/* 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.
You should have received a copy of the GNU General Public License
along with Bison; see the file COPYING. If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
-#ifdef VMS
+#include "system.h"
+
+#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"
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
#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 */
+int tryclose PARAMS((FILE *));
+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;
+#ifdef MSDOS
register char *cp;
+#endif
char *filename;
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__) || defined(__EMX__))
+ {
+ 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;
+ char *filename;
+#ifdef MSDOS
+ char *cp;
+#endif
- fclose(fparser);
+ tryclose(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");
rewind(fattrs);
while((c=getc(fattrs))!=EOF) /* Thank god for buffering */
putc(c,ftmp);
- fclose(fattrs);
+ tryclose(fattrs);
fattrs=ftmp;
fguard = tryopen(guardfile, "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;
return ptr;
}
-void
-done(k)
-int k;
+int
+tryclose (FILE *ptr)
{
- if (faction)
- fclose(faction);
-
- if (fattrs)
- fclose(fattrs);
-
- if (fguard)
- fclose(fguard);
+ int result;
- if (finput)
- fclose(finput);
+ if (ptr == NULL)
+ return 0;
- if (fparser)
- fclose(fparser);
+ result = fclose (ptr);
+ if (result == EOF)
+ {
+ fprintf (stderr, "%s: ", program_name);
+ perror ("fclose");
+ done (2);
+ }
+ return result;
+}
- if (foutput)
- fclose(foutput);
+void
+done (int k)
+{
+ tryclose(faction);
+ tryclose(fattrs);
+ tryclose(fguard);
+ tryclose(finput);
+ tryclose(fparser);
+ tryclose(foutput);
/* JF write out the output file */
if (k == 0 && ftable)
rewind(ftable);
while((c=getc(ftable)) != EOF)
putc(c,ftmp);
- fclose(ftmp);
- fclose(ftable);
+ tryclose(ftmp);
+ tryclose(ftable);
if (definesflag)
{
rewind(fdefines);
while((c=getc(fdefines)) != EOF)
putc(c,ftmp);
- fclose(ftmp);
- fclose(fdefines);
+ tryclose(ftmp);
+ tryclose(fdefines);
}
}
-#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 */
}