1 /* $OpenBSD: main.c,v 1.29 2017/05/25 20:11:03 tedu Exp $ */
2 /* $NetBSD: main.c,v 1.5 1996/03/19 03:21:38 jtc Exp $ */
5 * Copyright (c) 1989 The Regents of the University of California.
8 * This code is derived from software contributed to Berkeley by
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * 3. Neither the name of the University nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 #include <sys/types.h>
51 char *file_prefix
= "y";
56 int explicit_file_name
;
58 char *action_file_name
;
60 char *defines_file_name
;
61 char *input_file_name
= "";
62 char *output_file_name
;
64 char *union_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 *code_file
; /* y.code.c (used when the -r option is specified) */
70 FILE *defines_file
; /* y.tab.h */
71 FILE *input_file
; /* the input file */
72 FILE *output_file
; /* y.tab.c */
73 FILE *text_file
; /* a temp file, used to save text until all */
74 /* symbols have been defined */
75 FILE *union_file
; /* a temp file, used to save the union */
76 /* definition until all symbol have been */
78 FILE *verbose_file
; /* y.output */
101 void set_signals(void);
103 void getargs(int, char *[]);
104 void create_file_names(void);
105 void open_files(void);
107 volatile sig_atomic_t sigdie
;
113 unlink(action_file_name
);
115 unlink(text_file_name
);
117 unlink(union_file_name
);
125 onintr(__unused
int signo
)
136 if (signal(SIGINT
, SIG_IGN
) != SIG_IGN
)
137 signal(SIGINT
, onintr
);
140 if (signal(SIGTERM
, SIG_IGN
) != SIG_IGN
)
141 signal(SIGTERM
, onintr
);
144 if (signal(SIGHUP
, SIG_IGN
) != SIG_IGN
)
145 signal(SIGHUP
, onintr
);
153 fprintf(stderr
, "usage: %s [-dlrtv] [-b file_prefix] [-o output_file] [-p symbol_prefix] file\n", __progname
);
159 getargs(int argc
, char *argv
[])
163 while ((ch
= getopt(argc
, argv
, "b:dlo:p:rtv")) != -1) {
166 file_prefix
= optarg
;
178 output_file_name
= optarg
;
179 explicit_file_name
= 1;
183 symbol_prefix
= optarg
;
207 if (strcmp(*argv
, "-") == 0)
210 input_file_name
= *argv
;
228 #define TEMPNAME(s, c, d, l) \
229 (asprintf(&(s), "%.*s/yacc.%xXXXXXXXXXX", (int)(l), (d), (c)))
232 create_file_names(void)
239 len
= strlen(tmpdir
);
240 if (tmpdir
[len
- 1] == '/')
243 if (TEMPNAME(action_file_name
, 'a', tmpdir
, len
) == -1 ||
244 TEMPNAME(text_file_name
, 'r', tmpdir
, len
) == -1 ||
245 TEMPNAME(union_file_name
, 'u', tmpdir
, len
) == -1)
248 if (output_file_name
== NULL
) {
249 if (asprintf(&output_file_name
, "%s%s", file_prefix
, OUTPUT_SUFFIX
)
254 if (asprintf(&code_file_name
, "%s%s", file_prefix
, CODE_SUFFIX
) == -1)
257 code_file_name
= output_file_name
;
260 if (explicit_file_name
) {
263 defines_file_name
= strdup(output_file_name
);
264 if (defines_file_name
== 0)
267 /* does the output_file_name have a known suffix */
268 if ((suffix
= strrchr(output_file_name
, '.')) != 0 &&
269 (!strcmp(suffix
, ".c") || /* good, old-fashioned C */
270 !strcmp(suffix
, ".C") || /* C++, or C on Windows */
271 !strcmp(suffix
, ".cc") || /* C++ */
272 !strcmp(suffix
, ".cxx") || /* C++ */
273 !strcmp(suffix
, ".cpp"))) {/* C++ (Windows) */
274 strncpy(defines_file_name
, output_file_name
,
275 suffix
- output_file_name
+ 1);
276 defines_file_name
[suffix
- output_file_name
+ 1] = 'h';
277 defines_file_name
[suffix
- output_file_name
+ 2] = '\0';
279 fprintf(stderr
, "%s: suffix of output file name %s"
280 " not recognized, no -d file generated.\n",
281 __progname
, output_file_name
);
283 free(defines_file_name
);
284 defines_file_name
= 0;
287 if (asprintf(&defines_file_name
, "%s%s", file_prefix
,
288 DEFINES_SUFFIX
) == -1)
293 if (asprintf(&verbose_file_name
, "%s%s", file_prefix
,
294 VERBOSE_SUFFIX
) == -1)
307 if (input_file
== 0) {
308 input_file
= fopen(input_file_name
, "r");
310 open_error(input_file_name
);
312 fd
= mkstemp(action_file_name
);
313 if (fd
== -1 || (action_file
= fdopen(fd
, "w")) == NULL
)
314 open_error(action_file_name
);
316 fd
= mkstemp(text_file_name
);
317 if (fd
== -1 || (text_file
= fdopen(fd
, "w")) == NULL
)
318 open_error(text_file_name
);
321 verbose_file
= fopen(verbose_file_name
, "w");
322 if (verbose_file
== 0)
323 open_error(verbose_file_name
);
326 defines_file
= fopen(defines_file_name
, "w");
327 if (defines_file
== NULL
)
328 open_write_error(defines_file_name
);
329 fd
= mkstemp(union_file_name
);
330 if (fd
== -1 || (union_file
= fdopen(fd
, "w")) == NULL
)
331 open_error(union_file_name
);
333 output_file
= fopen(output_file_name
, "w");
334 if (output_file
== 0)
335 open_error(output_file_name
);
338 code_file
= fopen(code_file_name
, "w");
340 open_error(code_file_name
);
342 code_file
= output_file
;
347 main(int argc
, char *argv
[])
349 if (pledge("stdio rpath wpath cpath", NULL
) == -1)
350 fatal("pledge: invalid arguments");