xSyntax10.Scn.FntIStampElemsAlloc22 Sep 978FoldElemsNew(8Syntax10i.Scn.Fnt8888*88)88'8898HL@R*.8 Syntax10b.Scn.Fnt88 MODULE Put; (* HM  *) IMPORT SYSTEM, Ref, Out; CONST End = 0; Name = 1; String = 2; Eol = 3; VAR in: ARRAY 256 OF CHAR; pos, sym, level: INTEGER; ch: CHAR; val: ARRAY 128 OF CHAR; PROCEDURE ^Find (name: ARRAY OF CHAR; VAR r: Ref.Rider); PROCEDURE Get;  BEGIN ch := in[pos]; INC(pos) END Get;  PROCEDURE ReadName (*into val*);  VAR i: INTEGER; BEGIN i := 0; WHILE (CAP(ch) >= "A") & (CAP(ch) <= "Z") OR (ch >= "0") & (ch <= "9") DO val[i] := ch; INC(i); Get END; val[i] := 0X END ReadName;  PROCEDURE GetSym;  VAR i: INTEGER; BEGIN IF ch = "#" THEN Get; ReadName; sym := Name ELSIF ch = 0X THEN sym := End ELSIF ch = "$" THEN sym := Eol; Get ELSE sym := String; i := 0; WHILE (ch # 0X) & (ch # "#") DO val[i] := ch; INC(i); Get END; val[i] := 0X END END GetSym;  PROCEDURE ZoomRecord (VAR r: Ref.Rider);  BEGIN IF ch = "." THEN Get; ReadName; IF val # "" THEN r.Zoom(r); WHILE (r.mode # Ref.End) & (r.name # val) DO r.Next END; IF r.mode = Ref.End THEN r.form := Ref.None END ELSE r.form := Ref.None END ELSE r.form := Ref.None END END ZoomRecord;  PROCEDURE ZoomArray (VAR r: Ref.Rider);  VAR i: INTEGER; si: SHORTINT; li: LONGINT; r1: Ref.Rider; BEGIN IF ch = "[" THEN Get; r.Zoom(r); IF (CAP(ch) >= "A") & (CAP(ch) <= "Z") THEN ReadName; Find(val, r1); CASE r1.form OF Ref.Int: r1.ReadInt(i); li := i | Ref.SInt: r1.ReadSInt(si); li := si | Ref.LInt: r1.ReadLInt(li) ELSE r.form := Ref.None END; IF r.form # Ref.None THEN r.SetTo(li) END ELSIF (ch >= "0") & (ch <= "9") THEN li := 0; REPEAT li := 10 * li + ORD(ch) - ORD("0"); Get UNTIL (ch < "0") OR (ch > "9"); r.SetTo(li) ELSE r.form := Ref.None END; IF ch = "]" THEN Get ELSE r.form := Ref.None END END END ZoomArray;  PROCEDURE ZoomPtr (VAR r: Ref.Rider);  BEGIN IF ch = "^" THEN Get END; IF ch = "." THEN ZoomRecord(r) ELSIF ch = "[" THEN ZoomArray(r) ELSE r.form := Ref.None END END ZoomPtr;  PROCEDURE Find (name: ARRAY OF CHAR; VAR r: Ref.Rider);  VAR r1: Ref.Rider; i: INTEGER; sl: LONGINT; BEGIN INC(level); (*--- search in local variables*) Ref.OpenStack(NIL, r1); FOR i := 1 TO level DO r1.Next; r1.Next END; (*recursive calls of Find from ZoomArray add 2 frames to the stack*) r1.Zoom(r); WHILE (r.mode # Ref.End) & (r.name # name) DO r.Next END; (*--- search in variables at intermediate levels*) WHILE (r.mode = Ref.End) & (r1.staticLink # 0) DO sl := r1.staticLink; REPEAT r1.Next UNTIL r1.fp = sl; r1.Zoom(r); WHILE (r.mode # Ref.End) & (r.name # name) DO r.Next END; END; (*--- search in global variables*) IF r.mode = Ref.End THEN Ref.OpenVars(r.mod, r); WHILE (r.mode # Ref.End) & (r.name # name) DO r.Next END END; (*--- assume imported name*) IF (r.mode = Ref.End) & (ch = ".") THEN Ref.OpenVars(name, r); IF r.mod # "" THEN Get; ReadName; WHILE (r.mode # Ref.End) & (r.name # val) DO r.Next END ELSE r.mode := Ref.End END END; (*--- handle designators*) IF r.mode # Ref.End THEN LOOP IF r.form = Ref.Record THEN ZoomRecord(r) ELSIF (r.form IN {Ref.Array, Ref.DynArr}) & (ch = "[") THEN ZoomArray(r) ELSIF (r.form = Ref.Pointer) & ((ch = "^") OR (ch = ".") OR (ch = "[")) THEN ZoomPtr(r) ELSE EXIT END END END; DEC(level) END Find;  PROCEDURE S* (s: ARRAY OF CHAR);  VAR r, r1: Ref.Rider; i: INTEGER; si: SHORTINT; li: LONGINT; re: REAL; lr: LONGREAL; set: SET; b: BOOLEAN; char: CHAR; p: SYSTEM.PTR; str: ARRAY 128 OF CHAR; BEGIN COPY(s, in); level := 0; pos := 0; Get; GetSym; WHILE sym # End DO IF sym = Name THEN Find(val, r); IF r.mode # Ref.End THEN CASE r.form OF Ref.Int: r.ReadInt(i); Out.Int(i, 0) | Ref.SInt: r.ReadSInt(si); Out.Int(si, 0) | Ref.LInt: r.ReadLInt(li); Out.Int(li, 0) | Ref.Real: r.ReadReal(re); Out.Real(re, 10) | Ref.LReal: r.ReadLReal(lr); Out.LongReal(lr, 10) | Ref.Set: r.ReadSet(set); b := TRUE; Out.Char("{"); FOR i := 0 TO 31 DO IF i IN set THEN IF b THEN b := FALSE ELSE Out.Char(",") END; Out.Int(i, 0) END END; Out.Char("}") | Ref.Bool: r.ReadBool(b); IF b THEN Out.String("TRUE") ELSE Out.String("FALSE") END | Ref.Char: r.Read(char); Out.Char(char) | Ref.Array, Ref.DynArr: r.Zoom(r1); IF r1.form = Ref.Char THEN r.ReadString(str); Out.String(str) END | Ref.Pointer: r.ReadPtr(p); Out.Int(SYSTEM.VAL(LONGINT, p), 0) ELSE END END ELSIF sym = Eol THEN Out.Ln ELSE Out.String(val) END; GetSym END END S;  END Put.