big fix for #include in macro argument

This commit is contained in:
eck 1990-01-26 14:59:50 +00:00
parent f4dcfc3c64
commit 721005b4d7
2 changed files with 18 additions and 15 deletions

View file

@ -88,7 +88,7 @@ main(argc, argv)
inctable[0] = ""; inctable[0] = "";
inctable[1] = "/usr/include"; inctable[1] = "/usr/include";
inctable[2] = 0; inctable[2] = 0;
inc_total = 2; inc_total = 3;
inc_max = 10; inc_max = 10;
init_pp(); /* initialise the preprocessor macros */ init_pp(); /* initialise the preprocessor macros */

View file

@ -286,13 +286,13 @@ struct repl *repl;
/* stash arguments */ /* stash arguments */
register int i; register int i;
*args->a_rawptr++ = '(';
for (i = 0; ap->a_rawvec[i] != (char *)0; i++) { for (i = 0; ap->a_rawvec[i] != (char *)0; i++) {
if (i == 0) stash(repl, '(', -1);
else stash(repl, ',', -1);
for (p = ap->a_rawvec[i]; *p != '\0'; p++) for (p = ap->a_rawvec[i]; *p != '\0'; p++)
stash(repl, *p, -1); stash(repl, *p, -1);
stash(repl, ',', -1);
} }
*(args->a_rawptr-1) = ')'; /* delete last ',' */ stash(repl, ')', -1);
} }
} }
@ -386,16 +386,14 @@ actual(repl)
} }
} }
UnGetChar(); UnGetChar();
} else if (ch == '(' || ch == '[' || ch == '{') { } else if (ch == '(') {
/* a comma may occur within these constructions ??? /* a comma may occur between parentheses */
*/
level++; level++;
stash(repl, ch, !nostashraw); stash(repl, ch, !nostashraw);
} else if (ch == ')' || ch == ']' || ch == '}') { } else if (ch == ')') {
level--; level--;
/* clossing parenthesis of macro call */ /* closing parenthesis of macro call */
if (ch == ')' && level < 0) if (level < 0) return ')';
return ')';
stash(repl, ch, !nostashraw); stash(repl, ch, !nostashraw);
} else if (ch == ',') { } else if (ch == ',') {
if (level <= 0) { /* comma separator for next argument */ if (level <= 0) { /* comma separator for next argument */
@ -419,7 +417,7 @@ actual(repl)
interpreted as such. interpreted as such.
*/ */
ch = GetChar(); a_new_line: ch = GetChar();
while (class(ch) == STSKIP || ch == '/') { while (class(ch) == STSKIP || ch == '/') {
if (ch == '/') { if (ch == '/') {
if ((ch = GetChar()) == '*' && !InputLevel) { if ((ch = GetChar()) == '*' && !InputLevel) {
@ -435,9 +433,11 @@ actual(repl)
break; break;
} else ch = GetChar(); } else ch = GetChar();
} }
if (ch == '#')
if (ch == '#') {
domacro(); domacro();
else if (ch == EOI) { goto a_new_line;
} else if (ch == EOI) {
lexerror("unterminated macro call"); lexerror("unterminated macro call");
return ')'; return ')';
} }
@ -738,7 +738,8 @@ add2repl(repl, ch)
{ {
register int index = repl->r_ptr - repl->r_text; register int index = repl->r_ptr - repl->r_text;
if (index + 1 >= repl->r_size) { ASSERT(index < repl->r_size);
if (index + 2 >= repl->r_size) {
repl->r_text = Realloc(repl->r_text, repl->r_size <<= 1); repl->r_text = Realloc(repl->r_text, repl->r_size <<= 1);
repl->r_ptr = repl->r_text + index; repl->r_ptr = repl->r_text + index;
} }
@ -761,6 +762,7 @@ stash(repl, ch, stashraw)
register int index = args->a_expptr - args->a_expbuf; register int index = args->a_expptr - args->a_expbuf;
if (stashraw >= 0) { if (stashraw >= 0) {
ASSERT(index < args->a_expsize);
if (index + 1 >= args->a_expsize) { if (index + 1 >= args->a_expsize) {
args->a_expbuf = Realloc(args->a_expbuf, args->a_expbuf = Realloc(args->a_expbuf,
args->a_expsize <<= 1); args->a_expsize <<= 1);
@ -771,6 +773,7 @@ stash(repl, ch, stashraw)
if (stashraw) { if (stashraw) {
index = args->a_rawptr - args->a_rawbuf; index = args->a_rawptr - args->a_rawbuf;
ASSERT(index < args->a_rawsize);
if (index + 1 >= args->a_rawsize) { if (index + 1 >= args->a_rawsize) {
args->a_rawbuf = Realloc(args->a_rawbuf, args->a_rawbuf = Realloc(args->a_rawbuf,
args->a_rawsize <<= 1); args->a_rawsize <<= 1);