]> andersk Git - splint.git/blobdiff - src/fileloc.c
Making fixes for Microsoft Visual C++ compiler.
[splint.git] / src / fileloc.c
index 729c633debbf41413e101988bca191d1ab16724b..461659bac6e8867773476dd35612fa9dc29edf61 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** Splint - annotation-assisted static program checker
-** Copyright (C) 1994-2002 University of Virginia,
+** Copyright (C) 1994-2003 University of Virginia,
 **         Massachusetts Institute of Technology
 **
 ** This program is free software; you can redistribute it and/or modify it
@@ -26,7 +26,7 @@
 */
 /*
  * Modified by Herbert 04/19/97:
- * - added new include file portab.h.
+ * - added new include file portab.h (now in osd.h)
  * - added new private function fileloc_filenameForCpp() to handle
  *   filenames belonging to "#line" statements for OS/2 and MSDOS. It
  *   gets called by fileloc_lineMarker() and fileloc_previousLineMarker()
  */
 
 # include "splintMacros.nf"
-# include "llbasic.h"
-# include "fileIdList.h"
+# include "basic.h"
 # include "osd.h"
-# include "portab.h"
 
-static /*@only@*/ fileloc fileloc_createPrim (flkind p_kind, fileId p_fid, int p_line, int p_col);
+static /*@only@*/ fileloc fileloc_createPrim (flkind p_kind, fileId p_fid, int p_line, int p_col) /*@*/ ;
+
+/*
+** builtin locs are never free'd
+*/
+
+static /*@owned@*/ fileloc s_builtinLoc = fileloc_undefined;
+static /*@owned@*/ fileloc s_externalLoc = fileloc_undefined;
+
+void fileloc_destroyMod ()
+{
+  if (fileloc_isDefined (s_builtinLoc))
+    {
+      sfree (s_builtinLoc);
+      s_builtinLoc = fileloc_undefined;
+    }
+
+  if (fileloc_isDefined (s_externalLoc))
+    {
+      sfree (s_externalLoc);
+      s_externalLoc = fileloc_undefined;
+    }
+}
 
 static flkind fileId_kind (fileId s)
 {
@@ -292,7 +312,6 @@ fileloc_notAfter (fileloc f1, fileloc f2)
   /*@noaccess fileId@*/
 }
 
-# ifndef NOLCL
 bool
 fileloc_isStandardLibrary (fileloc f)
 {
@@ -305,7 +324,6 @@ fileloc_isStandardLibrary (fileloc f)
          || cstring_equalLit (s, LLPOSIXSTRICTLIBS_NAME)
          || cstring_equalLit (s, LLPOSIXLIBS_NAME));
 }
-# endif
 
 bool
 fileloc_sameFileAndLine (fileloc f1, fileloc f2)
@@ -431,7 +449,6 @@ fileloc_almostSameFile (fileloc f1, fileloc f2)
     }
 }
 
-# ifndef NOLCL
 /*@only@*/ fileloc
 fileloc_fromTok (ltoken t) 
 {
@@ -448,7 +465,6 @@ fileloc_fromTok (ltoken t)
   
   return (fl);
 }
-# endif
 
 /*@only@*/ fileloc
 fileloc_createLib (cstring ln)
@@ -483,14 +499,12 @@ fileloc fileloc_createExternal (void)
 
 fileloc fileloc_getExternal (void)
 {
-  static /*@owned@*/ fileloc res = fileloc_undefined;
-
-  if (res == fileloc_undefined) 
+  if (s_externalLoc == fileloc_undefined) 
     {
-      res = fileloc_createPrim (FL_EXTERNAL, fileId_invalid, 0, 0);
+      s_externalLoc = fileloc_createPrim (FL_EXTERNAL, fileId_invalid, 0, 0);
     }
 
-  return res;
+  return s_externalLoc;
 }
 
 fileloc fileloc_observeBuiltin ()
@@ -542,13 +556,20 @@ fileloc_makePreprocPrevious (fileloc loc)
   return (fileloc_createPrim (FL_PREPROC, fileId_invalid, 0, 0));
 }
 
+/* We pretend the result is only, because fileloc_free doesn't free it! */
 /*@only@*/ fileloc
 fileloc_createBuiltin ()
 {
-  return (fileloc_createPrim (FL_BUILTIN, fileId_invalid, 0, 0)); 
+  if (fileloc_isUndefined (s_builtinLoc))
+    {
+      s_builtinLoc = fileloc_createPrim (FL_BUILTIN, fileId_invalid, 0, 0); 
+    }
+
+  /*@-globstate@*/ /*@-retalias@*/ 
+  return s_builtinLoc;
+  /*@=globstate@*/ /*@=retalias@*/ 
 }
 
-# ifndef NOLCL
 /*@only@*/ fileloc
 fileloc_createImport (cstring fname, int lineno)
 {
@@ -561,7 +582,6 @@ fileloc_createImport (cstring fname, int lineno)
 
   return (fileloc_createPrim (FL_IMPORT, fid, lineno, 0));
 }
-# endif
 
 static /*@only@*/ fileloc
 fileloc_createPrim (flkind kind, fileId fid, int line, int col)
@@ -577,13 +597,11 @@ fileloc_createPrim (flkind kind, fileId fid, int line, int col)
   return (f);
 }
 
-# ifndef NOLCL
 /*@only@*/ fileloc
 fileloc_createSpec (fileId fid, int line, int col)
 {
   return (fileloc_createPrim (FL_SPEC, fid, line, col));
 }
-# endif
 
 fileloc fileloc_create (fileId fid, int line, int col)
 {
@@ -600,7 +618,14 @@ fileloc_filename (fileloc f)
 {
   if (fileloc_isDefined (f))
     {
-      return osd_outputPath (fileTable_rootFileName (f->fid));
+      if (fileId_isValid (f->fid))
+       {
+         return osd_outputPath (fileTable_rootFileName (f->fid));
+       }
+      else
+       {
+         return cstring_makeLiteral ("<invalid>");
+       }
     }
   else
     {
@@ -645,16 +670,24 @@ fileloc_column (fileloc f)
 /*@only@*/ cstring
 fileloc_unparse (fileloc f)
 {
+  static bool in_funparse = FALSE;
   bool parenFormat = context_getFlag (FLG_PARENFILEFORMAT); 
   bool htmlFormat = context_getFlag (FLG_HTMLFILEFORMAT);
   cstring res = cstring_undefined;
 
+  /* watch out for recursive calls when debugging... */
+  llassert (!in_funparse);
+  in_funparse = TRUE;
+
   if (fileloc_isDefined (f))
     {
        switch (f->kind)
        {
        case FL_BUILTIN:
-         return (cstring_makeLiteral ("Command Line"));
+         {
+           res = cstring_makeLiteral ("Command Line");
+           break;
+         }
        case FL_IMPORT:
          if (parenFormat)
            {
@@ -688,6 +721,12 @@ fileloc_unparse (fileloc f)
            if (f->kind == FL_LIB)
              {
                fname = message ("load file %q", fileloc_outputFilename (f));
+
+               if (!context_getFlag (FLG_SHOWLOADLOC))
+                 {
+                   res = fname;
+                   break;
+                 }
              }
            else
              {
@@ -724,6 +763,7 @@ fileloc_unparse (fileloc f)
                else
                  {
                    res = fname;
+                   /*@-branchstate@*/ /* spurious warnings reporteded because of break above */
                  }
              }
            else if (fileloc_linenoDefined (f))
@@ -753,7 +793,9 @@ fileloc_unparse (fileloc f)
     {
       res = cstring_makeLiteral ("< Location unknown >");
     }
+  /*@=branchstate@*/ /* this is a spurious warning because of the break */
   
+  in_funparse = FALSE;
   return res;
 }
 
This page took 0.040972 seconds and 4 git commands to generate.