IMPLEMENTATION MODULE Console ; FROM SYSTEM IMPORT ADR ; FROM StdChans IMPORT StdOutChan ; FROM IOChan IMPORT ChanId, TextWrite ; FROM RealStr IMPORT RealToStr ; FROM Strings IMPORT Length ; VAR outChan : ChanId ; inited : BOOLEAN ; PROCEDURE Out () : ChanId ; BEGIN IF NOT inited THEN outChan := StdOutChan () ; inited := TRUE ; END ; RETURN outChan ; END Out ; PROCEDURE WriteChar (c: CHAR) ; BEGIN TextWrite (Out (), ADR (c), 1) ; END WriteChar ; PROCEDURE WriteString (s: ARRAY OF CHAR) ; BEGIN TextWrite (Out (), ADR (s), HIGH (s) + 1) ; END WriteString ; PROCEDURE WriteN (p: ADDRESS; n: CARDINAL) ; BEGIN TextWrite (Out (), p, n) ; END WriteN ; PROCEDURE WriteLn ; VAR nl: CHAR ; BEGIN nl := 12C ; (* LF *) TextWrite (Out (), ADR (nl), 1) ; END WriteLn ; PROCEDURE WriteLongCard (u: LONGCARD) ; VAR tmp : ARRAY [0..31] OF CHAR ; n, i: CARDINAL ; BEGIN n := 0 ; REPEAT tmp [n] := CHR (ORD ('0') + VAL (CARDINAL, u MOD 10)) ; u := u DIV 10 ; INC (n) ; UNTIL u = 0 ; i := n ; WHILE i > 0 DO DEC (i) ; WriteChar (tmp [i]) ; END ; END WriteLongCard ; PROCEDURE WriteLongInt (l: LONGINT) ; VAR u: LONGCARD ; BEGIN IF l < 0 THEN WriteChar ('-') ; u := VAL (LONGCARD, l) ; u := 0 - u ; WriteLongCard (u) ; ELSE WriteLongCard (VAL (LONGCARD, l)) ; END ; END WriteLongInt ; PROCEDURE WriteInt (i: INTEGER) ; BEGIN WriteLongInt (VAL (LONGINT, i)) ; END WriteInt ; PROCEDURE WriteBool (b: BOOLEAN) ; BEGIN IF b THEN WriteString ("TRUE") ; ELSE WriteString ("FALSE") ; END ; END WriteBool ; PROCEDURE WriteReal (r: REAL) ; VAR buf : ARRAY [0..63] OF CHAR ; n: CARDINAL ; BEGIN RealToStr (r, buf) ; n := Length (buf) ; TextWrite (Out (), ADR (buf), n) ; END WriteReal ; PROCEDURE Fatal (msg: ARRAY OF CHAR) ; BEGIN WriteString (msg) ; WriteLn ; HALT (1) ; END Fatal ; END Console.