Added some %persistents, improved behaviour of preprocessor, and other
authorceriel <none@none>
Tue, 11 Jul 1989 12:34:38 +0000 (12:34 +0000)
committerceriel <none@none>
Tue, 11 Jul 1989 12:34:38 +0000 (12:34 +0000)
minor mods

lang/cem/cemcom/LLlex.c
lang/cem/cemcom/declar.g
lang/cem/cemcom/domacro.c
lang/cem/cemcom/expression.g
lang/cem/cemcom/ival.g

index a7b5b57..9a540f1 100644 (file)
@@ -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) {
index c14676c..dc24efd 100644 (file)
@@ -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;)
index 4d8ac7d..4e080f0 100644 (file)
@@ -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;
index d26ed5f..8697f8a 100644 (file)
@@ -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);}
index 79a64e0..02a1feb 100644 (file)
@@ -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);
 }