Ver código fonte

Lindev synced with BlackBox 1.6-rc6 Dev

Alexander Shiryaev 12 anos atrás
pai
commit
8babc25df7

BIN
BlackBox/Lindev/Mod/CPB.odc


+ 33 - 43
BlackBox/Lindev/Mod/CPB.txt

@@ -331,32 +331,31 @@ MODULE LindevCPB;
 			Prepare(x); Prepare(y);
 			z.intval := x.intval + y.intval; z.realval := x.realval + y.realval
 		ELSIF type.form IN realSet THEN
-			IF ABS(x.realval) = DevCPM.InfReal THEN
-				IF y.realval # -x.realval THEN z.realval := x.realval ELSE err(212) END
-			ELSIF ABS(y.realval) = DevCPM.InfReal THEN z.realval := y.realval
-			ELSIF (y.realval >= 0) & (x.realval <= MAX(REAL) - y.realval)
-					OR (y.realval < 0) & (x.realval >= -MAX(REAL) - y.realval) THEN
-				z.realval := x.realval + y.realval
-			ELSE err(206)
+			IF (ABS(x.realval) = DevCPM.InfReal) & (x.realval = - y.realval) THEN err(212)
+			ELSE z.realval := x.realval + y.realval
 			END
 		ELSE HALT(100)
 		END;
 		GetConstType(z, type.form, 206, type)
 	END AddConst;
 	
+	PROCEDURE NegateConst (y, z: DevCPT.Const; VAR type: DevCPT.Struct);	(* z := - y *)
+	BEGIN
+		IF type.form IN intSet THEN Prepare(y); z.intval :=  -y.intval; z.realval := -y.realval
+		ELSIF type.form IN realSet THEN z.realval := -y.realval
+		ELSE HALT(100)
+		END;
+		GetConstType(z, type.form, 207, type)
+	END NegateConst;
+	
 	PROCEDURE SubConst (x, y, z: DevCPT.Const; VAR type: DevCPT.Struct);	(* z := x - y *)
 	BEGIN
 		IF type.form IN intSet THEN
 			Prepare(x); Prepare(y);
 			z.intval := x.intval - y.intval; z.realval := x.realval - y.realval
 		ELSIF type.form IN realSet THEN
-			IF ABS(x.realval) = DevCPM.InfReal THEN
-				IF y.realval # x.realval THEN z.realval := x.realval ELSE err(212) END
-			ELSIF ABS(y.realval) = DevCPM.InfReal THEN z.realval := -y.realval
-			ELSIF (y.realval >= 0) & (x.realval >= -MAX(REAL) + y.realval)
-					OR (y.realval < 0) & (x.realval <= MAX(REAL) + y.realval) THEN
-				z.realval := x.realval - y.realval
-			ELSE err(207)
+			IF (ABS(x.realval) = DevCPM.InfReal) & (x.realval =  y.realval) THEN err(212)
+			ELSE z.realval := x.realval - y.realval
 			END
 		ELSE HALT(100)
 		END;
@@ -370,19 +369,9 @@ MODULE LindevCPB;
 			z.realval := x.realval * y.realval + x.intval * y.realval + x.realval * y.intval;
 			z.intval := x.intval * y.intval
 		ELSIF type.form IN realSet THEN
-			IF ABS(x.realval) = DevCPM.InfReal THEN
-				IF y.realval > 0 THEN z.realval := x.realval
-				ELSIF y.realval < 0 THEN z.realval := -x.realval
-				ELSE err(212)
-				END
-			ELSIF ABS(y.realval) = DevCPM.InfReal THEN
-				IF x.realval > 0 THEN z.realval := y.realval
-				ELSIF x.realval < 0 THEN z.realval := -y.realval
-				ELSE err(212)
-				END
-			ELSIF (ABS(y.realval) <= 1) OR (ABS(x.realval) <= MAX(REAL) / ABS(y.realval)) THEN
-				z.realval := x.realval * y.realval
-			ELSE err(204)
+			IF (ABS(x.realval) = DevCPM.InfReal) & ( y.realval = 0.0) THEN err(212)
+			ELSIF (ABS(y.realval) = DevCPM.InfReal) & (x.realval = 0.0) THEN err(212)
+			ELSE z.realval := x.realval * y.realval
 			END
 		ELSE HALT(100)
 		END;
@@ -392,18 +381,9 @@ MODULE LindevCPB;
 	PROCEDURE DivConst (x, y, z: DevCPT.Const; VAR type: DevCPT.Struct);	(* z := x / y *)
 	BEGIN
 		IF type.form IN realSet THEN
-			IF y.realval # 0.0 THEN
-				IF ABS(x.realval) = DevCPM.InfReal THEN
-					IF ABS(y.realval) = DevCPM.InfReal THEN err(212)
-					ELSIF y.realval >= 0 THEN z.realval := x.realval
-					ELSE z.realval := -x.realval
-					END
-				ELSIF ABS(y.realval) = DevCPM.InfReal THEN z.realval := 0
-				ELSIF (ABS(y.realval) >= 1) OR (ABS(x.realval) <= MAX(REAL) * ABS(y.realval)) THEN
-					z.realval := x.realval / y.realval
-				ELSE err(204)
-				END
-			ELSE err(205)
+			IF (x.realval = 0.0) & (y.realval = 0.0) THEN err(212)
+			ELSIF (ABS(x.realval) =  DevCPM.InfReal) & (ABS(y.realval) =  DevCPM.InfReal) THEN err(212)
+			ELSE z.realval := x.realval / y.realval
 			END
 		ELSE HALT(100)
 		END;
@@ -464,6 +444,17 @@ MODULE LindevCPB;
 		RETURN res
 	END LessConst;
 	
+	PROCEDURE IsNegConst (x: DevCPT.Const; form: INTEGER): BOOLEAN;	(* x < 0  OR x = (-0.0) *)
+		VAR res: BOOLEAN;
+	BEGIN
+		CASE form OF
+		| Int8..Int32: res := x.intval < 0
+		| Int64: Prepare(x); res := x.realval + x.intval < 0
+		| Real32, Real64: res := (x.realval <= 0.) & (1. / x.realval <= 0.)
+		END;
+		RETURN res
+	END IsNegConst;
+
 
 	PROCEDURE NewIntConst*(intval: INTEGER): DevCPT.Node;
 		VAR x: DevCPT.Node;
@@ -847,7 +838,7 @@ MODULE LindevCPB;
 				IF f IN intSet + realSet + {Set} THEN
 					IF z.class = Nconst THEN
 						IF f = Set THEN z.conval.setval := -z.conval.setval
-						ELSE SubConst(zero, z.conval, z.conval, z.typ)
+						ELSE NegateConst(z.conval, z.conval, z.typ)
 						END;
 						z.obj := NIL
 					ELSE
@@ -859,7 +850,7 @@ MODULE LindevCPB;
 			| abs:
 				IF f IN intSet + realSet THEN
 					IF z.class = Nconst THEN
-						IF LessConst(z.conval, zero, f) THEN SubConst(zero, z.conval, z.conval, z.typ) END;
+						IF IsNegConst(z.conval, f) THEN NegateConst(z.conval, z.conval, z.typ) END;
 						z.obj := NIL
 					ELSE
 						IF f < Int32 THEN Convert(z, DevCPT.int32typ) END;
@@ -1030,8 +1021,7 @@ MODULE LindevCPB;
 					END ;
 					IF do THEN NewOp(op, typ, z, y) END;
 				| slash:
-					IF f IN realSet THEN
-						IF (y.class = Nconst) & (y.conval.realval = 0) THEN err(205) END
+					IF f IN realSet THEN (* OK *)
 					ELSIF (f # Set) & (f # Undef) THEN err(102); typ := DevCPT.undftyp
 					END ;
 					NewOp(op, typ, z, y)

BIN
BlackBox/Lindev/Mod/CPE.odc


+ 12 - 7
BlackBox/Lindev/Mod/CPE.txt

@@ -3,7 +3,7 @@ MODULE LindevCPE;
 	(* THIS IS TEXT COPY OF CPE.odc *)
 	(* DO NOT EDIT *)
 
-	IMPORT SYSTEM, (*Dates,*) DevCPM := LindevCPM, DevCPT := LindevCPT;
+	IMPORT SYSTEM, (* Dates, *) DevCPM := LindevCPM, DevCPT := LindevCPT;
 
 
 	CONST
@@ -123,6 +123,11 @@ MODULE LindevCPE;
 		IF DevCPM.LEHost THEN hi := a[1]; low := a[0] ELSE hi := a[0]; low := a[1] END
 	END GetRealWords;
 		
+	PROCEDURE IsSame (x, y: REAL): BOOLEAN;
+	BEGIN
+		RETURN  (x = y) & ((x #  0.) OR (1. / x = 1. / y))
+	END IsSame;
+	
 	PROCEDURE AllocConst* (con: DevCPT.Const; form: BYTE; VAR obj: DevCPT.Object; VAR adr: INTEGER);
 		VAR c: DevCPT.Const;
 	BEGIN
@@ -144,11 +149,11 @@ MODULE LindevCPE;
 			IF c = NIL THEN con.intval2 := con.intval; adr := idx64; INC(idx64, 8) END
 		| Real32:
 			obj := Const32; c := obj.conval;
-			WHILE (c # NIL) & ((con.setval # c.setval) OR (con.realval # c.realval)) DO c := c.link END;
+			WHILE (c # NIL) & ((con.setval # c.setval) OR ~IsSame(con.realval, c.realval)) DO c := c.link END;
 			IF c = NIL THEN adr := idx32; INC(idx32, 4) END
 		| Real64:
 			obj := Const64; c := obj.conval;
-			WHILE (c # NIL) & ((con.setval # c.setval) OR (con.realval # c.realval)) DO c := c.link END;
+			WHILE (c # NIL) & ((con.setval # c.setval) OR ~IsSame(con.realval, c.realval)) DO c := c.link END;
 			IF c = NIL THEN adr := idx64; INC(idx64, 8) END
 		| Guid:
 			obj := Const32; c := obj.conval;
@@ -642,7 +647,7 @@ MODULE LindevCPE;
 		ELSE n := NameIdx(desc.strobj)
 		END;
 		IF desc.form # ProcTyp THEN b := desc.BaseTyp;
-			IF (b # NIL) & (b # DevCPT.anytyp) & (b # DevCPT.anyptrtyp) & (b.form IN {Pointer, Comp})
+			IF (b # NIL) & (b # DevCPT.anytyp) & (b # DevCPT.anyptrtyp) & (b.form IN {Pointer, Comp, ProcTyp})
 					& (b.sysflag # interface) & (b # DevCPT.guidtyp)
 					& (~b.untagged OR outURef & (b.form = Comp)) THEN
 				l := OffsetLink(TypeObj(b), 0)
@@ -730,14 +735,14 @@ MODULE LindevCPE;
 	END OutDesc;
 
 	PROCEDURE OutModDesc (nofptr, refSize, namePos, ptrPos, expPos, impPos: INTEGER);
-		VAR i: INTEGER; (*t: Dates.Time; d: Dates.Date;*)
+		VAR i: INTEGER; (* t: Dates.Time; d: Dates.Date; *)
 	BEGIN
 		Out4(0);	(* link *)
 		Out4(ORD(options));	(* opts *)
 		Out4(0);	(* refcnt *)
-		(*Dates.GetDate(d); Dates.GetTime(t); 	(* compile time *)
+		(* Dates.GetDate(d); Dates.GetTime(t); 	(* compile time *)
 		Out2(d.year); Out2(d.month); Out2(d.day);
-		Out2(t.hour); Out2(t.minute); Out2(t.second);*)
+		Out2(t.hour); Out2(t.minute); Out2(t.second); *)
 		Out2(2007); Out2(5); Out2(25);
 		Out2(0); Out2(0); Out2(0);
 		Out4(0); Out4(0); Out4(0); 	(* load time *)

BIN
BlackBox/Lindev/Mod/CPM.odc


+ 48 - 15
BlackBox/Lindev/Mod/CPM.txt

@@ -1,9 +1,9 @@
 MODULE LindevCPM;
 
-	(* THIS IS TEXT COPY PF CPM.odc *)
+	(* THIS IS TEXT COPY OF CPM.odc *)
 	(* DO NOT EDIT *)
 
-	IMPORT SYSTEM, Kernel, Files(*, Stores, Models, Views, TextModels, TextMappers, StdLog, DevMarkers*);
+	IMPORT SYSTEM, Kernel, Files (* , Stores, Models, Views, TextModels, TextMappers, StdLog, DevMarkers *);
 
 	CONST
 		ProcSize* = 4;	(* PROCEDURE type *)
@@ -108,9 +108,10 @@ TYPE
 		file*: Files.File;	(* used for sym file import *)
 		codeDir*: ARRAY 16 OF CHAR;
 		symDir*: ARRAY 16 OF CHAR;
-		
+		checksum*: INTEGER;	(* symbol file checksum *)
+
 		errorMes*: ARRAY 4096 OF CHAR;
-		
+
 		lastpos: INTEGER;
 		realpat: INTEGER;
 		lrealpat: RECORD H, L: INTEGER END;
@@ -167,6 +168,20 @@ TYPE
 		Get(sCh);
 		ch := sCh
 	END GetL;
+	
+(*
+	PROCEDURE LineOf* (pos: INTEGER): INTEGER;
+		VAR ch: CHAR;
+	BEGIN
+		IF lineReader = NIL THEN lineReader := in.Base().NewReader(NIL); lineReader.SetPos(0); lineNum := 0 END;
+		IF lineReader.Pos() > pos THEN lineReader.SetPos(0); lineNum := 0 END;
+		WHILE lineReader.Pos() < pos DO
+			lineReader.ReadChar(ch);
+			IF ch = 0DX THEN INC(lineNum) END
+		END;
+		RETURN lineNum
+	END LineOf;
+*)
 
 	PROCEDURE LoWord (r: REAL): INTEGER;
 		VAR x: INTEGER;
@@ -403,7 +418,7 @@ TYPE
 			ch := str[idx]; INC(idx); val := val * 64 + ORD(ch) - 128
 		END
 	END GetUtf8;
-	
+
 	PROCEDURE Mark* (n, pos: INTEGER);
 	BEGIN
 		IF (n >= 0) & ~((oberon IN options) & (n >= 181) & (n <= 190)) THEN
@@ -449,7 +464,7 @@ TYPE
 	END InitCrcTab;
 	
 	PROCEDURE FPrint* (VAR fp: INTEGER; val: INTEGER);
-		VAR c, i: INTEGER;
+		VAR c: INTEGER;
 	BEGIN
 (*
 		fp := SYSTEM.ROT(ORD(BITS(fp) / BITS(val)), 1)	(* bad collision detection *)
@@ -475,15 +490,25 @@ TYPE
 		FPrint(fp, LoWord(lr)); FPrint(fp, HiWord(lr))
 	END FPrintLReal;
 
+	PROCEDURE ChkSum (VAR fp: INTEGER; val: INTEGER);	(* symbolfile checksum *)
+	BEGIN
+		(* same as FPrint, 8 bit only *)
+		fp := ORD(BITS(fp * 256) / BITS(crc32tab[ORD(BITS(fp DIV 1000000H) / BITS(val)) MOD 256]))
+	END ChkSum;
+
 
 
 	(* compact format *)
 	
 	PROCEDURE WriteLInt (w: Files.Writer; i: INTEGER);
 	BEGIN
+		ChkSum(checksum, i);
 		w.WriteByte(SHORT(SHORT(i MOD 256))); i := i DIV 256;
+		ChkSum(checksum, i);
 		w.WriteByte(SHORT(SHORT(i MOD 256))); i := i DIV 256;
+		ChkSum(checksum, i);
 		w.WriteByte(SHORT(SHORT(i MOD 256))); i := i DIV 256;
+		ChkSum(checksum, i);
 		w.WriteByte(SHORT(SHORT(i MOD 256)))
 	END WriteLInt;
 
@@ -491,14 +516,19 @@ TYPE
 		VAR b: BYTE; x: INTEGER;
 	BEGIN
 		r.ReadByte(b); x := b MOD 256;
+		ChkSum(checksum, b);
 		r.ReadByte(b); x := x + 100H * (b MOD 256);
+		ChkSum(checksum, b);
 		r.ReadByte(b); x := x + 10000H * (b MOD 256);
-		r.ReadByte(b); i := x + 1000000H * b
+		ChkSum(checksum, b);
+		r.ReadByte(b); i := x + 1000000H * b;
+		ChkSum(checksum, b)
 	END ReadLInt;
 
 	PROCEDURE WriteNum (w: Files.Writer; i: INTEGER);
 	BEGIN	(* old format of Oberon *)
-		WHILE (i < -64) OR (i > 63) DO w.WriteByte(SHORT(SHORT(i MOD 128 - 128))); i := i DIV 128 END;
+		WHILE (i < -64) OR (i > 63) DO ChkSum(checksum, i MOD 128 - 128); w.WriteByte(SHORT(SHORT(i MOD 128 - 128))); i := i DIV 128 END;
+		ChkSum(checksum, i MOD 128);
 		w.WriteByte(SHORT(SHORT(i MOD 128)))
 	END WriteNum;
 
@@ -506,8 +536,9 @@ TYPE
 		VAR b: BYTE; s, y: INTEGER;
 	BEGIN
 		s := 0; y := 0; r.ReadByte(b);
-		WHILE b < 0 DO INC(y, ASH(b + 128, s)); INC(s, 7); r.ReadByte(b) END;
-		i := ASH((b + 64) MOD 128 - 64, s) + y
+		IF ~r.eof THEN ChkSum(checksum, b) END;
+		WHILE b < 0 DO INC(y, ASH(b + 128, s)); INC(s, 7); r.ReadByte(b); ChkSum(checksum, b) END;
+		i := ASH((b + 64) MOD 128 - 64, s) + y;
 	END ReadNum;
 	
 	PROCEDURE WriteNumSet (w: Files.Writer; x: SET);
@@ -549,7 +580,8 @@ TYPE
 	PROCEDURE SymRCh* (VAR ch: SHORTCHAR);
 		VAR b: BYTE;
 	BEGIN
-		inSym.ReadByte(b); ch := SHORT(CHR(b))
+		inSym.ReadByte(b); ch := SHORT(CHR(b));
+		ChkSum(checksum, b)
 	END SymRCh;
 	
 	PROCEDURE SymRInt* (): INTEGER;
@@ -613,6 +645,7 @@ TYPE
 
 	PROCEDURE SymWCh* (ch: SHORTCHAR);
 	BEGIN
+		ChkSum(checksum, ORD(ch));
 		outSym.WriteByte(SHORT(ORD(ch)))
 	END SymWCh;
 
@@ -646,7 +679,7 @@ TYPE
 	BEGIN
 		ObjFName := modName$; Kernel.SplitName(ObjFName, dir, ObjFName);
 		loc := Files.dir.This(dir); loc := loc.This(symDir);
-		symFile := Files.dir.New(loc, Files.dontAsk);
+		symFile := Files.dir.New(loc, Files.ask);
 		IF symFile # NIL THEN
 			outSym := symFile.NewWriter(NIL);
 			WriteLInt(outSym, SFtag)
@@ -661,7 +694,7 @@ TYPE
 		IF symFile # NIL THEN
 			name := ObjFName$;
 			Kernel.MakeFileName(name, Kernel.symType);
-			symFile.Register(name, Kernel.symType, Files.dontAsk, res);
+			symFile.Register(name, Kernel.symType, Files.ask, res);
 			symFile := NIL
 		END
 	END RegisterNewSym;
@@ -720,7 +753,7 @@ TYPE
 		errpos := 0;
 		ObjFName := modName$; Kernel.SplitName(ObjFName, dir, ObjFName);
 		loc := Files.dir.This(dir); loc := loc.This(codeDir);
-		objFile := Files.dir.New(loc, Files.dontAsk);
+		objFile := Files.dir.New(loc, Files.ask);
 		IF objFile # NIL THEN
 			outObj := objFile.NewWriter(NIL);
 			WriteLInt(outObj, OFtag)
@@ -735,7 +768,7 @@ TYPE
 		IF objFile # NIL THEN
 			name := ObjFName$;
 			Kernel.MakeFileName(name, Kernel.objType);
-			objFile.Register(name, Kernel.objType, Files.dontAsk, res);
+			objFile.Register(name, Kernel.objType, Files.ask, res);
 			objFile := NIL; outObj := NIL
 		END
 	END RegisterObj;

BIN
BlackBox/Lindev/Mod/CPT.odc


+ 19 - 14
BlackBox/Lindev/Mod/CPT.txt

@@ -572,6 +572,7 @@ MODULE LindevCPT;
 		BEGIN
 			WHILE (fld # NIL) & (fld.mode = Fld) DO
 				IF (fld.vis # internal) & visible THEN
+					DevCPM.FPrint(pvfp, fld.vis); FPrintName(pvfp, fld.name^); DevCPM.FPrint(pvfp, fld.adr);
 					DevCPM.FPrint(pbfp, fld.vis); FPrintName(pbfp, fld.name^); DevCPM.FPrint(pbfp, fld.adr);
 					FPrintStr(fld.typ); DevCPM.FPrint(pbfp, fld.typ.pbfp); DevCPM.FPrint(pvfp, fld.typ.pvfp)
 				ELSE FPrintHdFld(fld.typ, fld, fld.adr + adr)
@@ -581,20 +582,23 @@ MODULE LindevCPT;
 		END FPrintFlds;
 
 		PROCEDURE FPrintTProcs(obj: Object);	(* modifies pbfp and pvfp *)
+			VAR fp: INTEGER;
 		BEGIN
 			IF obj # NIL THEN
 				FPrintTProcs(obj.left);
 				IF obj.mode = TProc THEN
 					IF obj.vis # internal THEN
-						IF obj.vis = externalR THEN DevCPM.FPrint(pbfp, externalR) END;
-						IF limAttr IN obj.conval.setval THEN DevCPM.FPrint(pbfp, limAttr)
-						ELSIF absAttr IN obj.conval.setval THEN DevCPM.FPrint(pbfp, absAttr)
-						ELSIF empAttr IN obj.conval.setval THEN DevCPM.FPrint(pbfp, empAttr)
-						ELSIF extAttr IN obj.conval.setval THEN DevCPM.FPrint(pbfp, extAttr)
+						fp := 0;
+						IF obj.vis = externalR THEN DevCPM.FPrint(fp, externalR) END;
+						IF limAttr IN obj.conval.setval THEN DevCPM.FPrint(fp, limAttr)
+						ELSIF absAttr IN obj.conval.setval THEN DevCPM.FPrint(fp, absAttr)
+						ELSIF empAttr IN obj.conval.setval THEN DevCPM.FPrint(fp, empAttr)
+						ELSIF extAttr IN obj.conval.setval THEN DevCPM.FPrint(fp, extAttr)
 						END;
-						DevCPM.FPrint(pbfp, TProc); DevCPM.FPrint(pbfp, obj.num);
-						FPrintSign(pbfp, obj.typ, obj.link); FPrintName(pbfp, obj.name^);
-						IF obj.entry # NIL THEN FPrintName(pbfp, obj.entry^) END
+						DevCPM.FPrint(fp, TProc); DevCPM.FPrint(fp, obj.num);
+						FPrintSign(fp, obj.typ, obj.link); FPrintName(fp, obj.name^);
+						IF obj.entry # NIL THEN FPrintName(fp, obj.entry^) END;
+						DevCPM.FPrint(pvfp, fp); DevCPM.FPrint(pbfp, fp)
 					ELSIF DevCPM.ExpHdTProc THEN
 						DevCPM.FPrint(pvfp, TProc); DevCPM.FPrint(pvfp, obj.num)
 					END
@@ -624,10 +628,7 @@ MODULE LindevCPT;
 				IF btyp # NIL THEN FPrintStr(btyp); DevCPM.FPrint(pbfp, btyp.pbfp); DevCPM.FPrint(pvfp, btyp.pvfp) END ;
 				DevCPM.FPrint(pvfp, typ.size); DevCPM.FPrint(pvfp, typ.align); DevCPM.FPrint(pvfp, typ.n);
 				nofhdfld := 0; FPrintFlds(typ.link, 0, TRUE);
-(*
-				IF nofhdfld > DevCPM.MaxHdFld THEN DevCPM.Mark(225, typ.txtpos) END ;
-*)
-				FPrintTProcs(typ.link); DevCPM.FPrint(pvfp, pbfp); strobj := typ.strobj;
+				FPrintTProcs(typ.link); (* DevCPM.FPrint(pvfp, pbfp); *) strobj := typ.strobj;
 				IF (strobj = NIL) OR (strobj.name = null) THEN pbfp := pvfp END
 			END ;
 			typ.pbfp := pbfp; typ.pvfp := pvfp
@@ -1151,6 +1152,7 @@ MODULE LindevCPT;
 				lib := NIL;
 				impProc := SHORT(DevCPM.SymRInt());
 				IF (impProc # 0) & (processor # 0) & (impProc # processor) THEN err(151) END;
+				DevCPM.checksum := 0;	(* start checksum here to avoid problems with proc id fixup *)
 				tag := DevCPM.SymRInt();
 				IF tag < Smname THEN version := tag; tag := DevCPM.SymRInt()
 				ELSE version := 0
@@ -1484,15 +1486,17 @@ MODULE LindevCPT;
 	END OutObj;
 
 	PROCEDURE Export*(VAR ext, new: BOOLEAN);
-			VAR i: SHORTINT; nofmod: BYTE; done: BOOLEAN; old: Object;
+			VAR i: SHORTINT; nofmod: BYTE; done: BOOLEAN; old: Object; oldCSum: INTEGER;
 	BEGIN
 		symExtended := FALSE; symNew := FALSE; nofmod := nofGmod;
 		Import("@self", SelfName, done); nofGmod := nofmod;
+		oldCSum := DevCPM.checksum;
 		ASSERT(GlbMod[0].name^ = SelfName);
 		IF DevCPM.noerr THEN	(* ~DevCPM.noerr => ~done *)
 			DevCPM.NewSym(SelfName);
 			IF DevCPM.noerr THEN
 				DevCPM.SymWInt(0);	(* portable symfile *)
+				DevCPM.checksum := 0;	(* start checksum here to avoid problems with proc id fixup *)
 				DevCPM.SymWInt(actVersion);
 				old := GlbMod[0]; portable := TRUE;
  				IF libName # "" THEN
@@ -1507,7 +1511,8 @@ MODULE LindevCPT;
 				expCtxt.nofm := 1; expCtxt.locmno[0] := 0;
 				i := 1; WHILE i < maxImps DO expCtxt.locmno[i] := -1; INC(i) END ;
 				OutObj(topScope.right);
-				ext := sfpresent & symExtended; new := ~sfpresent OR symNew;
+				ext := sfpresent & symExtended;
+				new := ~sfpresent OR symNew OR (DevCPM.checksum # oldCSum);
 				IF DevCPM.noerr & ~portable THEN
 					DevCPM.SymReset;
 					DevCPM.SymWInt(processor)	(* nonportable symfile *)

+ 0 - 0
BlackBox/LindevCompiler.odc → BlackBox/Lindev/Mod/Compiler.odc


+ 1 - 1
BlackBox/LindevCompiler.txt → BlackBox/Lindev/Mod/Compiler.txt

@@ -1,6 +1,6 @@
 MODULE LindevCompiler;
 
-	(* THIS IS TEXT COPY OF LindevCompiler.odc *)
+	(* THIS IS TEXT COPY OF Compiler.odc *)
 	(* DO NOT EDIT *)
 
 	(*

+ 0 - 0
BlackBox/LindevElfLinker16.odc → BlackBox/Lindev/Mod/ElfLinker16.odc


+ 1 - 1
BlackBox/LindevElfLinker16.txt → BlackBox/Lindev/Mod/ElfLinker16.txt

@@ -1,6 +1,6 @@
 MODULE LindevElfLinker;
 
-	(* THIS IS TEXT COPY OF LindevElfLinker16.odc *)
+	(* THIS IS TEXT COPY OF ElfLinker16.odc *)
 	(* DO NOT EDIT *)
 
 (*

+ 2 - 2
BlackBox/build

@@ -50,8 +50,8 @@ LindevCompiler.Compile('Lindev/Mod', 'CPL486.txt')
 LindevCompiler.Compile('Lindev/Mod', 'CPC486.txt')
 LindevCompiler.Compile('Lindev/Mod', 'CPV486.txt')
 
-LindevCompiler.Compile('', 'LindevCompiler.txt')
-LindevCompiler.Compile('', 'LindevElfLinker16.txt')
+LindevCompiler.Compile('Lindev/Mod', 'Compiler.txt')
+LindevCompiler.Compile('Lindev/Mod', 'ElfLinker16.txt')
 
 ### simple dev interpreter (include LindevCompiler and LindevElfLinker)
 

BIN
BlackBox/libBB.so


+ 8 - 7
README

@@ -53,7 +53,6 @@ Files:
 			Dev/Docu/ElfLinker.odc
 			Lin/Mod/Console.odc
 			System/Mod/Console.odc
-			Lindev/*
 			Docu/OpenBUGS-License.odc
 		oberoncore.ru:
 			Lin/Mod/Kernel_so_init.odc
@@ -72,10 +71,13 @@ Files:
 		Lin/Mod/Obsd.Libc.txt:
 			OpenBUGS Lin/Mod/Libc.odc:
 				OpenBSD-specific
-		LindevCompiler.odc:
-			modified original BlackBox Dev/Mod/Compiler.odc
-		LindevElfLinker16.odc:
-			modified OpenBUGS Dev/Mod/ElfLinker16.odc
+		Lindev/Mod
+			CP*
+				BlackBox 1.6-rc6 Dev CP* modified to not depend on Dates, Texts etc.
+			Compiler.odc:
+				modified original BlackBox Dev/Mod/Compiler.odc
+			ElfLinker16.odc:
+				modified OpenBUGS Dev/Mod/ElfLinker16.odc
 	new:
 		Interp.odc: simple console interpreter
 		libBB.so: compiled and linked OpenBSD shared library to run BlackBox
@@ -83,7 +85,6 @@ Files:
 
 Notes:
 	Lindev:
-		OpenBUGS/Lindev compiler outdated, not in sync with original BlackBox/Dev compiler
-		Lindev* is temporary solution until TextModels ported
+		Lindev is temporary solution until TextModels ported?
 
 A. V. Shiryaev, 2012