X-Git-Url: http://andersk.mit.edu/gitweb/splint.git/blobdiff_plain/747ae48b0021a9b0d928e0fc8f2a0e36421692a0..52e90c0f77bb0e3edb043873b71a73459d4ae8ab:/src/llmain.c diff --git a/src/llmain.c b/src/llmain.c index 7b795ec..2031c6d 100644 --- a/src/llmain.c +++ b/src/llmain.c @@ -17,8 +17,8 @@ ** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, ** MA 02111-1307, USA. ** -** For information on splint: splint@cs.virginia.edu -** To report a bug: splint-bug@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 */ /* @@ -114,6 +114,8 @@ static /*@only@*/ /*@null@*/ inputStream initFile = inputStream_undefined; static fileIdList preprocessFiles (fileIdList, bool) /*@modifies fileSystem@*/ ; +static void warnSysFiles(fileIdList p_files) /*@modifies fileSystem@*/; + # ifndef NOLCL static @@ -364,12 +366,9 @@ 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 source file */ + /* Open the source file */ if (!inputStream_open (specFile)) { @@ -523,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 (); } @@ -628,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; @@ -640,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, @@ -665,7 +666,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); @@ -684,7 +687,7 @@ int main (int argc, char *argv[]) setCodePoint (); g_currentloc = fileloc_createBuiltin (); - + before = clock (); context_initMod (); @@ -798,13 +801,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) { @@ -1008,10 +1029,16 @@ int main (int argc, char *argv[]) opt = flags_identifyFlag (flagname); DPRINTF (("Flag: %s", flagcode_unparse (opt))); - if (flagcode_isSkip (opt) || opt == FLG_SHOWSCAN || opt == FLG_WARNRC || opt == FLG_PARENFILEFORMAT) + if (flagcode_isMessageControlFlag (opt)) { - /* showscan already processed */ - DPRINTF (("Skipping!")); + /* + ** Processed on first pass + */ + + if (flagcode_hasArgument (opt)) + { + ++i; + } } else if (flagcode_isInvalid (opt)) { @@ -1225,7 +1252,7 @@ int main (int argc, char *argv[]) { showHelp (); } - fprintf (g_msgstream, "\n"); + fprintf (g_warningstream, "\n"); fileIdList_free (cfiles); fileIdList_free (xfiles); @@ -1249,17 +1276,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 ())) { @@ -1291,12 +1310,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; @@ -1345,16 +1359,14 @@ int main (int argc, char *argv[]) llflush (); - if (context_getFlag (FLG_SHOWSCAN)) - { - fprintf (stderr, "< preprocessing"); - } + displayScanOpen (cstring_makeLiteral ("preprocessing")); lcltime = clock (); context_setPreprocessing (); dercfiles = preprocessFiles (xfiles, TRUE); tfiles = preprocessFiles (cfiles, FALSE); + warnSysFiles(cfiles); dercfiles = fileIdList_append (dercfiles, tfiles); fileIdList_free (tfiles); @@ -1362,11 +1374,7 @@ int main (int argc, char *argv[]) fileIdList_free (cfiles); - if (context_getFlag (FLG_SHOWSCAN)) - { - fprintf (stderr, " >\n"); - } - + displayScanClose (); pptime = clock (); } else @@ -1418,10 +1426,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, @@ -1458,10 +1463,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 (); @@ -1529,7 +1531,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) @@ -1662,15 +1664,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 @@ -2169,7 +2171,7 @@ interrupt (int i) switch (i) { case SIGINT: - fprintf (stderr, "*** Interrupt\n"); + fprintf (g_errorstream, "*** Interrupt\n"); llexit (LLINTERRUPT); case SIGSEGV: { @@ -2178,28 +2180,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); } } @@ -2224,7 +2226,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 @@ -2301,11 +2303,8 @@ bool readOptionsFile (cstring fname, cstringSList *passThroughArgs, bool report) 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); @@ -2683,13 +2682,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++; } @@ -2780,3 +2779,19 @@ char *specFullName (char *specfile, /*@out@*/ char **inpath) return specname; } # endif + +void warnSysFiles(fileIdList files) +{ + fileIdList_elements (files, file) + { + + if (fileTable_isSystemFile (context_fileTable (), file) ) + { + if (!context_getFlag( FLG_SYSTEMDIRERRORS ) ) + { + voptgenerror (FLG_WARNSYSFILES, message ("Warning %s is a considered a system file. No errors in this file will be reported.", fileTable_rootFileName (file) ), g_currentloc); + } + } + } + end_fileIdList_elements; +}