Rev 9902 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 9902 | Rev 9903 | ||
---|---|---|---|
Line 19... | Line 19... | ||
19 | 19 | ||
Line 20... | Line 20... | ||
20 | MODULE ChangeLog; |
20 | MODULE ChangeLog; |
Line -... | Line 21... | ||
- | 21 | ||
- | 22 | IMPORT List, Lines, API, SYSTEM; |
|
- | 23 | ||
- | 24 | CONST |
|
21 | 25 | boolItemSize = 8; |
|
22 | IMPORT List, Lines, API, SYSTEM; |
26 | fillMap = {0..boolItemSize-1}; |
23 | 27 | ||
24 | TYPE |
28 | TYPE |
25 | tIntItem = POINTER TO RECORD (List.tItem) |
29 | tIntItem = POINTER TO RECORD (List.tItem) |
Line 26... | Line 30... | ||
26 | cnt: INTEGER; |
30 | cnt: INTEGER; |
- | 31 | adr, val: ARRAY 8 OF INTEGER |
|
- | 32 | END; |
|
- | 33 | ||
27 | adr, val: ARRAY 8 OF INTEGER |
34 | tBoolItem = POINTER TO RECORD (List.tItem) |
28 | END; |
35 | map: SET; |
29 | 36 | data: ARRAY boolItemSize OF |
|
- | 37 | RECORD |
|
30 | tBoolItem = POINTER TO RECORD (List.tItem) |
38 | line: Lines.tLine; |
Line 31... | Line 39... | ||
31 | line: Lines.tLine; |
39 | adr: INTEGER; |
32 | adr: INTEGER; |
40 | val, save: BOOLEAN |
33 | val, save: BOOLEAN |
41 | END |
Line 112... | Line 120... | ||
112 | IF item IS tIntItem THEN |
120 | IF item IS tIntItem THEN |
113 | FOR i := 0 TO item(tIntItem).cnt - 1 DO |
121 | FOR i := 0 TO item(tIntItem).cnt - 1 DO |
114 | SYSTEM.PUT(item(tIntItem).adr[i], item(tIntItem).val[i]) |
122 | SYSTEM.PUT(item(tIntItem).adr[i], item(tIntItem).val[i]) |
115 | END |
123 | END |
116 | ELSIF item IS tBoolItem THEN |
124 | ELSIF item IS tBoolItem THEN |
- | 125 | FOR i := 0 TO boolItemSize - 1 DO |
|
- | 126 | IF i IN item(tBoolItem).map THEN |
|
117 | SYSTEM.PUT(item(tBoolItem).adr, item(tBoolItem).val) |
127 | SYSTEM.PUT(item(tBoolItem).data[i].adr, item(tBoolItem).data[i].val) |
- | 128 | END |
|
- | 129 | END |
|
118 | END |
130 | END |
119 | END redo; |
131 | END redo; |
Line 120... | Line 132... | ||
120 | 132 | ||
Line 137... | Line 149... | ||
137 | PROCEDURE save* (guard: tGuard); |
149 | PROCEDURE save* (guard: tGuard); |
138 | VAR |
150 | VAR |
139 | item: List.tItem; |
151 | item: List.tItem; |
140 | boolItem: tBoolItem; |
152 | boolItem: tBoolItem; |
141 | cur: List.tItem; |
153 | cur: List.tItem; |
142 | del: BOOLEAN; |
154 | i: INTEGER; |
143 | BEGIN |
155 | BEGIN |
144 | item := CL.Log.first; |
156 | item := CL.Log.first; |
145 | WHILE item # NIL DO |
157 | WHILE item # NIL DO |
146 | IF item IS tGuard THEN |
158 | IF item IS tGuard THEN |
147 | item(tGuard).saved := FALSE |
159 | item(tGuard).saved := FALSE |
Line 152... | Line 164... | ||
152 | 164 | ||
153 | cur := CL.guard.prev; |
165 | cur := CL.guard.prev; |
154 | WHILE cur # NIL DO |
166 | WHILE cur # NIL DO |
155 | IF cur IS tBoolItem THEN |
167 | IF cur IS tBoolItem THEN |
- | 168 | boolItem := cur(tBoolItem); |
|
156 | boolItem := cur(tBoolItem); |
169 | FOR i := 0 TO boolItemSize - 1 DO |
157 | del := boolItem.save & boolItem.line.modified |
170 | IF (i IN boolItem.map) & boolItem.data[i].save & |
158 | ELSE |
171 | boolItem.data[i].line.modified THEN |
- | 172 | EXCL(boolItem.map, i) |
|
- | 173 | END |
|
159 | del := FALSE |
174 | END |
160 | END; |
175 | END; |
161 | cur := cur.prev; |
176 | cur := cur.prev; |
162 | IF del THEN |
177 | IF boolItem.map = {} THEN |
163 | List.delete(CL.Log, boolItem); |
178 | List.delete(CL.Log, boolItem); |
164 | DISPOSE(boolItem) |
179 | DISPOSE(boolItem) |
165 | END |
180 | END |
166 | END |
181 | END |
Line 190... | Line 205... | ||
190 | SYSTEM.GET(adrX, item.val[item.cnt]); |
205 | SYSTEM.GET(adrX, item.val[item.cnt]); |
191 | INC(item.cnt) |
206 | INC(item.cnt) |
192 | END changeWord; |
207 | END changeWord; |
Line 193... | Line -... | ||
193 | - | ||
194 | - | ||
195 | PROCEDURE changeBool (line: Lines.tLine; VAR v: BOOLEAN; x: BOOLEAN); |
- | |
196 | VAR |
- | |
197 | item: tBoolItem; |
- | |
198 | BEGIN |
- | |
199 | NEW(item); |
- | |
200 | item.line := line; |
- | |
201 | item.adr := SYSTEM.ADR(v); |
- | |
202 | item.val := x; |
- | |
203 | item.save := FALSE; |
- | |
204 | IF ~CL.isLast THEN |
- | |
205 | clear(CL.guard) |
- | |
206 | END; |
- | |
207 | List.append(CL.Log, item) |
- | |
208 | END changeBool; |
- | |
209 | 208 | ||
210 | 209 | ||
211 | PROCEDURE delSaved*; |
210 | PROCEDURE delSaved*; |
212 | VAR |
211 | VAR |
213 | boolItem: tBoolItem; |
212 | boolItem: tBoolItem; |
214 | cur: List.tItem; |
213 | cur: List.tItem; |
215 | del: BOOLEAN; |
214 | i: INTEGER; |
216 | BEGIN |
215 | BEGIN |
217 | cur := CL.guard.next; |
216 | cur := CL.guard.next; |
218 | WHILE cur # NIL DO |
217 | WHILE cur # NIL DO |
219 | IF cur IS tBoolItem THEN |
218 | IF cur IS tBoolItem THEN |
220 | boolItem := cur(tBoolItem); |
219 | boolItem := cur(tBoolItem); |
221 | del := boolItem.save |
220 | FOR i := 0 TO boolItemSize - 1 DO |
- | 221 | IF (i IN boolItem.map) & boolItem.data[i].save THEN |
|
- | 222 | EXCL(boolItem.map, i) |
|
222 | ELSE |
223 | END |
223 | del := FALSE |
224 | END |
224 | END; |
225 | END; |
225 | cur := cur.next; |
226 | cur := cur.next; |
226 | IF del THEN |
227 | IF boolItem.map = {} THEN |
227 | List.delete(CL.Log, boolItem); |
228 | List.delete(CL.Log, boolItem); |
228 | DISPOSE(boolItem) |
229 | DISPOSE(boolItem) |
229 | END |
230 | END |
Line 233... | Line 234... | ||
233 | 234 | ||
234 | PROCEDURE delCurSaved*; |
235 | PROCEDURE delCurSaved*; |
235 | VAR |
236 | VAR |
236 | boolItem: tBoolItem; |
237 | boolItem: tBoolItem; |
237 | cur: List.tItem; |
238 | cur: List.tItem; |
238 | del: BOOLEAN; |
239 | i: INTEGER; |
239 | BEGIN |
240 | BEGIN |
240 | cur := CL.guard.prev; |
241 | cur := CL.guard.prev; |
241 | WHILE (cur # NIL) & ~(cur IS tGuard) DO |
242 | WHILE (cur # NIL) & ~(cur IS tGuard) DO |
242 | IF cur IS tBoolItem THEN |
243 | IF cur IS tBoolItem THEN |
243 | boolItem := cur(tBoolItem); |
244 | boolItem := cur(tBoolItem); |
244 | del := boolItem.save |
245 | FOR i := 0 TO boolItemSize - 1 DO |
- | 246 | IF (i IN boolItem.map) & boolItem.data[i].save THEN |
|
245 | ELSE |
247 | SYSTEM.PUT(boolItem.data[i].adr, ~boolItem.data[i].val); |
- | 248 | EXCL(boolItem.map, i) |
|
- | 249 | END |
|
246 | del := FALSE |
250 | END |
247 | END; |
251 | END; |
248 | cur := cur.prev; |
252 | cur := cur.prev; |
249 | IF del THEN |
- | |
250 | SYSTEM.PUT(boolItem.adr, ~boolItem.val); |
253 | IF boolItem.map = {} THEN |
251 | List.delete(CL.Log, boolItem); |
254 | List.delete(CL.Log, boolItem); |
252 | DISPOSE(boolItem) |
255 | DISPOSE(boolItem) |
253 | END |
256 | END |
254 | END |
257 | END |
Line 255... | Line 258... | ||
255 | END delCurSaved; |
258 | END delCurSaved; |
256 | 259 | ||
257 | 260 | ||
- | 261 | PROCEDURE _changeBool (fn2: BOOLEAN; line: Lines.tLine; VAR v: BOOLEAN; x: BOOLEAN); |
|
- | 262 | VAR |
|
258 | PROCEDURE changeBool2 (line: Lines.tLine; VAR v: BOOLEAN; x: BOOLEAN); |
263 | item: tBoolItem; |
- | 264 | cur: List.tItem; |
|
- | 265 | i: INTEGER; |
|
- | 266 | BEGIN |
|
- | 267 | IF fn2 THEN |
|
- | 268 | cur := CL.guard.prev |
|
- | 269 | ELSE |
|
- | 270 | IF ~CL.isLast THEN |
|
- | 271 | clear(CL.guard) |
|
- | 272 | END; |
|
- | 273 | cur := CL.Log.last |
|
- | 274 | END; |
|
- | 275 | ||
- | 276 | WHILE (cur # NIL) & ~(cur IS tGuard) & |
|
- | 277 | (~(cur IS tBoolItem) OR (cur(tBoolItem).map = fillMap)) DO |
|
- | 278 | cur := cur.prev |
|
- | 279 | END; |
|
259 | VAR |
280 | IF (cur IS tBoolItem) & (cur(tBoolItem).map # fillMap) THEN |
260 | item: tBoolItem; |
- | |
261 | BEGIN |
- | |
262 | NEW(item); |
281 | item := cur(tBoolItem) |
263 | item.line := line; |
282 | ELSE |
264 | item.adr := SYSTEM.ADR(v); |
283 | NEW(item); |
- | 284 | item.map := {}; |
|
- | 285 | IF fn2 THEN |
|
- | 286 | List.insert(CL.Log, CL.guard.prev, item) |
|
- | 287 | ELSE |
|
- | 288 | List.append(CL.Log, item) |
|
- | 289 | END |
|
- | 290 | END; |
|
- | 291 | ||
- | 292 | i := 0; |
|
- | 293 | WHILE i < boolItemSize DO |
|
- | 294 | IF ~(i IN item.map) THEN |
|
- | 295 | item.data[i].line := line; |
|
- | 296 | item.data[i].adr := SYSTEM.ADR(v); |
|
- | 297 | item.data[i].val := x; |
|
- | 298 | item.data[i].save := fn2; |
|
- | 299 | INCL(item.map, i); |
|
- | 300 | i := boolItemSize |
|
- | 301 | END; |
|
- | 302 | INC(i) |
|
- | 303 | END |
|
- | 304 | END _changeBool; |
|
- | 305 | ||
- | 306 | ||
- | 307 | PROCEDURE changeBool (line: Lines.tLine; VAR v: BOOLEAN; x: BOOLEAN); |
|
- | 308 | BEGIN |
|
- | 309 | _changeBool(FALSE, line, v, x) |
|
- | 310 | END changeBool; |
|
- | 311 | ||
- | 312 | ||
265 | item.val := x; |
313 | PROCEDURE changeBool2 (line: Lines.tLine; VAR v: BOOLEAN; x: BOOLEAN); |
Line 266... | Line 314... | ||
266 | item.save := TRUE; |
314 | BEGIN |
267 | List.insert(CL.Log, CL.guard.prev, item) |
315 | _changeBool(TRUE, line, v, x) |