Rev 9674 | Rev 9903 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 9674 | Rev 9902 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | (* |
1 | (* |
2 | Copyright 2021, 2022 Anton Krotov |
2 | Copyright 2021-2023 Anton Krotov |
Line 3... | Line 3... | ||
3 | 3 | ||
Line 4... | Line 4... | ||
4 | This file is part of CEdit. |
4 | This file is part of CEdit. |
5 | 5 | ||
Line 21... | Line 21... | ||
21 | 21 | ||
Line 22... | Line 22... | ||
22 | IMPORT List, Lines, API, SYSTEM; |
22 | IMPORT List, Lines, API, SYSTEM; |
23 | 23 | ||
- | 24 | TYPE |
|
24 | TYPE |
25 | tIntItem = POINTER TO RECORD (List.tItem) |
25 | tIntItem = POINTER TO RECORD (List.tItem) |
26 | cnt: INTEGER; |
Line 26... | Line 27... | ||
26 | adr, val: INTEGER |
27 | adr, val: ARRAY 8 OF INTEGER |
27 | END; |
28 | END; |
28 | 29 | ||
29 | tBoolItem = POINTER TO RECORD (List.tItem) |
30 | tBoolItem = POINTER TO RECORD (List.tItem) |
30 | line: Lines.tLine; |
31 | line: Lines.tLine; |
Line 31... | Line 32... | ||
31 | adr: INTEGER; |
32 | adr: INTEGER; |
32 | val, save: BOOLEAN |
33 | val, save: BOOLEAN |
- | 34 | END; |
|
33 | END; |
35 | |
Line 34... | Line 36... | ||
34 | 36 | tUntypedPtr = POINTER TO RECORD (List.tItem) |
|
- | 37 | cnt: INTEGER; |
|
35 | tUntypedPtr = POINTER TO RECORD (List.tItem) |
38 | p: ARRAY 64 OF INTEGER |
36 | p: INTEGER |
39 | END; |
Line 37... | Line 40... | ||
37 | END; |
40 | |
38 | 41 | tTypedPtr = POINTER TO RECORD (List.tItem) |
|
39 | tTypedPtr = POINTER TO RECORD (List.tItem) |
42 | cnt: INTEGER; |
Line 40... | Line 43... | ||
40 | p: List.tItem |
43 | p: ARRAY 64 OF List.tItem |
41 | END; |
44 | END; |
42 | 45 | ||
43 | tGuard* = POINTER TO RECORD (List.tItem) |
46 | tGuard* = POINTER TO RECORD (List.tItem) |
44 | saved*: BOOLEAN |
47 | saved*: BOOLEAN |
Line 101... | Line 104... | ||
101 | CL.isLast := isLastGuard(_guard) |
104 | CL.isLast := isLastGuard(_guard) |
102 | END setGuard; |
105 | END setGuard; |
Line 103... | Line 106... | ||
103 | 106 | ||
- | 107 | ||
- | 108 | PROCEDURE redo* (item: List.tItem); |
|
104 | 109 | VAR |
|
105 | PROCEDURE redo* (item: List.tItem); |
110 | i: INTEGER; |
- | 111 | BEGIN |
|
106 | BEGIN |
112 | IF item IS tIntItem THEN |
- | 113 | FOR i := 0 TO item(tIntItem).cnt - 1 DO |
|
107 | IF item IS tIntItem THEN |
114 | SYSTEM.PUT(item(tIntItem).adr[i], item(tIntItem).val[i]) |
108 | SYSTEM.PUT(item(tIntItem).adr, item(tIntItem).val) |
115 | END |
109 | ELSIF item IS tBoolItem THEN |
116 | ELSIF item IS tBoolItem THEN |
110 | SYSTEM.PUT(item(tBoolItem).adr, item(tBoolItem).val) |
117 | SYSTEM.PUT(item(tBoolItem).adr, item(tBoolItem).val) |
Line 161... | Line 168... | ||
161 | 168 | ||
162 | 169 | ||
163 | PROCEDURE changeWord (adrV, adrX: INTEGER); |
170 | PROCEDURE changeWord (adrV, adrX: INTEGER); |
- | 171 | VAR |
|
164 | VAR |
172 | item: tIntItem; |
165 | item: tIntItem; |
- | |
166 | BEGIN |
- | |
167 | NEW(item); |
- | |
168 | item.adr := adrV; |
173 | cur: List.tItem; |
169 | SYSTEM.GET(adrX, item.val); |
174 | BEGIN |
170 | IF ~CL.isLast THEN |
175 | IF ~CL.isLast THEN |
- | 176 | clear(CL.guard) |
|
- | 177 | END; |
|
- | 178 | cur := CL.Log.last; |
|
- | 179 | WHILE (cur # NIL) & ~(cur IS tGuard) & ~(cur IS tIntItem) DO |
|
- | 180 | cur := cur.prev |
|
- | 181 | END; |
|
- | 182 | IF (cur IS tIntItem) & (cur(tIntItem).cnt < LEN(cur(tIntItem).adr)) THEN |
|
- | 183 | item := cur(tIntItem) |
|
- | 184 | ELSE |
|
171 | clear(CL.guard) |
185 | NEW(item); |
- | 186 | item.cnt := 0; |
|
- | 187 | List.append(CL.Log, item) |
|
- | 188 | END; |
|
- | 189 | item.adr[item.cnt] := adrV; |
|
172 | END; |
190 | SYSTEM.GET(adrX, item.val[item.cnt]); |
Line 173... | Line 191... | ||
173 | List.append(CL.Log, item) |
191 | INC(item.cnt) |
174 | END changeWord; |
192 | END changeWord; |
Line 264... | Line 282... | ||
264 | 282 | ||
265 | PROCEDURE typedPtr (p: List.tItem); |
283 | PROCEDURE typedPtr (p: List.tItem); |
266 | VAR |
284 | VAR |
267 | item: tTypedPtr; |
285 | item: tTypedPtr; |
- | 286 | BEGIN |
|
- | 287 | item := CL.TPointers.last(tTypedPtr); |
|
268 | BEGIN |
288 | IF (item = NIL) OR (item.cnt = LEN(item.p)) THEN |
269 | NEW(item); |
289 | NEW(item); |
270 | item.p := p; |
290 | item.cnt := 0; |
- | 291 | List.append(CL.TPointers, item) |
|
- | 292 | END; |
|
- | 293 | item.p[item.cnt] := p; |
|
271 | List.append(CL.Pointers, item) |
294 | INC(item.cnt) |
Line 272... | Line 295... | ||
272 | END typedPtr; |
295 | END typedPtr; |
273 | 296 | ||
274 | 297 | ||
275 | PROCEDURE untypedPtr (p: INTEGER); |
298 | PROCEDURE untypedPtr (p: INTEGER); |
- | 299 | VAR |
|
- | 300 | item: tUntypedPtr; |
|
276 | VAR |
301 | BEGIN |
277 | item: tUntypedPtr; |
302 | item := CL.UPointers.last(tUntypedPtr); |
278 | BEGIN |
303 | IF (item = NIL) OR (item.cnt = LEN(item.p)) THEN |
- | 304 | NEW(item); |
|
- | 305 | item.cnt := 0; |
|
- | 306 | List.append(CL.UPointers, item) |
|
279 | NEW(item); |
307 | END; |
Line 280... | Line 308... | ||
280 | item.p := p; |
308 | item.p[item.cnt] := p; |
281 | List.append(CL.Pointers, item) |
309 | INC(item.cnt) |
282 | END untypedPtr; |
310 | END untypedPtr; |
283 | 311 | ||
Line 284... | Line 312... | ||
284 | 312 | ||
285 | PROCEDURE set* (_CL: tLog); |
313 | PROCEDURE setLog* (_CL: tLog); |
286 | BEGIN |
314 | BEGIN |
Line 295... | Line 323... | ||
295 | NEW(newLog); |
323 | NEW(newLog); |
296 | newLog.guard := NIL; |
324 | newLog.guard := NIL; |
297 | newLog.first := NIL; |
325 | newLog.first := NIL; |
298 | newLog.isLast := TRUE; |
326 | newLog.isLast := TRUE; |
299 | newLog.Log := List.create(NIL); |
327 | newLog.Log := List.create(NIL); |
- | 328 | newLog.TPointers := List.create(NIL); |
|
300 | newLog.Pointers := List.create(NIL); |
329 | newLog.UPointers := List.create(NIL); |
301 | CL := newLog; |
330 | CL := newLog; |
302 | Lines.setMaxLength(maxLength) |
331 | Lines.setMaxLength(maxLength) |
303 | RETURN newLog |
332 | RETURN newLog |
304 | END create; |
333 | END create; |
Line 305... | Line 334... | ||
305 | 334 | ||
306 | 335 | ||
307 | PROCEDURE destroy* (VAR log: tLog); |
336 | PROCEDURE destroy* (VAR log: tLog); |
308 | VAR |
337 | VAR |
309 | item: List.tItem; |
338 | item: List.tItem; |
310 | res: INTEGER; |
339 | res, i: INTEGER; |
311 | BEGIN |
340 | BEGIN |
312 | IF log # NIL THEN |
341 | IF log # NIL THEN |
313 | item := List.pop(log.Log); |
342 | item := List.pop(log.Log); |
314 | WHILE item # NIL DO |
343 | WHILE item # NIL DO |
315 | DISPOSE(item); |
344 | DISPOSE(item); |
316 | item := List.pop(log.Log) |
345 | item := List.pop(log.Log) |
Line 317... | Line 346... | ||
317 | END; |
346 | END; |
- | 347 | DISPOSE(log.Log); |
|
- | 348 | ||
- | 349 | item := List.pop(log.TPointers); |
|
- | 350 | WHILE item # NIL DO |
|
- | 351 | FOR i := 0 TO item(tTypedPtr).cnt - 1 DO |
|
- | 352 | DISPOSE(item(tTypedPtr).p[i]) |
|
- | 353 | END; |
|
- | 354 | DISPOSE(item); |
|
- | 355 | item := List.pop(log.TPointers) |
|
- | 356 | END; |
|
318 | DISPOSE(log.Log); |
357 | DISPOSE(log.TPointers); |
319 | 358 | ||
320 | item := List.pop(log.Pointers); |
359 | item := List.pop(log.UPointers); |
321 | WHILE item # NIL DO |
- | |
322 | IF item IS tUntypedPtr THEN |
- | |
323 | res := API._DISPOSE(item(tUntypedPtr).p) |
360 | WHILE item # NIL DO |
324 | ELSIF item IS tTypedPtr THEN |
361 | FOR i := 0 TO item(tUntypedPtr).cnt - 1 DO |
325 | DISPOSE(item(tTypedPtr).p) |
362 | res := API._DISPOSE(item(tUntypedPtr).p[i]) |
326 | END; |
363 | END; |
327 | DISPOSE(item); |
364 | DISPOSE(item); |
Line 328... | Line 365... | ||
328 | item := List.pop(log.Pointers) |
365 | item := List.pop(log.UPointers) |
329 | END; |
366 | END; |
330 | DISPOSE(log.Pointers); |
367 | DISPOSE(log.UPointers); |