-/* $Id: main.c,v 1.35 2010/12/27 01:21:59 tom Exp $ */
+/* $Id: main.c,v 1.39 2012/05/26 00:50:20 tom Exp $ */
#include <signal.h>
#include <unistd.h> /* for _exit() */
char dflag;
char gflag;
+char iflag;
char lflag;
static char oflag;
char rflag;
+char sflag;
char tflag;
char vflag;
char *code_file_name;
char *input_file_name = empty_string;
-static char *defines_file_name;
+char *defines_file_name;
+char *externs_file_name;
+
static char *graph_file_name;
static char *output_file_name;
static char *verbose_file_name;
/* with rules until the parser is written */
FILE *code_file; /* y.code.c (used when the -r option is specified) */
FILE *defines_file; /* y.tab.h */
+FILE *externs_file; /* y.tab.i */
FILE *input_file; /* the input file */
FILE *output_file; /* y.tab.c */
FILE *text_file; /* a temp file, used to save text until all */
if (dflag)
DO_FREE(defines_file_name);
+ if (iflag)
+ DO_FREE(externs_file_name);
+
if (oflag)
DO_FREE(output_file_name);
,"Options:"
," -b file_prefix set filename prefix (default \"y.\")"
," -d write definitions (y.tab.h)"
+ ," -i write interface (y.tab.i)"
," -g write a graphical description"
," -l suppress #line directives"
," -o output_file (default \"y.tab.c\")"
," -p symbol_prefix set symbol prefix (default \"yy\")"
," -P create a reentrant parser, e.g., \"%pure-parser\""
," -r produce separate code and table files (y.code.c)"
+ ," -s suppress #define's for quoted names in %token lines"
," -t add debugging support"
," -v write description (y.output)"
," -V show version information and exit"
gflag = 1;
break;
+ case 'i':
+ iflag = 1;
+ break;
+
case 'l':
lflag = 1;
break;
rflag = 1;
break;
+ case 's':
+ sflag = 1;
+ break;
+
case 't':
tflag = 1;
break;
}
#define CREATE_FILE_NAME(dest, suffix) \
- dest = MALLOC(len + strlen(suffix) + 1); \
+ dest = TMALLOC(char, len + strlen(suffix) + 1); \
NO_SPACE(dest); \
strcpy(dest, file_prefix); \
strcpy(dest + len, suffix)
{
size_t len;
const char *defines_suffix;
+ const char *externs_suffix;
char *prefix;
prefix = NULL;
defines_suffix = DEFINES_SUFFIX;
+ externs_suffix = EXTERNS_SUFFIX;
/* compute the file_prefix from the user provided output_file_name */
if (output_file_name != 0)
{
if (!(prefix = strstr(output_file_name, ".tab.c"))
&& (prefix = strstr(output_file_name, ".c")))
+ {
defines_suffix = ".h";
+ externs_suffix = ".i";
+ }
}
if (prefix != NULL)
{
len = (size_t) (prefix - output_file_name);
- file_prefix = (char *)MALLOC(len + 1);
+ file_prefix = TMALLOC(char, len + 1);
NO_SPACE(file_prefix);
strncpy(file_prefix, output_file_name, len)[len] = 0;
}
CREATE_FILE_NAME(defines_file_name, defines_suffix);
}
+ if (iflag)
+ {
+ CREATE_FILE_NAME(externs_file_name, externs_suffix);
+ }
+
if (vflag)
{
CREATE_FILE_NAME(verbose_file_name, VERBOSE_SUFFIX);
union_file = open_tmpfile("union_file");
}
+ if (iflag)
+ {
+ externs_file = fopen(externs_file_name, "w");
+ if (externs_file == 0)
+ open_error(externs_file_name);
+ }
+
output_file = fopen(output_file_name, "w");
if (output_file == 0)
open_error(output_file_name);