]> andersk Git - splint.git/blobdiff - src/context.c
Fixed line numbering when multi-line macro parameters are used.
[splint.git] / src / context.c
index 2cea4b1bc205efc14419476cad6d05e228a96d71..d900745ca52db576b8ad66977f94d2c0374bf353 100644 (file)
@@ -1,6 +1,6 @@
 /*
-** LCLint - annotation-assisted static program checker
-** Copyright (C) 1994-2001 University of Virginia,
+** Splint - annotation-assisted static program checker
+** Copyright (C) 1994-2002 University of Virginia,
 **         Massachusetts Institute of Technology
 **
 ** This program is free software; you can redistribute it and/or modify it
@@ -17,9 +17,9 @@
 ** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
 ** MA 02111-1307, USA.
 **
-** For information on lclint: lclint-request@cs.virginia.edu
-** To report a bug: lclint-bug@cs.virginia.edu
-** For more information: http://lclint.cs.virginia.edu
+** For information on splint: info@splint.org
+** To report a bug: splint-bug@splint.org
+** For more information: http://www.splint.org
 */
 /*
 ** context.c
@@ -33,7 +33,7 @@
  *   or, if not set "." will be used.
  */
 
-# include "lclintMacros.nf"
+# include "splintMacros.nf"
 # include "llbasic.h"
 
 # ifndef NOLCL
@@ -171,14 +171,16 @@ static void context_exitClauseSimp (void)  /*@modifies gc@*/ ;
 static void context_exitClausePlain (void) /*@modifies gc@*/ ;
 static void context_setJustPopped (void) /*@modifies gc.justpopped@*/ ;
 static void context_setValue (flagcode p_flag, int p_val) /*@modifies gc.flags@*/ ;
-static void context_setFlag (flagcode p_f, bool p_b)
+static void context_setFlag (flagcode p_f, bool p_b, fileloc p_loc)
   /*@modifies gc.flags@*/ ;
 
 static void
-  context_setFlagAux (flagcode p_f, bool p_b, bool p_inFile, bool p_isRestore)
+  context_setFlagAux (flagcode p_f, bool p_b, bool p_inFile, 
+                     bool p_isRestore, fileloc p_loc)
   /*@modifies gc.flags@*/ ;
 
-static void context_restoreFlag (flagcode p_f) /*@modifies gc.flags@*/ ;
+static void context_restoreFlag (flagcode p_f, fileloc p_loc)
+  /*@modifies gc.flags@*/ ;
 
 /*@+enumindex@*/ 
 
@@ -270,10 +272,9 @@ context_addMacroCache (/*@only@*/ cstring def)
 }
 
 void
-context_addComment (/*@only@*/ cstring def)
+context_addComment (/*@only@*/ cstring def, fileloc loc)
 {
-  DPRINTF (("macro comment: %s", def));
-  macrocache_addComment (gc.mc, fileloc_copy (g_currentloc), def);
+  macrocache_addComment (gc.mc, fileloc_copy (loc), def);
 }
 
 /*
@@ -391,39 +392,47 @@ context_inSuppressRegion (void)
 }
 
 void
-context_enterSuppressRegion (void)
+context_enterSuppressRegion (fileloc loc)
 {
   if (gc.insuppressregion)
     {
       gc.insuppressregion = FALSE;     /* get this msg! */
       llmsg (message
             ("%q: New ignore errors region entered while in ignore errors region",
-             fileloc_unparse (g_currentloc)));
+             fileloc_unparse (loc)));
     }
   
   gc.insuppressregion = TRUE;
-  flagMarkerList_add (gc.markers, flagMarker_createIgnoreOn (g_currentloc));
+  (void) flagMarkerList_add (gc.markers, flagMarker_createIgnoreOn (loc));
 }
 
 static void
-context_addFlagMarker (flagcode code, ynm set)
+context_addFlagMarker (flagcode code, ynm set, fileloc loc)
 {
-  flagMarkerList_add (gc.markers,
-                     flagMarker_createLocalSet (code, set, g_currentloc));
+  (void) flagMarkerList_add (gc.markers,
+                            flagMarker_createLocalSet (code, set, loc));
 }
 
 void
-context_enterSuppressLine (int count)
+context_enterSuppressLine (int count, fileloc loc)
 {
-  fileloc nextline = fileloc_copy (g_currentloc);
+  if (context_processingMacros ())
+    {
+      return;
+    }
 
-  flagMarkerList_add (gc.markers,
-                     flagMarker_createIgnoreCount (count, g_currentloc));
+  if (flagMarkerList_add 
+      (gc.markers,
+       flagMarker_createIgnoreCount (count, loc)))
+    {
+      fileloc nextline = fileloc_copy (loc);
+      fileloc_nextLine (nextline);
+      fileloc_setColumn (nextline, 0);
 
-  fileloc_nextLine (nextline);
-  flagMarkerList_add (gc.markers,
-                     flagMarker_createIgnoreOff (nextline));
-  fileloc_free (nextline);
+      check (flagMarkerList_add (gc.markers,
+                                flagMarker_createIgnoreOff (nextline)));
+      fileloc_free (nextline);
+    }
 }
 
 void context_checkSuppressCounts (void)
@@ -441,16 +450,18 @@ void context_incLineno (void)
 }
 
 void
-context_exitSuppressRegion (void)
+context_exitSuppressRegion (fileloc loc)
 {
   if (!gc.insuppressregion)
     {
-      llerrorlit (FLG_SYNTAX, 
-                 "End ignore errors in region while not ignoring errors");
+      voptgenerror 
+       (FLG_SYNTAX, 
+        message ("End ignore errors in region while not ignoring errors"),
+        loc);
     }
-
-    gc.insuppressregion = FALSE;
-  flagMarkerList_add (gc.markers, flagMarker_createIgnoreOff (g_currentloc));
+  
+  gc.insuppressregion = FALSE;
+  (void) flagMarkerList_add (gc.markers, flagMarker_createIgnoreOff (loc));
 }
 
 void
@@ -537,7 +548,7 @@ context_exitLCLfile (void)
   if (gc.kind != CX_LCLLIB)
     {
       cstring lclname =  
-       fileLib_withoutExtension (fileName (currentFile ()), LCL_EXTENSION);
+       fileLib_withoutExtension (fileTable_fileName (currentFile ()), LCL_EXTENSION);
       
       addModuleAccess (fileLib_removePath (lclname), gc.facct);
       cstring_free (lclname);
@@ -668,17 +679,15 @@ typeIdSet context_fileAccessTypes (void)
 
 void
 context_resetModeFlags (void)
-{
-  
+{  
   allFlagCodes (code)
     {
       if (flagcode_isModeFlag (code))
        {
-         context_setFlag (code, FALSE);
+         context_setFlag (code, FALSE, g_currentloc);
        }
-    } end_allFlagCodes;
-
-  }
+    } end_allFlagCodes;  
+}
 
 /*
 ** resetAllFlags
@@ -704,11 +713,13 @@ conext_resetAllCounters (void)
 void
 context_resetAllFlags (void) 
 {
+  DPRINTF (("******** Reset all flags"));
+
   allFlagCodes (code)
     {
       gc.flags[code] = FALSE;
 
-      if (flagcode_hasValue (code))
+      if (flagcode_hasNumber (code))
        {
          int val = 0;
          
@@ -724,21 +735,21 @@ context_resetAllFlags (void)
            case FLG_INDENTSPACES: 
              val = DEFAULT_INDENTSPACES; break;
            case FLG_EXTERNALNAMELEN:
-             val = DEFAULT_EXTERNALNAMELEN; break;
+             val = ISO99_EXTERNALNAMELEN; break;
            case FLG_INTERNALNAMELEN:
-             val = DEFAULT_INTERNALNAMELEN; break;
+             val = ISO99_INTERNALNAMELEN; break;
            case FLG_COMMENTCHAR: 
              val = (int) DEFAULT_COMMENTCHAR; break;
            case FLG_CONTROLNESTDEPTH:
-             val = (int) DEFAULT_CONTROLNESTDEPTH; break;
+             val = (int) ISO99_CONTROLNESTDEPTH; break;
            case FLG_STRINGLITERALLEN:
-             val = (int) DEFAULT_STRINGLITERALLEN; break;
+             val = (int) ISO99_STRINGLITERALLEN; break;
            case FLG_INCLUDENEST:
-             val = (int) DEFAULT_INCLUDENEST; break;
+             val = (int) ISO99_INCLUDENEST; break;
            case FLG_NUMSTRUCTFIELDS:
-             val = (int) DEFAULT_NUMSTRUCTFIELDS; break;
+             val = (int) ISO99_NUMSTRUCTFIELDS; break;
            case FLG_NUMENUMMEMBERS:
-             val = (int) DEFAULT_NUMENUMMEMBERS; break;
+             val = (int) ISO99_NUMENUMMEMBERS; break;
            case FLG_EXPECT:
            case FLG_LCLEXPECT:
              break;
@@ -747,7 +758,15 @@ context_resetAllFlags (void)
            }
          /*@=loopswitchbreak@*/          
 
+         DPRINTF (("Set value: [%s] / %d",  flagcode_unparse (code), val));
          context_setValue (code, val);
+         DPRINTF (("Set value: [%s] / %d",  flagcode_unparse (code), context_getValue (code)));
+         llassert (context_getValue (code) == val);
+       }
+      else if (flagcode_hasChar (code))
+       {
+         llassert (code == FLG_COMMENTCHAR);
+         context_setCommentMarkerChar (DEFAULT_COMMENTCHAR);
        }
       else if (flagcode_hasString (code))
        {
@@ -820,15 +839,21 @@ context_resetAllFlags (void)
 
   /*@i34 move this into flags.def */
     
+  gc.flags[FLG_OBVIOUSLOOPEXEC] = TRUE;
   gc.flags[FLG_MODIFIES] = TRUE;
   gc.flags[FLG_NESTCOMMENT] = TRUE;
   gc.flags[FLG_GLOBALS] = TRUE;
   gc.flags[FLG_FULLINITBLOCK] = TRUE;
+  gc.flags[FLG_INITSIZE] = TRUE;
+  gc.flags[FLG_INITALLELEMENTS] = TRUE;
+
+  gc.flags[FLG_STRINGLITTOOLONG] = TRUE;
+
   gc.flags[FLG_LIKELYBOOL] = TRUE;
   gc.flags[FLG_ZEROPTR] = TRUE;
   gc.flags[FLG_NUMLITERAL] = TRUE;
   gc.flags[FLG_DUPLICATEQUALS] = TRUE;
-  gc.flags[FLG_SKIPANSIHEADERS] = TRUE;
+  gc.flags[FLG_SKIPISOHEADERS] = TRUE;
   gc.flags[FLG_SKIPPOSIXHEADERS] = TRUE;
   gc.flags[FLG_SYSTEMDIREXPAND] = TRUE;
   gc.flags[FLG_UNRECOGCOMMENTS] = TRUE;
@@ -844,6 +869,7 @@ context_resetAllFlags (void)
   gc.flags[FLG_SIZEOFFORMALARRAY] = TRUE;
   gc.flags[FLG_FIXEDFORMALARRAY] = TRUE;
 
+  gc.flags[FLG_UNRECOGDIRECTIVE] = TRUE;
   gc.flags[FLG_WARNUSE] = TRUE;
   gc.flags[FLG_PREDASSIGN] = TRUE;
   gc.flags[FLG_MODOBSERVER] = TRUE;
@@ -860,6 +886,7 @@ context_resetAllFlags (void)
   gc.flags[FLG_FORMATTYPE] = TRUE;
   gc.flags[FLG_BADFLAG] = TRUE;
   gc.flags[FLG_WARNFLAGS] = TRUE;
+  gc.flags[FLG_WARNRC] = TRUE;
   gc.flags[FLG_FILEEXTENSIONS] = TRUE;
   gc.flags[FLG_WARNUNIXLIB] = TRUE;
   gc.flags[FLG_WARNPOSIX] = TRUE;
@@ -871,8 +898,12 @@ context_resetAllFlags (void)
   gc.flags[FLG_TYPE] = TRUE;
   gc.flags[FLG_INCOMPLETETYPE] = TRUE;
   gc.flags[FLG_ABSTRACT] = TRUE;
-  gc.flags[FLG_ITER] = TRUE;
-  gc.flags[FLG_CONTROL] = TRUE;
+  gc.flags[FLG_ITERBALANCE] = TRUE;
+  gc.flags[FLG_ITERYIELD] = TRUE;
+  gc.flags[FLG_DUPLICATECASES] = TRUE;
+  gc.flags[FLG_ALWAYSEXITS] = TRUE;
+  gc.flags[FLG_EMPTYRETURN] = TRUE;
+  gc.flags[FLG_MACRORETURN] = TRUE;
   gc.flags[FLG_UNRECOG] = TRUE;
   gc.flags[FLG_SYSTEMUNRECOG] = TRUE;
   gc.flags[FLG_LINTCOMMENTS] = TRUE;
@@ -890,6 +921,18 @@ context_resetAllFlags (void)
 
   gc.flags[FLG_GNUEXTENSIONS] = TRUE;
 
+  /*
+    Changed for 3.0.0.19
+   */
+
+  /* commenting ou until some output issues are fixed */
+  /* gc.flags[FLG_ORCONSTRAINT] = TRUE;*/
+  
+  gc.flags[FLG_CONSTRAINTLOCATION] = TRUE;
+
+  /*drl 1/18/2002*/
+  gc.flags[FLG_WARNSYSFILES] = TRUE;
+
   /*
   ** On by default for Win32, but not Unix (to support MS/VC++ error message format).
   */
@@ -910,10 +953,24 @@ context_resetAllFlags (void)
       if (!flagcode_isModeFlag (modeflags[i])) \
        { llbug (message ("not a mode flag: %s", \
                          flagcode_unparse (modeflags[i]))); } \
-      else { context_setFlag (modeflags[i], TRUE); }  i++; }}
+      else { context_setFlag (modeflags[i], TRUE, g_currentloc); }  i++; }}
+
+static void context_setModeAux (cstring p_s, bool p_warn) ;
 
 void
 context_setMode (cstring s)
+{
+  context_setModeAux (s, TRUE);
+}
+
+void
+context_setModeNoWarn (cstring s)
+{
+  context_setModeAux (s, FALSE);
+}
+
+void
+context_setModeAux (cstring s, bool warn)
 {
   intSet setflags = intSet_new ();
   
@@ -954,11 +1011,14 @@ context_setMode (cstring s)
            }
        } end_intSet_elements ;
       
-      voptgenerror (FLG_WARNFLAGS,
-                   message ("Setting mode %s after setting mode flags will "
-                            "override set values of flags: %s",
-                            s, rflags),
-                   g_currentloc);
+      if (warn)
+       {
+         voptgenerror (FLG_WARNFLAGS,
+                       message ("Setting mode %s after setting mode flags will "
+                                "override set values of flags: %s",
+                                s, rflags),
+                       g_currentloc);
+       }
 
       cstring_free (rflags);
     }
@@ -972,17 +1032,19 @@ context_setMode (cstring s)
       flagcode modeflags[] = 
        {
          FLG_ENUMINT, FLG_MACROMATCHNAME,
+         FLG_STRINGLITNOROOM,
          FLG_MACROUNDEF, FLG_RELAXQUALS, 
          FLG_USEALLGLOBS, FLG_CHECKSTRICTGLOBALS,
          FLG_CHECKSTRICTGLOBALIAS,
          FLG_CHECKEDGLOBALIAS,
          FLG_CHECKMODGLOBALIAS,
          FLG_PREDBOOLOTHERS, FLG_PREDBOOLINT,
+         FLG_UNSIGNEDCOMPARE,
          FLG_PARAMUNUSED, FLG_VARUNUSED, FLG_FUNCUNUSED, 
          FLG_TYPEUNUSED,
          FLG_CONSTUNUSED, FLG_ENUMMEMUNUSED, FLG_FIELDUNUSED,
-         FLG_PTRNUMCOMPARE, FLG_BOOLCOMPARE, FLG_MUTREP, 
-         FLG_NOEFFECT, FLG_IMPTYPE,
+         FLG_PTRNUMCOMPARE, FLG_BOOLCOMPARE, FLG_UNSIGNEDCOMPARE,
+         FLG_MUTREP, FLG_NOEFFECT, FLG_IMPTYPE,
          FLG_RETVALOTHER, FLG_RETVALBOOL, FLG_RETVALINT,
          FLG_SPECUNDEF, FLG_INCONDEFS, FLG_INCONDEFSLIB, FLG_MISPLACEDSHAREQUAL,
          FLG_MATCHFIELDS,
@@ -1025,7 +1087,9 @@ context_setMode (cstring s)
          FLG_EXPORTLOCAL,
 
          FLG_USERELEASED, FLG_ALIASUNIQUE, FLG_MAYALIASUNIQUE,
-         FLG_MUSTFREE, FLG_MUSTDEFINE, FLG_GLOBSTATE, 
+         FLG_MUSTFREEONLY, 
+         FLG_MUSTFREEFRESH,
+         FLG_MUSTDEFINE, FLG_GLOBSTATE, 
          FLG_COMPDESTROY, FLG_MUSTNOTALIAS,
          FLG_MEMIMPLICIT,
          FLG_BRANCHSTATE, 
@@ -1036,7 +1100,8 @@ context_setMode (cstring s)
          FLG_MODGLOBS, FLG_WARNLINTCOMMENTS,
          FLG_IFEMPTY, FLG_REALCOMPARE,
          FLG_BOOLOPS, FLG_PTRNEGATE,
-         FLG_SHIFTSIGNED,
+         FLG_SHIFTNEGATIVE,      
+         FLG_SHIFTIMPLEMENTATION,
          FLG_BUFFEROVERFLOWHIGH,
          FLG_BUFFEROVERFLOW,
          INVALID_FLAG 
@@ -1058,6 +1123,7 @@ context_setMode (cstring s)
           FLG_CHECKSTRICTGLOBALS, FLG_MACROMATCHNAME,
          FLG_RETVALOTHER,
          FLG_IFEMPTY, 
+         FLG_BUFFEROVERFLOWHIGH,
          FLG_RETSTACK, FLG_PTRNEGATE,
          FLG_STATETRANSFER, FLG_STATEMERGE,
          FLG_LONGUNSIGNEDINTEGRAL,
@@ -1082,9 +1148,12 @@ context_setMode (cstring s)
          FLG_CHECKMODGLOBALIAS,
          FLG_UNCHECKEDGLOBALIAS,
          FLG_FORMATCONST,
+         FLG_STRINGLITNOROOM,
+         FLG_STRINGLITNOROOMFINALNULL,
+         FLG_STRINGLITSMALLER,
           FLG_EXITARG, FLG_PTRNUMCOMPARE, 
-         FLG_BOOLCOMPARE, FLG_MACROUNDEF
-         FLG_MUSTMOD, FLG_ALLGLOBALS,
+         FLG_BOOLCOMPARE, FLG_UNSIGNEDCOMPARE
+         FLG_MACROUNDEF, FLG_MUSTMOD, FLG_ALLGLOBALS,
          FLG_PREDBOOLOTHERS, FLG_PREDBOOLPTR, FLG_PREDBOOLINT,
          FLG_USEALLGLOBS, FLG_MUTREP, FLG_RETALIAS, 
          FLG_RETEXPOSE, FLG_ASSIGNEXPOSE, FLG_CASTEXPOSE,
@@ -1110,9 +1179,12 @@ context_setMode (cstring s)
          FLG_UNREACHABLE, 
          FLG_NORETURN, FLG_CASEBREAK, FLG_MISSCASE,
          FLG_EVALORDER, FLG_USEDEF, 
-
          FLG_NESTEDEXTERN, 
 
+         /* warn use flags */
+         FLG_MULTITHREADED, FLG_PORTABILITY, FLG_SUPERUSER, FLG_IMPLEMENTATIONOPTIONAL,
+         FLG_BUFFEROVERFLOWHIGH,
+
          /* memchecks flags */
 
          FLG_NULLSTATE, FLG_NULLDEREF, FLG_NULLASSIGN,
@@ -1140,7 +1212,9 @@ context_setMode (cstring s)
          FLG_IMMEDIATETRANS,
          FLG_ONLYUNQGLOBALTRANS,
          FLG_USERELEASED, FLG_ALIASUNIQUE, FLG_MAYALIASUNIQUE,
-         FLG_MUSTFREE, FLG_MUSTDEFINE, FLG_GLOBSTATE, 
+         FLG_MUSTFREEONLY,
+         FLG_MUSTFREEFRESH,
+         FLG_MUSTDEFINE, FLG_GLOBSTATE, 
          FLG_COMPDESTROY, FLG_MUSTNOTALIAS,
          FLG_MEMIMPLICIT,
          FLG_BRANCHSTATE, 
@@ -1150,9 +1224,10 @@ context_setMode (cstring s)
          FLG_LOOPLOOPBREAK, FLG_SWITCHLOOPBREAK, FLG_MODGLOBS,
          FLG_CHECKSTRICTGLOBALS, FLG_IMPCHECKEDSPECGLOBALS,
           FLG_MACROMATCHNAME, FLG_WARNLINTCOMMENTS,
-         FLG_INCLUDENEST, FLG_ANSIRESERVED, FLG_CPPNAMES, 
+         FLG_INCLUDENEST, FLG_ISORESERVED, FLG_CPPNAMES, 
          FLG_NOPARAMS, FLG_IFEMPTY, FLG_WHILEEMPTY, FLG_REALCOMPARE,
-         FLG_BOOLOPS, FLG_SHIFTSIGNED,
+         FLG_BOOLOPS, FLG_SHIFTNEGATIVE,
+         FLG_SHIFTIMPLEMENTATION,
          FLG_BUFFEROVERFLOWHIGH, FLG_BUFFEROVERFLOW,
          INVALID_FLAG } ;
 
@@ -1169,6 +1244,9 @@ context_setMode (cstring s)
          FLG_MODFILESYSTEM,
          FLG_MACROMATCHNAME,
          FLG_FORMATCONST,
+         FLG_STRINGLITNOROOM,
+         FLG_STRINGLITNOROOMFINALNULL,
+         FLG_STRINGLITSMALLER,
          FLG_STATETRANSFER, FLG_STATEMERGE,
           FLG_MACROUNDEF, FLG_MUTREP, FLG_MUSTMOD,
          FLG_ALLGLOBALS, FLG_IMPTYPE,
@@ -1193,9 +1271,9 @@ context_setMode (cstring s)
          FLG_VARUNUSED, 
          FLG_NULLPOINTERARITH, FLG_POINTERARITH, 
          FLG_PTRNUMCOMPARE, 
-         FLG_BOOLCOMPARE, FLG_NOEFFECT, 
-         FLG_RETVALINT, FLG_RETVALBOOL, FLG_RETVALOTHER, 
-         FLG_ANSIRESERVED, FLG_ANSIRESERVEDLOCAL, FLG_CPPNAMES,
+         FLG_BOOLCOMPARE, FLG_UNSIGNEDCOMPARE,
+         FLG_NOEFFECT, FLG_RETVALINT, FLG_RETVALBOOL, FLG_RETVALOTHER, 
+         FLG_ISORESERVED, FLG_ISORESERVEDLOCAL, FLG_CPPNAMES,
          FLG_RETVALBOOL, FLG_RETVALINT, FLG_SPECUNDEF, 
          FLG_DECLUNDEF, FLG_STRICTOPS, FLG_INCONDEFS, 
          FLG_MISPLACEDSHAREQUAL, FLG_REDUNDANTSHAREQUAL,
@@ -1216,6 +1294,11 @@ context_setMode (cstring s)
          FLG_NESTEDEXTERN, 
          FLG_FIRSTCASE,
 
+         /* warn use flags */
+         FLG_MULTITHREADED, FLG_PORTABILITY, FLG_SUPERUSER, FLG_IMPLEMENTATIONOPTIONAL,
+         FLG_BUFFEROVERFLOWHIGH,
+         FLG_BUFFEROVERFLOW, FLG_TOCTOU,
+
          /* memchecks flags */
          FLG_NULLSTATE, FLG_NULLDEREF, FLG_NULLASSIGN,
          FLG_NULLPASS, FLG_NULLRET,
@@ -1242,7 +1325,9 @@ context_setMode (cstring s)
          FLG_UNKNOWNINITTRANS,
 
          FLG_USERELEASED, FLG_ALIASUNIQUE, FLG_MAYALIASUNIQUE,
-         FLG_MUSTFREE, FLG_MUSTDEFINE, FLG_GLOBSTATE, 
+         FLG_MUSTFREEONLY,
+         FLG_MUSTFREEFRESH,
+         FLG_MUSTDEFINE, FLG_GLOBSTATE, 
          FLG_COMPDESTROY, FLG_MUSTNOTALIAS,
          FLG_MEMIMPLICIT,
          FLG_BRANCHSTATE, 
@@ -1260,7 +1345,7 @@ context_setMode (cstring s)
          FLG_IMPCHECKEDSTRICTSPECGLOBALS,
          FLG_IMPCHECKMODINTERNALS,
          FLG_WARNMISSINGGLOBALS, FLG_WARNMISSINGGLOBALSNOGLOBS,
-         FLG_WARNLINTCOMMENTS, FLG_ANSIRESERVEDLOCAL,
+         FLG_WARNLINTCOMMENTS, FLG_ISORESERVEDLOCAL,
          FLG_INCLUDENEST, FLG_STRINGLITERALLEN,
          FLG_NUMSTRUCTFIELDS, FLG_NUMENUMMEMBERS,
          FLG_CONTROLNESTDEPTH,
@@ -1271,7 +1356,9 @@ context_setMode (cstring s)
          FLG_REALCOMPARE, FLG_BOOLOPS,
          FLG_SYSTEMDIRERRORS, FLG_UNUSEDSPECIAL,
 
-         FLG_SHIFTSIGNED, FLG_BITWISEOPS,
+         FLG_SHIFTNEGATIVE,
+         FLG_SHIFTIMPLEMENTATION,
+         FLG_BITWISEOPS,
          FLG_BUFFEROVERFLOWHIGH, FLG_BUFFEROVERFLOW,
          INVALID_FLAG
        } ;
@@ -1297,44 +1384,44 @@ context_isSpecialFile (cstring fname)
 bool
 context_isSystemDir (cstring dir)
 {
-  cstring sysDirs = context_exposeString (FLG_SYSTEMDIRS);
-  char *thisdir = cstring_toCharsSafe (sysDirs);
-  char *nextdir = strchr (thisdir, PATH_SEPARATOR);
-
-  if (nextdir != NULL)
+  cstring thisdir = cstring_copy (context_getString (FLG_SYSTEMDIRS));
+  cstring savedir = thisdir;
+  cstring nextdir = cstring_afterChar (thisdir, PATH_SEPARATOR);
+  
+  if (cstring_isDefined (nextdir))
     {
-      *nextdir = '\0';
+      /*@access cstring@*/
+      *nextdir = '\0'; /* closes thisdir */
       nextdir += 1;
+      /*@noaccess cstring@*/
     }
 
-  while (thisdir != NULL)
+  /* 2001-09-09: added thisdir[0] != '\0' 
+  **   herbert: don't compare with an empty name! 
+  **   should return false for empty directory path
+  */
+
+  while (!cstring_isEmpty (thisdir))
     {
       DPRINTF (("Test: %s / %s", dir, thisdir));
 
-      if (cstring_equalCanonicalPrefix (dir, thisdir))
+      if (osd_equalCanonicalPrefix (dir, thisdir))
        {
-         if (nextdir != NULL)
-           {
-             *(nextdir - 1) = PATH_SEPARATOR;
-           }
-         
+         cstring_free (savedir);
          return TRUE;
        }
 
-      if (nextdir != NULL)
-       {
-         *(nextdir - 1) = PATH_SEPARATOR;
-       }
-
-      if (nextdir != NULL)
+      if (cstring_isDefined (nextdir))
        {
          thisdir = nextdir;
-         nextdir = strchr (thisdir, PATH_SEPARATOR);
+         nextdir = cstring_afterChar (thisdir, PATH_SEPARATOR);
          
-         if (nextdir != NULL)
+         if (cstring_isDefined (nextdir))
            {
+             /*@access cstring@*/
              *nextdir = '\0';
              nextdir += 1;
+             /*@noaccess cstring@*/
            } 
        }
       else
@@ -1344,6 +1431,7 @@ context_isSystemDir (cstring dir)
     } 
 
   DPRINTF (("Returns FALSE"));
+  cstring_free (savedir);
   return FALSE;
 }
 
@@ -1667,14 +1755,14 @@ void context_enterTrueClause (exprNode e)
 
 void context_enterSwitch (exprNode e)
 {
-  
+  DPRINTF (("Enter switch: %s", exprNode_unparse (e)));
   usymtab_switchBranch (e);
   context_enterCondClauseAux (SWITCHCLAUSE);
 }
 
 void context_exitSwitch (exprNode e, bool allpaths)
 {
-    usymtab_exitSwitch (e, allpaths);
+  usymtab_exitSwitch (e, allpaths);
   
   while (clause_isCase (clauseStack_top (gc.clauses)))
     {
@@ -1789,6 +1877,14 @@ context_enterFunction (/*@exposed@*/ uentry e)
   sRef_enterFunctionScope ();
 }
 
+bool context_inOldSytleScope(void)
+{
+  if (gc.kind == CX_OLDSTYLESCOPE)
+    return TRUE;
+  else
+    return FALSE;
+}
+
 void
 context_enterOldStyleScope (void)
 {
@@ -2226,7 +2322,7 @@ void context_exitIterClause (exprNode body)
 
   context_setJustPopped ();
 
-  if (context_getFlag (FLG_LOOPEXEC))
+  if (context_getFlag (FLG_ITERLOOPEXEC))
     {
       usymtab_popTrueExecBranch (exprNode_undefined, body, ITERCLAUSE);
     }
@@ -2283,7 +2379,7 @@ void context_exitWhileClause (exprNode pred, exprNode body)
   ** predicate must be false after while loop (unless there are breaks)
   */
 
-  if (context_getFlag (FLG_LOOPEXEC))
+  if (context_getFlag (FLG_WHILELOOPEXEC))
     {
       usymtab_popTrueExecBranch (pred, body, WHILECLAUSE);
     }
@@ -2329,17 +2425,30 @@ void context_exitForClause (exprNode forPred, exprNode body)
   llassert (gc.inclause == FORCLAUSE);
   context_setJustPopped ();
 
+  DPRINTF (("Exit for: %s / %s", exprNode_unparse (forPred), exprNode_unparse (body)));
+
   /*
-  ** predicate must be false after while loop (unless there are breaks)
+  ** Predicate must be false after for loop (unless there are breaks)
   */
 
-  if (context_getFlag (FLG_LOOPEXEC))
+  if (context_getFlag (FLG_FORLOOPEXEC))
     {
+      DPRINTF (("Here: for loop exec"));
       usymtab_popTrueExecBranch (forPred, body, FORCLAUSE);
     }
   else
     {
-      usymtab_popTrueBranch (forPred, body, FORCLAUSE);
+      if (context_getFlag (FLG_OBVIOUSLOOPEXEC)
+         && exprNode_loopMustExec (forPred))
+       {
+         DPRINTF (("Here: loop must exec"));
+         usymtab_popTrueExecBranch (forPred, body, FORCLAUSE);
+       }
+      else
+       {
+         DPRINTF (("Pop true branch:"));
+         usymtab_popTrueBranch (forPred, body, FORCLAUSE);
+       }
     }
 
   usymtab_addGuards (invGuards);
@@ -2686,15 +2795,15 @@ context_setValue (flagcode flag, int val)
        {
          
          llerror_flagWarning (message ("Value for %s must be a positive "
-                                   "number (given %d)",
-                                   flagcode_unparse (flag), val));
+                                       "number (given %d)",
+                                       flagcode_unparse (flag), val));
          return;
        }
       if (flag == FLG_LINELEN && val < MINLINELEN)
        {
          llerror_flagWarning (message ("Value for %s must be at least %d (given %d)",
-                                   flagcode_unparse (flag), 
-                                   MINLINELEN, val));
+                                       flagcode_unparse (flag), 
+                                       MINLINELEN, val));
          val = MINLINELEN;
        }
       break;
@@ -2707,10 +2816,9 @@ context_setValue (flagcode flag, int val)
     case FLG_INDENTSPACES:
       if (val < 0)
        {
-         
          llerror_flagWarning (message ("Value for %s must be a non-negative "
-                                   "number (given %d)",
-                                   flagcode_unparse (flag), val));
+                                       "number (given %d)",
+                                       flagcode_unparse (flag), val));
          return;
        }
 
@@ -2718,7 +2826,8 @@ context_setValue (flagcode flag, int val)
     default:
       break;
     }
-    
+
+  DPRINTF (("Set value [%s] %d = %d", flagcode_unparse (flag), index, val));
   gc.values[index] = val;
 }
 
@@ -2735,6 +2844,7 @@ context_getValue (flagcode flag)
   int index = flagcode_valueIndex (flag);
 
   llassert (index >= 0 && index <= NUMVALUEFLAGS);
+  DPRINTF (("Get value [%s] %d = %d", flagcode_unparse (flag), index, gc.values[index]));
   return (gc.values[index]);
 }
 
@@ -2791,19 +2901,19 @@ context_setString (flagcode flag, cstring val)
            {
              int n = cstring_length (tval) - 1;
 
-             while (isspace ((int) cstring_getChar (tval, n)))
+             while (isspace ((int) cstring_getChar (tval, size_fromInt (n))))
                {
                  n--;
                }
 
-             if (cstring_getChar (tval, n) != '\"')
+             if (cstring_getChar (tval, size_fromInt (n)) != '\"')
                {
                  llerror_flagWarning (message ("Setting -systemdirs to string with unmatching quotes: %s", val));
                }
              else
                {
                  cstring otval = tval;
-                 tval = cstring_prefix (tval, n);
+                 tval = cstring_prefix (tval, size_fromInt (n));
                  cstring_free (otval);
                }
            }
@@ -2835,7 +2945,7 @@ context_setString (flagcode flag, cstring val)
     }
 
   if (cstring_length (val) >= 1
-      && cstring_firstChar (val) == '"')
+      && cstring_firstChar (val) == '\"')
     {
       llerror_flagWarning (message
                       ("setting %s to string beginning with \".  You probably "
@@ -2934,16 +3044,18 @@ void context_initMod (void)
     {
       gc.setGlobally[code] = FALSE;
       gc.setLocally[code] = FALSE;
-    } end_allFlagCodes ;
-
+    } 
+  end_allFlagCodes ;
+  
   usymtab_initMod ();
 
   context_resetAllFlags ();
+
   assertSet (gc.flags); /* Can't use global in defines */
   assertSet (gc.saveflags);
   assertSet (gc.values);
   assertSet (gc.strings);
-
+  
   conext_resetAllCounters ();
   assertSet (gc.counters);
 
@@ -3363,7 +3475,7 @@ context_processMacros (void)
   if (fileId_isValid (currentFile ()))
     {
       fileloc lastfl;
-      cstring cbase = fileLib_removePathFree (fileLib_removeAnyExtension (fileName (currentFile ())));
+      cstring cbase = fileLib_removePathFree (fileLib_removeAnyExtension (fileTable_fileName (currentFile ())));
       
       gc.inmacrocache = TRUE;
 
@@ -3523,10 +3635,11 @@ context_userSetFlag (flagcode f, bool b)
     {
       if (gc.flags[FLG_EXPORTHEADER])
        {
-         llerror_flagWarning (cstring_makeLiteral
-                          ("setting +neverinclude after +exportheader.  "
-                           "Turning off exportheader, since headers are not checked "
-                           "when +neverinclude is used."));
+         llerror_flagWarning 
+           (cstring_makeLiteral
+            ("setting +neverinclude after +exportheader.  "
+             "Turning off exportheader, since headers are not checked "
+             "when +neverinclude is used."));
 
          gc.flags[FLG_EXPORTHEADER] = FALSE;
        }
@@ -3537,10 +3650,11 @@ context_userSetFlag (flagcode f, bool b)
        {
          if (gc.flags[FLG_NEVERINCLUDE])
            {
-             llerror_flagWarning (cstring_makeLiteral
-                              ("setting +exportheader after +neverinclude.  "
-                               "Not setting exportheader, since headers are not checked "
-                               "when +neverinclude is used."));
+             llerror_flagWarning
+               (cstring_makeLiteral
+                ("setting +exportheader after +neverinclude.  "
+                 "Not setting exportheader, since headers are not checked "
+                 "when +neverinclude is used."));
              gc.flags[FLG_EXPORTHEADER] = FALSE;
              return;
            }
@@ -3556,9 +3670,10 @@ context_userSetFlag (flagcode f, bool b)
          && !flagcode_isIdemFlag (f)
          && !flagcode_hasArgument (f))
        {
-         llerror_flagWarning (message ("setting %s%s redundant with current value", 
-                                   cstring_makeLiteralTemp (b ? "+" : "-"),
-                                   flagcode_unparse (f)));
+         llerror_flagWarning 
+           (message ("setting %s%s redundant with current value", 
+                     cstring_makeLiteralTemp (b ? "+" : "-"),
+                     flagcode_unparse (f)));
        }
     }
 
@@ -3566,9 +3681,9 @@ context_userSetFlag (flagcode f, bool b)
     {
       if (!context_getFlag (FLG_WARNUSE))
        {
-         llerror_flagWarning (message ("flag +%s is canceled by -warnuse",
-                                   flagcode_unparse (f)));
-         
+         llerror_flagWarning
+           (message ("flag +%s is canceled by -warnuse",
+                     flagcode_unparse (f)));
        }
     }
 
@@ -3578,40 +3693,44 @@ context_userSetFlag (flagcode f, bool b)
       if (gc.library != FLG_ANSILIB
          && gc.library != f)
        {
-         llerror_flagWarning (message ("selecting library %s after library %s was "
-                                       "selected (only one library may be used)",
-                                       flagcode_unparse (f),
-                                       flagcode_unparse (gc.library)));
+         llerror_flagWarning 
+           (message ("selecting library %s after library %s was "
+                     "selected (only one library may be used)",
+                     flagcode_unparse (f),
+                     flagcode_unparse (gc.library)));
        }
-
+      
       if (f == FLG_UNIXLIB)
        {
          if (context_getFlag (FLG_WARNUNIXLIB))
            {
-             llerror_flagWarning (cstring_makeLiteral
-                                  ("selecting unix library.  Unix library is "
-                                   "ad hoc addition to POSIX library.  Recommend "
-                                   "use +posixlib to select POSIX library instead. "
-                                   "Use -warnunixlib to suppress this message."));
+             llerror_flagWarning
+               (cstring_makeLiteral
+                ("selecting unix library.  Unix library is "
+                 "ad hoc addition to POSIX library.  Recommend "
+                 "use +posixlib to select POSIX library instead. "
+                 "Use -warnunixlib to suppress this message."));
            }
        }
       
       gc.library = f;
     }
-
+  
   if (flagcode_isNameChecksFlag (f) && b && !context_maybeSet (FLG_NAMECHECKS))
     {
-      llerror_flagWarning (message
-                          ("setting +%s will not produce warnings with -namechecks. Must set +namechecks also.",
-                           flagcode_unparse (f)));
+      llerror_flagWarning
+       (message
+        ("setting +%s will not produce warnings with -namechecks. "
+         "Must set +namechecks also.",
+         flagcode_unparse (f)));
     }
-
+  
   gc.setGlobally[f] = TRUE;
-  context_setFlag (f, b);
+  context_setFlag (f, b, g_currentloc);
 }
 
 void
-context_fileSetFlag (flagcode f, ynm set)
+context_fileSetFlag (flagcode f, ynm set, fileloc loc)
 {
   if (!gc.savedFlags)
     {
@@ -3620,23 +3739,22 @@ context_fileSetFlag (flagcode f, ynm set)
 
   if (ynm_isOff (set))
     {
-      context_setFlagAux (f, FALSE, TRUE, FALSE);
+      context_setFlagAux (f, FALSE, TRUE, FALSE, loc);
     }
   else if (ynm_isOn (set))
     {
-      context_setFlagAux (f, TRUE, TRUE, FALSE);
+      context_setFlagAux (f, TRUE, TRUE, FALSE, loc);
       gc.setLocally[f] = TRUE;
     }
   else
     {
-      context_restoreFlag (f);
+      context_restoreFlag (f, loc);
     }
 }
 
 static void
-context_restoreFlag (flagcode f)
+context_restoreFlag (flagcode f, fileloc loc)
 {
-  
   if (!gc.savedFlags)
     {
       voptgenerror 
@@ -3644,20 +3762,20 @@ context_restoreFlag (flagcode f)
         message ("Attempt to restore flag %s when no file scope flags "
                  "have been set.",
                  flagcode_unparse (f)),
-        g_currentloc);
+        loc);
     }
   else
     {
-      context_addFlagMarker (f, MAYBE);
-      context_setFlagAux (f, gc.saveflags[f], FALSE, TRUE);
+      context_addFlagMarker (f, MAYBE, loc);
+      context_setFlagAux (f, gc.saveflags[f], FALSE, TRUE, loc);
     }
 
   }
 
 static void
-context_setFlag (flagcode f, bool b)
+context_setFlag (flagcode f, bool b, fileloc loc)
 {
-  context_setFlagAux (f, b, FALSE, FALSE);
+  context_setFlagAux (f, b, FALSE, FALSE, loc);
 }
 
 void
@@ -3670,15 +3788,15 @@ context_setFlagTemp (flagcode f, bool b)
 /*@notfunction@*/
 # define DOSET(ff,b) \
    do { if (inFile) { gc.setLocally[ff] = TRUE; \
-                     context_addFlagMarker (ff, ynm_fromBool (b)); } \
+                     context_addFlagMarker (ff, ynm_fromBool (b), loc); } \
         DPRINTF (("set flag: %s / %s", flagcode_unparse (ff), bool_unparse (b))); \
         gc.flags[ff] = b; } while (FALSE)
 
 static void
-  context_setFlagAux (flagcode f, bool b, bool 
-                     inFile, /*@unused@*/ bool isRestore)
+context_setFlagAux (flagcode f, bool b, bool inFile, 
+                   /*@unused@*/ bool isRestore, fileloc loc)
 {
-  DPRINTF (("set flag: %s / %s", flagcode_unparse (f), bool_unparse (b)));
+  DPRINTF (("Set flag: %s / %s", flagcode_unparse (f), bool_unparse (b)));
 
   if (f == FLG_USESTDERR) 
     {
@@ -3809,8 +3927,8 @@ static void
       DOSET (FLG_SPECRETIMPONLY, b);
       DOSET (FLG_SPECSTRUCTIMPONLY, b);
       break;
-    case FLG_ANSILIMITS: 
-      DOSET (FLG_ANSILIMITS, b);
+    case FLG_ANSI89LIMITS: 
+      DOSET (FLG_ANSI89LIMITS, b);
       DOSET (FLG_CONTROLNESTDEPTH, b);
       DOSET (FLG_STRINGLITERALLEN, b);
       DOSET (FLG_INCLUDENEST, b);
@@ -3819,11 +3937,32 @@ static void
       
       if (b)
        {
-         context_setValue (FLG_CONTROLNESTDEPTH, DEFAULT_CONTROLNESTDEPTH);
-         context_setValue (FLG_STRINGLITERALLEN, DEFAULT_STRINGLITERALLEN);
-         context_setValue (FLG_INCLUDENEST, DEFAULT_INCLUDENEST);
-         context_setValue (FLG_NUMSTRUCTFIELDS, DEFAULT_NUMSTRUCTFIELDS);
-         context_setValue (FLG_NUMENUMMEMBERS, DEFAULT_NUMENUMMEMBERS);
+         context_setValue (FLG_CONTROLNESTDEPTH, ANSI89_CONTROLNESTDEPTH);
+         context_setValue (FLG_STRINGLITERALLEN, ANSI89_STRINGLITERALLEN);
+         context_setValue (FLG_INCLUDENEST, ANSI89_INCLUDENEST);
+         context_setValue (FLG_NUMSTRUCTFIELDS, ANSI89_NUMSTRUCTFIELDS);
+         context_setValue (FLG_NUMENUMMEMBERS, ANSI89_NUMENUMMEMBERS);
+         context_setValue (FLG_EXTERNALNAMELEN, ANSI89_EXTERNALNAMELEN);
+         context_setValue (FLG_INTERNALNAMELEN, ANSI89_INTERNALNAMELEN);
+       }
+      break;
+    case FLG_ISO99LIMITS: 
+      DOSET (FLG_ISO99LIMITS, b);
+      DOSET (FLG_CONTROLNESTDEPTH, b);
+      DOSET (FLG_STRINGLITERALLEN, b);
+      DOSET (FLG_INCLUDENEST, b);
+      DOSET (FLG_NUMSTRUCTFIELDS, b);
+      DOSET (FLG_NUMENUMMEMBERS, b);
+      
+      if (b)
+       {
+         context_setValue (FLG_CONTROLNESTDEPTH, ISO99_CONTROLNESTDEPTH);
+         context_setValue (FLG_STRINGLITERALLEN, ISO99_STRINGLITERALLEN);
+         context_setValue (FLG_INCLUDENEST, ISO99_INCLUDENEST);
+         context_setValue (FLG_NUMSTRUCTFIELDS, ISO99_NUMSTRUCTFIELDS);
+         context_setValue (FLG_NUMENUMMEMBERS, ISO99_NUMENUMMEMBERS);
+         context_setValue (FLG_EXTERNALNAMELEN, ISO99_EXTERNALNAMELEN);
+         context_setValue (FLG_INTERNALNAMELEN, ISO99_INTERNALNAMELEN);
        }
       break;
     case FLG_EXTERNALNAMELEN:
@@ -3901,6 +4040,11 @@ static void
       DOSET (FLG_LOOPLOOPCONTINUE, b);
       DOSET (FLG_DEEPBREAK, b);
       break;
+    case FLG_LOOPEXEC:
+      DOSET (FLG_FORLOOPEXEC, b);
+      DOSET (FLG_WHILELOOPEXEC, b);
+      DOSET (FLG_ITERLOOPEXEC, b);
+      break;
     case FLG_ACCESSALL:
       DOSET (FLG_ACCESSMODULE, b);
       DOSET (FLG_ACCESSFILE, b);
@@ -3911,6 +4055,10 @@ static void
       DOSET (FLG_FCNMACROS, b);
       DOSET (FLG_CONSTMACROS, b);
       break;
+    case FLG_BOUNDS:
+      DOSET (FLG_BOUNDSREAD, b);
+      DOSET (FLG_BOUNDSWRITE, b);
+      break;
     case FLG_CZECH:
       if (b) { DOSET (FLG_ACCESSCZECH, b); }
       DOSET (FLG_CZECHFUNCTIONS, b);
@@ -3939,6 +4087,10 @@ static void
       DOSET (FLG_NULLPASS, b);
       DOSET (FLG_NULLRET, b);
       break;
+    case FLG_MUSTFREE:
+      DOSET (FLG_MUSTFREEONLY, b);
+      DOSET (FLG_MUSTFREEFRESH, b);
+      break;
     case FLG_MEMCHECKS:
       DOSET (FLG_NULLSTATE, b);
       DOSET (FLG_NULLDEREF, b);
@@ -3952,7 +4104,8 @@ static void
       DOSET (FLG_USERELEASED, b);
       DOSET (FLG_ALIASUNIQUE, b);
       DOSET (FLG_MAYALIASUNIQUE, b);
-      DOSET (FLG_MUSTFREE, b);
+      DOSET (FLG_MUSTFREEONLY, b);
+      DOSET (FLG_MUSTFREEFRESH, b);
       DOSET (FLG_MUSTDEFINE, b);
       DOSET (FLG_GLOBSTATE, b); 
       DOSET (FLG_COMPDESTROY, b);
@@ -4410,8 +4563,15 @@ void context_checkGlobalScope (void)
 {
   if (gc.kind != CX_GLOBAL)
     {
-      llcontbug (message ("Not in global scope as expected: %q", context_unparse ()));
-      context_quietExitScopes ();
+      if (context_inMacro ())
+       {
+         ; /* evans 2001-10-14: Okay to be in a macro here! */ 
+       }
+      else
+       {
+         llcontbug (message ("Not in global scope as expected: %q", context_unparse ()));
+         context_quietExitScopes ();
+       }
     }
 }
 
@@ -4626,3 +4786,165 @@ valueTable context_createGlobalMarkerValueTable (stateInfo sinfo)
 
 
 
+/*drl 12/30/01 these are some ugly functions that were added to facilitate struct annotations */
+
+
+/*drl added */
+static ctype lastStruct;
+
+ctype context_setLastStruct (/*@returned@*/ ctype s) /*@globals lastStruct@*/
+{
+  lastStruct = s;
+  return s;
+}
+
+ctype context_getLastStruct (/*@returned@*/ /*ctype s*/) /*@globals lastStruct@*/
+{
+  return lastStruct;
+}
+
+
+/*@unused@*/ static int sInfoNum = 0;
+
+
+struct getUe {
+  /*@unused@*/  uentry ue;
+  /*@unused@*/ sRef s;
+};
+
+struct sInfo {
+  /*@unused@*/ ctype ct;
+  /*@unused@*/ constraintList inv;
+ /*@unused@*/ int ngetUe;
+ /*@unused@*/ struct getUe * t ;
+};
+
+
+static struct sInfo globalStructInfo;
+
+
+/*drl 1/6/2001: I didn't think these functions were solid enough to include in the
+  stable  release of splint.  I coomented them out so that they won't break anything
+  but didn't delete them because they will be fixed and included later
+*/
+
+/*
+void  setGlobalStructInfo(ctype ct, constraintList list)
+{
+  int i;
+  uentryList f;
+
+  f =  ctype_getFields (ct);
+  
+  if (constraintList_isDefined(list) )
+    {
+      globalStructInfo.ct = ct;
+      globalStructInfo.inv = list;
+
+      globalStructInfo.ngetUe = 0;
+      
+      / *abstraction violation fix it * /
+      globalStructInfo.t   = dmalloc(f->nelements * sizeof(struct getUe) );
+
+      globalStructInfo.ngetUe = f->nelements;
+
+      i = 0;
+      
+      uentryList_elements(f, ue)
+       {
+         globalStructInfo.t[i].ue = ue;
+         globalStructInfo.t[i].s = uentry_getSref(ue);
+         TPRINTF(( message(" setGlobalStructInfo:: adding ue=%s and sRef=%s",
+                           uentry_unparse(ue), sRef_unparse( uentry_getSref(ue) )
+                           )
+                   ));
+         i++;
+       }
+      end_uentryList_elements;
+    }
+}
+
+*/
+
+bool hasInvariants (ctype ct) /*@*/
+{
+  if ( ctype_sameName(globalStructInfo.ct, ct) )
+
+    return TRUE;
+
+  else
+    
+    return FALSE;
+  
+}
+
+/*drl 1/6/2001: I didn't think these functions were solid enough to include in the
+  stable  release of splint.  I coomented them out so that they won't break anything
+  but didn't delete them because they will be fixed and included later
+*/
+
+/*
+constraintList getInvariants (ctype ct)
+{
+  
+  llassert(hasInvariants(ct) );
+
+  return  globalStructInfo.inv;
+}
+*/
+
+/*
+static int getSref (ctype ct, sRef s)
+{
+  int i;
+
+  i = 0;
+
+  / *
+    DEBUGGIN INFO
+    
+    fprintf(stderr, "getSref: ct = %s (%x)\n",  ctype_unparse(ct), ct );
+    
+    fprintf(stderr,"getSref: s =  (%s) %X \n", sRef_unparse(s),  s);
+  * /
+  
+  while (i < globalStructInfo.ngetUe)
+    {
+      DPRINTF(( message(" getSref:: comparing ue=%s and sRef=%s",
+                       uentry_unparse(globalStructInfo.t[i].ue),
+                       sRef_unparse(globalStructInfo.t[i].s)
+                       )
+               ));
+
+      / *
+      fprintf (stderr, " globalStructInfo.t[i].s = %x\n ",
+              globalStructInfo.t[i].s );
+      * /
+      
+      if (sRef_same(globalStructInfo.t[i].s,s) )
+       return i;
+      
+      i++;
+    }
+  return -1;  
+}
+
+  
+sRef fixSref (ctype ct, sRef base, sRef fix)
+{
+  int index;
+  uentry ue;
+  cstring name;
+  index = getSref(ct, fix);
+
+  if (index < 0) 
+    return fix;
+
+  ue =  globalStructInfo.t[index].ue;
+  name = uentry_getName(ue);
+  fix = sRef_buildField(base, name );
+  cstring_free(name);
+  return fix;
+}
+
+*/
This page took 0.090465 seconds and 4 git commands to generate.