Syntax10.Scn.Fnt MODULE InOut; (* J. Templ, 18.6.91/27.10.91 *) IMPORT Texts, Oberon, Viewers, MenuViewers, TextFrames, Fonts, Display; Done*: BOOLEAN; W: Texts.Writer; T: Texts.Text; S: Texts.Scanner; B: Texts.Text; pos: LONGINT; PROCEDURE OpenInput*; VAR F: Display.Frame; beg, end, time: LONGINT; BEGIN pos := Oberon.Par.pos; B := Oberon.Par.text; Texts.OpenScanner(S, B, pos); Texts.Scan(S); (* one token look ahead *) IF S.class = Texts.Char THEN IF S.c = "^" THEN Oberon.GetSelection(B, beg, end, time); IF time >= 0 THEN Texts.OpenScanner(S, B, beg); pos := beg; Texts.Scan(S) ELSE B := Oberon.Par.text END ELSIF S.c = "*" THEN F := Oberon.MarkedViewer(); IF F IS MenuViewers.Viewer THEN F := F.dsc.next; WITH F: TextFrames.Frame DO B := F.text; Texts.OpenScanner(S, B, 0); pos := 0; Texts.Scan(S) ELSE END END END END END OpenInput; PROCEDURE OpenOutput*; VAR V: MenuViewers.Viewer; X, Y: INTEGER; BEGIN T := TextFrames.Text(""); Oberon.AllocateUserViewer(0, X, Y); V := MenuViewers.New( TextFrames.NewMenu("InOut.Text", "System.Close System.Copy System.Grow Edit.Search Edit.Store"), TextFrames.NewText(T, 0), TextFrames.menuH, X, Y) END OpenOutput; PROCEDURE Read*(VAR ch: CHAR); BEGIN Texts.OpenReader(S, B, pos); Texts.Read(S, ch); Done := ~S.eot; INC(pos); Texts.OpenScanner(S, B, pos); Texts.Scan(S) END Read; PROCEDURE ReadInt*(VAR i: LONGINT); BEGIN IF S.class = Texts.Int THEN Done := TRUE; i := S.i; pos := Texts.Pos(S)-1; Texts.Scan(S) ELSE Done := FALSE END END ReadInt; PROCEDURE ReadReal*(VAR x: LONGREAL); BEGIN IF S.class = Texts.Real THEN Done := TRUE; x := S.y; pos := Texts.Pos(S)-1; Texts.Scan(S) ELSE Done := FALSE END END ReadReal; PROCEDURE ReadString*(VAR s: ARRAY OF CHAR); BEGIN IF S.class = Texts.Name THEN Done := TRUE; COPY(S.s, s); pos := Texts.Pos(S)-1; Texts.Scan(S) ELSE Done := FALSE END END ReadString; PROCEDURE Write*(ch: CHAR); BEGIN Texts.Write(W, ch); Texts.Append(T, W.buf) END Write; PROCEDURE WriteInt*(i: LONGINT); BEGIN Texts.Write(W, " "); Texts.WriteInt(W, i, 1); Texts.Append(T, W.buf) END WriteInt; PROCEDURE WriteReal*( x: LONGREAL; n: INTEGER); BEGIN Texts.WriteLongReal(W, x, n); Texts.Append(T, W.buf) END WriteReal; PROCEDURE WriteString*(s: ARRAY OF CHAR); BEGIN Texts.WriteString(W, s); Texts.Append(T, W.buf) END WriteString; PROCEDURE WriteLn*; BEGIN Texts.WriteLn(W); Texts.Append(T, W.buf) END WriteLn; PROCEDURE SetFont*(name: ARRAY 32 OF CHAR); BEGIN Texts.SetFont(W, Fonts.This(name)) END SetFont; BEGIN Texts.OpenWriter(W); T := Oberon.Log END InOut.