X-Git-Url: http://andersk.mit.edu/gitweb/splint.git/blobdiff_plain/1b8ae6904556859bbe91aadf35b8adcc1a0611ce..36250f225665415476f402c25e138d99fa18381b:/src/fileTable.c diff --git a/src/fileTable.c b/src/fileTable.c index ab627d5..3256cd6 100644 --- a/src/fileTable.c +++ b/src/fileTable.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 */ /* @@ -44,18 +44,30 @@ * - Added conditional stuff (#define and #include) for IBM's compiler. */ +# include +# include +# include # include "splintMacros.nf" # include "llbasic.h" # include "osd.h" # include "llmain.h" # include "portab.h" + # if defined(__IBMC__) && defined(OS2) # include +# include # define getpid _getpid +# define S_IRUSR S_IREAD +# define S_IWUSR S_IWRITE +# define S_IXUSR S_IEXEC # endif /*@access fileId*/ +static void +fileTable_addOpen (fileTable p_ft, /*@observer@*/ FILE *p_f, /*@only@*/ cstring p_fname) + /*@modifies p_ft@*/ ; + static bool fileTable_inRange (fileTable ft, fileId fid) /*@*/ { return (fileTable_isDefined (ft) && (fid >= 0) && (fid < ft->nentries)); @@ -95,6 +107,25 @@ fileTable_getIndex (fileTable ft, cstring s) return res; } +static cstring ftentry_unparse (fileTable ft, ftentry fte) +{ + if (fileId_isValid (fte->fder)) + { + llassert (fileTable_isDefined (ft)); + + return message ("%s %q %d (%s)", + fte->fname, + fileType_unparse (fte->ftype), + fte->fder, + ft->elements[fte->fder]->fname); + } + else + { + return message ("%s %q", fte->fname, + fileType_unparse (fte->ftype)); + } +} + /*@only@*/ cstring fileTable_unparse (fileTable ft) { @@ -108,21 +139,8 @@ fileTable_unparse (fileTable ft) for (i = 0; i < ft->nentries; i++) { - if (fileId_isValid (ft->elements[i]->fder)) - { - s = message ("%s\n[%d] %s %q %d (%s)", - s, i, - ft->elements[i]->fname, - fileType_unparse (ft->elements[i]->ftype), - ft->elements[i]->fder, - ft->elements[ft->elements[i]->fder]->fname); - } - else - { - s = message ("%s\n[%d] %s %q", s, i, ft->elements[i]->fname, - fileType_unparse (ft->elements[i]->ftype)); - } - } + s = message ("%s\n[%d] %q", s, i, ftentry_unparse (ft, ft->elements[i])); + } return s; } @@ -270,11 +288,15 @@ void fileTable_noDelete (fileTable ft, cstring name) { fileId fid = fileTable_lookup (ft, name); - if (fileId_isValid (fid)) { - llassert (fileTable_isDefined (ft)); - - ft->elements[fid]->ftype = FILE_NODELETE; - } + if (fileId_isValid (fid)) + { + llassert (fileTable_isDefined (ft)); + ft->elements[fid]->ftype = FILE_NODELETE; + } + else + { + DPRINTF (("Invalid no delete: %s", name)); + } } static fileId @@ -284,7 +306,8 @@ fileTable_addFilePrim (fileTable ft, /*@temp@*/ cstring name, { cstring absname = osd_absolutePath (NULL, name); int tindex = fileTable_getIndex (ft, absname); - + + DPRINTF (("Got abs path: %s", absname)); llassert (ft != fileTable_undefined); if (tindex != NOT_FOUND) @@ -302,6 +325,17 @@ fileTable_addFilePrim (fileTable ft, /*@temp@*/ cstring name, e->basename = fileLib_removePathFree (fileLib_removeAnyExtension (absname)); e->fsystem = context_isSystemDir (absname); + + /* + ** evans 2002-03-15: change suggested by Jim Zelenka + ** support relative paths for system directories + */ + + if (!e->fsystem) + { + e->fsystem = context_isSystemDir (name); + } + e->fspecial = context_isSpecialFile (absname); if (e->fspecial) @@ -361,6 +395,12 @@ fileTable_addHeaderFile (fileTable ft, cstring name) } +void +fileTable_addStreamFile (fileTable ft, FILE *fstream, cstring name) +{ + fileTable_addOpen (ft, fstream, cstring_copy (name)); +} + bool fileTable_isHeader (fileTable ft, fileId fid) { @@ -471,6 +511,9 @@ fileTable_addCTempFile (fileTable ft, fileId fid) C_EXTENSION); fileId res; + DPRINTF (("tmp dir: %s", context_tmpdir ())); + DPRINTF (("new name: %s", newname)); + llassert (fileTable_isDefined (ft)); if (!fileId_isValid (ft->elements[fid]->fder)) @@ -498,6 +541,7 @@ fileTable_addCTempFile (fileTable ft, fileId fid) } } + DPRINTF (("Added file: %s", fileTable_fileName (res))); cstring_free (newname); return res; } @@ -736,7 +780,7 @@ fileTable_cleanup (fileTable ft) if (msg) { - (void) fflush (g_msgstream); + (void) fflush (g_warningstream); fprintf (stderr, "< cleaning"); } @@ -751,6 +795,7 @@ fileTable_cleanup (fileTable ft) /* ** Make sure it is really a derived file */ + if (fe->ftype == FILE_LSLTEMP || fe->ftype == FILE_NODELETE) { @@ -778,7 +823,7 @@ fileTable_cleanup (fileTable ft) if (msg && ((i % skip) == 0)) { - (void) fflush (g_msgstream); + (void) fflush (g_warningstream); if (i == 0) { fprintf (stderr, " "); @@ -897,16 +942,20 @@ static /*@only@*/ cstring makeTempName (cstring dir, cstring pre, cstring suf) maxlen = (cstring_length (dir) + cstring_length (pre) + mstring_length (msg) + cstring_length (pidname) + cstring_length (suf) + 2); + DPRINTF (("Dir: %s / %s / %s / %s / %s", + dir, pre, pidname, msg, suf)); + smsg = message ("%s%s%s%s%s", dir, pre, pidname, cstring_fromChars (msg), suf); nextMsg (msg); + DPRINTF (("Trying: %s", smsg)); + while (osd_fileExists (smsg)) { cstring_free (smsg); smsg = message ("%s%s%s%s%s", dir, pre, pidname, cstring_fromChars (msg), suf); nextMsg (msg); } - return smsg; } @@ -942,9 +991,106 @@ fileTable_addOpen (fileTable ft, /*@observer@*/ FILE *f, /*@only@*/ cstring fnam ft->nopen++; } -FILE *fileTable_openFile (fileTable ft, cstring fname, char *mode) +FILE *fileTable_createFile (fileTable ft, cstring fname) +{ + int fdesc = open (cstring_toCharsSafe (fname), O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, S_IRUSR | S_IWUSR); + + if (fdesc == -1) + { + osd_setTempError (); + llfatalerror (message ("Temporary file for " + "pre-processor output already exists. Trying to " + "open: %s.", + fname)); + + /*@notreached@*/ return NULL; + } + else + { + FILE *res = fdopen (fdesc, "w"); + + if (res != NULL) + { + fileTable_addOpen (ft, res, cstring_copy (fname)); + DPRINTF (("Opening file: %s / %p", fname, res)); + } + else + { + DPRINTF (("Error opening: %s", fname)); + } + + return res; + } +} + +FILE *fileTable_createMacrosFile (fileTable ft, cstring fname) +{ + int fdesc = open (cstring_toCharsSafe (fname), O_RDWR | O_CREAT | O_TRUNC | O_EXCL, S_IRUSR | S_IWUSR); + + if (fdesc == -1) + { + osd_setTempError (); + llfatalerror (message ("Temporary file for " + "pre-processor output already exists. Trying to " + "open: %s.", + fname)); + + /*@notreached@*/ return NULL; + } + else + { + FILE *res = fdopen (fdesc, "w+"); + + if (res != NULL) + { + fileTable_addOpen (ft, res, cstring_copy (fname)); + DPRINTF (("Opening file: %s / %p", fname, res)); + } + else + { + DPRINTF (("Error opening: %s", fname)); + } + + return res; + } +} + +FILE *fileTable_openReadFile (fileTable ft, cstring fname) { - FILE *res = fopen (cstring_toCharsSafe (fname), mode); + FILE *res = fopen (cstring_toCharsSafe (fname), "r"); + + if (res != NULL) + { + fileTable_addOpen (ft, res, cstring_copy (fname)); + DPRINTF (("Opening read file: %s / %p", fname, res)); + } + else + { + DPRINTF (("Cannot open read file: %s", fname)); + } + + return res; +} + +/* +** Allows overwriting +*/ + +FILE *fileTable_openWriteFile (fileTable ft, cstring fname) +{ + FILE *res = fopen (cstring_toCharsSafe (fname), "w"); + + if (res != NULL) { + fileTable_addOpen (ft, res, cstring_copy (fname)); + DPRINTF (("Opening file: %s / %p", fname, res)); + } + + return res; +} + +FILE *fileTable_openWriteUpdateFile (fileTable ft, cstring fname) +{ + FILE *res = fopen (cstring_toCharsSafe (fname), "w+"); if (res != NULL) { fileTable_addOpen (ft, res, cstring_copy (fname)); @@ -968,7 +1114,7 @@ bool fileTable_closeFile (fileTable ft, FILE *f) if (ft->openelements[i]->f == f) { DPRINTF (("Closing file: %p = %s", f, ft->openelements[i]->fname)); - + if (i == ft->nopen - 1) { foentry_free (ft->openelements[i]); @@ -996,13 +1142,19 @@ void fileTable_closeAll (fileTable ft) { int i = 0; + llassert (fileTable_isDefined (ft)); + for (i = 0; i < ft->nopen; i++) { /* lldiagmsg (message ("Unclosed file at exit: %s", ft->openelements[i]->fname)); */ + + if (ft->openelements[i]->f != NULL) + { + (void) fclose (ft->openelements[i]->f); /* No check - cleaning up after errors */ + } - (void) fclose (ft->openelements[i]->f); /* No check - cleaning up after errors */ ft->openelements[i]->f = NULL; foentry_free (ft->openelements[i]); ft->openelements[i] = NULL;