wood@dg-rtp.dg.com (Tom Wood) (11/10/89)
Here's an additional test and some patches to 1.35:
/*
* Traditional preprocess test. Works with and wihout -DT
*/
#ifndef T
Do comments work on #endif? yes /*
#endif
*/
#endif
End first block.
#ifndef T
Are character constants processed? '/*' yes
#endif
End second block
#ifndef T
Are valid strings processed? "yes /* "
#endif
End third block.
#ifndef T
Are bad char constants taken? 'yep
Are bad strings taken? " (ditto)
#endif
End fourth block.
#ifndef T
Do bad char constants hide comments? 'yep /*
Are bad strings hide comments? " (ditto) /*
#endif
End fifth block.
#include "/dev/null"
/*
* Fixing the above may lead to spurrious output from this:
*/
#ifndef LIBDIR
#define LIBDIR "/usr/local/lib/xtrek
#endif /* LIBDIR */
#ifndef FONTDIR
#define FONTDIR LIBDIR"
#endif /* FONTDIR */
#define PFILE LIBDIR/.planets"
Here's a set of patches to 1.35 cccp.c that fix these problems (and
one other involving numbers like 1.0e-DIGIT
*** gcc-1.35/cccp.c Thu Nov 9 16:07:22 1989
--- gcc-1.35.00/cccp.c Wed Aug 16 14:12:06 1989
***************
*** 1475,1485 ****
case '\n':
++ip->lineno;
++op->lineno;
! if (traditional) {
! /* Terminate the string at the newline and announce the newline. */
! beg_of_line = ibp;
goto while2end;
- }
if (pedantic || c == '\'') {
error_with_line (line_for_error (start_line),
"unterminated string or character constant");
--- 1393,1400 ----
case '\n':
++ip->lineno;
++op->lineno;
! if (traditional)
goto while2end;
if (pedantic || c == '\'') {
error_with_line (line_for_error (start_line),
"unterminated string or character constant");
***************
*** 1637,1650 ****
break;
}
*obp++ = c;
! /* A sign can be part of a preprocessing number if it follows
! an e. However, ANSI and PCC treat this as the termination
! of the pp-number. The exponent token may be rescanned. */
if (c == 'e' || c == 'E') {
! if (ibp < limit && (*ibp == '+' || *ibp == '-')) {
*obp++ = *ibp++;
- break;
- }
}
}
break;
--- 1552,1562 ----
break;
}
*obp++ = c;
! /* A sign can be part of a preprocessing number
! if it follows an e. */
if (c == 'e' || c == 'E') {
! if (ibp < limit && (*ibp == '+' || *ibp == '-'))
*obp++ = *ibp++;
}
}
break;
***************
*** 1891,1908 ****
}
}
}
- else if (ip->macro)
- break;
- else if (*ibp == '\\' && ibp[1] == '\n') {
- ibp += 2;
- ++ip->lineno;
- }
- else if (*ibp == '/' && (ibp[1] == '*' ||
- cplusplus && ibp[1] == '/')) {
- ip->bufp = ibp;
- skip_to_end_of_comment (ip, &ip->lineno);
- ibp = ip->bufp;
- }
else break;
}
if (*ibp != '(')
--- 1803,1808 ----
***************
*** 2155,2161 ****
if (unterminated) {
if (traditional) {
/* Traditional preprocessing permits unterminated strings. */
! /* --bp; This leaves the last character as output. */
ip->bufp = bp;
goto endloop1;
}
--- 2055,2061 ----
if (unterminated) {
if (traditional) {
/* Traditional preprocessing permits unterminated strings. */
! --bp;
ip->bufp = bp;
goto endloop1;
}
***************
*** 3610,3617 ****
break;
case '\"':
case '\'':
! /* Skip even in traditional. */
! bp = skip_quoted_string (bp - 1, endb, ip->lineno, &ip->lineno, 0, 0);
break;
case '\\':
/* Char after backslash loses its special meaning. */
--- 3504,3511 ----
break;
case '\"':
case '\'':
! if (!traditional)
! bp = skip_quoted_string (bp - 1, endb, ip->lineno, &ip->lineno, 0, 0);
break;
case '\\':
/* Char after backslash loses its special meaning. */
***************
*** 3970,3982 ****
}
bp++;
} else if (c == '\n') {
- if (traditional) {
- /* Unterminated strings and character constants are 'legal'. */
- bp--; /* Don't consume the newline. */
- if (eofp)
- *eofp = 1;
- break;
- }
if (match == '\'') {
error_with_line (line_for_error (start_line),
"unterminated character constant");
--- 3864,3869 ----
***************
*** 3985,3990 ****
--- 3872,3882 ----
*eofp = 1;
break;
}
+ if (traditional) { /* Unterminated strings are 'legal'. */
+ if (eofp)
+ *eofp = 1;
+ break;
+ }
if (count_newlines)
++*count_newlines;
} else if (c == match)
***************
*** 4189,4202 ****
for (; i < arglen; i++) {
c = arg->raw[i];
! /* Process newline escapes */
if (c == '\n') {
! c = arg->raw[++i];
! if (c == '-' || is_space[c]) {
! if (c == '\n') i--;
! continue;
! }
! i--;
}
/* Internal sequences of whitespace are replaced by one space. */
--- 4081,4091 ----
for (; i < arglen; i++) {
c = arg->raw[i];
! /* Special markers Newline Space and Newline Newline
! generate nothing for a stringified argument. */
if (c == '\n') {
! i++;
! continue;
}
/* Internal sequences of whitespace are replaced by one space. */
---
Tom Wood (919) 248-6067
Data General, Research Triangle Park, NC
{the known world}!rti!xyzzy!wood