Subversion Repositories Kolibri OS

Rev

Rev 8728 | Rev 9073 | 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)
30
        adr: INTEGER; val: BOOLEAN
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)
42
 
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
 
126
PROCEDURE changeWord (adrV, adrX: INTEGER);
127
VAR
128
    item: tIntItem;
129
BEGIN
130
    NEW(item);
131
    item.adr := adrV;
132
    SYSTEM.GET(adrX, item.val);
9050 leency 133
    IF ~CL.isLast THEN
134
        clear(CL.guard)
8728 leency 135
    END;
9050 leency 136
    List.append(CL.Log, item)
8728 leency 137
END changeWord;
138
 
139
 
140
PROCEDURE changeBool (VAR v: BOOLEAN; x: BOOLEAN);
141
VAR
142
    item: tBoolItem;
143
BEGIN
144
    NEW(item);
145
    item.adr := SYSTEM.ADR(v);
146
    item.val := x;
9050 leency 147
    IF ~CL.isLast THEN
148
        clear(CL.guard)
8728 leency 149
    END;
9050 leency 150
    List.append(CL.Log, item)
8728 leency 151
END changeBool;
152
 
153
 
154
PROCEDURE changeInt (VAR v: INTEGER; x: INTEGER);
155
BEGIN
156
    changeWord(SYSTEM.ADR(v), SYSTEM.ADR(x))
157
END changeInt;
158
 
159
 
160
PROCEDURE changePtr (VAR v: List.tItem; x: List.tItem);
161
BEGIN
162
    changeWord(SYSTEM.ADR(v), SYSTEM.ADR(x))
163
END changePtr;
164
 
165
(*
166
PROCEDURE typedPtr (p: List.tItem);
167
VAR
168
    item: tTypedPtr;
169
BEGIN
170
    NEW(item);
171
    item.p := p;
172
    List.append(Log, item)
173
END typedPtr;
174
 
175
 
176
PROCEDURE untypedPtr (p: INTEGER);
177
VAR
178
    item: tUntypedPtr;
179
BEGIN
180
    NEW(item);
181
    item.p := p;
182
    List.append(Log, item)
183
END untypedPtr;
184
*)
185
 
9050 leency 186
PROCEDURE set* (_CL: tLog);
8728 leency 187
BEGIN
9050 leency 188
    CL := _CL
189
END set;
190
 
191
 
192
PROCEDURE create* (VAR maxLength: INTEGER): tLog;
193
VAR
194
    newLog: tLog;
195
BEGIN
196
    NEW(newLog);
197
    newLog.guard := NIL;
198
    newLog.isLast := TRUE;
199
    newLog.Log := List.create(NIL);
200
    CL := newLog;
201
    Lines.setMaxLength(maxLength)
202
    RETURN newLog
203
END create;
204
 
205
 
206
BEGIN
8728 leency 207
    List.init(changeInt, changePtr);
9050 leency 208
    Lines.init(changeInt, changePtr, changeBool(*, typedPtr, untypedPtr*))
8728 leency 209
END ChangeLog.