Improved switches, and fixed wrong place indication in error messages
authorceriel <none@none>
Fri, 1 Mar 1991 13:51:37 +0000 (13:51 +0000)
committerceriel <none@none>
Fri, 1 Mar 1991 13:51:37 +0000 (13:51 +0000)
lang/cem/cemcom.ansi/BigPars
lang/cem/cemcom.ansi/SmallPars
lang/cem/cemcom.ansi/domacro.c
lang/cem/cemcom.ansi/options
lang/cem/cemcom.ansi/options.c
lang/cem/cemcom.ansi/switch.c

index b3bbfb5..31f7540 100644 (file)
@@ -31,7 +31,7 @@
 
 
 !File: density.h
-#define        DENSITY 2       /* see switch.[ch] for an explanation           */
+#define        DENSITY 3       /* see switch.[ch] for an explanation           */
 
 
 !File: macbuf.h
index cac1a4d..5d9c4a1 100644 (file)
@@ -31,7 +31,7 @@
 
 
 !File: density.h
-#define        DENSITY 2       /* see switch.[ch] for an explanation           */
+#define        DENSITY 3       /* see switch.[ch] for an explanation           */
 
 
 !File: macbuf.h
index 9265160..f42c17a 100644 (file)
@@ -115,7 +115,7 @@ domacro()
                                the arguments.
                        */
                        if (GetToken(&tk) != INTEGER) {
-                               error("bad #line syntax");
+                               lexerror("bad #line syntax");
                                SkipToNewLine();
                        }
                        else
@@ -303,17 +303,17 @@ do_include()
        if (((tok = GetToken(&tk)) == FILESPECIFIER) || tok == STRING)
                filenm = tk.tk_bts;
        else {
-               error("bad include syntax");
+               lexerror("bad include syntax");
                filenm = (char *)0;
        }
        AccFileSpecifier = 0;
        if (SkipToNewLine()) {
-               error("bad include syntax");
+               lexerror("bad include syntax");
        }
        inctable[0] = WorkingDir;
        if (filenm) {
                if (!InsertFile(filenm, &inctable[tok==FILESPECIFIER],&result)){
-                       error("cannot open include file \"%s\"", filenm);
+                       lexerror("cannot open include file \"%s\"", filenm);
                        add_dependency(filenm);
                }
                else {
@@ -535,7 +535,7 @@ getparams(buf, parbuf)
                */
                for (pbuf2 = pbuf - 1; pbuf2 >= &buf[0]; pbuf2--) {
                        if (!strcmp(*pbuf2, *pbuf)) {
-                               error("formal parameter \"%s\" already used",
+                               lexerror("formal parameter \"%s\" already used",
                                        *pbuf);
                        }
                }
@@ -781,7 +781,7 @@ domacro()
                EoiForNewline = 0;
                return;
        }
-       error("illegal # line");
+       lexerror("illegal # line");
        EoiForNewline = 0;
        SkipToNewLine();
 }
index 75feae9..0c4b117 100644 (file)
@@ -15,8 +15,8 @@ L     don't generate linenumbers and filename indications
 o      no warnings or stricts about normal old-style constuctions
 p      trace
 P      in running the preprocessor do not output '# line' lines
-R      restricted C
 s      no stricts
+S      switch density
 T      take path following as directory for storing temporary file(s)
 U      undefine predefined name
 V      set objectsize and alignment requirements
index a047972..e393e6a 100644 (file)
@@ -37,6 +37,7 @@ char loptions[128];                   /* one for every char   */
 #endif LINT
 
 extern int idfsize;
+extern int density;
 
 static int txt2int();
 
@@ -291,6 +292,9 @@ next_option:                        /* to allow combined one-char options */
                break;
        }
 #endif NOCROSS
+       case 'S':
+               density = txt2int(&text);
+               break;
 #endif LINT
        }
 }
index 124c1e3..d4835e5 100644 (file)
@@ -29,6 +29,8 @@
 
 extern char options[];
 
+int    density = DENSITY;
+
 compact(nr, low, up)
        arith low, up;
 {
@@ -38,7 +40,7 @@ compact(nr, low, up)
        */
        arith diff = up - low;
 
-       return (nr == 0 || (diff >= 0 && diff / nr <= (DENSITY - 1)));
+       return (nr == 0 || (diff >= 0 && diff / nr <= (density - 1)));
 }
 
 static struct switch_hdr *switch_stack = 0;
@@ -103,10 +105,20 @@ code_endswitch()
 #ifndef LINT
        code_expr(sh->sh_expr, RVAL, TRUE, NO_LABEL, NO_LABEL);
 #endif
-       tablabel = data_label();        /* the rom must have a label    */
-       C_df_dlb(tablabel);
-       C_rom_ilb(sh->sh_default);
-       if (compact(sh->sh_nrofentries, sh->sh_lowerbd, sh->sh_upperbd)) {
+       if (sh->sh_nrofentries <= 1) {
+               if (sh->sh_nrofentries) {
+                       load_cst(sh->sh_lowerbd, size);
+                       C_cms(size);
+                       C_zeq(sh->sh_entries->ce_label);
+               }
+               else    C_asp(size);
+               C_bra(sh->sh_default);
+       }
+       else {
+           tablabel = data_label();    /* the rom must have a label    */
+           C_df_dlb(tablabel);
+           C_rom_ilb(sh->sh_default);
+           if (compact(sh->sh_nrofentries, sh->sh_lowerbd, sh->sh_upperbd)) {
                /* CSA */
                register arith val;
 
@@ -114,8 +126,7 @@ code_endswitch()
                C_rom_icon(long2str((long)(sh->sh_upperbd - sh->sh_lowerbd),10),
                                size);
                ce = sh->sh_entries;
-               if (sh->sh_nrofentries)
-                   for (val = sh->sh_lowerbd; val <= sh->sh_upperbd; val++) {
+               for (val = sh->sh_lowerbd; val <= sh->sh_upperbd; val++) {
                        ASSERT(ce);
                        if (val == ce->ce_value) {
                                C_rom_ilb(ce->ce_label);
@@ -126,8 +137,8 @@ code_endswitch()
                }
                C_lae_dlb(tablabel, (arith)0); /* perform the switch    */
                C_csa(size);
-       }
-       else { /* CSB */
+           }
+           else { /* CSB */
                C_rom_icon(long2str((long)sh->sh_nrofentries,10),size);
                for (ce = sh->sh_entries; ce; ce = ce->next) {
                        /* generate the entries: value + prog.label     */
@@ -136,6 +147,7 @@ code_endswitch()
                }
                C_lae_dlb(tablabel, (arith)0); /* perform the switch    */
                C_csb(size);
+           }
        }
        C_df_ilb(sh->sh_break);
        switch_stack = sh->next;        /* unstack the switch descriptor */