3 * Copyright 1986, 1987, 1988
4 * by MIT Student Information Processing Board.
6 * For copyright info, see "mit-sipb-cr.h".
11 #include <afsconfig.h>
12 #include <afs/param.h>
21 #include <sys/param.h>
29 #include "mit-sipb-cr.h"
33 static const char copyright[] =
34 "Copyright 1987,1988 by MIT Student Information Processing Board";
37 extern char *gensym();
38 extern char *current_token;
39 extern int table_number, current;
41 char *table_name = (char *)NULL;
42 FILE *hfile, *cfile, *msfile;
51 char * xmalloc (size) unsigned int size; {
52 char * p = malloc (size);
60 static int check_arg (str_list, arg) char const *const *str_list, *arg; {
62 if (!strcmp(arg, *str_list++))
67 static const char *const debug_args[] = {
73 static const char *const lang_args[] = {
79 static const char *const language_names[] = {
86 static const char * const c_src_prolog[] = {
87 "#include <afs/param.h>\n",
88 "#include <afs/error_table.h>\n",
89 "static const char * const text[] = {\n",
93 static const char * const krc_src_prolog[] = {
95 "#define NOARGS void\n",
100 "#include <afs/param.h>\n",
101 "#include <afs/error_table.h>\n",
102 "static const char * const text[] = {\n",
106 static const char warning[] =
107 "/*\n * %s:\n * This file is automatically generated; please do not edit it.\n */\n";
109 static const char msf_warning[] =
110 "$ \n$ %s:\n$ This file is automatically generated; please do not edit it.\n$ \n$set 1\n";
113 char c_file[MAXPATHLEN]; /* output file */
114 char h_file[MAXPATHLEN]; /* output */
115 char msf_file[MAXPATHLEN];
116 char et_file[MAXPATHLEN]; /* full path to input file */
118 static void usage () {
119 fprintf (stderr, "%s: usage: %s ERROR_TABLE [-debug] [-language LANG] [-h INCLUDE] [-p prefix] [-v version]\n",
124 static void dup_err (type, one, two) char const *type, *one, *two; {
125 fprintf (stderr, "%s: multiple %s specified: `%s' and `%s'\n",
126 whoami, type, one, two);
130 #include "AFS_component_version_number.c"
132 int main (argc, argv) int argc; char **argv; {
134 char const * const *cpp;
135 int got_language = 0;
136 char *got_include = 0;
137 char *got_prefix = ".";
142 * The following signal action for AIX is necessary so that in case of a
143 * crash (i.e. core is generated) we can include the user's data section
144 * in the core dump. Unfortunately, by default, only a partial core is
145 * generated which, in many cases, isn't too useful.
147 struct sigaction nsa;
149 sigemptyset(&nsa.sa_mask);
150 nsa.sa_handler = SIG_DFL;
151 nsa.sa_flags = SA_FULLDUMP;
152 sigaction(SIGSEGV, &nsa, NULL);
154 /* argument parsing */
158 p = strrchr (whoami, '/');
161 while (argv++, --argc) {
165 dup_err ("filenames", filename, arg);
170 if (check_arg (debug_args, arg))
172 else if (check_arg (lang_args, arg)) {
174 arg = *++argv, argc--;
178 dup_err ("languanges", language_names[(int)language], arg);
179 #define check_lang(x,v) else if (!strcasecmp(arg,x)) language = v
180 check_lang ("c", lang_C);
181 check_lang ("ansi_c", lang_C);
182 check_lang ("ansi-c", lang_C);
183 check_lang ("krc", lang_KRC);
184 check_lang ("kr_c", lang_KRC);
185 check_lang ("kr-c", lang_KRC);
186 check_lang ("k&r-c", lang_KRC);
187 check_lang ("k&r_c", lang_KRC);
188 check_lang ("c++", lang_CPP);
189 check_lang ("cplusplus", lang_CPP);
190 check_lang ("c-plus-plus", lang_CPP);
193 fprintf (stderr, "%s: unknown language name `%s'\n",
195 fprintf (stderr, "\tpick one of: C K&R-C\n");
199 else if (strcmp (arg, "h") == 0) {
200 arg = *++argv, argc--;
204 else if (strcmp (arg, "p") == 0) {
205 arg = *++argv, argc--;
209 else if (strcmp (arg, "v") == 0) {
210 arg = *++argv, argc--;
212 if (version != 1 && version != 2) {
213 fprintf (stderr, "%s: unknown control argument -`%s'\n",
218 if (version == 2) use_msf = 1;
221 fprintf (stderr, "%s: unknown control argument -`%s'\n",
231 else if (language == lang_CPP) {
232 fprintf (stderr, "%s: Sorry, C++ support is not yet finished.\n",
238 p = strrchr(filename, '/');
239 if (p == (char *)NULL)
243 ename = xmalloc (strlen(p) + 5);
246 /* Now, flush .et suffix if it exists. */
247 p = strrchr(ename, '.');
249 if (strcmp (p, ".et") == 0)
254 sprintf(msf_file, "%s.msf", ename);
256 sprintf(c_file, "%s.c", ename);
259 sprintf(h_file, "%s.h", got_include);
261 sprintf(h_file, "%s.h", ename);
263 p = strrchr(filename, '.');
266 p = xmalloc (strlen(filename) + 4);
267 sprintf(p, "%s.et", filename);
271 sprintf(et_file, "%s/%s", got_prefix, filename);
273 yyin = fopen(et_file, "r");
279 /* on NT, yyout is not initialized to stdout */
284 hfile = fopen(h_file, "w");
285 if (hfile == (FILE *)NULL) {
289 fprintf (hfile, warning, h_file);
292 char prolog_h_file[MAXPATHLEN];
296 strcpy (prolog_h_file, got_prefix);
297 strcat (prolog_h_file, "/");
298 strcat (prolog_h_file, got_include);
299 strcat (prolog_h_file, ".p.h");
300 prolog_hfile = fopen(prolog_h_file, "r");
302 fprintf (stderr, "Including %s at beginning of %s file.\n", prolog_h_file, h_file);
303 fprintf (hfile, "/* Including %s at beginning of %s file. */\n\n",
304 prolog_h_file, h_file);
306 count = fread (buffer, sizeof(char), sizeof(buffer), prolog_hfile);
308 perror(prolog_h_file);
311 written = fwrite (buffer, sizeof(char), count, hfile);
312 if (count != written) {
313 perror(prolog_h_file);
317 fprintf (hfile, "\n/* End of prolog file %s. */\n\n", prolog_h_file);
322 msfile = fopen(msf_file, "w");
323 if (msfile == (FILE *)NULL) {
327 fprintf(msfile, msf_warning, msf_file);
329 cfile = fopen(c_file, "w");
330 if (cfile == (FILE *)NULL) {
334 fprintf (cfile, warning, c_file);
337 if (language == lang_C)
339 else if (language == lang_KRC)
340 cpp = krc_src_prolog;
344 fputs (*cpp++, cfile);
349 fclose(yyin); /* bye bye input file */
352 fputs (" 0\n};\n\n", cfile);
354 "static const struct error_table et = { text, %ldL, %d };\n\n",
355 (long int) table_number, current);
356 fputs("static struct et_list etlink = { 0, &et};\n\n", cfile);
357 fprintf(cfile, "void initialize_%s_error_table (%s) {\n",
358 table_name, (language == lang_C) ? "void" : "NOARGS");
359 fputs(" add_to_error_table(&etlink);\n", cfile);
364 fprintf (hfile, "extern void initialize_%s_error_table ();\n",
367 fprintf (hfile, "#define initialize_%s_error_table()\n",
371 fprintf (hfile, "#define ERROR_TABLE_BASE_%s (%ldL)\n",
372 table_name, (long int) table_number);
373 /* compatibility... */
374 fprintf (hfile, "\n/* for compatibility with older versions... */\n");
375 fprintf (hfile, "#define init_%s_err_tbl initialize_%s_error_table\n",
376 table_name, table_name);
377 fprintf (hfile, "#define %s_err_base ERROR_TABLE_BASE_%s\n", table_name,
379 fprintf (hfile, "\n/* for compatibility with other users... */\n");
380 lcstring (lcname, table_name, sizeof(lcname));
381 fprintf (hfile, "#define ERROR_TABLE_BASE_%s (%ldL)\n",
382 lcname, (long int) table_number);
383 fprintf (hfile, "#define init_%s_err_tbl initialize_%s_error_table\n",
385 fprintf (hfile, "#define initialize_%s_error_table initialize_%s_error_table\n",
387 fprintf (hfile, "#define %s_err_base ERROR_TABLE_BASE_%s\n", lcname,
389 fclose(hfile); /* bye bye include file */
395 void yyerror(const char *s) {
397 fprintf(stderr, "\nLine number %d; last token was '%s'\n",
398 yylineno, current_token);