]> git.saurik.com Git - bison.git/blobdiff - src/files.c
* src/atgeneral.m4: Update from Autoconf.
[bison.git] / src / files.c
index 020111f51038c99159c8bac64d7823b1f3867746..b7f168a3d76ca7b005ed5a16e203797e7f95c7d3 100644 (file)
@@ -1,39 +1,51 @@
 /* Open and close files for bison,
-   Copyright (C) 1984, 1986, 1989 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1986, 1989, 1992, 2000 Free Software Foundation, Inc.
 
-This file is part of Bison, the GNU Compiler Compiler.
+   This file is part of Bison, the GNU Compiler Compiler.
 
-Bison is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+   Bison is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
 
-Bison is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   Bison is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 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.  */
+   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, Inc., 59 Temple Place - Suite 330, Boston, MA
+   02111-1307, USA.  */
 
 
+#include "system.h"
+
 #if defined (VMS) & !defined (__VMS_POSIX)
-#include <ssdef.h>
-#define unlink delete
-#ifndef XPFILE
-#define XPFILE "GNU_BISON:[000000]BISON.SIMPLE"
-#endif
-#ifndef XPFILE1
-#define XPFILE1 "GNU_BISON:[000000]BISON.HAIRY"
+# include <ssdef.h>
+# define unlink delete
+# ifndef XPFILE
+#  define XPFILE "GNU_BISON:[000000]BISON.SIMPLE"
+# endif
+# ifndef XPFILE1
+#  define XPFILE1 "GNU_BISON:[000000]BISON.HAIRY"
+# 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 "getargs.h"
 #include "files.h"
-#include "new.h"
+#include "alloc.h"
 #include "gram.h"
+#include "complain.h"
 
 FILE *finput = NULL;
 FILE *foutput = NULL;
@@ -48,40 +60,40 @@ FILE *fparser = NULL;
 char *spec_outfile;
 
 char *infile;
-char *outfile;
-char *defsfile;
-char *tabfile;
 char *attrsfile;
-char *guardfile;
-char *actfile;
-char *tmpattrsfile;
-char *tmptabfile;
-char *tmpdefsfile;
+
+static char *outfile;
+static char *defsfile;
+static char *tabfile;
+static char *guardfile;
+static char *actfile;
+static char *tmpattrsfile;
+static char *tmptabfile;
+static char *tmpdefsfile;
 
 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();
 
-extern char *program_name;
-extern int verboseflag;
-extern int definesflag;
+extern char *stringappend PARAMS((const char *, int, const char *));
+extern void openfiles PARAMS((void));
+extern void open_extra_files PARAMS((void));
+
 int fixed_outfiles = 0;
+
+extern char *program_name;
 \f
 
-char*
-stringappend(string1, end1, string2)
-char *string1;
-int end1;
-char *string2;
+char *
+stringappend (const char *string1, int end1, const char *string2)
 {
   register char *ostring;
-  register char *cp, *cp1;
+  register char *cp;
+  register const char *cp1;
   register int i;
 
-  cp = string2;  i = 0;
-  while (*cp++) i++;
+  cp1 = string2;
+  i = 0;
+  while (*cp1++) i++;
 
   ostring = NEW2(i+end1+1, char);
 
@@ -91,27 +103,65 @@ char *string2;
     *cp++ = *cp1++;
 
   cp1 = string2;
-  while (*cp++ = *cp1++) ;
+  while ((*cp++ = *cp1++))
+    ;
 
   return ostring;
 }
 
+/*-----------------------------------------------------------------.
+| Try to open file NAME with mode MODE, and print an error message |
+| if fails.                                                        |
+`-----------------------------------------------------------------*/
+
+static FILE *
+tryopen (const char *name, const char *mode)
+{
+  FILE *ptr;
+
+  ptr = fopen (name, mode);
+  if (!ptr)
+    error (2, errno, _("cannot open file `%s'"), name);
+
+  return ptr;
+}
 
+/*-------------------------------------------------------------.
+| Try to close file PTR, and print an error message if fails.  |
+`-------------------------------------------------------------*/
+
+static int
+tryclose (FILE *ptr)
+{
+  int result;
+
+  if (ptr == NULL)
+    return 0;
+
+  result = fclose (ptr);
+  if (result == EOF)
+    error (2, errno, _("cannot close file"));
+
+  return result;
+}
+\f
 /* 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;
 
 #if defined (VMS) & !defined (__VMS_POSIX)
-  char *tmp_base = "sys$scratch:b_";
+  const char *tmp_base = "sys$scratch:b_";
 #else
-  char *tmp_base = "/tmp/b.";
+  const char *tmp_base = "/tmp/b.";
 #endif
   int tmp_len;
 
@@ -122,6 +172,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)
@@ -167,7 +235,9 @@ openfiles()
       /* -o was not specified; compute output file name from input
         or use y.tab.c, etc., if -y was specified.  */
 
-      name_base = fixed_outfiles ? "y.y" : infile;
+      static char FIXED_NAME_BASE[] = "y.y";
+
+      name_base = fixed_outfiles ? FIXED_NAME_BASE : infile;
 
       /* BASE_LENGTH gets length of NAME_BASE, sans ".y" suffix if any.  */
 
@@ -190,20 +260,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 +290,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 +322,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)
@@ -268,88 +352,65 @@ openfiles()
 
 
 
-/* open the output files needed only for the semantic parser.
-This is done when %semantic_parser is seen in the declarations section.  */
+/*--------------------------------------------------------------------.
+| Open the output files needed only for the semantic parser.  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");
 
 }
 
-       /* 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;
-{
-  FILE *ptr;
-
-  ptr = fopen(name, mode);
-  if (ptr == NULL)
-    {
-      fprintf(stderr, "%s: ", program_name);
-      perror(name);
-      done(2);
-    }
-  return ptr;
-}
-
 void
-done(k)
-int k;
+done (void)
 {
-  if (faction)
-    fclose(faction);
-
-  if (fattrs)
-    fclose(fattrs);
-
-  if (fguard)
-    fclose(fguard);
-
-  if (finput)
-    fclose(finput);
-
-  if (fparser)
-    fclose(fparser);
-
-  if (foutput)
-    fclose(foutput);
-
-       /* JF write out the output file */
-  if (k == 0 && ftable)
+  tryclose(faction);
+  tryclose(fattrs);
+  tryclose(fguard);
+  tryclose(finput);
+  tryclose(fparser);
+  tryclose(foutput);
+
+  /* JF write out the output file */
+  if (!complain_message_count && ftable)
     {
       FILE *ftmp;
       register int c;
@@ -358,8 +419,8 @@ int k;
       rewind(ftable);
       while((c=getc(ftable)) != EOF)
         putc(c,ftmp);
-      fclose(ftmp);
-      fclose(ftable);
+      tryclose(ftmp);
+      tryclose(ftable);
 
       if (definesflag)
         {
@@ -368,27 +429,30 @@ 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);
   if (ftable)
     delete(tmptabfile);
-  if (k==0) sys$exit(SS$_NORMAL);
-  sys$exit(SS$_ABORT);
+/* Don't call exit again, we're in atexit ().
+  if (!complain_message_count)
+    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 */
-  exit(k);
+#endif /* MSDOS || (_WIN32 && !__CYGWIN32__) */
+/* Don't call exit again, we're in atexit ().
+  exit (complain_message_count ? 1 : 0); */
 #endif /* not VMS, or __VMS_POSIX */
 }