Rev 7597 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 7597 | Rev 7693 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | (* |
1 | (* |
2 | BSD 2-Clause License |
2 | BSD 2-Clause License |
Line 3... | Line 3... | ||
3 | 3 | ||
4 | Copyright (c) 2018, Anton Krotov |
4 | Copyright (c) 2018, 2019, Anton Krotov |
5 | All rights reserved. |
5 | All rights reserved. |
Line 6... | Line 6... | ||
6 | *) |
6 | *) |
Line 28... | Line 28... | ||
28 | CR: BOOLEAN; |
28 | CR: BOOLEAN; |
Line 29... | Line 29... | ||
29 | 29 | ||
30 | line*, col*: INTEGER; |
30 | line*, col*: INTEGER; |
31 | eof*: BOOLEAN; |
31 | eof*: BOOLEAN; |
32 | eol*: BOOLEAN; |
- | |
33 | - | ||
34 | open*: PROCEDURE (text: TEXT; name: ARRAY OF CHAR): BOOLEAN; |
32 | eol*: BOOLEAN; |
35 | peak*: PROCEDURE (text: TEXT): CHAR; |
- | |
Line 36... | Line 33... | ||
36 | nextc*: PROCEDURE (text: TEXT) |
33 | peak*: CHAR |
Line 37... | Line 34... | ||
37 | 34 | ||
Line 38... | Line 35... | ||
38 | END; |
35 | END; |
Line 39... | Line -... | ||
39 | - | ||
40 | - | ||
41 | VAR |
- | |
42 | - | ||
43 | texts: C.COLLECTION; |
- | |
44 | - | ||
45 | - | ||
46 | PROCEDURE reset (text: TEXT); |
- | |
47 | BEGIN |
- | |
48 | text.chunk[0] := 0; |
- | |
49 | text.pos := 0; |
- | |
50 | text.size := 0; |
- | |
51 | text.file := NIL; |
- | |
52 | text.utf8 := FALSE; |
- | |
53 | text.CR := FALSE; |
- | |
54 | text.line := 1; |
- | |
55 | text.col := 1; |
- | |
56 | text.eof := FALSE; |
- | |
57 | text.eol := FALSE |
- | |
58 | END reset; |
- | |
59 | 36 | ||
60 | 37 | ||
61 | PROCEDURE peak (text: TEXT): CHAR; |
38 | VAR |
62 | RETURN CHR(text.chunk[text.pos]) |
39 | |
63 | END peak; |
40 | texts: C.COLLECTION; |
64 | 41 | ||
65 | 42 | ||
66 | PROCEDURE load (text: TEXT); |
43 | PROCEDURE load (text: TEXT); |
67 | BEGIN |
44 | BEGIN |
- | 45 | IF ~text.eof THEN |
|
68 | IF ~text.eof THEN |
46 | text.size := FILES.read(text.file, text.chunk, LEN(text.chunk)); |
69 | text.size := FILES.read(text.file, text.chunk, LEN(text.chunk)); |
47 | text.pos := 0; |
Line 70... | Line 48... | ||
70 | text.pos := 0; |
48 | IF text.size = 0 THEN |
71 | IF text.size = 0 THEN |
49 | text.eof := TRUE; |
72 | text.eof := TRUE; |
50 | text.chunk[0] := 0 |
- | 51 | END; |
|
73 | text.chunk[0] := 0 |
52 | text.peak := CHR(text.chunk[0]) |
74 | END |
53 | END |
75 | END |
54 | END load; |
- | 55 | ||
76 | END load; |
56 | |
77 | 57 | PROCEDURE next* (text: TEXT); |
|
78 | 58 | VAR |
|
Line 79... | Line 59... | ||
79 | PROCEDURE next (text: TEXT); |
59 | c: CHAR; |
Line 80... | Line 60... | ||
80 | VAR |
60 | |
Line 81... | Line 61... | ||
81 | c: CHAR; |
61 | BEGIN |
82 | BEGIN |
62 | IF text.pos < text.size - 1 THEN |
83 | IF text.pos < text.size - 1 THEN |
63 | INC(text.pos); |
84 | INC(text.pos) |
64 | text.peak := CHR(text.chunk[text.pos]) |
Line 121... | Line 101... | ||
121 | END next; |
101 | END next; |
Line 122... | Line 102... | ||
122 | 102 | ||
123 | 103 | ||
124 | PROCEDURE init (text: TEXT); |
- | |
125 | BEGIN |
104 | PROCEDURE init (text: TEXT); |
126 | 105 | BEGIN |
|
127 | IF (text.pos = 0) & (text.size >= 3) THEN |
106 | IF (text.pos = 0) & (text.size >= 3) THEN |
128 | IF (text.chunk[0] = 0EFH) & |
107 | IF (text.chunk[0] = 0EFH) & |
129 | (text.chunk[1] = 0BBH) & |
108 | (text.chunk[1] = 0BBH) & |
Line 138... | Line 117... | ||
138 | text.size := 1; |
117 | text.size := 1; |
139 | text.eof := FALSE |
118 | text.eof := FALSE |
140 | END; |
119 | END; |
Line 141... | Line 120... | ||
141 | 120 | ||
142 | text.line := 1; |
121 | text.line := 1; |
Line -... | Line 122... | ||
- | 122 | text.col := 1; |
|
143 | text.col := 1 |
123 | |
Line 144... | Line 124... | ||
144 | 124 | text.peak := CHR(text.chunk[text.pos]) |
|
145 | END init; |
125 | END init; |
146 | 126 | ||
147 | - | ||
148 | PROCEDURE open (text: TEXT; name: ARRAY OF CHAR): BOOLEAN; |
- | |
149 | BEGIN |
- | |
150 | ASSERT(text # NIL); |
127 | |
151 | 128 | PROCEDURE close* (VAR text: TEXT); |
|
152 | reset(text); |
- | |
153 | text.file := FILES.open(name); |
129 | BEGIN |
Line -... | Line 130... | ||
- | 130 | IF text # NIL THEN |
|
154 | IF text.file # NIL THEN |
131 | IF text.file # NIL THEN |
- | 132 | FILES.close(text.file) |
|
155 | load(text); |
133 | END; |
Line 156... | Line 134... | ||
156 | init(text) |
134 | |
157 | END |
135 | C.push(texts, text); |
158 | 136 | text := NIL |
|
159 | RETURN text.file # NIL |
137 | END |
Line 160... | Line 138... | ||
160 | END open; |
138 | END close; |
161 | 139 | ||
162 | 140 | ||
163 | PROCEDURE NewText (): TEXT; |
141 | PROCEDURE open* (name: ARRAY OF CHAR): TEXT; |
164 | VAR |
142 | VAR |
165 | text: TEXT; |
143 | text: TEXT; |
166 | citem: C.ITEM; |
144 | citem: C.ITEM; |
167 | - | ||
168 | BEGIN |
- | |
169 | citem := C.pop(texts); |
- | |
170 | IF citem = NIL THEN |
- | |
171 | NEW(text) |
- | |
172 | ELSE |
- | |
173 | text := citem(TEXT) |
- | |
174 | END |
- | |
175 | - | ||
176 | RETURN text |
- | |
177 | END NewText; |
- | |
178 | - | ||
179 | - | ||
180 | PROCEDURE create* (): TEXT; |
- | |
181 | VAR |
- | |
182 | text: TEXT; |
- | |
183 | BEGIN |
- | |
184 | text := NewText(); |
- | |
Line 185... | Line -... | ||
185 | reset(text); |
- | |
186 | text.open := open; |
- | |
187 | text.peak := peak; |
145 | |
- | 146 | BEGIN |
|
- | 147 | citem := C.pop(texts); |
|
- | 148 | IF citem = NIL THEN |
|
- | 149 | NEW(text) |
|
- | 150 | ELSE |
|
- | 151 | text := citem(TEXT) |
|
- | 152 | END; |
|
- | 153 | ||
- | 154 | IF text # NIL THEN |
|
- | 155 | text.chunk[0] := 0; |
|
- | 156 | text.pos := 0; |
|
188 | text.nextc := next |
157 | text.size := 0; |
189 | 158 | text.utf8 := FALSE; |
|
190 | RETURN text |
159 | text.CR := FALSE; |
191 | END create; |
- | |
192 | 160 | text.line := 1; |
|
193 | 161 | text.col := 1; |
|
194 | PROCEDURE destroy* (VAR text: TEXT); |
162 | text.eof := FALSE; |
- | 163 | text.eol := FALSE; |
|
- | 164 | text.peak := 0X; |
|
- | 165 | text.file := FILES.open(name); |
|
195 | BEGIN |
166 | IF text.file # NIL THEN |
Line 196... | Line 167... | ||
196 | IF text # NIL THEN |
167 | load(text); |
197 | IF text.file # NIL THEN |
168 | init(text) |
198 | FILES.close(text.file) |
169 | ELSE |
199 | END; |
170 | close(text) |