DEADSOFTWARE

Port, TODO
[bbcp.git] / Trurl-based / Cons / Mod / Interp.txt
1 MODULE ConsInterp;
3 (*
4 A. V. Shiryaev, 2012.09
5 *)
7 IMPORT
8 Console,
9 Strings, Dialog,
10 DevCommanders, TextModels,
11 StdLog;
13 VAR
14 textR: TextModels.Reader;
16 PROCEDURE ShowStdLog;
17 VAR c: CHAR;
18 BEGIN
19 StdLog.text.Append(StdLog.buf);
21 textR.SetPos(0);
22 textR.ReadChar(c);
23 WHILE ~textR.eot DO
24 IF c = 0DX THEN
25 Console.WriteLn
26 ELSE
27 Console.WriteChar(c)
28 END;
29 textR.ReadChar(c)
30 END;
31 StdLog.text.Delete(0, StdLog.text.Length())
32 END ShowStdLog;
34 PROCEDURE Call1 (IN s: ARRAY OF CHAR; i: INTEGER): BOOLEAN;
35 VAR j: INTEGER;
36 res: INTEGER;
37 par: DevCommanders.Par;
38 m: TextModels.Model; w: TextModels.Writer;
39 BEGIN
40 (* ASSERT 0X in s[ i:LEN(s) ) *)
41 j := i;
42 WHILE s[j] # 0X DO INC(j) END;
43 IF j > i THEN
44 m := TextModels.dir.New();
45 w := m.NewWriter(NIL);
46 WHILE i < j DO
47 w.WriteChar(s[i]);
48 INC(i)
49 END;
50 NEW(par); par.text := m; par.beg := 0; par.end := m.Length() - 1;
51 DevCommanders.par := par
52 END;
53 Dialog.Call(s, " ", res);
54 DevCommanders.par := NIL;
55 ShowStdLog;
56 RETURN res = 0
57 END Call1;
59 PROCEDURE Call0 (VAR s: ARRAY OF CHAR): BOOLEAN;
60 VAR i: INTEGER;
61 res: BOOLEAN;
62 inStr: BOOLEAN;
63 BEGIN
64 (* ASSERT s is 0X terminated and not empty *)
65 i := 0;
66 WHILE (s[i] # 0X) & (s[i] # ' ') & (s[i] # '(') DO
67 INC(i)
68 END;
69 IF s[i] = 0X THEN
70 res := Call1(s, i)
71 ELSIF s[i] = ' ' THEN
72 s[i] := 0X;
73 res := Call1(s, i + 1)
74 ELSE (* s[i] = '(' *)
75 INC(i);
76 inStr := FALSE;
77 WHILE (s[i] # 0X) & ~(~inStr & (s[i] = ')')) DO
78 IF s[i] = "'" THEN inStr := ~inStr END;
79 INC(i)
80 END;
81 IF s[i] # 0X THEN
82 INC(i);
83 IF s[i] = 0X THEN
84 res := Call1(s, i)
85 ELSE
86 s[i] := 0X;
87 res := Call1(s, i + 1)
88 END
89 ELSE
90 res := FALSE
91 END
92 END;
93 RETURN res
94 END Call0;
96 PROCEDURE Call (VAR s: ARRAY OF CHAR): BOOLEAN;
97 VAR i: INTEGER;
98 res: BOOLEAN;
99 BEGIN
100 i := 0;
101 WHILE (i < LEN(s)) & (s[i] # 0AX) & (s[i] # 0DX) & (s[i] # 0X) DO
102 INC(i)
103 END;
104 IF (i < LEN(s)) & (s[i] # 0X) THEN
105 IF (i > 0) & (s[0] # '#') THEN
106 s[i] := 0X;
107 res := Call0(s)
108 ELSE (* skip empty strings and comments *)
109 res := TRUE
110 END
111 ELSE (* end of input *)
112 res := FALSE
113 END;
114 RETURN res
115 END Call;
117 PROCEDURE Run*;
118 VAR s: ARRAY 1024 OF CHAR;
119 BEGIN
120 Console.ReadLn(s);
121 WHILE Call(s) DO
122 Console.ReadLn(s)
123 END
124 END Run;
126 BEGIN
127 textR := StdLog.text.NewReader(NIL)
128 END ConsInterp.