X-Git-Url: http://andersk.mit.edu/gitweb/splint.git/blobdiff_plain/aa9c16018c05551094b01617f312d52735a8ddd9..2a3f24b83026515b6a9ce54a2ff4fb1eab2fe2f9:/src/flags.c diff --git a/src/flags.c b/src/flags.c index a56ab38..27e018e 100644 --- a/src/flags.c +++ b/src/flags.c @@ -27,7 +27,10 @@ # include "splintMacros.nf" # include "basic.h" +# include "osd.h" # include "portab.h" +# include "rcfiles.h" +# include "lslinit.h" /* ** from the CC man page: @@ -1241,6 +1244,7 @@ flags_identifyFlagAux (cstring s, bool quiet) else if (flags_isModeName (cflag)) { res = MODENAME_FLAG; + } else { res = INVALID_FLAG; @@ -1548,15 +1552,111 @@ bool flagcode_isNamePrefixFlag (flagcode f) return FALSE; } } - -bool flags_processFlags (bool inCommandLine, int argc, char **argv) + +static cstring findLarchPathFile (/*@temp@*/ cstring s) { - int i; + cstring pathName; + filestatus status; + + status = osd_getPath (context_getLarchPath (), s, &pathName); + + if (status == OSD_FILEFOUND) + { + return pathName; + } + else if (status == OSD_FILENOTFOUND) + { + showHerald (); + lldiagmsg (message ("Cannot find file on LARCH_PATH: %s", s)); + } + else if (status == OSD_PATHTOOLONG) + { + /* Directory and filename are too long. Report error. */ + llbuglit ("soure_getPath: Filename plus directory from search path too long"); + } + else + { + BADBRANCH; + } + + return cstring_undefined; +} + +static void addLarchPathFile (fileIdList files, /*@temp@*/ cstring s) +{ + cstring pathName = findLarchPathFile (s); + + if (cstring_isDefined (pathName)) + { + if (fileTable_exists (context_fileTable (), pathName)) + { + showHerald (); + lldiagmsg (message ("File listed multiple times: %s", pathName)); + cstring_free (pathName); + } + else + { + fileIdList_add (files, fileTable_addFileOnly (context_fileTable (), pathName)); + } + } +} + + +static void addFile (fileIdList files, /*@only@*/ cstring s) +{ + if (fileTable_exists (context_fileTable (), s)) + { + showHerald (); + lldiagmsg (message ("File listed multiple times: %s", s)); + cstring_free (s); + } + else + { + fileIdList_add (files, fileTable_addFileOnly (context_fileTable (), s)); + } +} + +static void addXHFile (fileIdList files, /*@temp@*/ cstring s) +{ + cstring pathName = findLarchPathFile (s); + + if (cstring_isDefined (pathName)) + { + if (fileTable_exists (context_fileTable (), pathName)) + { + showHerald (); + lldiagmsg (message ("File listed multiple times: %s", s)); + } + else + { + fileIdList_add (files, fileTable_addXHFile (context_fileTable (), pathName)); + } + } + cstring_free (pathName); +} + +void +flags_processFlags (bool inCommandLine, + fileIdList xfiles, + fileIdList cfiles, + fileIdList lclfiles, + fileIdList mtfiles, + cstringSList *passThroughArgs, + int argc, char **argv) +{ + int i; + cstringSList fl = cstringSList_undefined; + for (i = 0; i < argc; i++) { - char *thisarg = argv[i]; - + char *thisarg; + + llassert (argv != NULL); + thisarg = argv[i]; + + DPRINTF (("thisarg: %s", thisarg)); + if (*thisarg == '-' || *thisarg == '+') { bool set = (*thisarg == '+'); @@ -1590,7 +1690,39 @@ bool flags_processFlags (bool inCommandLine, int argc, char **argv) g_currentloc); } } - else if (flagcode_isModeNameFlag (opt)) + else if (flagcode_isPassThrough (opt)) /* preprocessor flag: -D or -U */ + { + /* + ** Following space is optional, don't include the - + */ + + *passThroughArgs = cstringSList_add (*passThroughArgs, + cstring_fromChars (thisarg + 1)); + } + else if (opt == FLG_INCLUDEPATH || opt == FLG_SPECPATH) + { + cstring dir = cstring_suffix (cstring_fromChars (thisarg), 1); /* skip over I */ + + DPRINTF (("Directory: %s", dir)); + + 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_isModeName (opt)) { context_setMode (flagname); } @@ -1615,223 +1747,179 @@ bool flags_processFlags (bool inCommandLine, int argc, char **argv) if (flagcode_hasArgument (opt)) { - if (flagcode_isPassThrough (opt)) /* -D or -U */ - { - /* - ** Following space is optional - */ - - flags_recordPassThroughArg (flagname); - - passThroughArgs = cstringSList_add - (passThroughArgs, cstring_fromChars (thisarg)); - } - else if (flagcode_hasNumber (opt)) + if (flagcode_hasNumber (opt)) + { + if (++i < argc) { - 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)) + setValueFlag (opt, cstring_fromChars (argv[i])); + } + else { - 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) + voptgenerror + (FLG_BADFLAG, + message + ("Flag %s must be followed by a number", + flagcode_unparse (opt)), + g_currentloc); + } + } + else if (flagcode_hasChar (opt)) + { + if (++i < argc) { - 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; - } + setValueFlag (opt, cstring_fromChars (argv[i])); + } + else + { + voptgenerror + (FLG_BADFLAG, + message + ("Flag %s must be followed by a character", + flagcode_unparse (opt)), + g_currentloc); } - else if (flagcode_hasString (opt) - || opt == FLG_INIT || opt == FLG_OPTF) + } + else if (flagcode_hasString (opt) + || opt == FLG_INIT || opt == FLG_OPTF) + { + if (++i < argc) { - if (++i < argc) + cstring arg = cstring_fromChars (argv[i]); + + if (opt == FLG_OPTF) { - cstring arg = cstring_fromChars (argv[i]); - - if (opt == FLG_OPTF) + if (inCommandLine) { ; /* -f already processed */ } - else if (opt == FLG_INIT) + else { + (void) rcfiles_read (arg, passThroughArgs, TRUE); + } + } + else if (opt == FLG_INIT) + { # ifndef NOLCL - initFile = inputStream_create - (arg, - cstring_makeLiteralTemp (LCLINIT_SUFFIX), - FALSE); + lslinit_setInitFile (inputStream_create + (arg, + cstring_makeLiteralTemp (LCLINIT_SUFFIX), + FALSE)); # endif - break; + 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 { - 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)); - } + setStringFlag (opt, cstring_copy (arg)); } } - else - { - llfatalerror - (message - ("Flag %s must be followed by a string", - flagcode_unparse (opt))); - } } else { - /* no argument */ + voptgenerror + (FLG_BADFLAG, + message + ("Flag %s must be followed by a string", + flagcode_unparse (opt)), + g_currentloc); } } + else + { + /* no argument */ + } } } - else /* its a filename */ - { - DPRINTF (("Adding filename: %s", thisarg)); - fl = cstringSList_add (fl, cstring_fromChars (thisarg)); - } + } + else /* its a filename */ + { + DPRINTF (("Adding filename: %s", thisarg)); + fl = cstringSList_add (fl, cstring_fromChars (thisarg)); } } -} - -void flags_processHelp (int argc, char **argv) -{ - - if (showhelp) + /* + ** create lists of C and LCL files + */ + + if (inCommandLine) + { + cstringSList_elements (fl, current) { - if (allhelp) - { - showHerald (); - } - - allhelp = FALSE; + cstring ext = fileLib_getExtension (current); - 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")) + if (cstring_isUndefined (ext)) { - printParseErrors (); + /* no extension --- both C and LCL with default extensions */ + + addFile (cfiles, message ("%s%s", current, C_EXTENSION)); + addFile (lclfiles, message ("%s%s", current, LCL_EXTENSION)); } - else if (mstring_equal (thisarg, "comments")) + else if (cstring_equal (ext, XH_EXTENSION)) { - printComments (); + addXHFile (xfiles, current); } - else if (mstring_equal (thisarg, "prefixcodes")) + else if (cstring_equal (ext, PP_EXTENSION)) { - describePrefixCodes (); + if (!context_getFlag (FLG_NOPP)) + { + voptgenerror + (FLG_FILEEXTENSIONS, + message ("File extension %s used without +nopp flag (will be processed as C source code): %s", + ext, current), + g_currentloc); + } + + addFile (cfiles, cstring_copy (current)); } - else if (mstring_equal (thisarg, "references") - || mstring_equal (thisarg, "refs")) + else if (cstring_equal (ext, LCL_EXTENSION)) { - printReferences (); + addFile (lclfiles, cstring_copy (current)); } - else if (mstring_equal (thisarg, "mail")) + else if (fileLib_isCExtension (ext)) { - printMail (); + addFile (cfiles, cstring_copy (current)); } - else if (mstring_equal (thisarg, "maintainer") - || mstring_equal (thisarg, "version")) + else if (cstring_equal (ext, MTS_EXTENSION)) { - printMaintainer (); + addLarchPathFile (mtfiles, current); } - else if (mstring_equal (thisarg, "flags")) + else { - 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)); + voptgenerror + (FLG_FILEEXTENSIONS, + message ("Unrecognized file extension: %s (assuming %s is C source code)", + current, ext), + g_currentloc); - if (cstring_isDefined (s)) - { - llmsg (s); - } + addFile (cfiles, cstring_copy (current)); } - } - else + } end_cstringSList_elements; + } + else + { + if (cstringSList_size (fl) != 0) { + /* Cannot list files in .splintrc files */ + voptgenerror (FLG_BADFLAG, + message ("Cannot list files in .splintrc files: %s (probable missing + or -)", + cstringSList_unparse (fl)), + g_currentloc); + } + } +}