IMPLEMENTATION MODULE ANSI; IMPORT InOut, Strings, NumConv; CONST Escape = 33C; PROCEDURE CtrlSeq (seq : ARRAY OF CHAR); BEGIN InOut.Write (Escape); InOut.WriteString (seq); InOut.WriteBf END CtrlSeq; PROCEDURE Cls; BEGIN CtrlSeq ('[2J') END Cls; PROCEDURE Cursor (lin, col : CARDINAL); VAR str, tmp : ARRAY [0..9] OF CHAR; ok1, ok2 : BOOLEAN; BEGIN str := '['; NumConv.Num2Str (lin, 10, tmp, ok1); Strings.Append (str, tmp); Strings.Append (str, ';'); NumConv.Num2Str (col, 10, tmp, ok2); Strings.Append (str, tmp); Strings.Append (str, 'H'); IF ok1 AND ok2 THEN CtrlSeq (str) END END Cursor; PROCEDURE Attribute (attr : AttrMode); BEGIN CASE attr OF Bright : CtrlSeq ('[1m') | Underlined : CtrlSeq ('[4m') | Blinking : CtrlSeq ('[5m') | Reverse : CtrlSeq ('[7m') | Invisible : CtrlSeq ('[8m') ELSE CtrlSeq ('[0m') END END Attribute; PROCEDURE Foreground (colour : Colours); BEGIN CASE colour OF Black : CtrlSeq ('[30m') | Red : CtrlSeq ('[31m') | Green : CtrlSeq ('[32m') | Yellow : CtrlSeq ('[33m') | Blue : CtrlSeq ('[34m') | Magenta : CtrlSeq ('[35m') | Cyan : CtrlSeq ('[36m') ELSE CtrlSeq ('[37m') END END Foreground; PROCEDURE Background (colour : Colours); BEGIN CASE colour OF Black : CtrlSeq ('[40m') | Red : CtrlSeq ('[41m') | Green : CtrlSeq ('[42m') | Yellow : CtrlSeq ('[43m') | Blue : CtrlSeq ('[44m') | Magenta : CtrlSeq ('[45m') | Cyan : CtrlSeq ('[46m') ELSE CtrlSeq ('[47m') END END Background; PROCEDURE Colour (fg, bg : Colours; attr : AttrMode); BEGIN Foreground (fg); Background (bg); Attribute (attr) END Colour; PROCEDURE Fill (lin, col, len : CARDINAL); VAR n : CARDINAL; BEGIN Cursor (lin, col); FOR n := 1 TO len DO InOut.Write (' ') END END Fill; END ANSI.