From bd1da2f86c021a4bc3255a0ff26a8d39636a9a48 Mon Sep 17 00:00:00 2001 From: ceriel Date: Fri, 1 Mar 1991 13:51:37 +0000 Subject: [PATCH] Improved switches, and fixed wrong place indication in error messages --- lang/cem/cemcom.ansi/BigPars | 2 +- lang/cem/cemcom.ansi/SmallPars | 2 +- lang/cem/cemcom.ansi/domacro.c | 12 ++++++------ lang/cem/cemcom.ansi/options | 2 +- lang/cem/cemcom.ansi/options.c | 4 ++++ lang/cem/cemcom.ansi/switch.c | 30 +++++++++++++++++++++--------- 6 files changed, 34 insertions(+), 18 deletions(-) diff --git a/lang/cem/cemcom.ansi/BigPars b/lang/cem/cemcom.ansi/BigPars index b3bbfb51d..31f7540bc 100644 --- a/lang/cem/cemcom.ansi/BigPars +++ b/lang/cem/cemcom.ansi/BigPars @@ -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 diff --git a/lang/cem/cemcom.ansi/SmallPars b/lang/cem/cemcom.ansi/SmallPars index cac1a4dfa..5d9c4a1dd 100644 --- a/lang/cem/cemcom.ansi/SmallPars +++ b/lang/cem/cemcom.ansi/SmallPars @@ -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 diff --git a/lang/cem/cemcom.ansi/domacro.c b/lang/cem/cemcom.ansi/domacro.c index 926516074..f42c17ac4 100644 --- a/lang/cem/cemcom.ansi/domacro.c +++ b/lang/cem/cemcom.ansi/domacro.c @@ -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(); } diff --git a/lang/cem/cemcom.ansi/options b/lang/cem/cemcom.ansi/options index 75feae9f0..0c4b11792 100644 --- a/lang/cem/cemcom.ansi/options +++ b/lang/cem/cemcom.ansi/options @@ -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 diff --git a/lang/cem/cemcom.ansi/options.c b/lang/cem/cemcom.ansi/options.c index a047972ee..e393e6abd 100644 --- a/lang/cem/cemcom.ansi/options.c +++ b/lang/cem/cemcom.ansi/options.c @@ -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 } } diff --git a/lang/cem/cemcom.ansi/switch.c b/lang/cem/cemcom.ansi/switch.c index 124c1e33b..d4835e584 100644 --- a/lang/cem/cemcom.ansi/switch.c +++ b/lang/cem/cemcom.ansi/switch.c @@ -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 */