Subversion Repositories Kolibri OS

Rev

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)