3 * Copyright 1986, 1987, 1988
4 * by MIT Student Information Processing Board.
6 * For copyright info, see "mit-sipb-copyright.h".
10 #include "mit-sipb-copyright.h"
12 #include <sys/types.h>
13 #include <sys/param.h>
20 static const char copyright[] =
21 "Copyright 1987,1988 by MIT Student Information Processing Board";
23 static const char rcsid[] = "$Id$";
26 lang_C, /* ANSI C (default) */
27 lang_KRC, /* C: ANSI + K&R */
32 extern char *gensym(const char *x);
33 extern int yyparse(void);
34 extern char *current_token;
35 extern int table_number, current;
37 /* From et_lex.lex.l. */
43 char *table_name = NULL;
45 static int debug; /* dump debugging info? */
46 static char *filename; /* error table source */
47 static enum lang language;
48 static const char *whoami;
50 char *xmalloc(unsigned int size)
52 char * p = malloc (size);
61 static int check_arg(const char *const *str_list, const char *arg)
64 if (!strcmp(arg, *str_list++))
69 static const char *const debug_args[] = {
75 static const char *const lang_args[] = {
81 static const char *const language_names[] = {
88 static const char * const c_src_prolog[] = {
89 "static const char * const text[] = {\n",
93 static const char * const krc_src_prolog[] = {
95 "#define NOARGS void\n",
100 "static const char * const text[] = {\n",
104 static const char *const struct_def[] = {
105 "struct error_table {\n",
106 " char const * const * msgs;\n",
110 "struct et_list {\n",
111 " struct et_list *next;\n",
112 " const struct error_table * table;\n",
114 "extern struct et_list *_et_list;\n",
118 static const char warning[] =
119 "/*\n * %s:\n * This file is automatically generated; please do not edit it.\n */\n";
122 char c_file[MAXPATHLEN]; /* output file */
123 char h_file[MAXPATHLEN]; /* output */
125 static void usage() {
126 fprintf (stderr, "%s: usage: %s ERROR_TABLE\n",
131 static void dup_err(const char *type, const char *one, const char *two)
133 fprintf (stderr, "%s: multiple %s specified: `%s' and `%s'\n",
134 whoami, type, one, two);
138 int main(int argc, char **argv)
142 char const * const *cpp;
143 int got_language = 0;
145 /* argument parsing */
149 p = strrchr (whoami, '/');
152 while (argv++, --argc) {
156 dup_err ("filenames", filename, arg);
161 if (check_arg (debug_args, arg))
163 else if (check_arg (lang_args, arg)) {
165 arg = *++argv, argc--;
169 dup_err ("languanges", language_names[(int)language], arg);
170 #define check_lang(x,v) else if (!strcasecmp(arg,x)) language = v
171 check_lang ("c", lang_C);
172 check_lang ("ansi_c", lang_C);
173 check_lang ("ansi-c", lang_C);
174 check_lang ("krc", lang_KRC);
175 check_lang ("kr_c", lang_KRC);
176 check_lang ("kr-c", lang_KRC);
177 check_lang ("k&r-c", lang_KRC);
178 check_lang ("k&r_c", lang_KRC);
179 check_lang ("c++", lang_CPP);
180 check_lang ("cplusplus", lang_CPP);
181 check_lang ("c-plus-plus", lang_CPP);
184 fprintf (stderr, "%s: unknown language name `%s'\n",
186 fprintf (stderr, "\tpick one of: C K&R-C\n");
191 fprintf (stderr, "%s: unknown control argument -`%s'\n",
201 else if (language == lang_CPP) {
202 fprintf (stderr, "%s: Sorry, C++ support is not yet finished.\n",
207 p = xmalloc (strlen (filename) + 5);
208 strcpy (p, filename);
210 p = strrchr(filename, '/');
216 len = strlen (ename);
218 if (strcmp (p, ".et"))
221 /* now p points to where "et" suffix should start */
222 /* generate new filenames */
224 strcpy (c_file, ename);
226 strcpy (h_file, ename);
229 yyin = fopen(filename, "r");
235 hfile = fopen(h_file, "w");
240 fprintf (hfile, warning, h_file);
242 cfile = fopen(c_file, "w");
247 fprintf (cfile, warning, c_file);
250 if (language == lang_C)
252 else if (language == lang_KRC)
253 cpp = krc_src_prolog;
257 fputs (*cpp++, cfile);
261 fclose(yyin); /* bye bye input file */
263 fputs (" 0\n};\n\n", cfile);
264 for (cpp = struct_def; *cpp; cpp++)
267 "const struct error_table et_%s_error_table = { text, %ldL, %d };",
268 table_name, (long) table_number, current);
269 fputs("\n\nstatic struct et_list link = { 0, 0 };\n\n",
271 fprintf(cfile, "void initialize_%s_error_table (%s) {\n",
272 table_name, (language == lang_C) ? "void" : "NOARGS");
273 fputs(" if (!link.table) {\n", cfile);
274 fputs(" link.next = _et_list;\n", cfile);
275 fprintf(cfile, " link.table = &et_%s_error_table;\n", table_name);
276 fputs(" _et_list = &link;\n", cfile);
277 fputs(" }\n", cfile);
281 if (language == lang_KRC) {
282 fprintf (hfile, "extern void initialize_%s_error_table ();\n",
285 fprintf (hfile, "void initialize_%s_error_table (void);\n",
288 fprintf (hfile, "#define ERROR_TABLE_BASE_%s (%ldL)\n",
289 table_name, (long) table_number);
290 /* compatibility... */
291 fprintf (hfile, "\n/* for compatibility with older versions... */\n");
292 fprintf (hfile, "#define init_%s_err_tbl initialize_%s_error_table\n",
293 table_name, table_name);
294 fprintf (hfile, "#define %s_err_base ERROR_TABLE_BASE_%s\n", table_name,
296 fclose(hfile); /* bye bye include file */
304 fprintf(stderr, "\nLine number %d; last token was '%s'\n",
305 num_lines, current_token);