]> andersk Git - splint.git/blobdiff - src/llerror.c
Fixed all /*@i...@*/ tags (except 1).
[splint.git] / src / llerror.c
index e7dfe9ff40e4dc176b0cdfa36a2bca5ca66993c6..4f108c481e19ab70751f63ee7b43895eb93f4391 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
@@ -30,7 +30,7 @@
 # include "splintMacros.nf"
 # include <string.h>
 # include <errno.h>
-# include "llbasic.h"
+# include "basic.h"
 # include "llmain.h"
 # include "cpperror.h"
 # include "Headers/version.h" /* Visual C++ finds a different version.h on some path! */
 static void printIndentMessage (FILE *p_stream, /*@only@*/ cstring p_sc, int p_indent)
    /*@modifies *p_stream@*/ ;
 
-# ifndef NOLCL
 static int lclerrors = 0;
-# endif
-
 static size_t lastfileloclen = 10;
 static /*@only@*/ cstring lastmsg = cstring_undefined;
 static int mcount = 0;
 static /*@only@*/ cstring saveOneMessage = cstring_undefined;
 static /*@only@*/ fileloc lastparseerror = fileloc_undefined;
 static /*@only@*/ fileloc lastbug = fileloc_undefined;
-static bool llgenerrorreal (char *p_srcFile, int p_srcLine, 
-                           /*@only@*/ cstring p_s, fileloc p_fl, bool p_iserror, bool p_indent)
+static bool llgenerrorreal (flagcode p_code, 
+                           char *p_srcFile, int p_srcLine, 
+                           /*@only@*/ cstring p_s,
+                           /*@temp@*/ cstring p_addtext,
+                           fileloc p_fl, bool p_iserror, bool p_indent)
                  /*@modifies g_warningstream@*/ ;
-static bool llgenerroraux (char *p_srcFile, int p_srcLine, 
-                          /*@only@*/ cstring p_s, fileloc p_fl, bool p_iserror, bool p_indent)
+static bool llgenerroraux (flagcode p_code, char *p_srcFile, int p_srcLine, 
+                          /*@only@*/ cstring p_s,
+                          /*@temp@*/ cstring p_addtext,
+                          fileloc p_fl, bool p_iserror, bool p_indent)
                  /*@modifies g_warningstream@*/ ;
 
+static void generateCSV (flagcode p_code, cstring p_s, cstring p_addtext, fileloc p_fl) 
+     /*@modifies g_csvstream@*/ ;
+
 static void printError (FILE *p_stream, /*@only@*/ cstring p_sc)
    /*@globals lastfileloclen @*/
    /*@modifies *p_stream@*/ ;
@@ -118,7 +123,7 @@ void closeMessage (void)
       && context_getFlag (FLG_SHOWSCAN))
     {
       llflush ();
-      displayScanOpen (cstring_makeLiteral ("more preprocessing ."));
+      displayScanOpen (cstring_makeLiteral ("more preprocessing ."));
       llassertprotect (!s_needsPrepare);
       s_needsPrepare = TRUE;
     }
@@ -173,16 +178,7 @@ void llerror_flagWarning (cstring s)
 {
   if (context_getFlag (FLG_WARNFLAGS))
     {
-      showHerald ();
-
-      if (fileloc_isBuiltin (g_currentloc))
-       {
-         llmsg (message ("Warning: %q", s));
-       }
-      else
-       {
-         llgenmsg (message ("Warning: %q", s), g_currentloc);
-       }
+      llgenmsg (s, g_currentloc);
     }
   else
     {
@@ -599,9 +595,12 @@ void
 llgenindentmsg (/*@only@*/ cstring s, fileloc fl)
 {
   cstring flstring = fileloc_unparse (fl);
-
+  int indentspaces = context_getLocIndentSpaces ();
   prepareMessage ();
-  (void) printIndentMessage (g_warningstream, message ("%q: %q", flstring, s), context_getIndentSpaces ());
+  
+  (void) printIndentMessage (g_warningstream, message ("%q: %q", flstring, s),
+                            indentspaces);
+
   closeMessage ();
 }
 
@@ -642,18 +641,22 @@ llgentypeerroraux (char *srcFile, int srcLine,
     ut2 = ctype_baseArrayPtr (ut2);
   }
 
-  if ((ctype_isFloat (ut1) && ctype_isDouble (ut2))
-      || (ctype_isFloat (ut1) && ctype_isDouble (ut2)))
+  if (ctype_isRealNumAbstract (ut1) && exprNode_isNumLiteral (e2)) 
+    {
+      hcode = FLG_NUMABSTRACTLIT;
+    }
+  else if ((ctype_isFloat (ut1) && ctype_isDouble (ut2))
+          || (ctype_isFloat (ut1) && ctype_isDouble (ut2)))
     {
       hcode = FLG_FLOATDOUBLE;
     }
-  else if ((exprNode_isCharLit (e1) && ctype_isInt (ut2))
-          || (exprNode_isCharLit (e2) && ctype_isInt (ut1)))
+  else if ((exprNode_isCharLiteral (e1) && ctype_isInt (ut2))
+          || (exprNode_isCharLiteral (e2) && ctype_isInt (ut1)))
     {
       hcode = FLG_CHARINTLITERAL;
     }
-  else if ((exprNode_isNumLit (e1) && ctype_isReal (ut2))
-          || (exprNode_isNumLit (e2) && ctype_isReal (ut1)))
+  else if ((exprNode_isNumLiteral (e1) && ctype_isReal (ut2))
+          || (exprNode_isNumLiteral (e2) && ctype_isReal (ut1)))
     {
       hcode = FLG_NUMLITERAL;
     }
@@ -674,7 +677,20 @@ llgentypeerroraux (char *srcFile, int srcLine,
     {
       if (!bool_equal (ctype_isSigned (ut1), ctype_isSigned (ut2)))
        {
-         hcode = FLG_IGNORESIGNS;
+         if (ctype_isArbitraryIntegral (ctype_realType (ut1))
+             && !ctype_isArbitraryIntegral (ctype_realType (ut2)))
+           {
+             hcode = FLG_MATCHANYINTEGRAL;
+           }
+         else if (ctype_isArbitraryIntegral (ctype_realType (ut2))
+                  && !ctype_isArbitraryIntegral (ctype_realType (ut1)))
+           {
+             hcode = FLG_MATCHANYINTEGRAL;
+           }
+         else
+           {
+             hcode = FLG_IGNORESIGNS;
+           }
        }
       else
        {
@@ -784,10 +800,32 @@ llgentypeerroraux (char *srcFile, int srcLine,
          
          if (ctype_match (ct, ut1))
            {
-             code = FLG_ABSTRACT;
-             hint = message ("Underlying types match, but %s is an "
-                             "abstract type that is not accessible here.",
-                             ctype_unparse (t2));
+             if (ctype_isNumAbstract (ut2)) 
+               {
+                 if (exprNode_isNumLiteral (e1))
+                   {
+                     code = FLG_NUMABSTRACTLIT;
+                     hint = message ("Underlying types match, but %s is a "
+                                     "numabstract type that is not accessible here. "
+                                     "(Use +numabstractlit to allow numeric literals "
+                                     "to be used as numabstract type values.)",
+                                     ctype_unparse (t2));
+                   }
+                 else
+                   {
+                     code = FLG_NUMABSTRACT;
+                     hint = message ("Underlying types match, but %s is a "
+                                     "numabstract type that is not accessible here.",
+                                     ctype_unparse (t2));
+                   }
+               }
+             else
+               {
+                 code = FLG_ABSTRACT;
+                 hint = message ("Underlying types match, but %s is an "
+                                 "abstract type that is not accessible here.",
+                                 ctype_unparse (t2));
+               }
            }
        }
       else
@@ -830,7 +868,7 @@ llgentypeerroraux (char *srcFile, int srcLine,
     {
       if (!context_suppressFlagMsg (ocode, fl))
        {
-         return llgenhinterror (code, s, hint, fl);
+         return xllgenhinterror (srcFile, srcLine, code, s, hint, fl);
        }
       else
        {
@@ -841,14 +879,27 @@ llgentypeerroraux (char *srcFile, int srcLine,
     }
   else
     {
-      if (llgenerroraux (srcFile, srcLine, s, fl, TRUE, FALSE))
+      if (hcode != INVALID_FLAG && hcode != ocode)
        {
-         if (hcode != INVALID_FLAG && hcode != ocode)
+         code = hcode;
+       }
+      
+      if (llgenerroraux (ocode, srcFile, srcLine, s,
+                        flagcodeHint (code), fl, TRUE, FALSE))
+       {
+         if (code != ocode) 
            {
-             code = hcode;
-             llshowhint (code);
-
-           }
+             if (context_flagOn (code, fl))
+               {
+                 /* The flag is alreay set, something buggy in the flag code */
+                 llcontbug (message ("No hint available, flag %s is already set.",
+                                     flagcode_unparse (code)));
+               }
+             else
+               {
+                 llshowhint (code);
+               }
+         } 
          else
            {
              llsuppresshint ('-', code);
@@ -877,7 +928,22 @@ xllgenformattypeerror (char *srcFile, int srcLine,
 {
   if (!context_suppressFlagMsg (FLG_FORMATTYPE, fl))
     {
-      return llgentypeerroraux (srcFile, srcLine, FLG_FORMATTYPE, t1, e1, t2, e2, s, fl);
+      if (ctype_isInt (t1)
+         && ctype_isNumAbstract (t2))
+       {
+         if (!context_suppressFlagMsg (FLG_NUMABSTRACTPRINT, fl))
+           {
+             return llgentypeerroraux (srcFile, srcLine, FLG_NUMABSTRACTPRINT, t1, e1, t2, e2, s, fl);
+           }
+         else
+           {
+             return FALSE;
+           }
+       }
+      else
+       {
+         return llgentypeerroraux (srcFile, srcLine, FLG_FORMATTYPE, t1, e1, t2, e2, s, fl);
+       }
     }
   else
     {
@@ -889,7 +955,7 @@ xllgenformattypeerror (char *srcFile, int srcLine,
 bool
 xllgenerror (char *srcFile, int srcLine, flagcode o, /*@only@*/ cstring s, fileloc fl)
 {
-  if (llgenerroraux (srcFile, srcLine, s, fl, TRUE, FALSE))
+  if (llgenerroraux (o, srcFile, srcLine, s, flagcodeHint (o), fl, TRUE, FALSE))
     {
       llnosuppresshint (o);
       flagcode_recordError (o);
@@ -910,7 +976,7 @@ xllgenhinterror (char *srcFile, int srcLine,
 {
   if (!context_suppressFlagMsg (o, fl))
     {
-      if (llgenerroraux (srcFile, srcLine, s, fl, TRUE, FALSE))
+      if (llgenerroraux (o, srcFile, srcLine, s, hint, fl, TRUE, FALSE))
        {
          flagcode_recordError (o);
 
@@ -940,14 +1006,17 @@ xllgenhinterror (char *srcFile, int srcLine,
 }
 
 static bool
-llrealerror (char *srcFile, int srcLine, /*@only@*/ cstring s, fileloc fl)
+llrealerror (flagcode code, char *srcFile, int srcLine, /*@only@*/ cstring s, /*@temp@*/ cstring addtext, fileloc fl)
 {
-  return (llgenerrorreal (srcFile, srcLine, s, fl, TRUE, FALSE));
+  return (llgenerrorreal (code, srcFile, srcLine, s, addtext, fl, TRUE, FALSE));
 }
 
 static bool
-llgenerroraux (char *srcFile, int srcLine,
-              /*@only@*/ cstring s, fileloc fl, bool iserror, bool indent)
+llgenerroraux (flagcode code,
+              char *srcFile, int srcLine,
+              /*@only@*/ cstring s, 
+              cstring addtext,
+              fileloc fl, bool iserror, bool indent)
 {
   if (context_inSuppressZone (fl))
     {
@@ -955,7 +1024,7 @@ llgenerroraux (char *srcFile, int srcLine,
       return FALSE;
     }
   
-  if (llgenerrorreal (srcFile, srcLine, s, fl, iserror, indent)) {
+  if (llgenerrorreal (code, srcFile, srcLine, s, addtext, fl, iserror, indent)) {
     return TRUE;
   } else {
     return FALSE;
@@ -968,7 +1037,7 @@ xllforceerror (char *srcFile, int srcLine,
 {
   flagcode_recordError (code);
 
-  if (llgenerrorreal (srcFile, srcLine, s, fl, TRUE, FALSE)) {
+  if (llgenerrorreal (code, srcFile, srcLine, s, cstring_undefined, fl, TRUE, FALSE)) {
     closeMessage ();
     return TRUE;
   } else {
@@ -976,9 +1045,34 @@ xllforceerror (char *srcFile, int srcLine,
   }
 }
 
+static void generateCSV (flagcode code, cstring s, cstring addtext, fileloc fl)
+{
+
+  if (g_csvstream != NULL) {
+    /* Warning, Flag Code, Flag Name, Priority, File, Line, Column, Warning Text, Additional Text */
+    fprintf (g_csvstream, "%d,%d,%s,%d,%s,%d,%d,\"%s\"",
+            context_numErrors (),
+            (int) code, /* flag code */
+            cstring_toCharsSafe (flagcode_unparse (code)), /* flag name */
+            flagcode_priority (code), /* priority */
+            cstring_toCharsSafe (fileloc_outputFilename (fl)),
+            fileloc_lineno (fl),
+            fileloc_column (fl),
+            cstring_toCharsSafe (s));
+
+    if (cstring_isDefined (addtext)) {
+      fprintf (g_csvstream, ",\"%s\"\n", cstring_toCharsSafe (addtext));
+    } else {
+      fprintf (g_csvstream, "\n");
+    }
+  }
+}
+
 static bool
-llgenerrorreal (char *srcFile, int srcLine, 
-               /*@only@*/ cstring s, fileloc fl, bool iserror, bool indent)
+llgenerrorreal (flagcode code, char *srcFile, int srcLine, 
+               /*@only@*/ cstring s, 
+               cstring addtext,
+               fileloc fl, bool iserror, bool indent)
 {
   cstring flstring;
 
@@ -1138,6 +1232,8 @@ llgenerrorreal (char *srcFile, int srcLine,
   flstring = fileloc_unparse (fl);
   lastfileloclen = cstring_length (flstring);
 
+  generateCSV (code, s, addtext, fl);
+
   if (indent)
     {
       printError (g_warningstream, message ("   %q: %q", flstring, s));
@@ -1148,6 +1244,7 @@ llgenerrorreal (char *srcFile, int srcLine,
     }
 
   showSourceLoc (srcFile, srcLine);
+            
   return TRUE;
 }
 
@@ -1200,7 +1297,7 @@ void printError (FILE *stream, /*@only@*/ cstring sc)
 {
   int maxlen = context_getLineLen ();
   size_t nspaces = lastfileloclen + 5;
-  int nextlen = maxlen - nspaces;
+  int nextlen = maxlen - size_toInt (nspaces);
   size_t len = cstring_length (sc);
   int indent = 0;
   char *s = cstring_toCharsSafe (sc);
@@ -1257,7 +1354,7 @@ void printError (FILE *stream, /*@only@*/ cstring sc)
 
          if (nspaces < 1) nspaces = 1;
 
-         nextlen = maxlen - nspaces;
+         nextlen = size_toInt (maxlen - nspaces);
 
          mstring_split (&s, &t, maxlen, &indent);
 
@@ -1289,7 +1386,7 @@ void printError (FILE *stream, /*@only@*/ cstring sc)
       else
        {
          nspaces = 4;
-         nextlen = maxlen - nspaces;
+         nextlen = size_toInt (maxlen - nspaces);
 
          DPRINTF (("Here 2: [%s]", s));
          mstring_split (&s, &t, maxlen, &indent);
@@ -1340,7 +1437,6 @@ xllfatalbug (char *srcFile, int srcLine, /*@only@*/ cstring s)
   llexit (LLFAILURE);
 }
 
-# ifndef NOLCL
 void
 lclfatalbug (char *msg)
 {
@@ -1351,7 +1447,6 @@ lclfatalbug (char *msg)
   printBugReport ();
   llexit (LLFAILURE);
 }
-# endif
 
 void
 checkParseError (void)
@@ -1404,11 +1499,17 @@ void llbugaux (cstring file, int line, /*@only@*/ cstring s)
 
   llflush ();
   
+  /*
+  ** This is confusing, and hardly ever useful.
+
   if (errno != 0)
     {
       perror ("Possible system error diagnostic: ");
     }
 
+  **
+  */
+
   printBugReport ();
   llflush ();
 
@@ -1429,7 +1530,6 @@ void llbugaux (cstring file, int line, /*@only@*/ cstring s)
   inbug = FALSE;
 }
 
-# ifndef NOLCL
 void
 lclbug (/*@only@*/ cstring s)
 {
@@ -1440,29 +1540,29 @@ lclbug (/*@only@*/ cstring s)
   fprintf (g_errorstream, "       (attempting to continue, results may be incorrect)\n");
   closeMessage ();
 }
-# endif
 
 void
-llfatalerror (cstring s)
+xllfatalerror (char *srcFile, int srcLine, cstring s)
 {
   prepareMessage ();
   printError (g_errorstream, s);
   printError (g_errorstream, cstring_makeLiteral ("*** Cannot continue."));
+  showSourceLoc (srcFile, srcLine);
   llexit (LLFAILURE);
 }
 
 void
-llfatalerrorLoc (/*@only@*/ cstring s)
+xllfatalerrorLoc (char *srcFile, int srcLine, /*@only@*/ cstring s)
 {
   prepareMessage ();
   (void) fflush (g_warningstream);
   printError (g_errorstream, message ("%q: %q", fileloc_unparse (g_currentloc), s));
   printError (g_errorstream, cstring_makeLiteral ("*** Cannot continue."));
+  showSourceLoc (srcFile, srcLine);
   (void) fflush (g_warningstream);
   llexit (LLFAILURE);
 }
 
-# ifndef NOLCL
 bool
 lclHadError (void)
 {
@@ -1564,7 +1664,6 @@ lclRedeclarationError (ltoken id)
       lclerror (id, message ("Identifier redeclared: %s", s));
     }
 }
-# endif
 
 void genppllerror (flagcode code, /*@only@*/ cstring s)
 {
@@ -1612,6 +1711,7 @@ void genppllerrorhint (flagcode code, /*@only@*/ cstring s,
     {
       if (context_getFlag (code))
        {
+         generateCSV (code, s, hint, g_currentloc);
          prepareMessage ();
          context_clearPreprocessing ();
          llerror (code, s);
@@ -1699,7 +1799,7 @@ bool xlloptgenerror (char *srcFile, int srcLine,
 {
   DPRINTF (("xllopt: %s", s));
 
-  if (llrealerror (srcFile, srcLine, s, loc))
+  if (llrealerror (o, srcFile, srcLine, s, flagcodeHint (o), loc))
     {
       DPRINTF (("Here we are!"));
       llsuppresshint ('-', o);
@@ -1732,7 +1832,7 @@ bool xoptgenerror2 (char *srcFile, int srcLine,
        }
       else
        {
-         if (llrealerror (srcFile, srcLine, s, loc))
+         if (llrealerror (f1, srcFile, srcLine, s, flagcodeHint (f1), loc))
            {
              llsuppresshint2 ('-', f1, f2);
              flagcode_recordError (f2);
@@ -1767,7 +1867,7 @@ bool xoptgenerror2n (char *srcFile, int srcLine,
        }
       else
        {
-         if (llrealerror (srcFile, srcLine, s, loc))
+         if (llrealerror (f1, srcFile, srcLine, s, flagcodeHint (f2), loc))
            {
              llsuppresshint ('+', f2);
              flagcode_recordError (f2);
@@ -1784,7 +1884,7 @@ bool xoptgenerror2n (char *srcFile, int srcLine,
 bool xllnoptgenerror (char *srcFile, int srcLine,
                      flagcode o, /*@only@*/ cstring s, fileloc loc)
 {
-  if (llrealerror (srcFile, srcLine, s, loc))
+  if (llrealerror (o, srcFile, srcLine, s, flagcodeHint (o), loc))
     {
       llsuppresshint ('+', o);
       flagcode_recordError (o);
@@ -1796,7 +1896,7 @@ bool xllnoptgenerror (char *srcFile, int srcLine,
   return FALSE;
 }
 
-void llparseerror (cstring s)
+void xllparseerror (char *srcFile, int srcLine, cstring s)
 {
   if (context_getFlag (FLG_TRYTORECOVER))
     {
@@ -1806,14 +1906,16 @@ void llparseerror (cstring s)
        {
          if (cstring_isDefined (s))
            {
-             llfatalerror (message ("%q: Parse Error: %q.  "
-                                    "Too many errors, giving up.",
-                                    fileloc_unparse (g_currentloc), s));
+             xllfatalerror (srcFile, srcLine,
+                            message ("%q: Parse Error: %q.  "
+                                     "Too many errors, giving up.",
+                                     fileloc_unparse (g_currentloc), s));
            }
          else
            {
-             llfatalerror (message ("%q: Parse Error.  Too many errors, giving up.",
-                                    fileloc_unparse (g_currentloc)));
+             xllfatalerror (srcFile, srcLine,
+                            message ("%q: Parse Error.  Too many errors, giving up.",
+                                     fileloc_unparse (g_currentloc)));
            }
        }
       else
@@ -1822,10 +1924,12 @@ void llparseerror (cstring s)
            {
              llreportparseerror (message ("Parse Error: %q. Attempting to continue.",
                                           s));
+             showSourceLoc (srcFile, srcLine);
            }
          else
            {
              llreportparseerror (message ("Parse Error. Attempting to continue."));
+             showSourceLoc (srcFile, srcLine);
            }
        }
     }
@@ -1842,27 +1946,32 @@ void llparseerror (cstring s)
          msg = message ("Parse Error.");
        }
 
-      llfatalerror
-       (message ("%q: %s (For help on parse errors, "
+      xllfatalerror
+       (srcFile, srcLine,
+        message ("%q: %s (For help on parse errors, "
                  "see splint -help parseerrors.)",
                  fileloc_unparse (g_currentloc), msg));
     }
 }
 
 bool xfsgenerror (char *srcFile, int srcLine,
-                  flagSpec fs, /*@only@*/ cstring s, fileloc fl) 
+                 flagSpec fs, /*@only@*/ cstring s, fileloc fl) 
 {
   if (flagSpec_isOn (fs, fl))
     {
-      if (llgenerroraux (srcFile, srcLine, s, fl, TRUE, FALSE))
+      flagcode firston = flagSpec_getFirstOn (fs, fl);
+
+      if (llgenerroraux (firston, srcFile, srcLine, s, 
+                        flagcodeHint (firston),
+                        fl, TRUE, FALSE))
        {
-         llsuppresshint ('-', flagSpec_getFirstOn (fs, fl));
-         flagcode_recordError (flagSpec_getFirstOn (fs, fl));
+         llsuppresshint ('-', firston);
+         flagcode_recordError (firston);
          return TRUE;
        }
       else
        {
-         flagcode_recordSuppressed (flagSpec_getFirstOn (fs, fl));
+         flagcode_recordSuppressed (firston);
          return FALSE;
        }
     }
@@ -1941,10 +2050,16 @@ static bool s_scanOpen = FALSE;
 
 void displayScan (cstring msg)
 {
+  if (s_scanOpen)
+    {
+      displayScanClose ();
+    }
+
   llassert (!s_scanOpen);
 
   if (context_getFlag (FLG_SHOWSCAN))
     {
+      showHerald ();
       fprintf (g_messagestream, "< %s >\n", cstring_toCharsSafe (msg));
       (void) fflush (g_messagestream);
     }
@@ -1954,6 +2069,11 @@ void displayScan (cstring msg)
 
 void displayScanOpen (cstring msg)
 {
+  if (s_scanOpen)
+    {
+      displayScanClose ();
+    }
+
   llassert (!s_scanOpen);
   s_scanOpen = TRUE;
 
@@ -1970,22 +2090,41 @@ void displayScanContinue (/*@temp@*/ cstring msg)
 {
   if (context_getFlag (FLG_SHOWSCAN))
     {
-      llassert (s_scanOpen);
-      fprintf (g_messagestream, "%s", cstring_toCharsSafe (msg));
-      (void) fflush (g_messagestream);
+      if (s_scanOpen) 
+       {
+         fprintf (g_messagestream, "%s", cstring_toCharsSafe (msg));
+         (void) fflush (g_messagestream);
+       }
+      else
+       {
+         /*
+         ** Don't call bug recursively
+         */
+
+         fprintf (stderr, "*** Bug: scan continue scan not open\n");
+       }
     }
 }
 
 void displayScanClose (void)
 {
-  llassert (s_scanOpen);
-
-  if (context_getFlag (FLG_SHOWSCAN))
+  if (s_scanOpen)
     {
-      fprintf (g_messagestream, " >\n");
-      (void) fflush (g_messagestream);
+      if (context_getFlag (FLG_SHOWSCAN))
+       {
+         fprintf (g_messagestream, " >\n");
+         (void) fflush (g_messagestream);
+       }
     }
-
+  else
+    {
+      /*
+      ** Don't call bug recursively
+      */
+      
+      fprintf (stderr, "*** Bug: scan close scan not open\n");
+    }
+  
   s_scanOpen = FALSE;
 }
 
This page took 0.069584 seconds and 4 git commands to generate.