]> git.saurik.com Git - bison.git/blobdiff - src/files.c
Add `po' directory skeleton.
[bison.git] / src / files.c
index 020111f51038c99159c8bac64d7823b1f3867746..348900fe54d414a76aa39a628d9495ca64c6cf28 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.
 
@@ -15,7 +15,8 @@ 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.  */
 
 
 #if defined (VMS) & !defined (__VMS_POSIX)
@@ -29,10 +30,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 +68,18 @@ 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 */
+int tryclose PARAMS((FILE *));
+void done PARAMS((int));
 
 extern char *program_name;
 extern int verboseflag;
@@ -70,11 +87,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 +105,8 @@ char *string2;
     *cp++ = *cp1++;
 
   cp1 = string2;
-  while (*cp++ = *cp1++) ;
+  while ((*cp++ = *cp1++))
+    ;
 
   return ostring;
 }
@@ -100,10 +115,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;
@@ -122,6 +139,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)
@@ -190,20 +225,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 != NULL)
+  if (! noparserflag) 
     {
-      filename = xmalloc(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 +255,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 +287,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,35 +321,41 @@ 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
 
-  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 != NULL)
+  if (! noparserflag) 
     {
-      filename = xmalloc(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");
@@ -310,9 +365,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;
 
@@ -326,27 +379,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)
@@ -358,8 +417,8 @@ int k;
       rewind(ftable);
       while((c=getc(ftable)) != EOF)
         putc(c,ftmp);
-      fclose(ftmp);
-      fclose(ftable);
+      tryclose(ftmp);
+      tryclose(ftable);
 
       if (definesflag)
         {
@@ -368,13 +427,13 @@ int k;
           rewind(fdefines);
           while((c=getc(fdefines)) != EOF)
             putc(c,ftmp);
-          fclose(ftmp);
-          fclose(fdefines);
+          tryclose(ftmp);
+          tryclose(fdefines);
         }
     }
 
 #if defined (VMS) & !defined (__VMS_POSIX)
-  if (faction)
+  if (faction && ! noparserflag)
     delete(actfile);
   if (fattrs)
     delete(tmpattrsfile);
@@ -383,12 +442,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, or __VMS_POSIX */
 }