switch back to HTML output method
[mono.git] / mcs / jay / main.c
1 /*
2  * Copyright (c) 1989 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * This code is derived from software contributed to Berkeley by
6  * Robert Paul Corbett.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. All advertising materials mentioning features or use of this software
17  *    must display the following acknowledgement:
18  *      This product includes software developed by the University of
19  *      California, Berkeley and its contributors.
20  * 4. Neither the name of the University nor the names of its contributors
21  *    may be used to endorse or promote products derived from this software
22  *    without specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34  * SUCH DAMAGE.
35  */
36
37 #ifndef lint
38 char copyright[] =
39 "@(#) Copyright (c) 1989 The Regents of the University of California.\n\
40  All rights reserved.\n";
41 #endif /* not lint */
42
43 #ifndef lint
44 static char sccsid[] = "@(#)main.c      5.5 (Berkeley) 5/24/93";
45 #endif /* not lint */
46
47 #include <signal.h>
48 #include "defs.h"
49
50 char tflag;
51 char vflag;
52 char csharp = 0;
53
54 char *file_prefix = "y";
55 char *myname = "yacc";
56 char *temp_form = "yacc.XXXXXXX";
57
58 int lineno;
59 int outline;
60
61 char *action_file_name;
62 char *input_file_name = "";
63 char *prolog_file_name;
64 char *local_file_name;
65 char *verbose_file_name;
66
67 FILE *action_file;      /*  a temp file, used to save actions associated    */
68                         /*  with rules until the parser is written          */
69 FILE *input_file;       /*  the input file                                  */
70 FILE *prolog_file;      /*  temp files, used to save text until all         */
71 FILE *local_file;       /*  symbols have been defined                       */
72 FILE *verbose_file;     /*  y.output                                        */
73
74 int nitems;
75 int nrules;
76 int nsyms;
77 int ntokens;
78 int nvars;
79
80 int   start_symbol;
81 char  **symbol_name;
82 short *symbol_value;
83 short *symbol_prec;
84 char  *symbol_assoc;
85
86 short *ritem;
87 short *rlhs;
88 short *rrhs;
89 short *rprec;
90 char  *rassoc;
91 short **derives;
92 char *nullable;
93
94 extern char *mktemp();
95 extern char *getenv();
96
97 done(k)
98 int k;
99 {
100     if (action_file) { fclose(action_file); unlink(action_file_name); }
101     if (prolog_file) { fclose(prolog_file); unlink(prolog_file_name); }
102     if (local_file) { fclose(local_file); unlink(local_file_name); }
103     exit(k);
104 }
105
106
107 void
108 onintr(signo)
109         int signo;
110 {
111     done(1);
112 }
113
114
115 set_signals()
116 {
117 #ifdef SIGINT
118     if (signal(SIGINT, SIG_IGN) != SIG_IGN)
119         signal(SIGINT, onintr);
120 #endif
121 #ifdef SIGTERM
122     if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
123         signal(SIGTERM, onintr);
124 #endif
125 #ifdef SIGHUP
126     if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
127         signal(SIGHUP, onintr);
128 #endif
129 }
130
131
132 usage()
133 {
134     fprintf(stderr, "usage: %s [-tvc] [-b file_prefix] filename\n", myname);
135     exit(1);
136 }
137
138
139 getargs(argc, argv)
140 int argc;
141 char *argv[];
142 {
143     register int i;
144     register char *s;
145
146     if (argc > 0) myname = argv[0];
147     for (i = 1; i < argc; ++i)
148     {
149         s = argv[i];
150         if (*s != '-') break;
151         switch (*++s)
152         {
153         case '\0':
154             input_file = stdin;
155             if (i + 1 < argc) usage();
156             return;
157
158         case '-':
159             ++i;
160             goto no_more_options;
161
162         case 'b':
163             if (*++s)
164                  file_prefix = s;
165             else if (++i < argc)
166                 file_prefix = argv[i];
167             else
168                 usage();
169             continue;
170
171         case 't':
172             tflag = 1;
173             break;
174
175         case 'c':
176             csharp = 1;
177             line_format = "#line %d \"%s\"\n";
178             break;
179             
180         case 'v':
181             vflag = 1;
182             break;
183
184         default:
185             usage();
186         }
187
188         for (;;)
189         {
190             switch (*++s)
191             {
192             case '\0':
193                 goto end_of_option;
194
195             case 't':
196                 tflag = 1;
197                 break;
198
199             case 'v':
200                 vflag = 1;
201                 break;
202
203             case 'c':
204                 csharp = 1;
205                 break;
206
207             default:
208                 usage();
209             }
210         }
211 end_of_option:;
212     }
213
214 no_more_options:;
215     if (i + 1 != argc) usage();
216     input_file_name = argv[i];
217 }
218
219
220 char *
221 allocate(n)
222 unsigned n;
223 {
224     register char *p;
225
226     p = NULL;
227     if (n)
228     {
229         p = CALLOC(1, n);
230         if (!p) no_space();
231     }
232     return (p);
233 }
234
235
236 create_file_names()
237 {
238     int i, len;
239     char *tmpdir;
240
241     tmpdir = getenv("TMPDIR");
242     if (tmpdir == 0) tmpdir = "/tmp";
243
244     len = strlen(tmpdir);
245     i = len + 13;
246     if (len && tmpdir[len-1] != '/')
247         ++i;
248
249     action_file_name = MALLOC(i);
250     if (action_file_name == 0) no_space();
251     prolog_file_name = MALLOC(i);
252     if (prolog_file_name == 0) no_space();
253     local_file_name = MALLOC(i);
254     if (local_file_name == 0) no_space();
255
256     strcpy(action_file_name, tmpdir);
257     strcpy(prolog_file_name, tmpdir);
258     strcpy(local_file_name, tmpdir);
259
260     if (len && tmpdir[len - 1] != '/')
261     {
262         action_file_name[len] = '/';
263         prolog_file_name[len] = '/';
264         local_file_name[len] = '/';
265         ++len;
266     }
267
268     strcpy(action_file_name + len, temp_form);
269     strcpy(prolog_file_name + len, temp_form);
270     strcpy(local_file_name + len, temp_form);
271
272     action_file_name[len + 5] = 'a';
273     prolog_file_name[len + 5] = 'p';
274     local_file_name[len + 5] = 'l';
275
276     mktemp(action_file_name);
277     mktemp(prolog_file_name);
278     mktemp(local_file_name);
279
280     len = strlen(file_prefix);
281
282     if (vflag)
283     {
284         verbose_file_name = MALLOC(len + 8);
285         if (verbose_file_name == 0)
286             no_space();
287         strcpy(verbose_file_name, file_prefix);
288         strcpy(verbose_file_name + len, VERBOSE_SUFFIX);
289     }
290 }
291
292
293 open_files()
294 {
295     create_file_names();
296
297     if (input_file == 0)
298     {
299         input_file = fopen(input_file_name, "r");
300         if (input_file == 0)
301             open_error(input_file_name);
302     }
303
304     action_file = fopen(action_file_name, "w");
305     if (action_file == 0)
306         open_error(action_file_name);
307
308     prolog_file = fopen(prolog_file_name, "w");
309     if (prolog_file == 0)
310         open_error(prolog_file_name);
311
312     local_file = fopen(local_file_name, "w");
313     if (local_file == 0)
314         open_error(local_file_name);
315
316     if (vflag)
317     {
318         verbose_file = fopen(verbose_file_name, "w");
319         if (verbose_file == 0)
320             open_error(verbose_file_name);
321     }
322 }
323
324
325 int
326 main(argc, argv)
327 int argc;
328 char *argv[];
329 {
330     set_signals();
331     getargs(argc, argv);
332     open_files();
333     reader();
334     lr0();
335     lalr();
336     make_parser();
337     verbose();
338     output();
339     done(0);
340     /*NOTREACHED*/
341 }