Oops, actually correctly revert that commit.
[mono-project.git] / mcs / jay / main.c
blobfcac218b1df5d647e516b280d0223fc2151eabc0
1 /*
2 * Copyright (c) 1989 The Regents of the University of California.
3 * All rights reserved.
5 * This code is derived from software contributed to Berkeley by
6 * Robert Paul Corbett.
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.
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.
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 */
43 #ifndef lint
44 static char sccsid[] = "@(#)main.c 5.5 (Berkeley) 5/24/93";
45 #endif /* not lint */
47 #include <signal.h>
48 #include "defs.h"
50 char tflag;
51 char vflag;
52 int csharp = 0;
54 char *file_prefix = "y";
55 char *myname = "yacc";
56 char *temp_form = "yacc.XXXXXXX";
58 int lineno;
59 int outline;
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;
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 */
74 int nitems;
75 int nrules;
76 int nsyms;
77 int ntokens;
78 int nvars;
79 int nmethods;
81 int start_symbol;
82 char **symbol_name;
83 short *symbol_value;
84 short *symbol_prec;
85 char *symbol_assoc;
86 char **methods;
88 short *ritem;
89 short *rlhs;
90 short *rrhs;
91 short *rprec;
92 char *rassoc;
93 short **derives;
94 char *nullable;
96 #if defined(_WIN32) && !defined(__CYGWIN32__) && !defined(__CYGWIN__)
97 extern char* mktemp();
98 #define mkstemp mktemp
99 #endif
101 extern char *getenv();
103 done(k)
104 int k;
106 if (action_file) { fclose(action_file); unlink(action_file_name); }
107 if (prolog_file) { fclose(prolog_file); unlink(prolog_file_name); }
108 if (local_file) { fclose(local_file); unlink(local_file_name); }
109 exit(k);
113 void
114 onintr(signo)
115 int signo;
117 done(1);
121 set_signals()
123 #ifdef SIGINT
124 if (signal(SIGINT, SIG_IGN) != SIG_IGN)
125 signal(SIGINT, onintr);
126 #endif
127 #ifdef SIGTERM
128 if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
129 signal(SIGTERM, onintr);
130 #endif
131 #ifdef SIGHUP
132 if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
133 signal(SIGHUP, onintr);
134 #endif
138 usage()
140 fprintf(stderr, "usage: %s [-tvcp] [-b file_prefix] filename\n", myname);
141 exit(1);
144 void
145 print_skel_dir(void)
147 printf ("%s\n", SKEL_DIRECTORY);
148 exit (0);
151 getargs(argc, argv)
152 int argc;
153 char *argv[];
155 register int i;
156 register char *s;
158 if (argc > 0) myname = argv[0];
159 for (i = 1; i < argc; ++i)
161 s = argv[i];
162 if (*s != '-') break;
163 switch (*++s)
165 case '\0':
166 input_file = stdin;
167 if (i + 1 < argc) usage();
168 return;
170 case '-':
171 ++i;
172 goto no_more_options;
174 case 'b':
175 if (*++s)
176 file_prefix = s;
177 else if (++i < argc)
178 file_prefix = argv[i];
179 else
180 usage();
181 continue;
183 case 't':
184 tflag = 1;
185 break;
187 case 'p':
188 print_skel_dir ();
189 break;
191 case 'c':
192 csharp = 1;
193 line_format = "#line %d \"%s\"\n";
194 default_line_format = "#line default\n";
195 break;
197 case 'v':
198 vflag = 1;
199 break;
201 default:
202 usage();
205 for (;;)
207 switch (*++s)
209 case '\0':
210 goto end_of_option;
212 case 't':
213 tflag = 1;
214 break;
216 case 'v':
217 vflag = 1;
218 break;
220 case 'p':
221 print_skel_dir ();
222 break;
224 case 'c':
225 csharp = 1;
226 line_format = "#line %d \"%s\"\n";
227 default_line_format = "#line default\n";
229 break;
231 default:
232 usage();
235 end_of_option:;
238 no_more_options:;
239 if (i + 1 != argc) usage();
240 input_file_name = argv[i];
244 char *
245 allocate(n)
246 unsigned n;
248 register char *p;
250 p = NULL;
251 if (n)
253 p = CALLOC(1, n);
254 if (!p) no_space();
256 return (p);
259 #ifdef __GNUC__
260 #define GNUC_UNUSED __attribute__((__unused__))
261 #else
262 #define GNUC_UNUSED
263 #endif
265 create_file_names()
267 int i, len;
268 char *tmpdir;
269 int mkstemp_res GNUC_UNUSED;
271 #if defined(_WIN32) && !defined(__CYGWIN32__) && !defined(__CYGWIN__)
272 tmpdir = ".";
273 #else
274 tmpdir = getenv("TMPDIR");
275 if (tmpdir == 0) tmpdir = getenv ("TMP");
276 if (tmpdir == 0) tmpdir = getenv ("TEMP");
277 if (tmpdir == 0) tmpdir = "/tmp";
278 #endif
280 len = strlen(tmpdir);
281 i = len + 13;
282 if (len && tmpdir[len-1] != '/')
283 ++i;
285 action_file_name = MALLOC(i);
286 if (action_file_name == 0) no_space();
287 prolog_file_name = MALLOC(i);
288 if (prolog_file_name == 0) no_space();
289 local_file_name = MALLOC(i);
290 if (local_file_name == 0) no_space();
292 strcpy(action_file_name, tmpdir);
293 strcpy(prolog_file_name, tmpdir);
294 strcpy(local_file_name, tmpdir);
296 if (len && tmpdir[len - 1] != '/')
298 action_file_name[len] = '/';
299 prolog_file_name[len] = '/';
300 local_file_name[len] = '/';
301 ++len;
304 strcpy(action_file_name + len, temp_form);
305 strcpy(prolog_file_name + len, temp_form);
306 strcpy(local_file_name + len, temp_form);
308 action_file_name[len + 5] = 'a';
309 prolog_file_name[len + 5] = 'p';
310 local_file_name[len + 5] = 'l';
312 mkstemp_res = mkstemp(action_file_name);
313 mkstemp_res = mkstemp(prolog_file_name);
314 mkstemp_res = mkstemp(local_file_name);
316 len = strlen(file_prefix);
318 if (vflag)
320 verbose_file_name = MALLOC(len + 8);
321 if (verbose_file_name == 0)
322 no_space();
323 strcpy(verbose_file_name, file_prefix);
324 strcpy(verbose_file_name + len, VERBOSE_SUFFIX);
329 open_files()
331 create_file_names();
333 if (input_file == 0)
335 input_file = fopen(input_file_name, "r");
336 if (input_file == 0)
337 open_error(input_file_name);
340 action_file = fopen(action_file_name, "w");
341 if (action_file == 0)
342 open_error(action_file_name);
344 prolog_file = fopen(prolog_file_name, "w");
345 if (prolog_file == 0)
346 open_error(prolog_file_name);
348 local_file = fopen(local_file_name, "w");
349 if (local_file == 0)
350 open_error(local_file_name);
352 if (vflag)
354 verbose_file = fopen(verbose_file_name, "w");
355 if (verbose_file == 0)
356 open_error(verbose_file_name);
362 main(argc, argv)
363 int argc;
364 char *argv[];
366 set_signals();
367 getargs(argc, argv);
368 open_files();
369 reader();
370 lr0();
371 lalr();
372 make_parser();
373 verbose();
374 output();
375 done(0);
376 /*NOTREACHED*/