--------------------------------------------------------------------
MODULE--------------------------------------------------------------------TextReadingUtils EXPORTSTextReadingUtils ; IMPORT Rd, RdExtras, ASCII, TextSeq, TextRd; FROM Thread IMPORT Alerted;
CONST SingleQuote = '\''; CONST DoubleQuote = '\"'; CONST delimiters = ASCII.Set{SingleQuote, DoubleQuote}; CONST StringChars = ASCII.All - delimiters;--------------------------------------------------------------------
PROCEDURE--------------------------------------------------------------------GetString (rd : Rd.T) : TEXT RAISES {Rd.Failure, Rd.EndOfFile, Alerted} = VAR t : TEXT := ""; c : CHAR; BEGIN c := RdExtras.Skip(rd, StringChars, FALSE); t := RdExtras.GetText(rd, ASCII.Set{}, ASCII.Set{c}, FALSE); RETURN t; END GetString;
PROCEDURE--------------------------------------------------------------------GetToken (rd : Rd.T; skip := ASCII.Spaces; terminate := ASCII.Spaces; unget := FALSE) : TEXT RAISES {Rd.Failure, Rd.EndOfFile, Alerted} = BEGIN RETURN RdExtras.GetText(rd, skip, terminate, unget); END GetToken;
PROCEDURE--------------------------------------------------------------------GetTokenOrString (rd : Rd.T; skip := ASCII.Spaces; terminate := ASCII.Spaces) : TEXT RAISES {Rd.Failure, Rd.EndOfFile, Alerted} = VAR c : CHAR; BEGIN c := RdExtras.Skip(rd, skip, TRUE); IF c = SingleQuote OR c = DoubleQuote THEN RETURN GetString(rd); ELSE RETURN RdExtras.GetText(rd, ASCII.Set{}, terminate); END; END GetTokenOrString;
PROCEDURE--------------------------------------------------------------------GetStringOrLine (rd : Rd.T) : TEXT RAISES {Rd.Failure, Rd.EndOfFile, Alerted} = VAR c : CHAR; BEGIN c := RdExtras.Skip(rd, ASCII.Spaces, TRUE); IF c = SingleQuote OR c = DoubleQuote THEN RETURN GetString(rd); ELSE RETURN Rd.GetLine(rd); END; END GetStringOrLine;
PROCEDURETokenize (t : TEXT; sep := ASCII.Spaces) : TextSeq.T = VAR rd := TextRd.New(t); res := NEW(TextSeq.T).init(); BEGIN TRY WHILE NOT Rd.EOF(rd) DO WITH token = GetTokenOrString(rd, sep, sep) DO res.addhi(token); END; END; EXCEPT ELSE END; RETURN res; END Tokenize; BEGIN (* empty module body *) END TextReadingUtils.