X-Git-Url: http://andersk.mit.edu/gitweb/splint.git/blobdiff_plain/8b63eb37025fe1afe1fe4d0160387db50fd77194..11c40ce9ae842585926cc1abd029f9f5a6702827:/src/cpplib.c diff --git a/src/cpplib.c b/src/cpplib.c index 09d9d10..5aff1e9 100644 --- a/src/cpplib.c +++ b/src/cpplib.c @@ -70,7 +70,11 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # include # if defined (WIN32) || defined (OS2) && defined (__IBMC__) # include +/* SMF */ +# ifndef BCC32 # include /* for __DATE__ and __TIME__ */ +# endif + # include # else # ifndef VMS @@ -238,6 +242,10 @@ static int cpp_peekN (cppReader *p_pfile, int p_n) /*@*/ ; # define cppBuffer_get(BUFFER) \ ((BUFFER)->cur < (BUFFER)->rlimit ? *(BUFFER)->cur++ : EOF) +/*@function static int cppBuffer_reachedEOF (sef cppBuffer *p_b) modifies nothing; @*/ +# define cppBuffer_reachedEOF(b) \ + ((b)->cur < (b)->rlimit ? FALSE : TRUE) + /* Append string STR (of length N) to PFILE's output buffer. Make space. */ /*@function static void cppReader_puts (sef cppReader *p_file, char *p_str, sef size_t p_n) modifies *p_file; @*/ @@ -295,6 +303,9 @@ static void cppBuffer_forward (cppBuffer *p_buf, int p_n) /*@modifies *p_buf@*/ /*@function static int cppReader_getC (cppReader *p_pfile) modifies *p_pfile; @*/ # define cppReader_getC(pfile) (cppBuffer_get (cppReader_getBufferSafe (pfile))) +/*@function static int cppReader_reachedEOF (sef cppReader *p_pfile) modifies *p_pfile; @*/ +# define cppReader_reachedEOF(pfile) (cppBuffer_reachedEOF (cppReader_getBufferSafe (pfile))) + /*@function static int cppReader_peekC (cppReader *) modifies nothing;@*/ # define cppReader_peekC(pfile) (cpplib_bufPeek (cppReader_getBufferSafe (pfile))) @@ -349,6 +360,8 @@ static void cppReader_scanBuffer (cppReader *p_pfile); # if defined (WIN32) || defined (OS2) && defined (__IBMC__) +/* SMF */ +# ifndef BCC32 /* ** WIN32 (at least the VC++ include files) does not define mode_t. */ @@ -356,6 +369,7 @@ static void cppReader_scanBuffer (cppReader *p_pfile); /*@-incondefs@*/ /*@-czechtypes@*/ typedef unsigned int mode_t; /*@=incondefs@*/ /*@=czechtypes@*/ +# endif # endif @@ -956,6 +970,9 @@ cppOptions_init (cppOptions *opts) opts->warn_comments = 0; opts->warnings_are_errors = 0; + /* Added 2003-07-10: */ + opts->traditional = FALSE; + opts->c89 = TRUE; initialize_char_syntax (opts); } @@ -1813,7 +1830,7 @@ collect_expansion (cppReader *pfile, char *buf, char *limit, llfatalbug (cstring_makeLiteral ("Maximum definition size exceeded.")); } - return defn; + /*@i1@*/ return defn; /* Spurious warning here */ } /* @@ -1877,7 +1894,6 @@ collect_expansionLoc (fileloc loc, char *buf, char *limit, defn->pattern = NULL; defn->nargs = nargs; defn->predefined = NULL; - exp_p = defn->expansion = (char *) defn + sizeof (*defn); defn->line = 0; @@ -2160,7 +2176,7 @@ collect_expansionLoc (fileloc loc, char *buf, char *limit, llfatalbug (cstring_makeLiteral ("Maximum definition size exceeded.")); } - return defn; + /*@i1@*/ return defn; /* Spurious warning here */ } /* @@ -2828,7 +2844,7 @@ do_defineAux (cppReader *pfile, struct directive *keyword, else if (hp->type == T_CONST) ok = !CPPOPTIONS (pfile)->done_initializing; else { - BADBRANCH; + ok = FALSE; /* Redefining anything else is bad. */ } /* Print the warning if it's not ok. */ @@ -3719,18 +3735,11 @@ initialize_builtins (cppReader *pfile) cpplib_installBuiltin ("__REGISTER_PREFIX__", ctype_string, -1, T_REGISTER_PREFIX_TYPE, 0, NULL, -1); cpplib_installBuiltin ("__TIME__", ctype_string, -1, T_TIME, 0, NULL, -1); - /* - ** No, don't define __STDC__ - ** - if (!cppReader_isTraditional (pfile)) { cpplib_installBuiltin ("__STDC__", ctype_int, -1, T_CONST, STDC_VALUE, NULL, -1); } - ** - */ - # ifdef WIN32 cpplib_installBuiltin ("_WIN32", ctype_int, -1, T_CONST, STDC_VALUE, NULL, -1); # endif @@ -6110,14 +6119,18 @@ get_next: &start_line, &start_column); old_written = cpplib_getWritten (pfile); string: - DPRINTF (("Put char: %c", c)); + DPRINTF (("Reading string: %c", c)); cppReader_putChar (pfile, c); while (TRUE) { - int cc = cppReader_getC (pfile); - DPRINTF (("cc: %c", c)); - if (cc == EOF) + /* evans-2003-06-07 + ** Because of ISO8859-1 characters in string literals, we need a special test here. + */ + + if (cppReader_reachedEOF (pfile)) { + + DPRINTF (("Matches EOF!")); if (cppBuffer_isMacro (CPPBUFFER (pfile))) { /* try harder: this string crosses a macro expansion @@ -6131,13 +6144,14 @@ get_next: CPPBUFFER (pfile) = next_buf; continue; } + if (!cppReader_isTraditional (pfile)) { cpp_setLocation (pfile); setLine (long_toInt (start_line)); setColumn (long_toInt (start_column)); - + if (pfile->multiline_string_line != long_toInt (start_line) && pfile->multiline_string_line != 0) { @@ -6157,59 +6171,64 @@ get_next: message ("Unterminated string or character constant")); } } - /*@loopbreak@*/ break; - } - DPRINTF (("putting char: %c", cc)); - cppReader_putChar (pfile, cc); - switch (cc) + /*@loopbreak@*/ break; + } + else { - case '\n': - /* Traditionally, end of line ends a string constant with - no error. So exit the loop and record the new line. */ - if (cppReader_isTraditional (pfile)) - goto while2end; - if (c == '\'') - { - goto while2end; - } - if (cppReader_isPedantic (pfile) - && pfile->multiline_string_line == 0) - { - cppReader_pedwarnWithLine - (pfile, long_toInt (start_line), - long_toInt (start_column), - cstring_makeLiteral ("String constant runs past end of line")); - } - if (pfile->multiline_string_line == 0) - { - pfile->multiline_string_line = start_line; - } - - /*@switchbreak@*/ break; - - case '\\': - cc = cppReader_getC (pfile); - if (cc == '\n') - { - /* Backslash newline is replaced by nothing at all. */ - cppReader_adjustWritten (pfile, -1); - pfile->lineno++; - } - else + int cc = cppReader_getC (pfile); + DPRINTF (("cc: %c [%d] [%d]", cc, cc, EOF)); + DPRINTF (("putting char: %c", cc)); + cppReader_putChar (pfile, cc); + switch (cc) { - /* ANSI stupidly requires that in \\ the second \ - is *not* prevented from combining with a newline. */ - NEWLINE_FIX1(cc); - if (cc != EOF) - cppReader_putChar (pfile, cc); + case '\n': + /* Traditionally, end of line ends a string constant with + no error. So exit the loop and record the new line. */ + if (cppReader_isTraditional (pfile)) + goto while2end; + if (c == '\'') + { + goto while2end; + } + if (cppReader_isPedantic (pfile) + && pfile->multiline_string_line == 0) + { + cppReader_pedwarnWithLine + (pfile, long_toInt (start_line), + long_toInt (start_column), + cstring_makeLiteral ("String constant runs past end of line")); + } + if (pfile->multiline_string_line == 0) + { + pfile->multiline_string_line = start_line; + } + + /*@switchbreak@*/ break; + + case '\\': + cc = cppReader_getC (pfile); + if (cc == '\n') + { + /* Backslash newline is replaced by nothing at all. */ + cppReader_adjustWritten (pfile, -1); + pfile->lineno++; + } + else + { + /* ANSI stupidly requires that in \\ the second \ + is *not* prevented from combining with a newline. */ + NEWLINE_FIX1(cc); + if (cc != EOF) + cppReader_putChar (pfile, cc); + } + /*@switchbreak@*/ break; + + case '\"': + case '\'': + if (cc == c) + goto while2end; + /*@switchbreak@*/ break; } - /*@switchbreak@*/ break; - - case '\"': - case '\'': - if (cc == c) - goto while2end; - /*@switchbreak@*/ break; } } while2end: @@ -6377,10 +6396,20 @@ get_next: op2: token = CPP_OTHER; pfile->only_seen_white = 0; - op2any: + op2any: /* jumped to for \ continuations */ cpplib_reserve(pfile, 3); cppReader_putCharQ (pfile, c); - cppReader_putCharQ (pfile, cppReader_getC (pfile)); + + /* evans 2003-08-24: This is a hack to fix line output for \ + continuations. Someday I really should get a decent pre-processor! + */ + + if (c == '\\') { + (void) cppReader_getC (pfile); /* skip the newline to avoid extra lines */ + } else { + cppReader_putCharQ (pfile, cppReader_getC (pfile)); + } + cppReader_nullTerminateQ (pfile); return token; @@ -6646,6 +6675,8 @@ get_next: case '\\': c2 = cppReader_peekC (pfile); + /* allow other stuff here if a flag is set? */ + DPRINTF (("Got continuation!")); if (c2 != '\n') goto randomchar; token = CPP_HSPACE;