]> andersk Git - splint.git/blobdiff - src/fileTable.c
Fixed pre-processing bug reported by Adam Clarke. Moved marking point
[splint.git] / src / fileTable.c
index 98daa02fe6fc6e52f4b9123148e1007be5d9dc70..dd04efccdf2efb73da0e99219f9133351bfe3572 100644 (file)
  * - Added conditional stuff (#define and #include) for IBM's compiler.
  */
 
+# include <sys/types.h>
+# include <sys/stat.h>
+# include <fcntl.h>
 # include "splintMacros.nf"
 # include "llbasic.h"
 # include "osd.h"
 # include "llmain.h"
 # include "portab.h"
+
 # if defined(__IBMC__) && defined(OS2)
 # include <process.h>
+# include <io.h>
 # define getpid _getpid
+# define S_IRUSR S_IREAD
+# define S_IWUSR S_IWRITE 
+# define S_IXUSR S_IEXEC
 # endif
 
 /*@access fileId*/
@@ -93,6 +101,12 @@ fileTable_getIndex (fileTable ft, cstring s)
   cstring abspath;
   if (ft == NULL) return NOT_FOUND;
   abspath = osd_absolutePath (cstring_undefined, s);
+  
+  if (context_getFlag (FLG_CASEINSENSITIVEFILENAMES))
+    {
+      abspath = cstring_downcase (abspath);
+    }
+
   DPRINTF (("Absolute path: %s: %s", s, abspath));
   res = cstringTable_lookup (ft->htable, abspath);
   cstring_free (abspath);
@@ -269,7 +283,18 @@ fileTable_internAddEntry (fileTable ft, /*@only@*/ ftentry e)
   ft->nspace--;
 
   DPRINTF (("Adding: %s", e->fname));
-  cstringTable_insert (ft->htable, e->fname, ft->nentries);
+
+  if (context_getFlag (FLG_CASEINSENSITIVEFILENAMES))
+    {
+      cstring sd = cstring_downcase (e->fname);
+      cstringTable_insert (ft->htable, sd, ft->nentries);
+      cstring_free (e->fname);
+    }
+  else
+    {
+      cstringTable_insert (ft->htable, e->fname, ft->nentries); 
+    }
+
   ft->elements[ft->nentries] = e;
 
   ft->nentries++;
@@ -299,7 +324,7 @@ fileTable_addFilePrim (fileTable ft, /*@temp@*/ cstring name,
   cstring absname = osd_absolutePath (NULL, name);
   int tindex = fileTable_getIndex (ft, absname);
   
-  DPRINTF (("Got abs path: %s", absname));
+  /*@i534 fprintf (stderr, "Got abs path: %s", absname); */
   llassert (ft != fileTable_undefined);
 
   if (tindex != NOT_FOUND)
@@ -636,7 +661,18 @@ fileTable_setFilePath (fileTable ft, fileId fid, cstring path)
 fileId
 fileTable_lookupBase (fileTable ft, cstring base)
 {
-  int tindex = fileTable_getIndex (ft, base);
+  int tindex;
+
+  if (context_getFlag (FLG_CASEINSENSITIVEFILENAMES))
+    {
+      cstring dbase = cstring_downcase (base);
+      tindex = fileTable_getIndex (ft, dbase);
+      cstring_free (dbase);
+    }
+  else
+    {
+      tindex = fileTable_getIndex (ft, base);
+    }
 
   if (tindex == NOT_FOUND)
     {
@@ -773,7 +809,7 @@ fileTable_cleanup (fileTable ft)
   if (msg)
     {
       (void) fflush (g_warningstream);
-      fprintf (stderr, "< cleaning");
+      displayScanOpen (cstring_makeLiteral ("cleaning"));
     }
 
   for (i = 0; i < ft->nentries; i++)
@@ -815,21 +851,13 @@ fileTable_cleanup (fileTable ft)
 
       if (msg && ((i % skip) == 0))
        {
-         (void) fflush (g_warningstream);
-
-         if (i == 0) {
-           fprintf (stderr, " ");
-         } else {
-           fprintf (stderr, ".");
-         }
-
-         (void) fflush (stderr);
+         displayScanContinue (cstring_makeLiteral (i == 0 ? " " : "."));
        }
     }
-  
+
   if (msg)
     {
-      fprintf (stderr, " >\n");
+      displayScanClose ();
     }
 }
 
@@ -948,7 +976,6 @@ static /*@only@*/ cstring makeTempName (cstring dir, cstring pre, cstring suf)
       smsg = message ("%s%s%s%s%s", dir, pre, pidname, cstring_fromChars (msg), suf);
       nextMsg (msg);
     }
-  
 
   return smsg;
 }
@@ -984,9 +1011,106 @@ fileTable_addOpen (fileTable ft, /*@observer@*/ FILE *f, /*@only@*/ cstring fnam
   ft->nopen++;
 }
 
-FILE *fileTable_openFile (fileTable ft, cstring fname, char *mode)
+FILE *fileTable_createFile (fileTable ft, cstring fname)
 {
-  FILE *res = fopen (cstring_toCharsSafe (fname), mode);
+  int fdesc = open (cstring_toCharsSafe (fname), O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, S_IRUSR | S_IWUSR);
+
+  if (fdesc == -1)
+    {
+      osd_setTempError ();
+      llfatalerror (message ("Temporary file for "
+                            "pre-processor output already exists.  Trying to "
+                            "open: %s.",
+                            fname));
+
+      /*@notreached@*/ return NULL;
+    }
+  else
+    {
+      FILE *res = fdopen (fdesc, "w");
+  
+      if (res != NULL) 
+       {
+         fileTable_addOpen (ft, res, cstring_copy (fname));
+         DPRINTF (("Opening file: %s / %p", fname, res));
+       }
+      else
+       {
+         DPRINTF (("Error opening: %s", fname));
+       }
+
+      return res;
+    }
+}
+
+FILE *fileTable_createMacrosFile (fileTable ft, cstring fname)
+{
+  int fdesc = open (cstring_toCharsSafe (fname), O_RDWR | O_CREAT | O_TRUNC | O_EXCL, S_IRUSR | S_IWUSR);
+
+  if (fdesc == -1)
+    {
+      osd_setTempError ();
+      llfatalerror (message ("Temporary file for "
+                            "pre-processor output already exists.  Trying to "
+                            "open: %s.",
+                            fname));
+
+      /*@notreached@*/ return NULL;
+    }
+  else
+    {
+      FILE *res = fdopen (fdesc, "w+");
+  
+      if (res != NULL) 
+       {
+         fileTable_addOpen (ft, res, cstring_copy (fname));
+         DPRINTF (("Opening file: %s / %p", fname, res));
+       }
+      else
+       {
+         DPRINTF (("Error opening: %s", fname));
+       }
+
+      return res;
+    }
+}
+
+FILE *fileTable_openReadFile (fileTable ft, cstring fname)
+{
+  FILE *res = fopen (cstring_toCharsSafe (fname), "r");
+
+  if (res != NULL) 
+    {
+      fileTable_addOpen (ft, res, cstring_copy (fname));
+      DPRINTF (("Opening read file: %s / %p", fname, res));
+    }
+  else
+    {
+      DPRINTF (("Cannot open read file: %s", fname));
+    }
+
+  return res;
+}
+
+/*
+** Allows overwriting
+*/
+
+FILE *fileTable_openWriteFile (fileTable ft, cstring fname)
+{
+  FILE *res = fopen (cstring_toCharsSafe (fname), "w");
+
+  if (res != NULL) {
+    fileTable_addOpen (ft, res, cstring_copy (fname));
+    DPRINTF (("Opening file: %s / %p", fname, res));
+  }
+
+  return res;
+}
+
+FILE *fileTable_openWriteUpdateFile (fileTable ft, cstring fname)
+{
+  FILE *res = fopen (cstring_toCharsSafe (fname), "w+");
 
   if (res != NULL) {
     fileTable_addOpen (ft, res, cstring_copy (fname));
@@ -1010,7 +1134,7 @@ bool fileTable_closeFile (fileTable ft, FILE *f)
       if (ft->openelements[i]->f == f)
        {
          DPRINTF (("Closing file: %p = %s", f, ft->openelements[i]->fname));
-
+         
          if (i == ft->nopen - 1)
            {
              foentry_free (ft->openelements[i]);
This page took 0.050613 seconds and 4 git commands to generate.