Pristine Ack-5.5
[Ack-5.5.git] / lang / m2 / test / Thalmann / bold.mod
1 MODULE BoldFormatter;
2
3 (* From: MODULA-2, An Introduction, by Daniel Thalmann, Springer-Verlag,
4          New York, 1985
5    Figure 18.2
6 *)
7
8   FROM InOut IMPORT Done, EOL, Read, Write, OpenInput, OpenOutput, CloseInput, CloseOutput;
9
10   CONST
11     N = 40;
12     WordLength = 32;
13
14   TYPE
15     alpha = ARRAY [0..14] OF CHAR;
16
17   VAR
18     ch : CHAR;
19     i, j, k, l, m, r : CARDINAL;
20     id : ARRAY [0..WordLength] OF CHAR;
21     key : ARRAY [1..N] OF alpha;
22
23   PROCEDURE copy;
24   BEGIN
25     Write(ch); Read(ch);
26   END copy;
27
28   PROCEDURE InitTable;
29   BEGIN
30     key[ 1] := "AND            ";
31     key[ 2] := "ARRAY          ";
32     key[ 3] := "BEGIN          ";
33     key[ 4] := "BY             ";
34     key[ 5] := "CASE           ";
35     key[ 6] := "CONST          ";
36     key[ 7] := "DEFINITION     ";
37     key[ 8] := "DIV            ";
38     key[ 9] := "DO             ";
39     key[10] := "ELSE           ";
40     key[11] := "ELSIF          ";
41     key[12] := "END            ";
42     key[13] := "EXIT           ";
43     key[14] := "EXPORT         ";
44     key[15] := "FOR            ";
45     key[16] := "FROM           ";
46     key[17] := "IF             ";
47     key[18] := "IMPLEMENTATION ";
48     key[19] := "IMPORT         ";
49     key[20] := "IN             ";
50     key[21] := "LOOP           ";
51     key[22] := "MOD            ";
52     key[23] := "MODULE         ";
53     key[24] := "NOT            ";
54     key[25] := "OF             ";
55     key[26] := "OR             ";
56     key[27] := "POINTER        ";
57     key[28] := "PROCEDURE      ";
58     key[29] := "QUALIFIED      ";
59     key[30] := "RECORD         ";
60     key[31] := "REPEAT         ";
61     key[32] := "RETURN         ";
62     key[33] := "SET            ";
63     key[34] := "THEN           ";
64     key[35] := "TO             ";
65     key[36] := "TYPE           ";
66     key[37] := "UNTIL          ";
67     key[38] := "VAR            ";
68     key[39] := "WHILE          ";
69     key[40] := "WITH           ";
70   END InitTable;
71
72   PROCEDURE Identifier() : BOOLEAN;
73
74   BEGIN
75     l := 1; r := N; id[k] := " ";
76     REPEAT
77       m := (l + r) DIV 2;
78       i := 0;
79       WHILE (id[i]=key[m,i]) AND (id[i]#" ") DO i := i+1; END;
80
81       IF id[i] <= key[m,i] THEN r := m-1; END;
82       IF id[i] >= key[m,i] THEN l := m+1; END;
83     UNTIL l > r;
84     RETURN l = r+1;
85   END Identifier;
86
87 BEGIN
88     InitTable;
89     OpenInput("mod");
90     OpenOutput("text");
91     IF NOT Done THEN HALT; END;
92     Read(ch);
93     REPEAT
94       IF (CAP(ch) >= "A") AND (CAP(ch) <= "Z") THEN
95         k := 0;
96         REPEAT
97           id[k] := ch; k := k+1;
98           Read(ch);
99         UNTIL (ch<"0") OR (ch>"9") AND (CAP(ch)<"A") OR (CAP(ch)>"Z");
100         IF Identifier() THEN
101           FOR i:= 0 TO k-1 DO
102             Write(id[i]);
103           END;
104         ELSE
105           FOR i := 0 TO k-1 DO
106             Write(id[i]); Write(10C); Write(id[i]); Write(10C); Write(id[i]);
107           END;
108         END
109       ELSIF (ch >= "0") AND (ch <= "9") THEN
110         REPEAT copy;
111         UNTIL ((ch<"0") OR (ch>"9")) AND ((ch < "A") OR (ch > "Z"))
112       ELSIF ch="(" THEN
113         copy;
114         IF ch = "*" THEN
115           REPEAT
116             REPEAT
117               copy;
118             UNTIL ch = "*";
119             copy;
120           UNTIL ch = ")";
121         END
122       ELSIF ch = "'" THEN
123         REPEAT copy; UNTIL ch = "'";
124         copy;
125       ELSIF ch='"' THEN
126         REPEAT copy; UNTIL ch = '"';
127         copy
128       ELSE copy;
129       END;
130     UNTIL NOT Done;
131     CloseInput;
132     CloseOutput;
133 END BoldFormatter.