/* * * Copyright 1986, 1987 by MIT Student Information Processing Board * * For copyright info, see "mit-sipb-copyright.h". * */ #include #include #include #include #include "mit-sipb-copyright.h" static char copyright[] = "Copyright 1987 by MIT Student Information Processing Board"; extern char *gensym(); extern char *current_token; extern int table_number, current; char buffer[BUFSIZ]; char *table_name = (char *)NULL; FILE *hfile, *cfile; /* C library */ extern char *malloc(); extern int errno; /* lex stuff */ extern FILE *yyin; extern int yylineno; /* pathnames */ char c_file[MAXPATHLEN]; /* temporary file */ char h_file[MAXPATHLEN]; /* output */ char o_file[MAXPATHLEN]; /* output */ char et_file[MAXPATHLEN]; /* input */ main(argc, argv) int argc; char **argv; { register char *p; int n_flag = 0, debug = 0; while (argc > 2) { register char *arg, ch; arg = argv[--argc]; if (strlen(arg) != 2 || arg[0] != '-') goto usage; ch = arg[1]; if (ch == 'n') n_flag++; else if (ch == 'd') debug++; else goto usage; } if (argc != 2) { usage: fprintf(stderr, "Usage: %s et_file [-n]\n", argv[0]); exit(1); } strcpy(et_file, argv[1]); p = rindex(et_file, '/'); if (p == (char *)NULL) p = et_file; else p++; p = rindex(p, '.'); if (!strcmp(p, ".et")) *++p = '\0'; else { if (!p) p = et_file; while (*p) p++; *p++ = '.'; *p = '\0'; } /* p points at null where suffix should be */ strcpy(p, "et.c"); strcpy(c_file, et_file); p[0] = 'h'; p[1] = '\0'; strcpy(h_file, et_file); p[0] = 'o'; strcpy(o_file, et_file); p[0] = 'e'; p[1] = 't'; p[2] = '\0'; yyin = fopen(et_file, "r"); if (!yyin) { perror(et_file); exit(1); } hfile = fopen(h_file, "w"); if (hfile == (FILE *)NULL) { perror(h_file); exit(1); } cfile = fopen(c_file, "w"); if (cfile == (FILE *)NULL) { perror("Can't open temp file"); exit(1); } /* parse it */ fputs("#define NULL 0\n", cfile); fputs("static char *_et[] = {\n", cfile); yyparse(); fclose(yyin); /* bye bye input file */ fputs("\t(char *)0\n};\n", cfile); fputs("extern int init_error_table();\n\n", cfile); fprintf(cfile, "int %s_err_base = %d;\n\n", table_name, table_number); fprintf(cfile, "int\ninit_%s_err_tbl()\n", table_name); fprintf(cfile, "{\n\treturn(init_error_table(_et, %d, %d));\n}\n", table_number, current); fclose(cfile); fputs("extern int init_", hfile); fputs(table_name, hfile); fputs("_err_tbl();\nextern int ", hfile); fputs(table_name, hfile); fputs("_err_base;\n", hfile); fclose(hfile); /* bye bye hfile */ if (n_flag) exit(0); if (!fork()) { p = rindex(c_file, '/'); if (p) { *p++ = '\0'; chdir(c_file); } else p = c_file; execlp("cc", "cc", "-c", "-R", "-O", p, 0); perror("cc"); exit(1); } else wait(0); if (!debug) (void) unlink(c_file); /* make it .o file name */ c_file[strlen(c_file)-1] = 'o'; if (!fork()) { execlp("cp", "cp", c_file, o_file, 0); perror("cp"); exit(1); } else wait(0); if (!debug) (void) unlink(c_file); exit(0); } yyerror(s) char *s; { fputs(s, stderr); fprintf(stderr, "\nLine number %d; last token was '%s'\n", yylineno, current_token); }