X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/54bd0db43634c649d13e175384e6e816c44a34d4..a889d44ce266967929df697d1ce264547ac98d9a:/src/files.c diff --git a/src/files.c b/src/files.c index 00342429..ba51cce4 100644 --- a/src/files.c +++ b/src/files.c @@ -1,5 +1,5 @@ /* 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. @@ -18,7 +18,7 @@ along with Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ -#ifdef VMS +#if defined (VMS) & !defined (__VMS_POSIX) #include #define unlink delete #ifndef XPFILE @@ -29,10 +29,19 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #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 #include "system.h" #include "files.h" -#include "new.h" +#include "alloc.h" #include "gram.h" FILE *finput = NULL; @@ -58,11 +67,17 @@ char *tmpattrsfile; 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; @@ -70,11 +85,8 @@ extern int definesflag; int fixed_outfiles = 0; -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; @@ -91,7 +103,8 @@ char *string2; *cp++ = *cp1++; cp1 = string2; - while (*cp++ = *cp1++) ; + while ((*cp++ = *cp1++)) + ; return ostring; } @@ -100,7 +113,7 @@ char *string2; /* 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; @@ -108,7 +121,7 @@ openfiles() 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."; @@ -122,6 +135,24 @@ openfiles() 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) @@ -150,7 +181,7 @@ openfiles() 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 @@ -190,20 +221,23 @@ openfiles() 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) { @@ -217,19 +251,29 @@ openfiles() 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+"); @@ -239,12 +283,13 @@ openfiles() 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) @@ -272,28 +317,32 @@ openfiles() 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"); @@ -310,9 +359,7 @@ open_extra_files() /* 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; @@ -327,8 +374,7 @@ char *mode; } void -done(k) -int k; +done (int k) { if (faction) fclose(faction); @@ -373,8 +419,8 @@ int k; } } -#ifdef VMS - if (faction) +#if defined (VMS) & !defined (__VMS_POSIX) + if (faction && ! noparserflag) delete(actfile); if (fattrs) delete(tmpattrsfile); @@ -383,12 +429,12 @@ int k; 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 */ }