---------------------------------------------------------------------------
MODULE---------------------------------------------------------------------------; IMPORT Lex, TextTextTbl, Text, TextConv, TextRd, TextWr, Rd, Wr, Thread; EnvUtils
PROCEDURE---------------------------------------------------------------------------ToText (env : T; sepChar := '\t') : TEXT RAISES {Error} = VAR iter := env.iterate(); name , val : TEXT; twr := TextWr.New(); sep := Text.FromChar(sepChar); BEGIN TRY Wr.PutText(twr, "(@env-start" & sep); WHILE iter.next(name, val) DO Wr.PutText(twr, name & sep & TextConv.Encode(val, TRUE) & sep); END; Wr.PutText(twr, "env-end@)" & sep); EXCEPT Thread.Alerted => RAISE Error("interrupted converting environment"); | Wr.Failure => RAISE Error("writer failure converting environment"); END; RETURN TextWr.ToText(twr); END ToText;
PROCEDURE---------------------------------------------------------------------------FromRd (rd : Rd.T; sepChars := Separators; skipStart := FALSE) : T RAISES {Error} = VAR sep := sepChars; nsep := SET OF CHAR{'\000' .. '\377'} - sep; res := NEW(TextTextTbl.Default).init(); name : TEXT; val : TEXT; done := FALSE; BEGIN TRY IF NOT skipStart THEN Lex.Skip(rd, sep); name := Lex.Scan(rd, nsep); IF NOT Text.Equal(name, "(@env-start") THEN RAISE Error("expected " & "(@env-start" & ", found " & name); END; END; WHILE NOT done AND NOT Rd.EOF(rd) DO Lex.Skip(rd, sep); name := Lex.Scan(rd, nsep); IF Text.Equal(name, "env-end@)") THEN done := TRUE; ELSE Lex.Skip(rd, sep); val := Lex.Scan(rd, nsep); val := TextConv.Decode(val, TRUE); EVAL res.put(name, val); END; END; EXCEPT Rd.Failure => RAISE Error("read error on text resource"); | Thread.Alerted => RAISE Error("interrupted reading text resource"); | TextConv.Fail => RAISE Error("conversion error in text resource"); END; IF NOT done THEN RAISE Error("premature end of environment denotation"); END; RETURN res; END FromRd;
PROCEDUREFromText (t : TEXT; sepChars := Separators) : T RAISES {Error} = VAR trd := TextRd.New(t); BEGIN RETURN FromRd(trd, sepChars); END FromText; BEGIN END EnvUtils.