fixed some bugs:
authorceriel <none@none>
Mon, 5 Oct 1987 10:17:44 +0000 (10:17 +0000)
committerceriel <none@none>
Mon, 5 Oct 1987 10:17:44 +0000 (10:17 +0000)
- switch with BIG difference between lower and upper now handled correctly
- made sure an added error production is never chosen as the default one
- don't allow AUTO as specification for a parameter

lang/cem/cemcom/.distr
lang/cem/cemcom/Makefile
lang/cem/cemcom/Makefile.erik
lang/cem/cemcom/declar.g
lang/cem/cemcom/decspecs.c
lang/cem/cemcom/domacro.c
lang/cem/cemcom/switch.c

index ce6f64b..a1a035d 100644 (file)
@@ -86,3 +86,5 @@ tokenname.c
 tokenname.h
 type.c
 type.str
+util.str
+util.c
index 334fc63..6ed03e2 100644 (file)
@@ -10,7 +10,7 @@ CID = $(EMHOME)/bin/cid
 # Libraries and EM interface definitions
 SYSLIB = $(EMHOME)/modules/lib/libsystem.a
 EMKLIB = $(EMHOME)/modules/lib/libemk.a
-EMELIB = $(EMHOME)/modules/lib/libeme.a
+EMELIB = $(EMHOME)/modules/lib/libeme.a $(EMHOME)/lib/em_data.a
 STRLIB = $(EMHOME)/modules/lib/libstring.a
 PRTLIB = $(EMHOME)/modules/lib/libprint.a
 EMMESLIB = $(EMHOME)/modules/lib/libem_mes.a
index a4d8f5a..43f7070 100644 (file)
@@ -13,7 +13,7 @@ LINT =                /usr/new/lint
 # Libraries and EM interface definitions
 SYSLIB =       $(EMHOME)/modules/lib/libsystem.a
 EMKLIB =       $(EMHOME)/modules/lib/libemk.a
-EMELIB =       $(EMHOME)/modules/lib/libeme.a
+EMELIB =       $(EMHOME)/modules/lib/libeme.a $(EMHOME)/lib/em_data.a
 STRLIB =       $(EMHOME)/modules/lib/libstring.a
 PRTLIB =       $(EMHOME)/modules/lib/libprint.a
 EMMESLIB =     $(EMHOME)/modules/lib/libem_mes.a
index fe5c0d6..1ede963 100644 (file)
@@ -120,14 +120,17 @@ type_specifier(struct type **tpp;)
 ;
 
 single_type_specifier(register struct decspecs *ds;):
-       TYPE_IDENTIFIER         /* this includes INT, CHAR, etc. */
+       %default TYPE_IDENTIFIER        /* this includes INT, CHAR, etc. */
        {idf2type(dot.tk_idf, &ds->ds_type);}
 |
        IDENTIFIER
-       {error("%s is not a type identifier", dot.tk_idf->id_text);
-        dot.tk_idf->id_def->df_type = error_type;
-        dot.tk_idf->id_def->df_sc = TYPEDEF;
-        ds->ds_type = error_type;
+       {
+               error("%s is not a type identifier", dot.tk_idf->id_text);
+               ds->ds_type = error_type;
+               if (dot.tk_idf->id_def) {
+                       dot.tk_idf->id_def->df_type = error_type;
+                       dot.tk_idf->id_def->df_sc = TYPEDEF;
+               }
        }
 |
        struct_or_union_specifier(&ds->ds_type)
index 1b0c3f6..a452d5d 100644 (file)
@@ -40,7 +40,7 @@ do_decspecs(ds)
        }
 
        if (level == L_FORMAL2) {
-               if (ds->ds_sc_given && ds->ds_sc != AUTO &&
+               if (ds->ds_sc_given &&
                    ds->ds_sc != REGISTER){
                        extern char *symbol2str();
                        error("%s formal illegal", symbol2str(ds->ds_sc));
index 2639f73..9b9fc96 100644 (file)
@@ -242,7 +242,7 @@ do_include()
        inctable[0] = WorkingDir;
        if (filenm) {
                if (!InsertFile(filenm, &inctable[tok==FILESPECIFIER],&result)){
-                       fatal("cannot find include file \"%s\"", filenm);
+                       fatal("cannot open include file \"%s\"", filenm);
                }
                else {
                        WorkingDir = getwdir(result);
index f85b88d..80b6a96 100644 (file)
 
 extern char options[];
 
-#define        compact(nr, low, up)    (nr != 0 && (up - low) / nr <= (DENSITY - 1))
+compact(nr, low, up)
+       arith low, up;
+{
+       /*      Careful! up - low might not fit in an arith. And then,
+               the test "up-low < 0" might also not work to detect this
+               situation! Or is this just a bug in the M68020/M68000?
+       */
+       arith diff = up - low;
+
+       return (nr != 0 && diff >= 0 && diff / nr <= (DENSITY - 1));
+}
 
 static struct switch_hdr *switch_stack = 0;