X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/6a5705cfe86144c3c1e6b25b6ffcc38a4dd6ccb2..e569a4351ce32cf9809c68a711d3aaa19c7aba9f:/src/files.c diff --git a/src/files.c b/src/files.c index b69e2aa6..f227685e 100644 --- a/src/files.c +++ b/src/files.c @@ -15,9 +15,12 @@ GNU General Public License for more details. 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. */ +#include "system.h" + #if defined (VMS) & !defined (__VMS_POSIX) #include #define unlink delete @@ -39,9 +42,8 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #endif #include -#include "system.h" #include "files.h" -#include "new.h" +#include "alloc.h" #include "gram.h" FILE *finput = NULL; @@ -72,8 +74,13 @@ 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; @@ -81,11 +88,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; @@ -102,7 +106,8 @@ char *string2; *cp++ = *cp1++; cp1 = string2; - while (*cp++ = *cp1++) ; + while ((*cp++ = *cp1++)) + ; return ostring; } @@ -111,10 +116,12 @@ 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; +#ifdef MSDOS register char *cp; +#endif char *filename; int base_length; int short_base_length; @@ -133,6 +140,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) @@ -263,13 +288,13 @@ openfiles() fdefines = tryopen(tmpdefsfile, "w+"); } -#ifndef MSDOS +#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) @@ -297,14 +322,16 @@ 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; + char *filename; +#ifdef MSDOS + char *cp; +#endif - if (fparser) - fclose(fparser); + tryclose(fparser); if (! noparserflag) { @@ -329,7 +356,7 @@ open_extra_files() rewind(fattrs); while((c=getc(fattrs))!=EOF) /* Thank god for buffering */ putc(c,ftmp); - fclose(fattrs); + tryclose(fattrs); fattrs=ftmp; fguard = tryopen(guardfile, "w"); @@ -339,9 +366,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; @@ -355,27 +380,33 @@ char *mode; return ptr; } -void -done(k) -int k; +int +tryclose (FILE *ptr) { - if (faction) - fclose(faction); + int result; - if (fattrs) - fclose(fattrs); - - if (fguard) - fclose(fguard); - - 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) @@ -387,8 +418,8 @@ int k; rewind(ftable); while((c=getc(ftable)) != EOF) putc(c,ftmp); - fclose(ftmp); - fclose(ftable); + tryclose(ftmp); + tryclose(ftable); if (definesflag) { @@ -397,8 +428,8 @@ int k; rewind(fdefines); while((c=getc(fdefines)) != EOF) putc(c,ftmp); - fclose(ftmp); - fclose(fdefines); + tryclose(ftmp); + tryclose(fdefines); } } @@ -412,12 +443,12 @@ int k; if (k==0) sys$exit(SS$_NORMAL); sys$exit(SS$_ABORT); #else -#ifdef MSDOS +#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, or __VMS_POSIX */ }