/* Open and close files for bison,
- Copyright (C) 1984, 1986, 1989 Free Software Foundation, Inc.
+ Copyright (C) 1984, 1986, 1989, 1992 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
-#ifdef VMS
+#if defined (VMS) & !defined (__VMS_POSIX)
#include <ssdef.h>
#define unlink delete
#ifndef XPFILE
#endif
#endif
+#if defined (_MSC_VER)
+#ifndef XPFILE
+#define XPFILE "c:/usr/local/lib/bison.simple"
+#endif
+#ifndef XPFILE1
+#define XPFILE1 "c:/usr/local/lib/bison.hairy"
+#endif
+#endif
+
#include <stdio.h>
#include "system.h"
#include "files.h"
-#include "new.h"
+#include "alloc.h"
#include "gram.h"
FILE *finput = NULL;
char *tmptabfile;
char *tmpdefsfile;
+extern int noparserflag;
+
extern char *mktemp(); /* So the compiler won't complain */
extern char *getenv();
extern void perror();
-FILE *tryopen(); /* This might be a good idea */
-void done();
+
+char *stringappend PARAMS((char *, int, char *));
+void openfiles PARAMS((void));
+void open_extra_files PARAMS((void));
+FILE *tryopen PARAMS((char *, char *)); /* This might be a good idea */
+void done PARAMS((int));
extern char *program_name;
extern int verboseflag;
int fixed_outfiles = 0;
\f
-char*
-stringappend(string1, end1, string2)
-char *string1;
-int end1;
-char *string2;
+char *
+stringappend (char *string1, int end1, char *string2)
{
register char *ostring;
register char *cp, *cp1;
*cp++ = *cp1++;
cp1 = string2;
- while (*cp++ = *cp1++) ;
+ while ((*cp++ = *cp1++))
+ ;
return ostring;
}
/* JF this has been hacked to death. Nowaday it sets up the file names for
the output files, and opens the tmp files and the parser */
void
-openfiles()
+openfiles (void)
{
char *name_base;
register char *cp;
int base_length;
int short_base_length;
-#ifdef VMS
+#if defined (VMS) & !defined (__VMS_POSIX)
char *tmp_base = "sys$scratch:b_";
#else
char *tmp_base = "/tmp/b.";
strlwr (infile);
#endif /* MSDOS */
+#if (defined(_WIN32) && !defined(__CYGWIN32__))
+ tmp_base = getenv ("TEMP"); /* Windows95 defines this ... */
+ if (tmp_base == 0)
+ tmp_base = getenv ("Temp"); /* ... while NT prefers this */
+ if (tmp_base == 0)
+ tmp_base = "";
+ strlwr (infile);
+#endif /* _WIN32 && !__CYGWIN32__ */
+
+#if (defined(unix) || defined(__unix) || defined(__unix__))
+ {
+ char *tmp_ptr = getenv("TMPDIR");
+
+ if (tmp_ptr != 0)
+ tmp_base = stringappend (tmp_ptr, strlen (tmp_ptr), "/b.");
+ }
+#endif /* unix || __unix || __unix__ */
+
tmp_len = strlen (tmp_base);
if (spec_outfile)
short_base_length = strlen (spec_file_prefix);
/* Count room for `.tab'. */
base_length = short_base_length + 4;
- name_base = (char *) mallocate (base_length + 1);
+ name_base = (char *) xmalloc (base_length + 1);
/* Append `.tab'. */
strcpy (name_base, spec_file_prefix);
#ifdef VMS
finput = tryopen(infile, "r");
- filename = getenv("BISON_SIMPLE");
-#ifdef MSDOS
- /* File doesn't exist in current directory; try in INIT directory. */
- cp = getenv("INIT");
- if (filename == 0 && cp != 0)
+ if (! noparserflag)
{
- filename = malloc(strlen(cp) + strlen(PFILE) + 2);
- strcpy(filename, cp);
- cp = filename + strlen(filename);
- *cp++ = '/';
- strcpy(cp, PFILE);
- }
+ filename = getenv("BISON_SIMPLE");
+#ifdef MSDOS
+ /* File doesn't exist in current directory; try in INIT directory. */
+ cp = getenv("INIT");
+ if (filename == 0 && cp != NULL)
+ {
+ filename = xmalloc(strlen(cp) + strlen(PFILE) + 2);
+ strcpy(filename, cp);
+ cp = filename + strlen(filename);
+ *cp++ = '/';
+ strcpy(cp, PFILE);
+ }
#endif /* MSDOS */
- fparser = tryopen(filename ? filename : PFILE, "r");
+ fparser = tryopen(filename ? filename : PFILE, "r");
+ }
if (verboseflag)
{
foutput = tryopen(outfile, "w");
}
+ if (noparserflag)
+ {
+ /* use permanent name for actions file */
+ actfile = stringappend(name_base, short_base_length, ".act");
+ faction = tryopen(actfile, "w");
+ }
+
#ifdef MSDOS
- actfile = mktemp(stringappend(tmp_base, tmp_len, "acXXXXXX"));
+ if (! noparserflag)
+ actfile = mktemp(stringappend(tmp_base, tmp_len, "acXXXXXX"));
tmpattrsfile = mktemp(stringappend(tmp_base, tmp_len, "atXXXXXX"));
tmptabfile = mktemp(stringappend(tmp_base, tmp_len, "taXXXXXX"));
tmpdefsfile = mktemp(stringappend(tmp_base, tmp_len, "deXXXXXX"));
#else
- actfile = mktemp(stringappend(tmp_base, tmp_len, "act.XXXXXX"));
+ if (! noparserflag)
+ actfile = mktemp(stringappend(tmp_base, tmp_len, "act.XXXXXX"));
tmpattrsfile = mktemp(stringappend(tmp_base, tmp_len, "attrs.XXXXXX"));
tmptabfile = mktemp(stringappend(tmp_base, tmp_len, "tab.XXXXXX"));
tmpdefsfile = mktemp(stringappend(tmp_base, tmp_len, "defs.XXXXXX"));
#endif /* not MSDOS */
- faction = tryopen(actfile, "w+");
+ if (! noparserflag)
+ faction = tryopen(actfile, "w+");
fattrs = tryopen(tmpattrsfile,"w+");
ftable = tryopen(tmptabfile, "w+");
fdefines = tryopen(tmpdefsfile, "w+");
}
-#ifndef MSDOS
- unlink(actfile);
+#if !(defined (MSDOS) || (defined(_WIN32) && !defined(__CYGWIN32__)))
+ if (! noparserflag)
+ unlink(actfile);
unlink(tmpattrsfile);
unlink(tmptabfile);
unlink(tmpdefsfile);
-#endif
+#endif /* MSDOS || (_WIN32 && !__CYGWIN32__) */
/* These are opened by `done' or `open_extra_files', if at all */
if (spec_outfile)
This is done when %semantic_parser is seen in the declarations section. */
void
-open_extra_files()
+open_extra_files (void)
{
FILE *ftmp;
int c;
char *filename, *cp;
- fclose(fparser);
+ if (fparser)
+ fclose(fparser);
- filename = (char *) getenv ("BISON_HAIRY");
-#ifdef MSDOS
- /* File doesn't exist in current directory; try in INIT directory. */
- cp = getenv("INIT");
- if (filename == 0 && cp != 0)
+ if (! noparserflag)
{
- filename = malloc(strlen(cp) + strlen(PFILE1) + 2);
- strcpy(filename, cp);
- cp = filename + strlen(filename);
- *cp++ = '/';
- strcpy(cp, PFILE1);
- }
+ filename = (char *) getenv ("BISON_HAIRY");
+#ifdef MSDOS
+ /* File doesn't exist in current directory; try in INIT directory. */
+ cp = getenv("INIT");
+ if (filename == 0 && cp != NULL)
+ {
+ filename = xmalloc(strlen(cp) + strlen(PFILE1) + 2);
+ strcpy(filename, cp);
+ cp = filename + strlen(filename);
+ *cp++ = '/';
+ strcpy(cp, PFILE1);
+ }
#endif
- fparser= tryopen(filename ? filename : PFILE1, "r");
+ fparser= tryopen(filename ? filename : PFILE1, "r");
+ }
/* JF change from inline attrs file to separate one */
ftmp = tryopen(attrsfile, "w");
/* JF to make file opening easier. This func tries to open file
NAME with mode MODE, and prints an error message if it fails. */
FILE *
-tryopen(name, mode)
-char *name;
-char *mode;
+tryopen (char *name, char *mode)
{
FILE *ptr;
}
void
-done(k)
-int k;
+done (int k)
{
if (faction)
fclose(faction);
}
}
-#ifdef VMS
- if (faction)
+#if defined (VMS) & !defined (__VMS_POSIX)
+ if (faction && ! noparserflag)
delete(actfile);
if (fattrs)
delete(tmpattrsfile);
if (k==0) sys$exit(SS$_NORMAL);
sys$exit(SS$_ABORT);
#else
-#ifdef MSDOS
- if (actfile) unlink(actfile);
+#if (defined (MSDOS) || (defined(_WIN32) && !defined(__CYGWIN32__)))
+ if (actfile && ! noparserflag) unlink(actfile);
if (tmpattrsfile) unlink(tmpattrsfile);
if (tmptabfile) unlink(tmptabfile);
if (tmpdefsfile) unlink(tmpdefsfile);
-#endif /* MSDOS */
+#endif /* MSDOS || (_WIN32 && !__CYGWIN32__) */
exit(k);
-#endif /* not VMS */
+#endif /* not VMS, or __VMS_POSIX */
}