2 * Copyright (c) 1989 The Regents of the University of California.
5 * This code is derived from software contributed to Berkeley by
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
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
39 "@(#) Copyright (c) 1989 The Regents of the University of California.\n\
40 All rights reserved.\n";
44 static char sccsid
[] = "@(#)main.c 5.5 (Berkeley) 5/24/93";
54 char *file_prefix
= "y";
55 char *myname
= "yacc";
56 char *temp_form
= "yacc.XXXXXXX";
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 */
94 #if defined(_WIN32) && !defined(__CYGWIN32__) && !defined(__CYGWIN__)
95 extern char* mktemp();
96 #define mkstemp mktemp
99 extern char *getenv();
104 if (action_file
) { fclose(action_file
); unlink(action_file_name
); }
105 if (prolog_file
) { fclose(prolog_file
); unlink(prolog_file_name
); }
106 if (local_file
) { fclose(local_file
); unlink(local_file_name
); }
122 if (signal(SIGINT
, SIG_IGN
) != SIG_IGN
)
123 signal(SIGINT
, onintr
);
126 if (signal(SIGTERM
, SIG_IGN
) != SIG_IGN
)
127 signal(SIGTERM
, onintr
);
130 if (signal(SIGHUP
, SIG_IGN
) != SIG_IGN
)
131 signal(SIGHUP
, onintr
);
138 fprintf(stderr
, "usage: %s [-tvcp] [-b file_prefix] filename\n", myname
);
145 printf ("%s\n", SKEL_DIRECTORY
);
156 if (argc
> 0) myname
= argv
[0];
157 for (i
= 1; i
< argc
; ++i
)
160 if (*s
!= '-') break;
165 if (i
+ 1 < argc
) usage();
170 goto no_more_options
;
176 file_prefix
= argv
[i
];
191 line_format
= "#line %d \"%s\"\n";
192 default_line_format
= "#line default\n";
224 line_format
= "#line %d \"%s\"\n";
225 default_line_format
= "#line default\n";
237 if (i
+ 1 != argc
) usage();
238 input_file_name
= argv
[i
];
263 #if defined(_WIN32) && !defined(__CYGWIN32__) && !defined(__CYGWIN__)
266 tmpdir
= getenv("TMPDIR");
267 if (tmpdir
== 0) tmpdir
= getenv ("TMP");
268 if (tmpdir
== 0) tmpdir
= getenv ("TEMP");
269 if (tmpdir
== 0) tmpdir
= "/tmp";
272 len
= strlen(tmpdir
);
274 if (len
&& tmpdir
[len
-1] != '/')
277 action_file_name
= MALLOC(i
);
278 if (action_file_name
== 0) no_space();
279 prolog_file_name
= MALLOC(i
);
280 if (prolog_file_name
== 0) no_space();
281 local_file_name
= MALLOC(i
);
282 if (local_file_name
== 0) no_space();
284 strcpy(action_file_name
, tmpdir
);
285 strcpy(prolog_file_name
, tmpdir
);
286 strcpy(local_file_name
, tmpdir
);
288 if (len
&& tmpdir
[len
- 1] != '/')
290 action_file_name
[len
] = '/';
291 prolog_file_name
[len
] = '/';
292 local_file_name
[len
] = '/';
296 strcpy(action_file_name
+ len
, temp_form
);
297 strcpy(prolog_file_name
+ len
, temp_form
);
298 strcpy(local_file_name
+ len
, temp_form
);
300 action_file_name
[len
+ 5] = 'a';
301 prolog_file_name
[len
+ 5] = 'p';
302 local_file_name
[len
+ 5] = 'l';
304 mkstemp(action_file_name
);
305 mkstemp(prolog_file_name
);
306 mkstemp(local_file_name
);
308 len
= strlen(file_prefix
);
312 verbose_file_name
= MALLOC(len
+ 8);
313 if (verbose_file_name
== 0)
315 strcpy(verbose_file_name
, file_prefix
);
316 strcpy(verbose_file_name
+ len
, VERBOSE_SUFFIX
);
327 input_file
= fopen(input_file_name
, "r");
329 open_error(input_file_name
);
332 action_file
= fopen(action_file_name
, "w");
333 if (action_file
== 0)
334 open_error(action_file_name
);
336 prolog_file
= fopen(prolog_file_name
, "w");
337 if (prolog_file
== 0)
338 open_error(prolog_file_name
);
340 local_file
= fopen(local_file_name
, "w");
342 open_error(local_file_name
);
346 verbose_file
= fopen(verbose_file_name
, "w");
347 if (verbose_file
== 0)
348 open_error(verbose_file_name
);