|
|
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.