3 * Copyright 1986, 1987, 1988
4 * by MIT Student Information Processing Board.
6 * For copyright info, see "mit-sipb-cr.h".
11 #include <afs/param.h>
12 #include <afsconfig.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];
117 static void usage () {
118 fprintf (stderr, "%s: usage: %s ERROR_TABLE [-debug] [-language LANG] [-h INCLUDE] [-v version]\n",
123 static void dup_err (type, one, two) char const *type, *one, *two; {
124 fprintf (stderr, "%s: multiple %s specified: `%s' and `%s'\n",
125 whoami, type, one, two);
129 #include "AFS_component_version_number.c"
131 int main (argc, argv) int argc; char **argv; {
133 char const * const *cpp;
134 int got_language = 0;
135 char *got_include = 0;
139 * The following signal action for AIX is necessary so that in case of a
140 * crash (i.e. core is generated) we can include the user's data section
141 * in the core dump. Unfortunately, by default, only a partial core is
142 * generated which, in many cases, isn't too useful.
144 struct sigaction nsa;
146 sigemptyset(&nsa.sa_mask);
147 nsa.sa_handler = SIG_DFL;
148 nsa.sa_flags = SA_FULLDUMP;
149 sigaction(SIGSEGV, &nsa, NULL);
151 /* argument parsing */
155 p = strrchr (whoami, '/');
158 while (argv++, --argc) {
162 dup_err ("filenames", filename, arg);
167 if (check_arg (debug_args, arg))
169 else if (check_arg (lang_args, arg)) {
171 arg = *++argv, argc--;
175 dup_err ("languanges", language_names[(int)language], arg);
176 #define check_lang(x,v) else if (!strcasecmp(arg,x)) language = v
177 check_lang ("c", lang_C);
178 check_lang ("ansi_c", lang_C);
179 check_lang ("ansi-c", lang_C);
180 check_lang ("krc", lang_KRC);
181 check_lang ("kr_c", lang_KRC);
182 check_lang ("kr-c", lang_KRC);
183 check_lang ("k&r-c", lang_KRC);
184 check_lang ("k&r_c", lang_KRC);
185 check_lang ("c++", lang_CPP);
186 check_lang ("cplusplus", lang_CPP);
187 check_lang ("c-plus-plus", lang_CPP);
190 fprintf (stderr, "%s: unknown language name `%s'\n",
192 fprintf (stderr, "\tpick one of: C K&R-C\n");
196 else if (strcmp (arg, "h") == 0) {
197 arg = *++argv, argc--;
201 else if (strcmp (arg, "v") == 0) {
202 arg = *++argv, argc--;
204 if (version != 1 && version != 2) {
205 fprintf (stderr, "%s: unknown control argument -`%s'\n",
210 if (version == 2) use_msf = 1;
213 fprintf (stderr, "%s: unknown control argument -`%s'\n",
223 else if (language == lang_CPP) {
224 fprintf (stderr, "%s: Sorry, C++ support is not yet finished.\n",
230 p = strrchr(filename, '/');
231 if (p == (char *)NULL)
235 ename = xmalloc (strlen(p) + 5);
238 /* Now, flush .et suffix if it exists. */
239 p = strrchr(ename, '.');
241 if (strcmp (p, ".et") == 0)
246 sprintf(msf_file, "%s.msf", ename);
248 sprintf(c_file, "%s.c", ename);
251 sprintf(h_file, "%s.h", got_include);
253 sprintf(h_file, "%s.h", ename);
255 p = strrchr(filename, '.');
258 p = xmalloc (strlen(filename) + 4);
259 sprintf(p, "%s.et", filename);
263 yyin = fopen(filename, "r");
269 /* on NT, yyout is not initialized to stdout */
274 hfile = fopen(h_file, "w");
275 if (hfile == (FILE *)NULL) {
279 fprintf (hfile, warning, h_file);
282 char prolog_h_file[MAXPATHLEN];
286 strcpy (prolog_h_file, got_include);
287 strcat (prolog_h_file, ".p.h");
288 prolog_hfile = fopen(prolog_h_file, "r");
290 fprintf (stderr, "Including %s at beginning of %s file.\n", prolog_h_file, h_file);
291 fprintf (hfile, "/* Including %s at beginning of %s file. */\n\n",
292 prolog_h_file, h_file);
294 count = fread (buffer, sizeof(char), sizeof(buffer), prolog_hfile);
296 perror(prolog_h_file);
299 written = fwrite (buffer, sizeof(char), count, hfile);
300 if (count != written) {
301 perror(prolog_h_file);
305 fprintf (hfile, "\n/* End of prolog file %s. */\n\n", prolog_h_file);
310 msfile = fopen(msf_file, "w");
311 if (msfile == (FILE *)NULL) {
315 fprintf(msfile, msf_warning, msf_file);
317 cfile = fopen(c_file, "w");
318 if (cfile == (FILE *)NULL) {
322 fprintf (cfile, warning, c_file);
325 if (language == lang_C)
327 else if (language == lang_KRC)
328 cpp = krc_src_prolog;
332 fputs (*cpp++, cfile);
337 fclose(yyin); /* bye bye input file */
340 fputs (" 0\n};\n\n", cfile);
342 "static const struct error_table et = { text, %ldL, %d };\n\n",
343 (long int) table_number, current);
344 fputs("static struct et_list etlink = { 0, &et};\n\n", cfile);
345 fprintf(cfile, "void initialize_%s_error_table (%s) {\n",
346 table_name, (language == lang_C) ? "void" : "NOARGS");
347 fputs(" add_to_error_table(&etlink);\n", cfile);
352 fprintf (hfile, "extern void initialize_%s_error_table ();\n",
355 fprintf (hfile, "#define initialize_%s_error_table()\n",
359 fprintf (hfile, "#define ERROR_TABLE_BASE_%s (%ldL)\n",
360 table_name, (long int) table_number);
361 /* compatibility... */
362 fprintf (hfile, "\n/* for compatibility with older versions... */\n");
363 fprintf (hfile, "#define init_%s_err_tbl initialize_%s_error_table\n",
364 table_name, table_name);
365 fprintf (hfile, "#define %s_err_base ERROR_TABLE_BASE_%s\n", table_name,
367 fclose(hfile); /* bye bye include file */
373 void yyerror(const char *s) {
375 fprintf(stderr, "\nLine number %d; last token was '%s'\n",
376 yylineno, current_token);