]> andersk Git - splint.git/blobdiff - src/llmain.c
Added splint.spec file contributed by Heiko Abraham
[splint.git] / src / llmain.c
index b6adf98c3a22a0388b9cbae2718690267e918fd5..0ebce768e3c15e43aaa76eda5ba21cd3f6e01bc7 100644 (file)
@@ -366,10 +366,7 @@ lslProcess (fileIdList lclfiles)
 
          setSpecFileId (fid);
                  
-         if (context_getFlag (FLG_SHOWSCAN))
-           {
-             lldiagmsg (message ("< reading spec %s >", g_currentSpec));
-           }
+         displayScan (message ("reading spec %s", g_currentSpec));
          
          /* Open the source file */
          
@@ -525,11 +522,13 @@ static void handlePassThroughFlag (char *arg)
 
 void showHerald (void)
 {
-  if (hasShownHerald || context_getFlag (FLG_QUIET)) return;
-
+  if (hasShownHerald || context_getFlag (FLG_QUIET)) 
+    {
+      return;
+    }
   else
     {
-      fprintf (g_msgstream, "%s\n\n", SPLINT_VERSION);
+      fprintf (g_messagestream, "%s\n\n", SPLINT_VERSION);
       hasShownHerald = TRUE;
       llflush ();
     }
@@ -630,7 +629,7 @@ int main (int argc, char *argv[])
 # ifdef NOLCL
   /*@globals killed undef g_currentloc,
             killed undef yyin,
-                    undef g_msgstream;
+                    undef g_warningstream, g_messagestream, g_errorstream;
    @*/
   /*@modifies g_currentloc, fileSystem,
              yyin; 
@@ -642,7 +641,7 @@ int main (int argc, char *argv[])
             killed undef g_currentSpec,
             killed undef g_currentSpecName,
             killed undef yyin,
-                    undef g_msgstream;
+                    undef g_warningstream, g_messagestream, g_errorstream;
    @*/
   /*@modifies g_currentloc, initFile, 
               g_localSpecPath, g_currentSpec, g_currentSpecName, fileSystem,
@@ -651,8 +650,6 @@ int main (int argc, char *argv[])
 # endif
 {
   bool first_time = TRUE;
-  bool showhelp = FALSE;
-  bool allhelp = TRUE;
   bool expsuccess;
   inputStream sourceFile = inputStream_undefined;
  
@@ -667,7 +664,9 @@ int main (int argc, char *argv[])
   _wildcard (&argc, &argv);
 # endif
 
-  g_msgstream = stdout;
+  g_warningstream = stdout;
+  g_messagestream = stderr;
+  g_errorstream = stderr;
 
   (void) signal (SIGINT, interrupt);
   (void) signal (SIGSEGV, interrupt); 
@@ -686,7 +685,7 @@ int main (int argc, char *argv[])
   setCodePoint ();
   
   g_currentloc = fileloc_createBuiltin ();
-  
+    
   before = clock ();
   context_initMod ();
 
@@ -695,7 +694,14 @@ int main (int argc, char *argv[])
   if (argc <= 1)
     {
       showHelp ();
-      llexit (LLGIVEUP);
+      llexit (LLSUCCESS);
+    }
+  
+  /* -help must be the first flag to get help */
+  if (flagcode_isHelpFlag (flags_identifyFlag (argv[1])))
+    {
+      flags_processHelp (argc - 1, argv + 1);
+      llexit (LLSUCCESS);
     }
 
   setCodePoint ();
@@ -758,6 +764,7 @@ int main (int argc, char *argv[])
       {
        /* Put C_INCLUDE_PATH directories in sysdirs */
        cstring cincval = osd_getEnvironmentVariable (cstring_makeLiteralTemp ("C_INCLUDE_PATH"));
+
        if (cstring_isDefined (cincval))
          {
            context_setString (FLG_SYSTEMDIRS, cstring_copy (cincval));
@@ -800,13 +807,31 @@ int main (int argc, char *argv[])
              {
                nof = TRUE;
              }
-           else if (opt == FLG_SHOWSCAN || opt == FLG_WARNRC || opt == FLG_PARENFILEFORMAT)
+           else if (flagcode_isMessageControlFlag (opt))
              {
                /*
                ** Need to set it immediately, so rc file scan is displayed
                */
 
                context_userSetFlag (opt, set);
+
+               if (flagcode_hasArgument (opt))
+                 {
+                   llassert (flagcode_hasString (opt));
+                   
+                   if (++i < argc)
+                     {
+                       fname = cstring_fromChars (argv[i]);
+                       setStringFlag (opt, fname);
+                     }
+                   else
+                     {
+                       llfatalerror 
+                         (message
+                          ("Flag %s must be followed by a string",
+                           flagcode_unparse (opt)));
+                     }
+                 }
              }
            else if (opt == FLG_OPTF)
              {
@@ -900,269 +925,10 @@ int main (int argc, char *argv[])
   }
   
   setCodePoint ();
-  
-  for (i = 1; i < argc; i++)
-    {
-      char *thisarg;
-      flagcode opt;
-      
-      thisarg = argv[i];
-      
-      if (showhelp)
-       {
-         if (allhelp)
-           {
-             showHerald ();
-           }
-         
-         allhelp = FALSE;
-         
-         if (*thisarg == '-' || *thisarg == '+')
-           {
-             thisarg++;        /* skip '-' */
-           }
-         if (mstring_equal (thisarg, "modes"))
-           {
-             llmsg (describeModes ());
-           }
-         else if (mstring_equal (thisarg, "vars")
-                  || mstring_equal (thisarg, "env"))
-           {
-             describeVars ();
-           }
-         else if (mstring_equal (thisarg, "annotations"))
-           {
-             printAnnotations ();
-           }
-         else if (mstring_equal (thisarg, "parseerrors"))
-           {
-             printParseErrors ();
-           }
-         else if (mstring_equal (thisarg, "comments"))
-           {
-             printComments ();
-           }
-         else if (mstring_equal (thisarg, "prefixcodes"))
-           {
-             describePrefixCodes ();
-           }
-         else if (mstring_equal (thisarg, "references") 
-                  || mstring_equal (thisarg, "refs"))
-           {
-             printReferences ();
-           }
-         else if (mstring_equal (thisarg, "mail"))
-           {
-             printMail ();
-           }
-         else if (mstring_equal (thisarg, "maintainer")
-                  || mstring_equal (thisarg, "version"))
-           {
-             printMaintainer ();
-           }
-         else if (mstring_equal (thisarg, "flags"))
-           {
-             if (i + 1 < argc)
-               {
-                 char *next = argv[i + 1];
-                 
-                 if (specialFlagsHelp (next))
-                   {
-                     i++;
-                   }
-                 else
-                   {
-                     flagkind k = identifyCategory (cstring_fromChars (next));
-                     
-                     if (k != FK_NONE)
-                       {
-                         printCategory (k);
-                         i++;
-                       }
-                   }
-               }
-             else
-               {
-                 printFlags ();
-               }
-           }
-         else
-           {
-             cstring s = describeFlag (cstring_fromChars (thisarg));
-             
-             if (cstring_isDefined (s))
-               {
-                 llmsg (s);
-               }
-           }
-       }
-      else
-       {
-         if (*thisarg == '-' || *thisarg == '+')
-           {
-             bool set = (*thisarg == '+');
-             cstring flagname;
-             
-             thisarg++;        /* skip '-' */
-             flagname = cstring_fromChars (thisarg);
-
-             DPRINTF (("Flag: %s", flagname));
-             opt = flags_identifyFlag (flagname);
-             DPRINTF (("Flag: %s", flagcode_unparse (opt)));
-
-             if (flagcode_isSkip (opt) || opt == FLG_SHOWSCAN || opt == FLG_WARNRC || opt == FLG_PARENFILEFORMAT)
-               {
-                 /* showscan already processed */
-                 DPRINTF (("Skipping!"));
-               }
-             else if (flagcode_isInvalid (opt))
-               {
-                 DPRINTF (("Invalid: %s", flagname));
 
-                 if (isMode (flagname))
-                   {
-                     context_setMode (flagname);
-                   }
-                 else
-                   {
-                     DPRINTF (("Error!"));
-                     voptgenerror (FLG_BADFLAG,
-                                   message ("Unrecognized option: %s", 
-                                            cstring_fromChars (thisarg)),
-                                   g_currentloc);
-                   }
-               }
-             else
-               {
-                 context_userSetFlag (opt, set);
-                 
-                 if (flagcode_hasArgument (opt))
-                   {
-                     if (opt == FLG_HELP)
-                       {
-                         showhelp = TRUE;
-                       }
-                     else if (flagcode_isPassThrough (opt)) /* -D or -U */
-                       { 
-                         passThroughArgs = cstringSList_add 
-                           (passThroughArgs, cstring_fromChars (thisarg));
-                       }
-                     else if (flagcode_hasNumber (opt))
-                       {
-                         if (++i < argc)
-                           {
-                             setValueFlag (opt, cstring_fromChars (argv[i]));
-                           }
-                         else
-                           {
-                             llfatalerror 
-                               (message
-                                ("Flag %s must be followed by a number",
-                                 flagcode_unparse (opt)));
-                           }
-                       } 
-                     else if (flagcode_hasChar (opt))
-                       {
-                         if (++i < argc)
-                           {
-                             setValueFlag (opt, cstring_fromChars (argv[i]));
-                           }
-                         else
-                           {
-                             llfatalerror 
-                               (message
-                                ("Flag %s must be followed by a character",
-                                 flagcode_unparse (opt)));
-                           }
-                       } 
-                     else if (opt == FLG_INCLUDEPATH || opt == FLG_SPECPATH)
-                       {
-                         cstring dir = cstring_suffix (cstring_fromChars (thisarg), 1); /* skip over I */
-                         
-                         switch (opt)
-                           {
-                           case FLG_INCLUDEPATH:
-                             cppAddIncludeDir (dir);
-                             /*@switchbreak@*/ break;
-                           case FLG_SPECPATH:
-                             /*@-mustfree@*/
-                             g_localSpecPath = cstring_toCharsSafe
-                               (message ("%s%h%s", 
-                                         cstring_fromChars (g_localSpecPath), 
-                                         PATH_SEPARATOR,
-                                         dir));
-                             /*@=mustfree@*/
-                             /*@switchbreak@*/ break;
-                             BADDEFAULT;
-                           }
-                       }
-                     else if (flagcode_hasString (opt)
-                              || opt == FLG_INIT || opt == FLG_OPTF)
-                       {
-                         if (++i < argc)
-                           {
-                             cstring arg = cstring_fromChars (argv[i]);
-                             
-                             if (opt == FLG_OPTF)
-                               {
-                                 ; /* -f already processed */
-                               }
-                             else if (opt == FLG_INIT)
-                               {
-# ifndef NOLCL
-                                 initFile = inputStream_create 
-                                   (arg, 
-                                    cstring_makeLiteralTemp (LCLINIT_SUFFIX),
-                                    FALSE);
-# endif
-                                 break;
-                               }
-                             else
-                               {
-                                 DPRINTF (("String flag: %s / %s",
-                                           flagcode_unparse (opt), arg));
-                                 if (opt == FLG_MTSFILE)
-                                   {
-                                     /*
-                                     ** arg identifies mts files
-                                     */
-                                     cstring tmp =  message ("%s%s", arg, MTS_EXTENSION);
-                                     addLarchPathFile (mtfiles, tmp);
-                                     cstring_free (tmp);
-                                     tmp = message ("%s%s", arg, XH_EXTENSION);
-                                     addXHFile (xfiles, tmp);
-                                     cstring_free (tmp);
-                                   }
-                                 else
-                                   {
-                                     setStringFlag (opt, cstring_copy (arg));
-                                   }
-                               }
-                           }
-                         else
-                           {
-                             llfatalerror 
-                               (message
-                                ("Flag %s must be followed by a string",
-                                 flagcode_unparse (opt)));
-                           }
-                       }
-                     else
-                       {
-                         /* no argument */
-                       }
-                   }
-               }
-           }
-         else /* its a filename */
-           {
-             DPRINTF (("Adding filename: %s", thisarg));
-             fl = cstringSList_add (fl, cstring_fromChars (thisarg));
-           }
-       }
-    }
+  /* argv[0] is the program name, don't pass it to flags_processFlags */
+  flags_processFlags (argc - 1, argv + 1);
 
-  setCodePoint ();  
   showHerald (); 
   
   /*
@@ -1227,7 +993,7 @@ int main (int argc, char *argv[])
        {
          showHelp ();
        }
-      fprintf (g_msgstream, "\n");
+      fprintf (g_warningstream, "\n");
 
       fileIdList_free (cfiles);
       fileIdList_free (xfiles);
@@ -1251,17 +1017,9 @@ int main (int argc, char *argv[])
     {
       cstring m = context_getMerge ();
 
-      if (context_getFlag (FLG_SHOWSCAN))
-       {
-         fprintf (g_msgstream, "< loading %s ", cstring_toCharsSafe (m));
-       }
-
+      displayScanOpen (message ("< loading %s ", m));
       loadState (m);
-
-      if (context_getFlag (FLG_SHOWSCAN))
-       {
-         fprintf (g_msgstream, " >\n");
-       }
+      displayScanClose ();
 
       if (!usymtab_existsType (context_getBoolName ()))
        {
@@ -1293,12 +1051,7 @@ int main (int argc, char *argv[])
   fileIdList_elements (mtfiles, mtfile)
     {
       context_setFileId (mtfile);
-
-      if (context_getFlag (FLG_SHOWSCAN))
-       {
-         lldiagmsg (message ("< processing %s >", fileTable_rootFileName (mtfile)));
-       }
-      
+      displayScan (message ("processing %s", fileTable_rootFileName (mtfile)));
       mtreader_readFile (cstring_copy (fileTable_fileName (mtfile)));
     } end_fileIdList_elements;
 
@@ -1347,10 +1100,7 @@ int main (int argc, char *argv[])
 
       llflush ();
 
-      if (context_getFlag (FLG_SHOWSCAN))
-       {
-         fprintf (stderr, "< preprocessing"); 
-       }
+      displayScanOpen (cstring_makeLiteral ("preprocessing"));
       
       lcltime = clock ();
 
@@ -1365,11 +1115,7 @@ int main (int argc, char *argv[])
 
       fileIdList_free (cfiles);
 
-      if (context_getFlag (FLG_SHOWSCAN))
-       {
-         fprintf (stderr, " >\n");
-       }
-      
+      displayScanClose ();
       pptime = clock ();
     }
   else
@@ -1421,10 +1167,7 @@ int main (int argc, char *argv[])
        
          llassert (yyin != NULL);
 
-         if (context_getFlag (FLG_SHOWSCAN))
-           {
-             lldiagmsg (message ("< checking %q >", osd_outputPath (fileTable_rootFileName (fid))));
-           }
+         displayScan (message ("checking %q", osd_outputPath (fileTable_rootFileName (fid))));
          
          /*
          ** Every time, except the first time, through the loop,
@@ -1461,10 +1204,7 @@ int main (int argc, char *argv[])
   **   is this correct behaviour?
   */
   
-  if (context_getFlag (FLG_SHOWSCAN))
-    {
-      lldiagmsg (cstring_makeLiteral ("< global checks >"));
-    }
+  displayScan (cstring_makeLiteral ("global checks"));
 
   cleanupMessages ();
   
@@ -1532,7 +1272,7 @@ int main (int argc, char *argv[])
     expsuccess = TRUE;
 
     if (context_neednl ())
-      fprintf (g_msgstream, "\n");
+      fprintf (g_warningstream, "\n");
     
 # ifndef NOLCL
     if (nspecErrors > 0)
@@ -1665,15 +1405,15 @@ int main (int argc, char *argv[])
       
       if (specLines > 0)
        {
-         fprintf (g_msgstream, "%d spec, ", specLines);
+         fprintf (g_warningstream, "%d spec, ", specLines);
        }
       
 # ifndef CLOCKS_PER_SEC
-      fprintf (g_msgstream, "%d source lines in %ld time steps (steps/sec unknown)\n", 
+      fprintf (g_warningstream, "%d source lines in %ld time steps (steps/sec unknown)\n", 
               context_getLinesProcessed (), 
               (long) ttime);
 # else
-      fprintf (g_msgstream, "%d source lines in %.2f s.\n", 
+      fprintf (g_warningstream, "%d source lines in %.2f s.\n", 
               context_getLinesProcessed (), 
               (double) ttime / CLOCKS_PER_SEC);
 # endif
@@ -2172,7 +1912,7 @@ interrupt (int i)
   switch (i)
     {
     case SIGINT:
-      fprintf (stderr, "*** Interrupt\n");
+      fprintf (g_errorstream, "*** Interrupt\n");
       llexit (LLINTERRUPT);
     case SIGSEGV:
       {
@@ -2181,28 +1921,28 @@ interrupt (int i)
        /* Cheat when there are parse errors */
        checkParseError (); 
        
-       fprintf (stderr, "*** Segmentation Violation\n");
+       fprintf (g_errorstream, "*** Segmentation Violation\n");
        
        /* Don't catch it if fileloc_unparse causes a signal */
        (void) signal (SIGSEGV, NULL);
 
        loc = fileloc_unparse (g_currentloc);
        
-       fprintf (stderr, "*** Location (not trusted): %s\n", 
+       fprintf (g_errorstream, "*** Location (not trusted): %s\n", 
                 cstring_toCharsSafe (loc));
        cstring_free (loc);
        printCodePoint ();
-       fprintf (stderr, "*** Please report bug to %s\n", SPLINT_MAINTAINER);
+       fprintf (g_errorstream, "*** Please report bug to %s\n", SPLINT_MAINTAINER);
        exit (LLGIVEUP);
       }
     default:
-      fprintf (stderr, "*** Signal: %d\n", i);
+      fprintf (g_errorstream, "*** Signal: %d\n", i);
       /*@-mustfree@*/
-      fprintf (stderr, "*** Location (not trusted): %s\n", 
+      fprintf (g_errorstream, "*** Location (not trusted): %s\n", 
               cstring_toCharsSafe (fileloc_unparse (g_currentloc)));
       /*@=mustfree@*/
       printCodePoint ();
-      fprintf (stderr, "*** Please report bug to %s ***\n", SPLINT_MAINTAINER);
+      fprintf (g_errorstream, "*** Please report bug to %s ***\n", SPLINT_MAINTAINER);
       exit (LLGIVEUP);
     }
 }
@@ -2227,7 +1967,7 @@ cleanupFiles (void)
 
   if (context_getFlag (FLG_KEEP))
     {
-      check (fputs ("Temporary files kept:\n", stderr) != EOF);
+      check (fputs ("Temporary files kept:\n", g_messagestream) != EOF);
       fileTable_printTemps (context_fileTable ());
     }
   else
@@ -2297,18 +2037,15 @@ bool readOptionsFile (cstring fname, cstringSList *passThroughArgs, bool report)
     }
   else
     {
-      FILE *innerf = fileTable_openFile (context_fileTable (), fname, "r");
+      FILE *innerf = fileTable_openReadFile (context_fileTable (), fname);
       
       if (innerf != NULL)
        {
          fileloc fc = g_currentloc;
          g_currentloc = fileloc_createRc (fname);
 
-         if (context_getFlag (FLG_SHOWSCAN))
-           {
-             lldiagmsg (message ("< reading options from %q >", 
-                                 fileloc_outputFilename (g_currentloc)));
-           }
+         displayScan (message ("< reading options from %q >", 
+                               fileloc_outputFilename (g_currentloc)));
          
          loadrc (innerf, passThroughArgs);
          fileloc_reallyFree (g_currentloc);
@@ -2456,7 +2193,7 @@ loadrc (/*:open:*/ FILE *rcfile, cstringSList *passThroughArgs)
            {
              DPRINTF (("Invalid: %s", thisflag));
 
-             if (isMode (cstring_fromChars (thisflag)))
+             if (flags_isModeName (cstring_fromChars (thisflag)))
                {
                  context_setMode (cstring_fromChars (thisflag));
                }
@@ -2492,7 +2229,20 @@ loadrc (/*:open:*/ FILE *rcfile, cstringSList *passThroughArgs)
                  else if (opt == FLG_INCLUDEPATH 
                           || opt == FLG_SPECPATH)
                    {
-                     cstring dir = cstring_suffix (cstring_fromChars (thisflag), 1); /* skip over I/S */
+                     cstring dir;
+
+                     /*
+                     ** Either -I<dir> or -I <dir>
+                     */
+
+                     if (cstring_length (thisflag) > 1)
+                       {
+                         dir = cstring_suffix (cstring_fromChars (thisflag), 1); /* skip over I/S */
+                       }
+                     else
+                       {
+                         BADBRANCH; /*@!!!!@*/
+                       }
                                      
                      switch (opt)
                        {
@@ -2686,13 +2436,13 @@ static fileIdList preprocessFiles (fileIdList fl, bool xhfiles)
              if ((filesprocessed % skip) == 0) 
                {
                  if (filesprocessed == 0) {
-                   fprintf (stderr, " ");
+                   fprintf (g_messagestream, " ");
                  }
                  else {
-                   fprintf (stderr, ".");
+                   fprintf (g_messagestream, ".");
                  }
                  
-                 (void) fflush (stderr);
+                 (void) fflush (g_messagestream);
                }
              filesprocessed++;
            }
This page took 0.056499 seconds and 4 git commands to generate.