Subversion Repositories Kolibri OS

Rev

Rev 9050 | Go to most recent revision | Details | 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
 
45
 
46
VAR
47
    Log*: List.tList;
48
    guard: tGuard;
49
    isLast: BOOLEAN;
50
 
51
 
52
PROCEDURE isLastGuard* (guard: tGuard): BOOLEAN;
53
VAR
54
    item: List.tItem;
55
    res: BOOLEAN;
56
BEGIN
57
    IF guard # NIL THEN
58
        item := Log.last;
59
        WHILE ~(item IS tGuard) DO
60
            item := item.prev
61
        END;
62
        res := guard = item
63
    ELSE
64
        res := TRUE
65
    END
66
    RETURN res
67
END isLastGuard;
68
 
69
 
70
PROCEDURE isFirstGuard* (guard: tGuard): BOOLEAN;
71
VAR
72
    item: List.tItem;
73
BEGIN
74
    ASSERT(guard # NIL);
75
    item := Log.first;
76
    WHILE ~(item IS tGuard) DO
77
        item := item.next
78
    END
79
    RETURN guard = item
80
END isFirstGuard;
81
 
82
 
83
PROCEDURE setGuard* (_guard: tGuard);
84
BEGIN
85
    guard := _guard;
86
    isLast := isLastGuard(_guard)
87
END setGuard;
88
 
89
 
90
PROCEDURE redo* (item: List.tItem);
91
BEGIN
92
    IF item IS tIntItem THEN
93
        SYSTEM.PUT(item(tIntItem).adr, item(tIntItem).val)
94
    ELSIF item IS tBoolItem THEN
95
        SYSTEM.PUT(item(tBoolItem).adr, item(tBoolItem).val)
96
    END
97
END redo;
98
 
99
 
100
PROCEDURE clear (guard: tGuard);
101
VAR
102
    item: List.tItem;
103
    (*res: INTEGER;*)
104
BEGIN
105
    isLast := TRUE;
106
    REPEAT
107
        item := List.pop(Log);
108
        IF item # guard THEN
109
        (*
110
            IF item IS tUntypedPtr THEN
111
                res := API._DISPOSE(item(tUntypedPtr).p)
112
            ELSIF item IS tTypedPtr THEN
113
                DISPOSE(item(tTypedPtr).p)
114
            END;*)
115
            DISPOSE(item)
116
        END
117
    UNTIL item = guard;
118
    List.append(Log, item)
119
END clear;
120
 
121
 
122
PROCEDURE changeWord (adrV, adrX: INTEGER);
123
VAR
124
    item: tIntItem;
125
BEGIN
126
    NEW(item);
127
    item.adr := adrV;
128
    SYSTEM.GET(adrX, item.val);
129
    IF ~isLast THEN
130
        clear(guard)
131
    END;
132
    List.append(Log, item)
133
END changeWord;
134
 
135
 
136
PROCEDURE changeBool (VAR v: BOOLEAN; x: BOOLEAN);
137
VAR
138
    item: tBoolItem;
139
BEGIN
140
    NEW(item);
141
    item.adr := SYSTEM.ADR(v);
142
    item.val := x;
143
    IF ~isLast THEN
144
        clear(guard)
145
    END;
146
    List.append(Log, item)
147
END changeBool;
148
 
149
 
150
PROCEDURE changeInt (VAR v: INTEGER; x: INTEGER);
151
BEGIN
152
    changeWord(SYSTEM.ADR(v), SYSTEM.ADR(x))
153
END changeInt;
154
 
155
 
156
PROCEDURE changePtr (VAR v: List.tItem; x: List.tItem);
157
BEGIN
158
    changeWord(SYSTEM.ADR(v), SYSTEM.ADR(x))
159
END changePtr;
160
 
161
(*
162
PROCEDURE typedPtr (p: List.tItem);
163
VAR
164
    item: tTypedPtr;
165
BEGIN
166
    NEW(item);
167
    item.p := p;
168
    List.append(Log, item)
169
END typedPtr;
170
 
171
 
172
PROCEDURE untypedPtr (p: INTEGER);
173
VAR
174
    item: tUntypedPtr;
175
BEGIN
176
    NEW(item);
177
    item.p := p;
178
    List.append(Log, item)
179
END untypedPtr;
180
*)
181
 
182
BEGIN
183
    guard := NIL;
184
    isLast := TRUE;
185
    List.init(changeInt, changePtr);
186
    Lines.init(changeInt, changePtr, changeBool(*, typedPtr, untypedPtr*));
187
    Log := List.create(NIL)
188
END ChangeLog.