1,5 → 1,5 |
(* |
Copyright 2021, 2022 Anton Krotov |
Copyright 2021-2023 Anton Krotov |
|
This file is part of CEdit. |
|
23,7 → 23,8 |
|
TYPE |
tIntItem = POINTER TO RECORD (List.tItem) |
adr, val: INTEGER |
cnt: INTEGER; |
adr, val: ARRAY 8 OF INTEGER |
END; |
|
tBoolItem = POINTER TO RECORD (List.tItem) |
33,11 → 34,13 |
END; |
|
tUntypedPtr = POINTER TO RECORD (List.tItem) |
p: INTEGER |
cnt: INTEGER; |
p: ARRAY 64 OF INTEGER |
END; |
|
tTypedPtr = POINTER TO RECORD (List.tItem) |
p: List.tItem |
cnt: INTEGER; |
p: ARRAY 64 OF List.tItem |
END; |
|
tGuard* = POINTER TO RECORD (List.tItem) |
45,7 → 48,7 |
END; |
|
tLog* = POINTER TO RECORD |
Log*, Pointers*: List.tList; |
Log*, TPointers, UPointers: List.tList; |
guard, first: tGuard; |
isLast: BOOLEAN |
END; |
103,9 → 106,13 |
|
|
PROCEDURE redo* (item: List.tItem); |
VAR |
i: INTEGER; |
BEGIN |
IF item IS tIntItem THEN |
SYSTEM.PUT(item(tIntItem).adr, item(tIntItem).val) |
FOR i := 0 TO item(tIntItem).cnt - 1 DO |
SYSTEM.PUT(item(tIntItem).adr[i], item(tIntItem).val[i]) |
END |
ELSIF item IS tBoolItem THEN |
SYSTEM.PUT(item(tBoolItem).adr, item(tBoolItem).val) |
END |
163,14 → 170,25 |
PROCEDURE changeWord (adrV, adrX: INTEGER); |
VAR |
item: tIntItem; |
cur: List.tItem; |
BEGIN |
NEW(item); |
item.adr := adrV; |
SYSTEM.GET(adrX, item.val); |
IF ~CL.isLast THEN |
clear(CL.guard) |
END; |
cur := CL.Log.last; |
WHILE (cur # NIL) & ~(cur IS tGuard) & ~(cur IS tIntItem) DO |
cur := cur.prev |
END; |
IF (cur IS tIntItem) & (cur(tIntItem).cnt < LEN(cur(tIntItem).adr)) THEN |
item := cur(tIntItem) |
ELSE |
NEW(item); |
item.cnt := 0; |
List.append(CL.Log, item) |
END; |
item.adr[item.cnt] := adrV; |
SYSTEM.GET(adrX, item.val[item.cnt]); |
INC(item.cnt) |
END changeWord; |
|
|
266,9 → 284,14 |
VAR |
item: tTypedPtr; |
BEGIN |
item := CL.TPointers.last(tTypedPtr); |
IF (item = NIL) OR (item.cnt = LEN(item.p)) THEN |
NEW(item); |
item.p := p; |
List.append(CL.Pointers, item) |
item.cnt := 0; |
List.append(CL.TPointers, item) |
END; |
item.p[item.cnt] := p; |
INC(item.cnt) |
END typedPtr; |
|
|
276,16 → 299,21 |
VAR |
item: tUntypedPtr; |
BEGIN |
item := CL.UPointers.last(tUntypedPtr); |
IF (item = NIL) OR (item.cnt = LEN(item.p)) THEN |
NEW(item); |
item.p := p; |
List.append(CL.Pointers, item) |
item.cnt := 0; |
List.append(CL.UPointers, item) |
END; |
item.p[item.cnt] := p; |
INC(item.cnt) |
END untypedPtr; |
|
|
PROCEDURE set* (_CL: tLog); |
PROCEDURE setLog* (_CL: tLog); |
BEGIN |
CL := _CL |
END set; |
END setLog; |
|
|
PROCEDURE create* (VAR maxLength: INTEGER): tLog; |
297,7 → 325,8 |
newLog.first := NIL; |
newLog.isLast := TRUE; |
newLog.Log := List.create(NIL); |
newLog.Pointers := List.create(NIL); |
newLog.TPointers := List.create(NIL); |
newLog.UPointers := List.create(NIL); |
CL := newLog; |
Lines.setMaxLength(maxLength) |
RETURN newLog |
307,7 → 336,7 |
PROCEDURE destroy* (VAR log: tLog); |
VAR |
item: List.tItem; |
res: INTEGER; |
res, i: INTEGER; |
BEGIN |
IF log # NIL THEN |
item := List.pop(log.Log); |
317,18 → 346,26 |
END; |
DISPOSE(log.Log); |
|
item := List.pop(log.Pointers); |
item := List.pop(log.TPointers); |
WHILE item # NIL DO |
IF item IS tUntypedPtr THEN |
res := API._DISPOSE(item(tUntypedPtr).p) |
ELSIF item IS tTypedPtr THEN |
DISPOSE(item(tTypedPtr).p) |
FOR i := 0 TO item(tTypedPtr).cnt - 1 DO |
DISPOSE(item(tTypedPtr).p[i]) |
END; |
DISPOSE(item); |
item := List.pop(log.Pointers) |
item := List.pop(log.TPointers) |
END; |
DISPOSE(log.Pointers); |
DISPOSE(log.TPointers); |
|
item := List.pop(log.UPointers); |
WHILE item # NIL DO |
FOR i := 0 TO item(tUntypedPtr).cnt - 1 DO |
res := API._DISPOSE(item(tUntypedPtr).p[i]) |
END; |
DISPOSE(item); |
item := List.pop(log.UPointers) |
END; |
DISPOSE(log.UPointers); |
|
DISPOSE(log) |
END |
END destroy; |