123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- 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.
|