summaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'main.c')
-rw-r--r--main.c105
1 files changed, 81 insertions, 24 deletions
diff --git a/main.c b/main.c
index 9a8099c5ec2ec..20a93c26bbd2c 100644
--- a/main.c
+++ b/main.c
@@ -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)