Browse Source

new: CongLog: Log.Hook implementation

Alexander Shiryaev 12 years ago
parent
commit
b42ccf2b44
4 changed files with 193 additions and 4 deletions
  1. 190 0
      BlackBox/Cons/Mod/Log.txt
  2. 2 1
      BlackBox/Init-Interp.txt
  3. 1 0
      BlackBox/build
  4. 0 3
      TODO

+ 190 - 0
BlackBox/Cons/Mod/Log.txt

@@ -0,0 +1,190 @@
+MODULE ConsLog;
+
+	(*
+		A. V. Shiryaev, 2012.10
+
+		Log.Hook implementation
+		based on StdLog
+	*)
+
+	IMPORT
+		Log, Views, Dialog,
+		TextModels, TextMappers,
+		Console;
+
+	TYPE
+		LogHook = POINTER TO RECORD (Log.Hook) END;
+
+	VAR
+		logAlerts: BOOLEAN;
+		subOut: TextMappers.Formatter;
+
+		buf: TextModels.Model;
+		textR: TextModels.Reader;
+
+	(* Sub support *)
+
+	PROCEDURE* Guard (o: ANYPTR): BOOLEAN;
+	BEGIN
+		RETURN o # NIL
+	END Guard;
+
+	PROCEDURE* ClearBuf;
+		VAR subBuf: TextModels.Model;
+	BEGIN
+		subBuf := subOut.rider.Base(); subBuf.Delete(0, subBuf.Length())
+	END ClearBuf;
+
+	PROCEDURE* FlushBuf;
+		VAR c: CHAR;
+	BEGIN
+		IF buf.Length() > 0 THEN
+			textR.SetPos(0);
+			textR.ReadChar(c);
+			WHILE ~textR.eot DO
+				IF c = 0DX THEN c := 0AX END;
+				Console.WriteChar(c);
+				textR.ReadChar(c)
+			END;
+			buf.Delete(0, buf.Length())
+		END
+	END FlushBuf;
+
+	PROCEDURE* SubFlush;
+	BEGIN
+		IF Log.synch THEN
+			FlushBuf;
+			(* IF Log.force THEN Views.RestoreDomain(text.Domain()) END *)
+		END;
+	END SubFlush;
+
+	PROCEDURE (log: LogHook) Guard* (o: ANYPTR): BOOLEAN;
+	BEGIN RETURN Guard(o)
+	END Guard;
+
+	PROCEDURE (log: LogHook) ClearBuf*;
+	BEGIN ClearBuf
+	END ClearBuf;
+
+	PROCEDURE (log: LogHook) FlushBuf*;
+	BEGIN FlushBuf
+	END FlushBuf;
+
+	PROCEDURE (log: LogHook) Beep*;
+	BEGIN Dialog.Beep
+	END Beep;
+
+	PROCEDURE (log: LogHook) Char* (ch: CHAR);
+	BEGIN
+		subOut.WriteChar(ch); SubFlush
+	END Char;
+
+	PROCEDURE (log: LogHook) Int* (n: INTEGER);
+	BEGIN
+		subOut.WriteChar(" "); subOut.WriteInt(n); SubFlush
+	END Int;
+
+	PROCEDURE (log: LogHook) Real* (x: REAL);
+	BEGIN
+		subOut.WriteChar(" "); subOut.WriteReal(x); SubFlush
+	END Real;
+
+	PROCEDURE (log: LogHook) String* (IN str: ARRAY OF CHAR);
+	BEGIN
+		subOut.WriteString(str); SubFlush
+	END String;
+
+	PROCEDURE (log: LogHook) Bool* (x: BOOLEAN);
+	BEGIN
+		subOut.WriteChar(" "); subOut.WriteBool(x); SubFlush
+	END Bool;
+
+	PROCEDURE (log: LogHook) Set* (x: SET);
+	BEGIN
+		subOut.WriteChar(" "); subOut.WriteSet(x); SubFlush
+	END Set;
+
+	PROCEDURE (log: LogHook) IntForm* (x: INTEGER; base, minWidth: INTEGER; fillCh: CHAR; showBase: BOOLEAN);
+	BEGIN
+		subOut.WriteIntForm(x, base, minWidth, fillCh, showBase); SubFlush
+	END IntForm;
+
+	PROCEDURE (log: LogHook) RealForm* (x: REAL; precision, minW, expW: INTEGER; fillCh: CHAR);
+	BEGIN
+		subOut.WriteRealForm(x, precision, minW, expW, fillCh); SubFlush
+	END RealForm;
+
+	PROCEDURE (log: LogHook) Tab*;
+	BEGIN
+		subOut.WriteTab; SubFlush
+	END Tab;
+
+	PROCEDURE (log: LogHook) Ln*;
+	BEGIN
+		subOut.WriteLn; SubFlush;
+		(* IF Log.synch THEN Views.RestoreDomain(text.Domain()) END *)
+	END Ln;
+
+	PROCEDURE (log: LogHook) Para*;
+	BEGIN
+		subOut.WritePara; SubFlush;
+		(* IF Log.synch THEN Views.RestoreDomain(text.Domain()) END *)
+	END Para;
+
+	PROCEDURE (log: LogHook) View* (v: ANYPTR);
+	BEGIN
+		IF (v # NIL) & (v IS Views.View) THEN
+			subOut.WriteView(v(Views.View)); SubFlush
+		END
+	END View;
+
+	PROCEDURE (log: LogHook) ViewForm* (v: ANYPTR; w, h: INTEGER);
+	BEGIN
+		ASSERT(v # NIL, 20);
+		IF (v # NIL) & (v IS Views.View) THEN
+			subOut.WriteViewForm(v(Views.View), w, h); SubFlush
+		END
+	END ViewForm;
+
+	PROCEDURE (log: LogHook) ParamMsg* (IN s, p0, p1, p2: ARRAY OF CHAR);
+		VAR msg: ARRAY 256 OF CHAR; i: INTEGER; ch: CHAR;
+	BEGIN
+		IF logAlerts THEN
+			(* IF Log.synch THEN Open END; *)
+			Dialog.MapParamString(s, p0, p1, p2, msg);
+			i := 0; ch := msg[0];
+			WHILE ch # 0X DO
+				IF ch = TextModels.line THEN subOut.WriteLn
+				ELSIF ch = TextModels.para THEN subOut.WritePara
+				ELSIF ch = TextModels.tab THEN subOut.WriteTab
+				ELSIF ch >= " " THEN subOut.WriteChar(ch)
+				END;
+				INC(i); ch := msg[i];
+			END;
+			subOut.WriteLn; SubFlush
+		(* ELSE
+			HostDialog.ShowParamMsg(s, p0, p1, p2) *)
+		END
+	END ParamMsg;
+
+
+	PROCEDURE AttachSubLog;
+		VAR h: LogHook;
+	BEGIN
+		subOut.ConnectTo(TextModels.dir.New());
+		buf := subOut.rider.Base();
+		textR := buf.NewReader(NIL);
+		NEW(h);
+		Log.SetHook(h);
+	END AttachSubLog;
+
+	PROCEDURE DetachSubLog;
+	BEGIN
+		Log.SetHook(NIL)
+	END DetachSubLog;
+
+BEGIN
+	AttachSubLog
+CLOSE
+	DetachSubLog;
+END ConsLog.

+ 2 - 1
BlackBox/Init-Interp.txt

@@ -9,7 +9,8 @@ MODULE Init;
 		HostDialog (* Dialog.SetShowHook *),
 		StdInterpreter, (* Dialog.SetCallHook *)
 		StdDialog (* Views.SetViewHook *),
-		(* StdLog, *)
+
+		StdLog, ConsLog, (* Log.Hook *)
 
 		Converters (* .odc *),
 		Dialog;

+ 1 - 0
BlackBox/build

@@ -74,6 +74,7 @@ LindevCompiler.Compile('', 'HostDialog.txt')
 LindevCompiler.Compile('Std/Mod', 'Log.txt')
 # LindevCompiler.Compile('', 'StdLog.txt')
 # LindevCompiler.Compile('Std/Mod', 'Out.txt')
+LindevCompiler.Compile('Cons/Mod', 'Log.txt')
 
 LindevCompiler.Compile('Dev/Mod', 'Markers.txt')
 LindevCompiler.Compile('Dev/Mod', 'Commanders.txt')

+ 0 - 3
TODO

@@ -3,9 +3,6 @@ By priority:
 		interface similar to DevCompiler
 		txt files Converter
 
-	ConsLog:
-		Log.hook instead of StdLog (load after StdLog)
-
 	localization:
 		Kernel.cmdLine:
 			decode (encoding = current locale encoding)