Subversion Repositories Kolibri OS

Rev

Rev 9050 | Rev 9336 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
8728 leency 1
(*
2
    Copyright 2021 Anton Krotov
3
 
4
    This file is part of CEdit.
5
 
6
    CEdit is free software: you can redistribute it and/or modify
7
    it under the terms of the GNU General Public License as published by
8
    the Free Software Foundation, either version 3 of the License, or
9
    (at your option) any later version.
10
 
11
    CEdit is distributed in the hope that it will be useful,
12
    but WITHOUT ANY WARRANTY; without even the implied warranty of
13
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
    GNU General Public License for more details.
15
 
16
    You should have received a copy of the GNU General Public License
17
    along with CEdit. If not, see .
18
*)
19
 
20
MODULE ChangeLog;
21
 
22
IMPORT List, Lines, (*API,*) SYSTEM;
23
 
24
TYPE
25
    tIntItem = POINTER TO RECORD (List.tItem)
26
        adr, val: INTEGER
27
    END;
28
 
29
    tBoolItem = POINTER TO RECORD (List.tItem)
9073 leency 30
        adr: INTEGER; val: BOOLEAN; save: BOOLEAN
8728 leency 31
    END;
32
(*
33
    tUntypedPtr = POINTER TO RECORD (List.tItem)
34
        p: INTEGER
35
    END;
36
 
37
    tTypedPtr = POINTER TO RECORD (List.tItem)
38
        p: List.tItem
39
    END;
40
*)
41
    tGuard* = POINTER TO RECORD (List.tItem)
9073 leency 42
        saved*: BOOLEAN
8728 leency 43
    END;
44
 
9050 leency 45
    tLog* = POINTER TO RECORD
46
        Log*: List.tList;
47
        guard: tGuard;
48
        isLast: BOOLEAN
49
    END;
8728 leency 50
 
9050 leency 51
 
8728 leency 52
VAR
9050 leency 53
    CL*: tLog;
8728 leency 54
 
55
 
56
PROCEDURE isLastGuard* (guard: tGuard): BOOLEAN;
57
VAR
58
    item: List.tItem;
59
    res: BOOLEAN;
60
BEGIN
61
    IF guard # NIL THEN
9050 leency 62
        item := CL.Log.last;
8728 leency 63
        WHILE ~(item IS tGuard) DO
64
            item := item.prev
65
        END;
66
        res := guard = item
67
    ELSE
68
        res := TRUE
69
    END
70
    RETURN res
71
END isLastGuard;
72
 
73
 
74
PROCEDURE isFirstGuard* (guard: tGuard): BOOLEAN;
75
VAR
76
    item: List.tItem;
77
BEGIN
78
    ASSERT(guard # NIL);
9050 leency 79
    item := CL.Log.first;
8728 leency 80
    WHILE ~(item IS tGuard) DO
81
        item := item.next
82
    END
83
    RETURN guard = item
84
END isFirstGuard;
85
 
86
 
87
PROCEDURE setGuard* (_guard: tGuard);
88
BEGIN
9050 leency 89
    CL.guard := _guard;
90
    CL.isLast := isLastGuard(_guard)
8728 leency 91
END setGuard;
92
 
93
 
94
PROCEDURE redo* (item: List.tItem);
95
BEGIN
96
    IF item IS tIntItem THEN
97
        SYSTEM.PUT(item(tIntItem).adr, item(tIntItem).val)
98
    ELSIF item IS tBoolItem THEN
99
        SYSTEM.PUT(item(tBoolItem).adr, item(tBoolItem).val)
100
    END
101
END redo;
102
 
103
 
104
PROCEDURE clear (guard: tGuard);
105
VAR
106
    item: List.tItem;
107
    (*res: INTEGER;*)
108
BEGIN
9050 leency 109
    CL.isLast := TRUE;
8728 leency 110
    REPEAT
9050 leency 111
        item := List.pop(CL.Log);
8728 leency 112
        IF item # guard THEN
113
        (*
114
            IF item IS tUntypedPtr THEN
115
                res := API._DISPOSE(item(tUntypedPtr).p)
116
            ELSIF item IS tTypedPtr THEN
117
                DISPOSE(item(tTypedPtr).p)
118
            END;*)
119
            DISPOSE(item)
120
        END
121
    UNTIL item = guard;
9050 leency 122
    List.append(CL.Log, item)
8728 leency 123
END clear;
124
 
125
 
9073 leency 126
PROCEDURE save* (guard: tGuard);
127
VAR
128
    item: List.tItem;
129
BEGIN
130
    item := CL.Log.first;
131
    WHILE item # NIL DO
132
        IF item IS tGuard THEN
133
            item(tGuard).saved := FALSE
134
        END;
135
        item := item.next
136
    END;
137
    guard.saved := TRUE
138
END save;
139
 
140
 
8728 leency 141
PROCEDURE changeWord (adrV, adrX: INTEGER);
142
VAR
143
    item: tIntItem;
144
BEGIN
145
    NEW(item);
146
    item.adr := adrV;
147
    SYSTEM.GET(adrX, item.val);
9050 leency 148
    IF ~CL.isLast THEN
149
        clear(CL.guard)
8728 leency 150
    END;
9050 leency 151
    List.append(CL.Log, item)
8728 leency 152
END changeWord;
153
 
154
 
155
PROCEDURE changeBool (VAR v: BOOLEAN; x: BOOLEAN);
156
VAR
157
    item: tBoolItem;
158
BEGIN
159
    NEW(item);
160
    item.adr := SYSTEM.ADR(v);
161
    item.val := x;
9073 leency 162
    item.save := FALSE;
9050 leency 163
    IF ~CL.isLast THEN
164
        clear(CL.guard)
8728 leency 165
    END;
9050 leency 166
    List.append(CL.Log, item)
8728 leency 167
END changeBool;
168
 
169
 
9073 leency 170
PROCEDURE delSaved*;
171
VAR
172
    boolItem: tBoolItem;
173
    cur: List.tItem;
174
    del: BOOLEAN;
175
BEGIN
176
    cur := CL.guard.next;
177
    WHILE cur # NIL DO
178
        IF cur IS tBoolItem THEN
179
            boolItem := cur(tBoolItem);
180
            del := boolItem.save
181
        ELSE
182
            del := FALSE
183
        END;
184
        cur := cur.next;
185
        IF del THEN
186
            List.delete(CL.Log, boolItem);
187
            DISPOSE(boolItem)
188
        END
189
    END
190
END delSaved;
191
 
192
 
193
PROCEDURE delCurSaved*;
194
VAR
195
    boolItem: tBoolItem;
196
    cur: List.tItem;
197
    del: BOOLEAN;
198
BEGIN
199
    cur := CL.guard.prev;
200
    WHILE (cur # NIL) & ~(cur IS tGuard) DO
201
        IF cur IS tBoolItem THEN
202
            boolItem := cur(tBoolItem);
203
            del := boolItem.save
204
        ELSE
205
            del := FALSE
206
        END;
207
        cur := cur.prev;
208
        IF del THEN
209
            SYSTEM.PUT(boolItem.adr, ~boolItem.val);
210
            List.delete(CL.Log, boolItem);
211
            DISPOSE(boolItem)
212
        END
213
    END
214
END delCurSaved;
215
 
216
 
217
PROCEDURE changeBool2 (VAR v: BOOLEAN; x: BOOLEAN);
218
VAR
219
    item, boolItem: tBoolItem;
220
    cur: List.tItem;
221
    del: BOOLEAN;
222
BEGIN
223
    NEW(item);
224
    item.adr := SYSTEM.ADR(v);
225
    item.val := x;
226
    item.save := TRUE;
227
    cur := CL.guard.prev;
228
    WHILE cur # NIL DO
229
        IF cur IS tBoolItem THEN
230
            boolItem := cur(tBoolItem);
231
            del := boolItem.save & (boolItem.adr = SYSTEM.ADR(v)) & (boolItem.val = x)
232
        ELSE
233
            del := FALSE
234
        END;
235
        cur := cur.prev;
236
        IF del THEN
237
            List.delete(CL.Log, boolItem);
238
            DISPOSE(boolItem)
239
        END
240
    END;
241
    List.insert(CL.Log, CL.guard.prev, item)
242
END changeBool2;
243
 
244
 
8728 leency 245
PROCEDURE changeInt (VAR v: INTEGER; x: INTEGER);
246
BEGIN
247
    changeWord(SYSTEM.ADR(v), SYSTEM.ADR(x))
248
END changeInt;
249
 
250
 
251
PROCEDURE changePtr (VAR v: List.tItem; x: List.tItem);
252
BEGIN
253
    changeWord(SYSTEM.ADR(v), SYSTEM.ADR(x))
254
END changePtr;
255
 
256
(*
257
PROCEDURE typedPtr (p: List.tItem);
258
VAR
259
    item: tTypedPtr;
260
BEGIN
261
    NEW(item);
262
    item.p := p;
263
    List.append(Log, item)
264
END typedPtr;
265
 
266
 
267
PROCEDURE untypedPtr (p: INTEGER);
268
VAR
269
    item: tUntypedPtr;
270
BEGIN
271
    NEW(item);
272
    item.p := p;
273
    List.append(Log, item)
274
END untypedPtr;
275
*)
276
 
9050 leency 277
PROCEDURE set* (_CL: tLog);
8728 leency 278
BEGIN
9050 leency 279
    CL := _CL
280
END set;
281
 
282
 
283
PROCEDURE create* (VAR maxLength: INTEGER): tLog;
284
VAR
285
    newLog: tLog;
286
BEGIN
287
    NEW(newLog);
288
    newLog.guard := NIL;
289
    newLog.isLast := TRUE;
290
    newLog.Log := List.create(NIL);
291
    CL := newLog;
292
    Lines.setMaxLength(maxLength)
293
    RETURN newLog
294
END create;
295
 
296
 
297
BEGIN
8728 leency 298
    List.init(changeInt, changePtr);
9073 leency 299
    Lines.init(changeInt, changePtr, changeBool, changeBool2(*, typedPtr, untypedPtr*))
8728 leency 300
END ChangeLog.