1
0
Эх сурвалжийг харах

Пробую сделать динамические строки

p.kushnir 10 жил өмнө
parent
commit
434bf09967

BIN
Docu/Tool-Map.odc


+ 4 - 1
Src/System/Mod/Cons.cp

@@ -22,8 +22,11 @@ MODULE Cons;
 	END Beep;
 	
 	PROCEDURE (log: Hook) Char (ch: CHAR);
+		VAR vs: ARRAY 2 OF CHAR;
 	BEGIN
-	
+		vs[0]:=ch;
+		vs[1]:=0X;
+		Console.String(vs)
 	END Char;
 	
 	PROCEDURE (log: Hook) Int (n: LONGINT);

+ 1 - 0
Src/System/Mod/Start.cp

@@ -6,4 +6,5 @@ BEGIN
 	Core.LoadMod("TestA2");
 	Core.LoadMod("TestMath");
 	Core.LoadMod("TestStrings");
+	Core.LoadMod("TestStrDyn");
 END Start.

+ 5 - 0
Src/System/Mod/Start2.cp

@@ -0,0 +1,5 @@
+MODULE Start2;
+	IMPORT Cons, Core;
+BEGIN
+	Core.LoadMod("TestStrDyn");
+END Start2.

+ 30 - 0
Src/System/Mod/Str.cp

@@ -8,11 +8,41 @@ MODULE Str;
 		minLongIntRev = "8085774586302733229";	(* reversed string of -MIN(LONGINT) *)
 		digitspace* = 08FX;
 	
+	TYPE
+		Dyn* = POINTER TO LIMITED RECORD 
+			x: POINTER TO ARRAY OF CHAR;
+		END;
+		
 	VAR
 		maxExp: INTEGER;
 		maxDig: INTEGER;
 		factor: REAL;	(* 10^maxDig *)	
 	
+	PROCEDURE New*(): Dyn;
+		VAR d: Dyn;
+	BEGIN
+		NEW(d);
+	RETURN d
+	END New;
+	
+	PROCEDURE (d: Dyn) Add* (c: CHAR), NEW;
+		VAR i, next: INTEGER; tmp: POINTER TO ARRAY OF CHAR;
+	BEGIN
+		IF d.x = NIL THEN
+			NEW(d.x, 1); next:=0;
+		ELSE
+			next:=LEN(d.x);
+			NEW(tmp, next+1);
+			i:=0;
+			WHILE i<next DO
+				tmp[i]:=d.x[i];
+				INC(i);
+			END;
+			d.x:=tmp
+		END;
+		d.x[next]:=c
+	END Add;
+	
 	(* integer conversions *)
 
 	PROCEDURE IntToString* (x: LONGINT; OUT s: ARRAY OF CHAR);

+ 21 - 0
Src/Test/Mod/StrDyn.cp

@@ -0,0 +1,21 @@
+MODULE TestStrDyn;
+	IMPORT 
+		Out, Str;
+	
+	PROCEDURE Init;
+		VAR i: INTEGER; d: Str.Dyn;
+	BEGIN
+		d:=Str.New();
+		i:=ORD("A");
+		WHILE i<=ORD("Z") DO
+			Out.Char(CHR(i));
+			d.Add(CHR(i));
+			INC(i);
+		END;
+		Out.Ln;
+	END Init;
+	
+BEGIN
+	Out.String("TEST dyn strings"); Out.Ln;
+	Init
+END TestStrDyn.