Subversion Repositories Kolibri OS

Rev

Rev 8728 | Rev 9073 | 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.     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 changeWord (adrV, adrX: INTEGER);
  127. VAR
  128.     item: tIntItem;
  129. BEGIN
  130.     NEW(item);
  131.     item.adr := adrV;
  132.     SYSTEM.GET(adrX, item.val);
  133.     IF ~CL.isLast THEN
  134.         clear(CL.guard)
  135.     END;
  136.     List.append(CL.Log, item)
  137. END changeWord;
  138.  
  139.  
  140. PROCEDURE changeBool (VAR v: BOOLEAN; x: BOOLEAN);
  141. VAR
  142.     item: tBoolItem;
  143. BEGIN
  144.     NEW(item);
  145.     item.adr := SYSTEM.ADR(v);
  146.     item.val := x;
  147.     IF ~CL.isLast THEN
  148.         clear(CL.guard)
  149.     END;
  150.     List.append(CL.Log, item)
  151. END changeBool;
  152.  
  153.  
  154. PROCEDURE changeInt (VAR v: INTEGER; x: INTEGER);
  155. BEGIN
  156.     changeWord(SYSTEM.ADR(v), SYSTEM.ADR(x))
  157. END changeInt;
  158.  
  159.  
  160. PROCEDURE changePtr (VAR v: List.tItem; x: List.tItem);
  161. BEGIN
  162.     changeWord(SYSTEM.ADR(v), SYSTEM.ADR(x))
  163. END changePtr;
  164.  
  165. (*
  166. PROCEDURE typedPtr (p: List.tItem);
  167. VAR
  168.     item: tTypedPtr;
  169. BEGIN
  170.     NEW(item);
  171.     item.p := p;
  172.     List.append(Log, item)
  173. END typedPtr;
  174.  
  175.  
  176. PROCEDURE untypedPtr (p: INTEGER);
  177. VAR
  178.     item: tUntypedPtr;
  179. BEGIN
  180.     NEW(item);
  181.     item.p := p;
  182.     List.append(Log, item)
  183. END untypedPtr;
  184. *)
  185.  
  186. PROCEDURE set* (_CL: tLog);
  187. BEGIN
  188.     CL := _CL
  189. END set;
  190.  
  191.  
  192. PROCEDURE create* (VAR maxLength: INTEGER): tLog;
  193. VAR
  194.     newLog: tLog;
  195. BEGIN
  196.     NEW(newLog);
  197.     newLog.guard := NIL;
  198.     newLog.isLast := TRUE;
  199.     newLog.Log := List.create(NIL);
  200.     CL := newLog;
  201.     Lines.setMaxLength(maxLength)
  202.     RETURN newLog
  203. END create;
  204.  
  205.  
  206. BEGIN
  207.     List.init(changeInt, changePtr);
  208.     Lines.init(changeInt, changePtr, changeBool(*, typedPtr, untypedPtr*))
  209. END ChangeLog.