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 */
96 #if defined(_WIN32) && !defined(__CYGWIN32__) && !defined(__CYGWIN__)
97 extern char* mktemp();
98 #define mkstemp mktemp
101 extern char *getenv();
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
); }
124 if (signal(SIGINT
, SIG_IGN
) != SIG_IGN
)
125 signal(SIGINT
, onintr
);
128 if (signal(SIGTERM
, SIG_IGN
) != SIG_IGN
)
129 signal(SIGTERM
, onintr
);
132 if (signal(SIGHUP
, SIG_IGN
) != SIG_IGN
)
133 signal(SIGHUP
, onintr
);
140 fprintf(stderr
, "usage: %s [-tvcp] [-b file_prefix] filename\n", myname
);
147 printf ("%s\n", SKEL_DIRECTORY
);
158 if (argc
> 0) myname
= argv
[0];
159 for (i
= 1; i
< argc
; ++i
)
162 if (*s
!= '-') break;
167 if (i
+ 1 < argc
) usage();
172 goto no_more_options
;
178 file_prefix
= argv
[i
];
193 line_format
= "#line %d \"%s\"\n";
194 default_line_format
= "#line default\n";
226 line_format
= "#line %d \"%s\"\n";
227 default_line_format
= "#line default\n";
239 if (i
+ 1 != argc
) usage();
240 input_file_name
= argv
[i
];
260 #define GNUC_UNUSED __attribute__((__unused__))
269 int mkstemp_res GNUC_UNUSED
;
271 #if defined(_WIN32) && !defined(__CYGWIN32__) && !defined(__CYGWIN__)
274 tmpdir
= getenv("TMPDIR");
275 if (tmpdir
== 0) tmpdir
= getenv ("TMP");
276 if (tmpdir
== 0) tmpdir
= getenv ("TEMP");
277 if (tmpdir
== 0) tmpdir
= "/tmp";
280 len
= strlen(tmpdir
);
282 if (len
&& tmpdir
[len
-1] != '/')
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
] = '/';
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
);
320 verbose_file_name
= MALLOC(len
+ 8);
321 if (verbose_file_name
== 0)
323 strcpy(verbose_file_name
, file_prefix
);
324 strcpy(verbose_file_name
+ len
, VERBOSE_SUFFIX
);
335 input_file
= fopen(input_file_name
, "r");
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");
350 open_error(local_file_name
);
354 verbose_file
= fopen(verbose_file_name
, "w");
355 if (verbose_file
== 0)
356 open_error(verbose_file_name
);