X-Git-Url: http://andersk.mit.edu/gitweb/splint.git/blobdiff_plain/68de3f33cfd8b4bd66fe22f6069e2658082bdf58..40fabe2650105c5ada4d352bdd15ebbb701c5693:/src/fileloc.c?ds=sidebyside diff --git a/src/fileloc.c b/src/fileloc.c index 0301a1f..23e4e7f 100644 --- a/src/fileloc.c +++ b/src/fileloc.c @@ -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 */ /* ** fileloc.c @@ -33,16 +33,38 @@ * instead of fileloc_unparseFilename(). */ -# include "lclintMacros.nf" +# include "splintMacros.nf" # include "llbasic.h" -# include "fileIdList.h" +# include "osd.h" # include "portab.h" -static /*@only@*/ fileloc fileloc_createPrim (flkind p_kind, fileId p_fid, int p_line, int p_col); +static /*@only@*/ fileloc fileloc_createPrim (flkind p_kind, fileId p_fid, int p_line, int p_col) /*@*/ ; + +/* +** builtin locs are never free'd +*/ + +static /*@owned@*/ fileloc s_builtinLoc = fileloc_undefined; +static /*@owned@*/ fileloc s_externalLoc = fileloc_undefined; + +void fileloc_destroyMod () +{ + if (fileloc_isDefined (s_builtinLoc)) + { + sfree (s_builtinLoc); + s_builtinLoc = fileloc_undefined; + } + + if (fileloc_isDefined (s_externalLoc)) + { + sfree (s_externalLoc); + s_externalLoc = fileloc_undefined; + } +} static flkind fileId_kind (fileId s) { - cstring fname = rootFileName (s); + cstring fname = fileTable_rootFileName (s); if (fileLib_isLCLFile (fname)) { @@ -63,6 +85,8 @@ fileloc_decColumn (fileloc f, int x) { fileloc ret = fileloc_copy (f); + llassert (x >= 0); + if (x > 0 && fileloc_isDefined (ret)) { llassertprint (ret->column > x, ("decColumn: %d", x)); @@ -210,7 +234,7 @@ cstring fileloc_getBase (fileloc f) { llassert (fileloc_isDefined (f)); - return (fileNameBase (f->fid)); + return (fileTable_fileNameBase (f->fid)); } bool @@ -289,7 +313,6 @@ fileloc_notAfter (fileloc f1, fileloc f2) /*@noaccess fileId@*/ } -# ifndef NOLCL bool fileloc_isStandardLibrary (fileloc f) { @@ -302,7 +325,6 @@ fileloc_isStandardLibrary (fileloc f) || cstring_equalLit (s, LLPOSIXSTRICTLIBS_NAME) || cstring_equalLit (s, LLPOSIXLIBS_NAME)); } -# endif bool fileloc_sameFileAndLine (fileloc f1, fileloc f2) @@ -349,7 +371,7 @@ fileloc_sameModule (fileloc f1, fileloc f2) cstring s1 = fileloc_getBase (f1); cstring s2 = fileloc_getBase (f2); - return (cstring_equal (s1, s2)); + return (cstring_equal (s1, s2)); } } } @@ -428,7 +450,6 @@ fileloc_almostSameFile (fileloc f1, fileloc f2) } } -# ifndef NOLCL /*@only@*/ fileloc fileloc_fromTok (ltoken t) { @@ -445,7 +466,6 @@ fileloc_fromTok (ltoken t) return (fl); } -# endif /*@only@*/ fileloc fileloc_createLib (cstring ln) @@ -480,14 +500,12 @@ fileloc fileloc_createExternal (void) fileloc fileloc_getExternal (void) { - static /*@owned@*/ fileloc res = fileloc_undefined; - - if (res == fileloc_undefined) + if (s_externalLoc == fileloc_undefined) { - res = fileloc_createPrim (FL_EXTERNAL, fileId_invalid, 0, 0); + s_externalLoc = fileloc_createPrim (FL_EXTERNAL, fileId_invalid, 0, 0); } - return res; + return s_externalLoc; } fileloc fileloc_observeBuiltin () @@ -539,13 +557,20 @@ fileloc_makePreprocPrevious (fileloc loc) return (fileloc_createPrim (FL_PREPROC, fileId_invalid, 0, 0)); } +/* We pretend the result is only, because fileloc_free doesn't free it! */ /*@only@*/ fileloc fileloc_createBuiltin () { - return (fileloc_createPrim (FL_BUILTIN, fileId_invalid, 0, 0)); + if (fileloc_isUndefined (s_builtinLoc)) + { + s_builtinLoc = fileloc_createPrim (FL_BUILTIN, fileId_invalid, 0, 0); + } + + /*@-globstate@*/ /*@-retalias@*/ + return s_builtinLoc; + /*@=globstate@*/ /*@=retalias@*/ } -# ifndef NOLCL /*@only@*/ fileloc fileloc_createImport (cstring fname, int lineno) { @@ -558,7 +583,6 @@ fileloc_createImport (cstring fname, int lineno) return (fileloc_createPrim (FL_IMPORT, fid, lineno, 0)); } -# endif static /*@only@*/ fileloc fileloc_createPrim (flkind kind, fileId fid, int line, int col) @@ -574,13 +598,11 @@ fileloc_createPrim (flkind kind, fileId fid, int line, int col) return (f); } -# ifndef NOLCL /*@only@*/ fileloc fileloc_createSpec (fileId fid, int line, int col) { return (fileloc_createPrim (FL_SPEC, fid, line, col)); } -# endif fileloc fileloc_create (fileId fid, int line, int col) { @@ -590,8 +612,26 @@ fileloc fileloc_create (fileId fid, int line, int col) /*@observer@*/ cstring fileloc_filename (fileloc f) { - return (fileloc_isDefined (f) - ? rootFileName (f->fid) : cstring_makeLiteralTemp ("")); + return (fileloc_isDefined (f) ? fileTable_rootFileName (f->fid) : cstring_makeLiteralTemp ("")); +} + +/*@only@*/ cstring fileloc_outputFilename (fileloc f) +{ + if (fileloc_isDefined (f)) + { + if (fileId_isValid (f->fid)) + { + return osd_outputPath (fileTable_rootFileName (f->fid)); + } + else + { + return cstring_makeLiteral (""); + } + } + else + { + return cstring_makeLiteral (""); + } } cstring @@ -602,15 +642,15 @@ fileloc_unparseFilename (fileloc f) switch (f->kind) { case FL_LIB: - return (message ("load file %s", fileloc_filename (f))); + return (message ("load file %q", fileloc_outputFilename (f))); case FL_BUILTIN: return (cstring_makeLiteral ("# builtin #")); case FL_IMPORT: - return (message ("import file %s", fileloc_filename (f))); + return (message ("import file %q", fileloc_outputFilename (f))); case FL_EXTERNAL: return (cstring_makeLiteral ("")); default: - return (cstring_copy (fileloc_filename (f))); + return (fileloc_outputFilename (f)); } } return cstring_undefined; @@ -631,46 +671,67 @@ fileloc_column (fileloc f) /*@only@*/ cstring fileloc_unparse (fileloc f) { + static in_funparse = FALSE; bool parenFormat = context_getFlag (FLG_PARENFILEFORMAT); + bool htmlFormat = context_getFlag (FLG_HTMLFILEFORMAT); + cstring res = cstring_undefined; + + /* watch out for recursive calls when debugging... */ + llassert (!in_funparse); + in_funparse = TRUE; if (fileloc_isDefined (f)) { switch (f->kind) { case FL_BUILTIN: - return (cstring_makeLiteral ("Command Line")); + { + res = cstring_makeLiteral ("Command Line"); + break; + } case FL_IMPORT: if (parenFormat) { - return (message ("import file %s(%d)", rootFileName (f->fid), f->lineno)); + res = message ("import file %q(%d)", fileloc_outputFilename (f), f->lineno); } else { - return (message ("import file %s:%d", rootFileName (f->fid), f->lineno)); + res = message ("import file %q:%d", fileloc_outputFilename (f), f->lineno); } + break; case FL_PREPROC: - if (parenFormat) - { - return (message ("%s(%d)", rootFileName (f->fid), f->lineno)); - } - else - { - return (message ("%s:%d", rootFileName (f->fid), f->lineno)); - } + { + if (parenFormat) + { + res = message ("%q(%d)", fileloc_outputFilename (f), f->lineno); + } + else + { + res = message ("%q:%d", fileloc_outputFilename (f), f->lineno); + } + + break; + } case FL_EXTERNAL: - return (cstring_makeLiteral ("")); + res = cstring_makeLiteral (""); + break; default: { cstring fname; - + if (f->kind == FL_LIB) { - fname = message ("load file %s", rootFileName (f->fid)); - cstring_markOwned (fname); /*@i32 memory leak...@*/ + fname = message ("load file %q", fileloc_outputFilename (f)); + + if (!context_getFlag (FLG_SHOWLOADLOC)) + { + res = fname; + break; + } } else { - fname = rootFileName (f->fid); + fname = fileloc_outputFilename (f); } if (context_getFlag (FLG_SHOWCOL)) @@ -681,83 +742,112 @@ fileloc_unparse (fileloc f) { if (parenFormat) { - return (message ("%s(%d,%d)", fname, f->lineno, f->column)); + res = message ("%q(%d,%d)", fname, f->lineno, f->column); } else { - return (message ("%s:%d:%d", fname, f->lineno, f->column)); + res = message ("%q:%d:%d", fname, f->lineno, f->column); } } else { if (parenFormat) { - return (message ("%s(%d)", fname, f->lineno)); + res = message ("%q(%d)", fname, f->lineno); } else { - return (message ("%s:%d", fname, f->lineno)); + res = message ("%q:%d", fname, f->lineno); } } } - return (cstring_copy (fname)); + else + { + res = fname; + /*@-branchstate@*/ /* spurious warnings reporteded because of break above */ + } } else if (fileloc_linenoDefined (f)) { if (parenFormat) { - return (message ("%s(%d)", fname, f->lineno)); + res = message ("%q(%d)", fname, f->lineno); } else { - return (message ("%s:%d", fname, f->lineno)); + res = message ("%q:%d", fname, f->lineno); } } else { - return (cstring_copy (fname)); + res = fname; } } } - } - return (cstring_makeLiteral ("< Location unknown >")); + if (htmlFormat && fileloc_linenoDefined (f)) + { + res = message ("%s", f->lineno, res); + } + } + else + { + res = cstring_makeLiteral ("< Location unknown >"); + } + /*@=branchstate@*/ /*@i2523 this is a spurious warning because of the break */ + + in_funparse = FALSE; + return res; } /*@only@*/ cstring fileloc_unparseRaw (cstring fname, int lineno) { - bool parenFormat = context_getFlag (FLG_PARENFILEFORMAT); - - if (parenFormat) + if (!cstring_isEmpty (fname)) { - return (message ("%s(%d)", fname, lineno)); + bool parenFormat = context_getFlag (FLG_PARENFILEFORMAT); + + if (parenFormat) + { + return (message ("%q(%d)", osd_outputPath (fname), lineno)); + } + else + { + return (message ("%q:%d", osd_outputPath (fname), lineno)); + } } else { - return (message ("%s:%d", fname, lineno)); + return cstring_makeLiteral ("Command Line"); } } /*@only@*/ cstring fileloc_unparseRawCol (cstring fname, int lineno, int col) { - if (context_getFlag (FLG_SHOWCOL)) + if (!cstring_isEmpty (fname)) { - bool parenFormat = context_getFlag (FLG_PARENFILEFORMAT); - - if (parenFormat) + if (context_getFlag (FLG_SHOWCOL)) { - return (message ("%s(%d,%d)", fname, lineno, col)); + bool parenFormat = context_getFlag (FLG_PARENFILEFORMAT); + + if (parenFormat) + { + return (message ("%q(%d,%d)", osd_outputPath (fname), lineno, col)); + } + else + { + return (message ("%q:%d:%d", osd_outputPath (fname), lineno, col)); + } } else { - return (message ("%s:%d:%d", fname, lineno, col)); + return fileloc_unparseRaw (fname, lineno); } } else { - return fileloc_unparseRaw (fname, lineno); + return cstring_makeLiteral ("Command Line"); } }