-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTextWriter.mod
More file actions
49 lines (40 loc) · 1.66 KB
/
TextWriter.mod
File metadata and controls
49 lines (40 loc) · 1.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
(* Writer - simple slightly formatted text output *)
MODULE TextWriter;
IMPORT Out;
VAR ChClass: INTEGER;
PROCEDURE Classify(ch: CHAR): INTEGER;
BEGIN
CASE ch OF
'a'..'z', 'A'..'Z', '0'..'9': RETURN 0 (* Space may be required required before and after*)
| ',', '.', ';', ':', '}', ']', ')': RETURN 1 (* No space needed before, space may be required after *)
| 0DX, 0AX: RETURN 3 (* End of line *)
ELSE RETURN 2 (* No space needed before or after *)
END
END Classify;
PROCEDURE Break(c1, c2: INTEGER); BEGIN
CASE c1 OF
0: IF c2 > 0 THEN RETURN END
| 1: IF c2 > 1 THEN RETURN END
ELSE RETURN
END;
Out.Char(' ')
END Break;
PROCEDURE Char*(c: CHAR); BEGIN Out.Char(c); ChClass := 2 END Char;
PROCEDURE NewLine*; BEGIN Out.Ln; ChClass := 3 END NewLine;
PROCEDURE Integer*(i: LONGINT); BEGIN Break(ChClass, 0); Out.Int(i,1); ChClass := 0 END Integer;
PROCEDURE Hex*(i,n: LONGINT); BEGIN Break(ChClass, 0); Out.Hex(i,n); ChClass := 0 END Hex;
PROCEDURE NoBreak*; BEGIN ChClass := 2 END NoBreak;
PROCEDURE Flush*; BEGIN Out.Flush END Flush;
PROCEDURE StartLine*; BEGIN IF ChClass < 3 THEN NewLine END; Flush END StartLine;
PROCEDURE StringLength*(s: ARRAY OF CHAR): LONGINT;
VAR result: LONGINT;
BEGIN result := 0; WHILE (result < LEN(s)) & (s[result] # 0X) DO INC(result) END;
RETURN result END StringLength;
PROCEDURE String*(VAR s: ARRAY OF CHAR);
VAR l: LONGINT;
BEGIN
l := StringLength(s);
IF l > 0 THEN Break(ChClass, Classify(s[0])); Out.String(s); ChClass := Classify(s[l-1]) END
END String;
BEGIN NoBreak;
END TextWriter.