X-Git-Url: http://andersk.mit.edu/gitweb/splint.git/blobdiff_plain/80489f0ab878fa01f87a35988aedff282e5f0ea5..36250f225665415476f402c25e138d99fa18381b:/src/fileTable.c diff --git a/src/fileTable.c b/src/fileTable.c index f33835a..3256cd6 100644 --- a/src/fileTable.c +++ b/src/fileTable.c @@ -44,14 +44,22 @@ * - 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*/ @@ -317,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) @@ -937,7 +956,6 @@ static /*@only@*/ cstring makeTempName (cstring dir, cstring pre, cstring suf) smsg = message ("%s%s%s%s%s", dir, pre, pidname, cstring_fromChars (msg), suf); nextMsg (msg); } - return smsg; } @@ -973,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) { - FILE *res = fopen (cstring_toCharsSafe (fname), mode); + 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), "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)); @@ -999,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]);