diff options
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 105 |
1 files changed, 81 insertions, 24 deletions
@@ -1,7 +1,7 @@ -/* $Id: main.c,v 1.60 2017/04/30 20:57:56 Julien.Ramseier Exp $ */ +/* $Id: main.c,v 1.69 2019/11/25 23:24:36 Tom.Shields Exp $ */ #include <signal.h> -#ifndef _WIN32 +#if !defined(_WIN32) || defined(__MINGW32__) #include <unistd.h> /* for _exit() */ #else #include <stdlib.h> /* for _exit() */ @@ -33,6 +33,7 @@ static MY_TMPFILES *my_tmpfiles; #endif /* USE_MKSTEMP */ char dflag; +char dflag2; char gflag; char iflag; char lflag; @@ -150,7 +151,7 @@ done(int k) if (rflag) DO_FREE(code_file_name); - if (dflag) + if (dflag && !dflag2) DO_FREE(defines_file_name); if (iflag) @@ -210,6 +211,7 @@ usage(void) ," -b file_prefix set filename prefix (default \"y.\")" ," -B create a backtracking parser" ," -d write definitions (" DEFINES_SUFFIX ")" + ," -H defines_file write definitions to defines_file" ," -i write interface (y.tab.i)" ," -g write a graphical description" ," -l suppress #line directives" @@ -230,7 +232,7 @@ usage(void) for (n = 0; n < sizeof(msg) / sizeof(msg[0]); ++n) fprintf(stderr, "%s\n", msg[n]); - exit(1); + exit(EXIT_FAILURE); } static void @@ -248,6 +250,7 @@ setflag(int ch) case 'd': dflag = 1; + dflag2 = 0; break; case 'g': @@ -308,6 +311,46 @@ static void getargs(int argc, char *argv[]) { int i; +#ifdef HAVE_GETOPT + int ch; + + if (argc > 0) + myname = argv[0]; + + while ((ch = getopt(argc, argv, "Bb:dgH:ilLo:Pp:rstVvy")) != -1) + { + switch (ch) + { + case 'b': + file_prefix = optarg; + break; + case 'H': + dflag = dflag2 = 1; + defines_file_name = optarg; + break; + case 'o': + output_file_name = optarg; + break; + case 'p': + symbol_prefix = optarg; + break; + default: + setflag(ch); + break; + } + } + if ((i = optind) < argc) + { + /* getopt handles "--" specially, while we handle "-" specially */ + if (!strcmp(argv[i], "-")) + { + if ((i + 1) < argc) + usage(); + input_file = stdin; + return; + } + } +#else char *s; int ch; @@ -340,6 +383,16 @@ getargs(int argc, char *argv[]) usage(); continue; + case 'H': + dflag = dflag2 = 1; + if (*++s) + defines_file_name = s; + else if (++i < argc) + defines_file_name = argv[i]; + else + usage(); + continue; + case 'o': if (*++s) output_file_name = s; @@ -378,7 +431,9 @@ getargs(int argc, char *argv[]) end_of_option:; } - no_more_options:; + no_more_options: + +#endif /* HAVE_GETOPT */ if (i + 1 != argc) usage(); input_file_name_len = strlen(argv[i]); @@ -476,7 +531,7 @@ create_file_names(void) else code_file_name = output_file_name; - if (dflag) + if (dflag && !dflag2) { CREATE_FILE_NAME(defines_file_name, defines_suffix); } @@ -578,7 +633,8 @@ open_tmpfile(const char *label) char *name; const char *mark; - if ((tmpdir = getenv("TMPDIR")) == 0 || access(tmpdir, W_OK) != 0) + if (((tmpdir = getenv("TMPDIR")) == 0 || access(tmpdir, W_OK) != 0) || + ((tmpdir = getenv("TEMP")) == 0 || access(tmpdir, W_OK) != 0)) { #ifdef P_tmpdir tmpdir = P_tmpdir; @@ -605,27 +661,28 @@ open_tmpfile(const char *label) sprintf(name, MY_FMT, tmpdir, (int)(mark - label), label); fd = mkstemp(name); - if (fd >= 0) + if (fd >= 0 + && (result = fdopen(fd, "w+")) != 0) { - result = fdopen(fd, "w+"); - if (result != 0) - { - MY_TMPFILES *item; + MY_TMPFILES *item; - if (my_tmpfiles == 0) - { - atexit(close_tmpfiles); - } + if (my_tmpfiles == 0) + { + atexit(close_tmpfiles); + } - item = NEW(MY_TMPFILES); - NO_SPACE(item); + item = NEW(MY_TMPFILES); + NO_SPACE(item); - item->name = name; - NO_SPACE(item->name); + item->name = name; + NO_SPACE(item->name); - item->next = my_tmpfiles; - my_tmpfiles = item; - } + item->next = my_tmpfiles; + my_tmpfiles = item; + } + else + { + FREE(name); } (void)umask(save_umask); } @@ -678,7 +735,7 @@ open_files(void) fprintf(graph_file, "\t*/\n"); } - if (dflag) + if (dflag || dflag2) { defines_file = fopen(defines_file_name, "w"); if (defines_file == 0) |