|
|
1.1 ! root 1: /* ! 2: * ! 3: * Copyright 1986, 1987 by MIT Student Information Processing Board ! 4: * ! 5: * For copyright info, see "mit-sipb-copyright.h". ! 6: * ! 7: */ ! 8: ! 9: #include <stdio.h> ! 10: #include <sys/file.h> ! 11: #include <strings.h> ! 12: #include <sys/param.h> ! 13: #include "mit-sipb-copyright.h" ! 14: ! 15: static char copyright[] = "Copyright 1987 by MIT Student Information Processing Board"; ! 16: ! 17: extern char *gensym(); ! 18: extern char *current_token; ! 19: extern int table_number, current; ! 20: char buffer[BUFSIZ]; ! 21: char *table_name = (char *)NULL; ! 22: FILE *hfile, *cfile; ! 23: ! 24: /* C library */ ! 25: extern char *malloc(); ! 26: extern int errno; ! 27: ! 28: /* lex stuff */ ! 29: extern FILE *yyin; ! 30: extern int yylineno; ! 31: ! 32: /* pathnames */ ! 33: char c_file[MAXPATHLEN]; /* temporary file */ ! 34: char h_file[MAXPATHLEN]; /* output */ ! 35: char o_file[MAXPATHLEN]; /* output */ ! 36: char et_file[MAXPATHLEN]; /* input */ ! 37: ! 38: main(argc, argv) ! 39: int argc; ! 40: char **argv; ! 41: { ! 42: register char *p; ! 43: int n_flag = 0, debug = 0; ! 44: ! 45: while (argc > 2) { ! 46: register char *arg, ch; ! 47: arg = argv[--argc]; ! 48: if (strlen(arg) != 2 || arg[0] != '-') ! 49: goto usage; ! 50: ch = arg[1]; ! 51: if (ch == 'n') ! 52: n_flag++; ! 53: else if (ch == 'd') ! 54: debug++; ! 55: else ! 56: goto usage; ! 57: } ! 58: ! 59: if (argc != 2) { ! 60: usage: ! 61: fprintf(stderr, "Usage: %s et_file [-n]\n", argv[0]); ! 62: exit(1); ! 63: } ! 64: ! 65: strcpy(et_file, argv[1]); ! 66: p = rindex(et_file, '/'); ! 67: if (p == (char *)NULL) ! 68: p = et_file; ! 69: else ! 70: p++; ! 71: p = rindex(p, '.'); ! 72: if (!strcmp(p, ".et")) ! 73: *++p = '\0'; ! 74: else { ! 75: if (!p) ! 76: p = et_file; ! 77: while (*p) ! 78: p++; ! 79: *p++ = '.'; ! 80: *p = '\0'; ! 81: } ! 82: /* p points at null where suffix should be */ ! 83: strcpy(p, "et.c"); ! 84: strcpy(c_file, et_file); ! 85: p[0] = 'h'; ! 86: p[1] = '\0'; ! 87: strcpy(h_file, et_file); ! 88: p[0] = 'o'; ! 89: strcpy(o_file, et_file); ! 90: p[0] = 'e'; ! 91: p[1] = 't'; ! 92: p[2] = '\0'; ! 93: ! 94: yyin = fopen(et_file, "r"); ! 95: if (!yyin) { ! 96: perror(et_file); ! 97: exit(1); ! 98: } ! 99: ! 100: hfile = fopen(h_file, "w"); ! 101: if (hfile == (FILE *)NULL) { ! 102: perror(h_file); ! 103: exit(1); ! 104: } ! 105: ! 106: cfile = fopen(c_file, "w"); ! 107: if (cfile == (FILE *)NULL) { ! 108: perror("Can't open temp file"); ! 109: exit(1); ! 110: } ! 111: ! 112: /* parse it */ ! 113: fputs("#define NULL 0\n", cfile); ! 114: fputs("static char *_et[] = {\n", cfile); ! 115: ! 116: yyparse(); ! 117: fclose(yyin); /* bye bye input file */ ! 118: ! 119: fputs("\t(char *)0\n};\n", cfile); ! 120: fputs("extern int init_error_table();\n\n", cfile); ! 121: fprintf(cfile, "int %s_err_base = %d;\n\n", table_name, table_number); ! 122: fprintf(cfile, "int\ninit_%s_err_tbl()\n", table_name); ! 123: fprintf(cfile, "{\n\treturn(init_error_table(_et, %d, %d));\n}\n", ! 124: table_number, current); ! 125: fclose(cfile); ! 126: ! 127: fputs("extern int init_", hfile); ! 128: fputs(table_name, hfile); ! 129: fputs("_err_tbl();\nextern int ", hfile); ! 130: fputs(table_name, hfile); ! 131: fputs("_err_base;\n", hfile); ! 132: fclose(hfile); /* bye bye hfile */ ! 133: ! 134: if (n_flag) ! 135: exit(0); ! 136: ! 137: if (!fork()) { ! 138: p = rindex(c_file, '/'); ! 139: if (p) { ! 140: *p++ = '\0'; ! 141: chdir(c_file); ! 142: } ! 143: else ! 144: p = c_file; ! 145: execlp("cc", "cc", "-c", "-R", "-O", p, 0); ! 146: perror("cc"); ! 147: exit(1); ! 148: } ! 149: else wait(0); ! 150: ! 151: if (!debug) ! 152: (void) unlink(c_file); ! 153: /* make it .o file name */ ! 154: c_file[strlen(c_file)-1] = 'o'; ! 155: if (!fork()) { ! 156: execlp("cp", "cp", c_file, o_file, 0); ! 157: perror("cp"); ! 158: exit(1); ! 159: } ! 160: else wait(0); ! 161: if (!debug) ! 162: (void) unlink(c_file); ! 163: ! 164: exit(0); ! 165: } ! 166: ! 167: yyerror(s) ! 168: char *s; ! 169: { ! 170: fputs(s, stderr); ! 171: fprintf(stderr, "\nLine number %d; last token was '%s'\n", ! 172: yylineno, current_token); ! 173: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.