(U+6C79): Add `ideographic-structure'; add `sound@ja/on'; add
[chise/xemacs-chise.git.1] / netinstall / ini.cc
1 /*
2  * Copyright (c) 2000, Red Hat, Inc.
3  *
4  *     This program is free software; you can redistribute it and/or modify
5  *     it under the terms of the GNU General Public License as published by
6  *     the Free Software Foundation; either version 2 of the License, or
7  *     (at your option) any later version.
8  *
9  *     A copy of the GNU General Public License can be found at
10  *     http://www.gnu.org/
11  *
12  * Written by DJ Delorie <dj@cygnus.com>
13  *
14  */
15
16 /* The purpose of this file is to get and parse the setup.ini file
17    from the mirror site.  A few support routines for the bison and
18    flex parsers are provided also.  We check to see if this setup.ini
19    is older than the one we used last time, and if so, warn the user. */
20
21 #include "win32.h"
22
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <stdarg.h>
26
27 #include "ini.h"
28 #include "resource.h"
29 #include "concat.h"
30 #include "state.h"
31 #include "geturl.h"
32 #include "dialog.h"
33 #include "msg.h"
34 #include "mkdir.h"
35 #include "log.h"
36 #include "reginfo.h"
37 #include "version.h"
38
39 unsigned int setup_timestamp = 0;
40 char *setup_version = 0;
41
42 extern "C" int yyparse ();
43 /*extern int yydebug;*/
44
45 static char *error_buf = 0;
46 static int error_count = 0;
47
48 void
49 do_ini (HINSTANCE h)
50 {
51   char *ini_file = get_url_to_string (concat (MIRROR_SITE, "/setup.ini", 0));
52   dismiss_url_status_dialog ();
53
54   if (!ini_file)
55     {
56       note (IDS_SETUPINI_MISSING, MIRROR_SITE);
57       next_dialog = IDD_SITE;
58       return;
59     }
60
61   package = 0;
62   npackages = 0;
63   setup_timestamp = 0;
64   setup_version = 0;
65
66   ini_init (ini_file);
67
68   setup_timestamp = 0;
69   /*yydebug = 1;*/
70
71   if (yyparse () || error_count > 0)
72     {
73       if (error_count == 1)
74         MessageBox (0, error_buf, "Parse Error", 0);
75       else
76         MessageBox (0, error_buf, "Parse Errors", 0);
77     }
78   else
79     {
80       /* save known-good setup.ini locally */
81       FILE *inif = fopen ("setup.ini", "wb");
82       if (inif)
83         {
84           fwrite (ini_file, 1, strlen (ini_file), inif);
85           fclose (inif);
86         }
87     }
88
89   if (root_dir)
90     {
91       mkdir_p (1, concat (root_dir, XEMACS_SETUP_DIR, 0));
92
93       unsigned int old_timestamp = 0;
94       FILE *ots = fopen (concat (root_dir, XEMACS_SETUP_DIR, "timestamp", 0), "rt");
95       if (ots)
96         {
97           fscanf (ots, "%u", &old_timestamp);
98           fclose (ots);
99           if (old_timestamp && setup_timestamp
100               && (old_timestamp > setup_timestamp))
101             {
102               int yn = yesno (IDS_OLD_SETUPINI);
103               if (yn == IDNO)
104                 exit_setup (1);
105             }
106         }
107       if (setup_timestamp)
108         {
109           FILE *nts = fopen (concat (root_dir, XEMACS_SETUP_DIR, "timestamp", 0), "wt");
110           if (nts)
111             {
112               fprintf (nts, "%u", setup_timestamp);
113               fclose (nts);
114             }
115         }
116     }
117
118   msg ("setup_version is %s, our_version is %s", setup_version? setup_version : "(null)", version);
119   if (setup_version)
120     {
121       char *ini_version = canonicalize_version (setup_version);
122       char *our_version = canonicalize_version (version);
123       if (strcmp (our_version, ini_version) < 0)
124         note (IDS_OLD_SETUP_VERSION, version, setup_version);
125     }
126
127   next_dialog = IDD_CHOOSE;
128 }
129
130 extern "C" int yylineno;
131
132 extern "C" int CDECL yyerror (char *s, ...)
133 {
134   char buf[1000];
135   int len;
136   sprintf (buf, "setup.ini line %d: ", yylineno);
137   va_list args;
138   va_start (args, s);
139   vsprintf (buf + strlen (buf), s, args);
140   OutputDebugString (buf);
141   if (error_buf)
142     {
143       strcat (error_buf, "\n");
144       len = strlen (error_buf) + strlen (buf) + 5;
145       error_buf = (char *) realloc (error_buf, len);
146       strcat (error_buf, buf);
147     }
148   else
149     {
150       len = strlen (buf) + 5;
151       error_buf = (char *) malloc (len);
152       strcpy (error_buf, buf);
153     }
154   error_count++;
155   return 0;
156 }
157
158 extern "C" int CDECL fprintf (FILE *f, const char *s, ...);
159
160 static char stderrbuf[1000];
161
162 int CDECL
163 fprintf (FILE *f, const char *fmt, ...)
164 {
165   char buf[1000];
166   int rv;
167   va_list args;
168   va_start (args, fmt);
169   if (f == stderr)
170     {
171       rv = vsprintf (buf, fmt, args);
172       strcat (stderrbuf, buf);
173       if (char *nl = strchr (stderrbuf, '\n'))
174         {
175           *nl = 0;
176           /*OutputDebugString (stderrbuf);*/
177           MessageBox (0, buf, "XEmacs Setup", 0);
178           stderrbuf[0] = 0;
179         }
180       
181     }
182   else
183     {
184       rv = vfprintf (f, fmt, args);
185     }
186   return rv;
187 }