Copyright 1995 by Digital Equipment Corp.
Last modified on Aug 2 15:31:28 PDT 1995 by gnelson
MODULE SaveState;
IMPORT Text, Wr, Rd, Fmt, Lex, Thread, FloatMode;
CONST Signature = "Saved Juno State";
The name of the current file (possibly Untitled.juno
) and the contents of the
current editor and source window.
PROCEDURE Save(READONLY st: T; wr: Wr.T) =
BEGIN
TRY
Wr.PutText(wr, Signature & "\n");
Wr.PutText(wr, Fmt.Int(Text.Length(st.file)) & "\n");
Wr.PutText(wr, Fmt.Int(Text.Length(st.editor)) & "\n");
Wr.PutText(wr, Fmt.Int(Text.Length(st.source)) & "\n");
Wr.PutText(wr, st.file);
Wr.PutChar(wr, '\n');
Wr.PutText(wr, st.editor);
Wr.PutChar(wr, '\n');
Wr.PutText(wr, st.source);
Wr.PutChar(wr, '\n')
EXCEPT
Wr.Failure, Thread.Alerted => (* SKIP *)
END
END Save;
PROCEDURE Restore(VAR st: T; rd: Rd.T): BOOLEAN =
VAR flen, elen, slen: INTEGER;
BEGIN
TRY
IF NOT Text.Equal(Rd.GetLine(rd), Signature) THEN
RETURN FALSE
END;
flen := Lex.Int(rd);
IF NOT '\n' = Rd.GetChar(rd) THEN RETURN FALSE END;
elen := Lex.Int(rd);
IF NOT '\n' = Rd.GetChar(rd) THEN RETURN FALSE END;
slen := Lex.Int(rd);
IF NOT '\n' = Rd.GetChar(rd) THEN RETURN FALSE END;
st.file := Rd.GetText(rd, flen);
IF Text.Length(st.file) # flen OR NOT '\n' = Rd.GetChar(rd) THEN
RETURN FALSE
END;
st.editor := Rd.GetText(rd, elen);
IF Text.Length(st.editor) # elen OR NOT '\n' = Rd.GetChar(rd) THEN
RETURN FALSE
END;
st.source := Rd.GetText(rd, slen);
IF Text.Length(st.source) # slen OR NOT '\n' = Rd.GetChar(rd) THEN
RETURN FALSE
END;
RETURN TRUE
EXCEPT
Rd.Failure, Lex.Error, FloatMode.Trap, Rd.EndOfFile, Thread.Alerted =>
RETURN FALSE
END
END Restore;
Read a saved state from rd
, store the result in st
, and return TRUE
.
Return FALSE
if rd
does not contain a properly saved state.
BEGIN END SaveState.