Subversion Repositories Kolibri OS

Rev

Rev 9050 | Rev 9448 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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 <http://www.gnu.org/licenses/>.
  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; save: 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.         saved*: BOOLEAN
  43.     END;
  44.  
  45.     tLog* = POINTER TO RECORD
  46.         Log*: List.tList;
  47.         guard: tGuard;
  48.         isLast: BOOLEAN
  49.     END;
  50.  
  51.  
  52. VAR
  53.     CL*: tLog;
  54.  
  55.  
  56. PROCEDURE isLastGuard* (guard: tGuard): BOOLEAN;
  57. VAR
  58.     item: List.tItem;
  59.     res: BOOLEAN;
  60. BEGIN
  61.     IF guard # NIL THEN
  62.         item := CL.Log.last;
  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);
  79.     item := CL.Log.first;
  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
  89.     CL.guard := _guard;
  90.     CL.isLast := isLastGuard(_guard)
  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
  109.     CL.isLast := TRUE;
  110.     REPEAT
  111.         item := List.pop(CL.Log);
  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;
  122.     List.append(CL.Log, item)
  123. END clear;
  124.  
  125.  
  126. PROCEDURE save* (guard: tGuard);
  127. VAR
  128.     item: List.tItem;
  129. BEGIN
  130.     item := CL.Log.first;
  131.     WHILE item # NIL DO
  132.         IF item IS tGuard THEN
  133.             item(tGuard).saved := FALSE
  134.         END;
  135.         item := item.next
  136.     END;
  137.     guard.saved := TRUE
  138. END save;
  139.  
  140.  
  141. PROCEDURE changeWord (adrV, adrX: INTEGER);
  142. VAR
  143.     item: tIntItem;
  144. BEGIN
  145.     NEW(item);
  146.     item.adr := adrV;
  147.     SYSTEM.GET(adrX, item.val);
  148.     IF ~CL.isLast THEN
  149.         clear(CL.guard)
  150.     END;
  151.     List.append(CL.Log, item)
  152. END changeWord;
  153.  
  154.  
  155. PROCEDURE changeBool (VAR v: BOOLEAN; x: BOOLEAN);
  156. VAR
  157.     item: tBoolItem;
  158. BEGIN
  159.     NEW(item);
  160.     item.adr := SYSTEM.ADR(v);
  161.     item.val := x;
  162.     item.save := FALSE;
  163.     IF ~CL.isLast THEN
  164.         clear(CL.guard)
  165.     END;
  166.     List.append(CL.Log, item)
  167. END changeBool;
  168.  
  169.  
  170. PROCEDURE delSaved*;
  171. VAR
  172.     boolItem: tBoolItem;
  173.     cur: List.tItem;
  174.     del: BOOLEAN;
  175. BEGIN
  176.     cur := CL.guard.next;
  177.     WHILE cur # NIL DO
  178.         IF cur IS tBoolItem THEN
  179.             boolItem := cur(tBoolItem);
  180.             del := boolItem.save
  181.         ELSE
  182.             del := FALSE
  183.         END;
  184.         cur := cur.next;
  185.         IF del THEN
  186.             List.delete(CL.Log, boolItem);
  187.             DISPOSE(boolItem)
  188.         END
  189.     END
  190. END delSaved;
  191.  
  192.  
  193. PROCEDURE delCurSaved*;
  194. VAR
  195.     boolItem: tBoolItem;
  196.     cur: List.tItem;
  197.     del: BOOLEAN;
  198. BEGIN
  199.     cur := CL.guard.prev;
  200.     WHILE (cur # NIL) & ~(cur IS tGuard) DO
  201.         IF cur IS tBoolItem THEN
  202.             boolItem := cur(tBoolItem);
  203.             del := boolItem.save
  204.         ELSE
  205.             del := FALSE
  206.         END;
  207.         cur := cur.prev;
  208.         IF del THEN
  209.             SYSTEM.PUT(boolItem.adr, ~boolItem.val);
  210.             List.delete(CL.Log, boolItem);
  211.             DISPOSE(boolItem)
  212.         END
  213.     END
  214. END delCurSaved;
  215.  
  216.  
  217. PROCEDURE changeBool2 (VAR v: BOOLEAN; x: BOOLEAN);
  218. VAR
  219.     item, boolItem: tBoolItem;
  220.     cur: List.tItem;
  221.     del: BOOLEAN;
  222. BEGIN
  223.     NEW(item);
  224.     item.adr := SYSTEM.ADR(v);
  225.     item.val := x;
  226.     item.save := TRUE;
  227.     cur := CL.guard.prev;
  228.     WHILE cur # NIL DO
  229.         IF cur IS tBoolItem THEN
  230.             boolItem := cur(tBoolItem);
  231.             del := boolItem.save & (boolItem.adr = SYSTEM.ADR(v)) & (boolItem.val = x)
  232.         ELSE
  233.             del := FALSE
  234.         END;
  235.         cur := cur.prev;
  236.         IF del THEN
  237.             List.delete(CL.Log, boolItem);
  238.             DISPOSE(boolItem)
  239.         END
  240.     END;
  241.     List.insert(CL.Log, CL.guard.prev, item)
  242. END changeBool2;
  243.  
  244.  
  245. PROCEDURE changeInt (VAR v: INTEGER; x: INTEGER);
  246. BEGIN
  247.     changeWord(SYSTEM.ADR(v), SYSTEM.ADR(x))
  248. END changeInt;
  249.  
  250.  
  251. PROCEDURE changePtr (VAR v: List.tItem; x: List.tItem);
  252. BEGIN
  253.     changeWord(SYSTEM.ADR(v), SYSTEM.ADR(x))
  254. END changePtr;
  255.  
  256. (*
  257. PROCEDURE typedPtr (p: List.tItem);
  258. VAR
  259.     item: tTypedPtr;
  260. BEGIN
  261.     NEW(item);
  262.     item.p := p;
  263.     List.append(Log, item)
  264. END typedPtr;
  265.  
  266.  
  267. PROCEDURE untypedPtr (p: INTEGER);
  268. VAR
  269.     item: tUntypedPtr;
  270. BEGIN
  271.     NEW(item);
  272.     item.p := p;
  273.     List.append(Log, item)
  274. END untypedPtr;
  275. *)
  276.  
  277. PROCEDURE set* (_CL: tLog);
  278. BEGIN
  279.     CL := _CL
  280. END set;
  281.  
  282.  
  283. PROCEDURE create* (VAR maxLength: INTEGER): tLog;
  284. VAR
  285.     newLog: tLog;
  286. BEGIN
  287.     NEW(newLog);
  288.     newLog.guard := NIL;
  289.     newLog.isLast := TRUE;
  290.     newLog.Log := List.create(NIL);
  291.     CL := newLog;
  292.     Lines.setMaxLength(maxLength)
  293.     RETURN newLog
  294. END create;
  295.  
  296.  
  297. BEGIN
  298.     List.init(changeInt, changePtr);
  299.     Lines.init(changeInt, changePtr, changeBool, changeBool2(*, typedPtr, untypedPtr*))
  300. END ChangeLog.