Subversion Repositories Kolibri OS

Rev

Rev 9050 | 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
  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.