X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/7612000cb004ae5b8516e3a34a79ab32050d688e..adf5fa13182bed417c720b2602215d7785b45c70:/src/files.c?ds=sidebyside diff --git a/src/files.c b/src/files.c index 1df92ec3..e8556a25 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,7 +42,11 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #endif #include -#include "system.h" + +#ifdef HAVE_UNISTD_H +#include +#endif + #include "files.h" #include "alloc.h" #include "gram.h" @@ -72,8 +79,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 +93,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 +111,8 @@ char *string2; *cp++ = *cp1++; cp1 = string2; - while (*cp++ = *cp1++) ; + while ((*cp++ = *cp1++)) + ; return ostring; } @@ -111,10 +121,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 +145,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__) || 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) @@ -263,13 +293,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 +327,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 +361,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 +371,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 +385,33 @@ char *mode; 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) @@ -387,8 +423,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 +433,8 @@ int k; rewind(fdefines); while((c=getc(fdefines)) != EOF) putc(c,ftmp); - fclose(ftmp); - fclose(fdefines); + tryclose(ftmp); + tryclose(fdefines); } } @@ -412,12 +448,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 */ }