IMPLEMENTATION MODULE STextIO; (* Bound to the runtime shim; the read result is recorded in SIOResult. *) IMPORT IOConsts, SIOResult; FROM IOConsts IMPORT allRight, endOfInput, endOfLine; PROCEDURE m2write (VAR s : ARRAY OF CHAR); EXTERNAL; PROCEDURE m2writeln; EXTERNAL; PROCEDURE m2writechar (c : CHAR); EXTERNAL; PROCEDURE m2readchar () : CHAR; EXTERNAL; PROCEDURE m2readline (VAR s : ARRAY OF CHAR; max : CARDINAL) : CARDINAL; EXTERNAL; PROCEDURE WriteChar (ch : CHAR); BEGIN m2writechar(ch) END WriteChar; PROCEDURE WriteLn; BEGIN m2writeln END WriteLn; PROCEDURE WriteString (s : ARRAY OF CHAR); BEGIN m2write(s) END WriteString; PROCEDURE ReadChar (VAR ch : CHAR); BEGIN ch := m2readchar(); IF ch = CHR(0) THEN SIOResult.SetReadResult(endOfInput) ELSE SIOResult.SetReadResult(allRight) END END ReadChar; PROCEDURE ReadString (VAR s : ARRAY OF CHAR); VAR n : CARDINAL; BEGIN n := m2readline(s, HIGH(s) + 1); SIOResult.SetReadResult(allRight) END ReadString; PROCEDURE ReadRestLine (VAR s : ARRAY OF CHAR); BEGIN ReadString(s) END ReadRestLine; PROCEDURE ReadToken (VAR s : ARRAY OF CHAR); VAR c : CHAR; i : CARDINAL; done : BOOLEAN; BEGIN i := 0; (* skip leading spaces/tabs *) REPEAT c := m2readchar() UNTIL (c # " ") AND (c # CHR(9)); done := FALSE; WHILE NOT done DO IF (c = CHR(0)) OR (c = CHR(10)) OR (c = " ") OR (c = CHR(9)) THEN done := TRUE ELSE IF i <= HIGH(s) THEN s[i] := c; INC(i) END; c := m2readchar() END END; IF i <= HIGH(s) THEN s[i] := CHR(0) END; SIOResult.SetReadResult(allRight) END ReadToken; PROCEDURE SkipLine; VAR c : CHAR; BEGIN REPEAT c := m2readchar() UNTIL (c = CHR(0)) OR (c = CHR(10)); SIOResult.SetReadResult(allRight) END SkipLine; END STextIO.