Procházet zdrojové kódy

Improved switches, and fixed wrong place indication in error messages

ceriel před 33 roky
rodič
revize
3650bd14fd

+ 1 - 1
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

+ 1 - 1
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

+ 6 - 6
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();
 }

+ 1 - 1
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

+ 4 - 0
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
 	}
 }

+ 21 - 9
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 */