MODULE; IMPORT Rd, Thread, ASCII, Text; PROCEDURE RdExtras Skip ( s: Rd.T; READONLY skip := ASCII.Spaces; unget := TRUE) : CHAR RAISES {Rd.Failure, Rd.EndOfFile, Thread.Alerted}= VAR ch: CHAR; BEGIN REPEAT ch := Rd.GetChar(s); UNTIL NOT(ch IN skip); IF unget THEN Rd.UnGetChar(s) END; RETURN ch; END Skip; PROCEDUREGetUntil ( s: Rd.T; VAR chars: ARRAY OF CHAR; READONLY terminate := ASCII.Spaces; unget := TRUE) : CARDINAL RAISES {Rd.Failure, Thread.Alerted}= VAR ch: CHAR; i := 0; BEGIN LOOP TRY ch := Rd.GetChar(s); IF ch IN terminate THEN IF unget THEN Rd.UnGetChar(s) END; EXIT END; IF i = NUMBER(chars) THEN INC(i); EXIT ELSE chars[i] := ch; INC(i); END; EXCEPT Rd.EndOfFile => EXIT; END; END; RETURN i; END GetUntil; PROCEDUREGetChars ( s: Rd.T; VAR chars: ARRAY OF CHAR; READONLY skip := ASCII.Spaces; READONLY terminate := ASCII.Spaces; unget := TRUE) : CARDINAL RAISES {Rd.Failure, Rd.EndOfFile, Thread.Alerted}= BEGIN EVAL Skip(s, skip); RETURN GetUntil(s, chars, terminate, unget); END GetChars; PROCEDUREGetText ( s: Rd.T; READONLY skip := ASCII.Set{}; READONLY terminate := ASCII.Spaces; unget := TRUE) : TEXT RAISES {Rd.Failure, Rd.EndOfFile, Thread.Alerted}= VAR chars: ARRAY [0..255] OF CHAR; result: TEXT := ""; len: CARDINAL; BEGIN EVAL Skip(s, skip); REPEAT len := GetUntil(s, chars, terminate, unget); result := result & Text.FromChars(SUBARRAY(chars, 0, MIN(len, NUMBER(chars)))); UNTIL len <= NUMBER(chars); RETURN result; END GetText; BEGIN END RdExtras.