while (ch != '\'') {
if (ch == '\n') {
lexerror("newline in character constant");
- LineNumber++;
+ PushBack();
break;
}
if (ch == '\\') {
while (ch != stop_char) {
if (ch == '\n') {
lexerror("newline in %s", nm);
- LineNumber++;
+ PushBack();
break;
}
if (ch == EOI) {
formal_list (struct formal **fmp;)
:
- formal(fmp) [ ',' formal(fmp) ]*
+ formal(fmp) [ %persistent ',' formal(fmp) ]*
;
formal(struct formal **fmp;)
on the same level.
*/
switch(tk.tk_idf->id_resmac) {
+ default:
+ SkipRestOfLine();
+ break;
case K_IF:
case K_IFDEF:
case K_IFNDEF:
push_if();
+ SkipRestOfLine();
break;
case K_ELIF:
+ if (ifstack[nestlevel])
+ lexwarning("#elif without corresponding #if");
if (! to_endif && nestlevel == skiplevel) {
nestlevel--;
push_if();
return;
}
}
+ else SkipRestOfLine();
break;
case K_ELSE:
+ if (ifstack[nestlevel])
+ lexwarning("#else without corresponding #if");
+ SkipRestOfLine();
if (! to_endif) {
++(ifstack[nestlevel]);
if (nestlevel == skiplevel) {
- SkipRestOfLine();
NoUnstack--;
return;
}
break;
case K_ENDIF:
ASSERT(nestlevel > nestlow);
+ SkipRestOfLine();
if (nestlevel == skiplevel) {
- SkipRestOfLine();
nestlevel--;
NoUnstack--;
return;
:
assignment_expression(expp)
{any2opnd(expp, PARCOMMA);}
- [ ','
+ [ %persistent
+ ','
assignment_expression(&e1)
{any2opnd(&e1, PARCOMMA);}
{ch7bin(expp, PARCOMMA, e1);}
struct expr *ex;
{
register struct type *tp = *tpp;
- register arith length = ex->SG_LEN;
- char *s;
+ register int length = ex->SG_LEN, i;
+ register char *to, *from, *s;
ASSERT(ex->ex_class == String);
if (tp->tp_size == (arith)-1) {
}
/* throw out the characters of the already prepared string */
s = Malloc((unsigned) (length));
- clear(s, (int) (length));
- strncpy(s, ex->SG_VALUE, (int) length);
+ clear(s, length);
+ i = length <= ex->SG_LEN ? length : ex->SG_LEN;
+ to = s; from = ex->SG_VALUE;
+ while(--i >= 0) {
+ *to++ = *from++;
+ }
free(ex->SG_VALUE);
- str_cst(s, (int) (length));
+ str_cst(s, length);
free(s);
}