X-Git-Url: http://andersk.mit.edu/gitweb/splint.git/blobdiff_plain/140c27a82ebb7e4c8d1e59ab5fce12c793e587f8..0866200bf1a30f43dcbb65b3da860c66e0338850:/src/osd.c diff --git a/src/osd.c b/src/osd.c index a78861f..68e90c8 100644 --- a/src/osd.c +++ b/src/osd.c @@ -453,8 +453,6 @@ nextdir (d_char *current_dir, d_char *dir, size_t *len) # endif } -# ifndef NOLCL - # ifdef WIN32 extern /*@external@*/ int _flushall (void) /*@modifies fileSystem@*/ ; # endif @@ -473,7 +471,6 @@ int osd_system (cstring cmd) res = system (cstring_toCharsSafe (cmd)); return res; } -# endif # ifndef unlink /* This should be defined by unistd.h */ @@ -888,6 +885,12 @@ void osd_initMod (void) osd_setWorkingDirectory (); } +void osd_destroyMod (void) +{ + cstring_free (osd_cwd); + osd_cwd = cstring_undefined; +} + cstring osd_absolutePath (cstring cwd, cstring filename) { # if defined (UNIX) || defined (OS2) @@ -1046,7 +1049,8 @@ cstring osd_outputPath (cstring filename) /*@access cstring@*/ path_p = filename; - rel_buf_p = rel_buffer = (char *) dmalloc (filename_len); + rel_buffer = (char *) dmalloc (filename_len); + rel_buf_p = rel_buffer; *rel_buf_p = '\0'; llassert (cwd_p != NULL); @@ -1061,25 +1065,35 @@ cstring osd_outputPath (cstring filename) if ((*cwd_p == '\0') && (*path_p == '\0' || osd_isConnectChar (*path_p))) /* whole pwd matched */ { if (*path_p == '\0') /* input *is* the current path! */ - return cstring_makeLiteral ("."); + { + cstring_free (rel_buffer); + return cstring_makeLiteral ("."); + } else { /*@i324 ! splint didn't report an errors for: return ++path_p; */ + cstring_free (rel_buffer); return cstring_fromCharsNew (path_p + 1); } } else { + + /* drl 2002-10/14 I had to put this code back*/ + /* the case that needs it is when splint is given an absolute path name of a file outside of the current directory and the subdirectories below the current directory. e.g. cd /home/; splint /tmp/prog.c + */ + /* evans 2002-02-05 This is horrible code, which I've removed. I couldn't find any ** test cases that need it, so I hope I'm not breaking anything. */ + /*#if 0*/ -# if 0 if (*path_p != '\0') { --cwd_p; --path_p; - while (!osd_isConnectChar (*cwd_p)) /* backup to last slash */ + + while (cwd_p >= osd_cwd && !osd_isConnectChar (*cwd_p)) /* backup to last slash */ { --cwd_p; --path_p; @@ -1091,7 +1105,7 @@ cstring osd_outputPath (cstring filename) /* Find out how many directory levels in cwd were *not* matched. */ while (*cwd_p != '\0') - {s + { if (osd_isConnectChar (*cwd_p++)) unmatched_slash_count++; } @@ -1100,16 +1114,19 @@ cstring osd_outputPath (cstring filename) Reject it if longer than the input. */ if (unmatched_slash_count * 3 + strlen (path_p) >= filename_len) { + cstring_free (rel_buffer); + /* fprintf (stderr, "Returning filename: %s [%p]\n", filename); */ return cstring_copy (filename); } -# endif - + + /*drl 10-14-2002 end previously removed code */ + /*#endif*/ /* For each of them, put a `../' at the beginning of the short name. */ while (unmatched_slash_count-- > 0) { /* Give up if the result gets to be longer than the absolute path name. */ - if (rel_buffer + filename_len <= rel_buf_p + 3) + /*@i423@*/ if (rel_buffer + filename_len <= rel_buf_p + 3) { sfree (rel_buffer); return cstring_copy (filename); @@ -1121,6 +1138,7 @@ cstring osd_outputPath (cstring filename) } /* Then tack on the unmatched part of the desired file's name. */ + do { if (rel_buffer + filename_len <= rel_buf_p) @@ -1138,6 +1156,7 @@ cstring osd_outputPath (cstring filename) if (osd_isConnectChar (*(rel_buf_p-1))) *--rel_buf_p = '\0'; + /* fprintf (stderr, "Returning buffer: %s [%p]\n", rel_buffer, rel_buffer); */ return rel_buffer; } /*@noaccess cstring@*/