From 1b08effa776bde003de723807d58491531daac23 Mon Sep 17 00:00:00 2001 From: ceriel Date: Tue, 11 Jul 1989 12:34:38 +0000 Subject: [PATCH] Added some %persistents, improved behaviour of preprocessor, and other minor mods --- lang/cem/cemcom/LLlex.c | 4 ++-- lang/cem/cemcom/declar.g | 2 +- lang/cem/cemcom/domacro.c | 13 +++++++++++-- lang/cem/cemcom/expression.g | 3 ++- lang/cem/cemcom/ival.g | 14 +++++++++----- 5 files changed, 25 insertions(+), 11 deletions(-) diff --git a/lang/cem/cemcom/LLlex.c b/lang/cem/cemcom/LLlex.c index a7b5b5769..9a540f13c 100644 --- a/lang/cem/cemcom/LLlex.c +++ b/lang/cem/cemcom/LLlex.c @@ -321,7 +321,7 @@ firstline: while (ch != '\'') { if (ch == '\n') { lexerror("newline in character constant"); - LineNumber++; + PushBack(); break; } if (ch == '\\') { @@ -522,7 +522,7 @@ string_token(nm, stop_char, plen) while (ch != stop_char) { if (ch == '\n') { lexerror("newline in %s", nm); - LineNumber++; + PushBack(); break; } if (ch == EOI) { diff --git a/lang/cem/cemcom/declar.g b/lang/cem/cemcom/declar.g index c14676c44..dc24efdb3 100644 --- a/lang/cem/cemcom/declar.g +++ b/lang/cem/cemcom/declar.g @@ -291,7 +291,7 @@ arrayer(arith *sizep;) formal_list (struct formal **fmp;) : - formal(fmp) [ ',' formal(fmp) ]* + formal(fmp) [ %persistent ',' formal(fmp) ]* ; formal(struct formal **fmp;) diff --git a/lang/cem/cemcom/domacro.c b/lang/cem/cemcom/domacro.c index 4d8ac7d6a..4e080f0f2 100644 --- a/lang/cem/cemcom/domacro.c +++ b/lang/cem/cemcom/domacro.c @@ -167,12 +167,18 @@ skip_block(to_endif) 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(); @@ -181,12 +187,15 @@ skip_block(to_endif) 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; } @@ -194,8 +203,8 @@ skip_block(to_endif) break; case K_ENDIF: ASSERT(nestlevel > nestlow); + SkipRestOfLine(); if (nestlevel == skiplevel) { - SkipRestOfLine(); nestlevel--; NoUnstack--; return; diff --git a/lang/cem/cemcom/expression.g b/lang/cem/cemcom/expression.g index d26ed5f87..8697f8ace 100644 --- a/lang/cem/cemcom/expression.g +++ b/lang/cem/cemcom/expression.g @@ -72,7 +72,8 @@ parameter_list(struct expr **expp;) : assignment_expression(expp) {any2opnd(expp, PARCOMMA);} - [ ',' + [ %persistent + ',' assignment_expression(&e1) {any2opnd(&e1, PARCOMMA);} {ch7bin(expp, PARCOMMA, e1);} diff --git a/lang/cem/cemcom/ival.g b/lang/cem/cemcom/ival.g index 79a64e0c8..02a1feb25 100644 --- a/lang/cem/cemcom/ival.g +++ b/lang/cem/cemcom/ival.g @@ -557,8 +557,8 @@ ch_array(tpp, ex) 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) { @@ -575,10 +575,14 @@ ch_array(tpp, ex) } /* 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); } -- 2.34.1