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 int errno;
26
27 /* lex stuff */
28 extern FILE *yyin;
29 extern int yylineno;
30
31 /* pathnames */
32 char c_file[MAXPATHLEN]; /* temporary file */
33 char h_file[MAXPATHLEN]; /* output */
34 char o_file[MAXPATHLEN]; /* output */
35 char et_file[MAXPATHLEN]; /* input */
36
main(argc,argv)37 main(argc, argv)
38 int argc;
39 char **argv;
40 {
41 register char *p;
42 int n_flag = 0, debug = 0;
43
44 while (argc > 2) {
45 register char *arg, ch;
46 arg = argv[--argc];
47 if (strlen(arg) != 2 || arg[0] != '-')
48 goto usage;
49 ch = arg[1];
50 if (ch == 'n')
51 n_flag++;
52 else if (ch == 'd')
53 debug++;
54 else
55 goto usage;
56 }
57
58 if (argc != 2) {
59 usage:
60 fprintf(stderr, "Usage: %s et_file [-n]\n", argv[0]);
61 exit(1);
62 }
63
64 strcpy(et_file, argv[1]);
65 p = rindex(et_file, '/');
66 if (p == (char *)NULL)
67 p = et_file;
68 else
69 p++;
70 p = rindex(p, '.');
71 if (!strcmp(p, ".et"))
72 *++p = '\0';
73 else {
74 if (!p)
75 p = et_file;
76 while (*p)
77 p++;
78 *p++ = '.';
79 *p = '\0';
80 }
81 /* p points at null where suffix should be */
82 strcpy(p, "et.c");
83 strcpy(c_file, et_file);
84 p[0] = 'h';
85 p[1] = '\0';
86 strcpy(h_file, et_file);
87 p[0] = 'o';
88 strcpy(o_file, et_file);
89 p[0] = 'e';
90 p[1] = 't';
91 p[2] = '\0';
92
93 yyin = fopen(et_file, "r");
94 if (!yyin) {
95 perror(et_file);
96 exit(1);
97 }
98
99 hfile = fopen(h_file, "w");
100 if (hfile == (FILE *)NULL) {
101 perror(h_file);
102 exit(1);
103 }
104
105 cfile = fopen(c_file, "w");
106 if (cfile == (FILE *)NULL) {
107 perror("Can't open temp file");
108 exit(1);
109 }
110
111 /* parse it */
112 fputs("#define NULL 0\n", cfile);
113 fputs("static char *_et[] = {\n", cfile);
114
115 yyparse();
116 fclose(yyin); /* bye bye input file */
117
118 fputs("\t(char *)0\n};\n", cfile);
119 fputs("extern int init_error_table();\n\n", cfile);
120 fprintf(cfile, "int %s_err_base = %d;\n\n", table_name, table_number);
121 fprintf(cfile, "int\ninit_%s_err_tbl()\n", table_name);
122 fprintf(cfile, "{\n\treturn(init_error_table(_et, %d, %d));\n}\n",
123 table_number, current);
124 fclose(cfile);
125
126 fputs("extern int init_", hfile);
127 fputs(table_name, hfile);
128 fputs("_err_tbl();\nextern int ", hfile);
129 fputs(table_name, hfile);
130 fputs("_err_base;\n", hfile);
131 fclose(hfile); /* bye bye hfile */
132
133 if (n_flag)
134 exit(0);
135
136 if (!fork()) {
137 p = rindex(c_file, '/');
138 if (p) {
139 *p++ = '\0';
140 chdir(c_file);
141 }
142 else
143 p = c_file;
144 execlp("cc", "cc", "-c", "-R", "-O", p, 0);
145 perror("cc");
146 exit(1);
147 }
148 else wait(0);
149
150 if (!debug)
151 (void) unlink(c_file);
152 /* make it .o file name */
153 c_file[strlen(c_file)-1] = 'o';
154 if (!fork()) {
155 execlp("cp", "cp", c_file, o_file, 0);
156 perror("cp");
157 exit(1);
158 }
159 else wait(0);
160 if (!debug)
161 (void) unlink(c_file);
162
163 exit(0);
164 }
165
yyerror(s)166 yyerror(s)
167 char *s;
168 {
169 fputs(s, stderr);
170 fprintf(stderr, "\nLine number %d; last token was '%s'\n",
171 yylineno, current_token);
172 }
173