]> git.saurik.com Git - bison.git/blobdiff - src/files.c
Use prototypes if the compiler understands them.
[bison.git] / src / files.c
index 00342429f4602efb0eddbdd683ba13e9fbdf77ed..ba51cce48e900d61ff34039f84d0b7594a5ca4d5 100644 (file)
@@ -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 <ssdef.h>
 #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 <stdio.h>
 #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;
 \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;
@@ -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 */
 }