home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 375.lha / IncrStorageManager_v1.0 / DynItem.mod < prev    next >
Text File  |  1990-05-02  |  5KB  |  246 lines

  1. IMPLEMENTATION MODULE DynItem;
  2.  
  3. (* Product: Incremental Storage Manager
  4.  
  5.    Version: 1.0
  6.  
  7.    Author:
  8.         Daniel B. Hankins
  9.         143 Montgomery Street
  10.         Poughkeepsie, NY 12601
  11.         dan-hankins@cup.portal.com
  12.  
  13.    Creation Date: 1989
  14.  
  15.    Release  Date: November 21, 1989
  16.  
  17.    Notice of Intellectual Property:
  18.         This material is *NOT COPYRIGHTED*.  By this notice, I hereby place
  19.    this program and all its parts in the public domain, under the definitions
  20.    and restrictions of United States law.
  21.  
  22.    History of Revisions:
  23.         None yet.
  24. *)
  25.  
  26. FROM SYSTEM      IMPORT ADDRESS, TSIZE, WORD;
  27. FROM WordAlign   IMPORT WordAlign;
  28.  
  29. IMPORT DynamicItem;
  30. IMPORT DynItemList;
  31.  
  32. TYPE
  33.   Object  = POINTER TO Item;
  34.   WordPtr = POINTER TO WORD;
  35.  
  36.   Item = RECORD
  37.            NextLower, NextHigher: Object;
  38.            Size, RefCount:        LONGCARD;
  39.            Term:                  DynamicItem.TermProc;
  40.            List:                  DynItemList.Object;
  41.            Handle:                DynamicItem.Object;
  42.          END;
  43.  
  44. VAR
  45.   ItemTypeSize: LONGCARD;
  46.  
  47.  
  48. PROCEDURE New(Size: LONGCARD; TermIt: DynamicItem.TermProc): Object;
  49. VAR
  50.   NewObject: Object;
  51.   TotalSize: LONGCARD;
  52.   List:      DynItemList.Object;
  53. BEGIN
  54. (* New(Size, Object) <-
  55.      WordAlign(Size, Size),
  56.      Plus(Size, ItemTypeSize, TotalSize),
  57.      DynItemList.GetListWithSpace(TotalSize, List),
  58.      New2(TotalSize, List, Object).
  59.    New2(TotalSize, List, Object) <-
  60.      DynItemList.Nil(List),
  61.      SetValue(Object, NIL).
  62.    New2(TotalSize, List, Object) <-
  63.      DynItemList.GetChunk(List, TotalSize, NewObject),
  64.      SetValue(NewObject^.Size,     TotalSize),
  65.      SetValue(NewObject^.RefCount, 1),
  66.      SetValue(NewObject^.List,     List),
  67.      SetValue(NewObject^.Handle,   NIL),
  68.      DynItemList.LinkItem(List, NewObject),
  69.      SetValue(Object, NewObject).
  70. *)
  71.   Size      := WordAlign(Size);
  72.   TotalSize := Size + ItemTypeSize;
  73.   List      := DynItemList.GetListWithSpace(TotalSize);
  74.  
  75.   IF DynItemList.Nil(List) THEN
  76.     RETURN(NIL);
  77.   END;
  78.  
  79.   NewObject           := DynItemList.GetChunk(List, TotalSize);
  80.   NewObject^.Size     := TotalSize;
  81.   NewObject^.RefCount := 1;
  82.   NewObject^.List     := List;
  83.   NewObject^.Term     := TermIt;
  84.   DynItemList.LinkItem(List, NewObject);
  85.  
  86.   RETURN NewObject;
  87. END New;
  88.  
  89.  
  90. PROCEDURE Init(DObject: Object; InitIt: DynamicItem.InitProc);
  91. BEGIN
  92.   InitIt(Access(DObject));
  93. END Init;
  94.  
  95.  
  96. PROCEDURE SetHandle(DObject: Object; Handle: DynamicItem.Object);
  97. BEGIN
  98.   DObject^.Handle := Handle;
  99. END SetHandle;
  100.  
  101.  
  102. PROCEDURE Dispose(DObject: Object): BOOLEAN;
  103. BEGIN
  104.   DObject^.RefCount := DObject^.RefCount - 1;
  105.   IF DObject^.RefCount = 0 THEN
  106.     DObject^.Term(Access(DObject));
  107.     Kill(DObject);
  108.     RETURN TRUE;
  109.   END;
  110.   RETURN FALSE;
  111. END Dispose;
  112.  
  113.  
  114. PROCEDURE Kill(DObject: Object);
  115. BEGIN
  116.   DynItemList.UnlinkItem(DObject^.List, DObject);
  117. END Kill;
  118.  
  119.  
  120. PROCEDURE Ref(DObject: Object);
  121. BEGIN
  122.   DObject^.RefCount := DObject^.RefCount + 1;
  123. END Ref;
  124.  
  125.  
  126. PROCEDURE Access(DObject: Object): ADDRESS;
  127. BEGIN
  128.   RETURN ADDRESS(LONGCARD(DObject) + ItemTypeSize);
  129. END Access;
  130.  
  131.  
  132. PROCEDURE GetList(DObject: Object): DynItemList.Object;
  133. BEGIN
  134.   RETURN DObject^.List;
  135. END GetList;
  136.  
  137.  
  138. PROCEDURE Percolate(DObject: Object);
  139. BEGIN
  140.   DynItemList.Percolate(DObject^.List);
  141. END Percolate;
  142.  
  143.  
  144. PROCEDURE LinkAfter(DObjectNew, DObjectOld: Object);
  145. BEGIN
  146. IF DObjectOld <> NIL THEN
  147.   DObjectNew^.NextLower  := DObjectOld;
  148.   DObjectNew^.NextHigher := DObjectOld^.NextHigher;
  149.   DObjectNew^.NextLower^.NextHigher := DObjectNew;
  150.   IF DObjectNew^.NextHigher <> NIL THEN
  151.     DObjectNew^.NextHigher^.NextLower := DObjectNew;
  152.   END;
  153. ELSE
  154.   DObjectNew^.NextLower := NIL;
  155.   DObjectNew^.NextHigher := NIL;
  156. END;
  157. END LinkAfter;
  158.  
  159.  
  160. PROCEDURE Unlink(DObject: Object);
  161. BEGIN
  162.   IF DObject^.NextLower <> NIL THEN
  163.     DObject^.NextLower^.NextHigher := DObject^.NextHigher;
  164.   END;
  165.   IF DObject^.NextHigher <> NIL THEN
  166.     DObject^.NextHigher^.NextLower := DObject^.NextLower;
  167.   END;
  168. END Unlink;
  169.  
  170.  
  171. PROCEDURE GetPrev(DObject: Object): Object;
  172. BEGIN
  173.   RETURN DObject^.NextLower;
  174. END GetPrev;
  175.  
  176.  
  177. PROCEDURE GetNext(DObject: Object): Object;
  178. BEGIN
  179.   RETURN DObject^.NextHigher;
  180. END GetNext;
  181.  
  182.  
  183. PROCEDURE MoveDown(DObject: Object): Object;
  184.  VAR
  185.   DestinationAddr: ADDRESS;
  186.   SourceWord, DestinationWord: WordPtr;
  187.   BytesToMove: LONGCARD;
  188. BEGIN
  189.   IF DObject^.NextLower = NIL THEN
  190.     DestinationAddr := DynItemList.NextAddr(DObject^.List);
  191.   ELSE
  192.     DestinationAddr := NextAddr(DObject^.NextLower);
  193.   END;
  194.  
  195.   DynamicItem.Set(DObject^.Handle, DestinationAddr);
  196.  
  197.   BytesToMove := DObject^.Size;
  198.   SourceWord := ADDRESS(DObject);
  199.   DestinationWord := DestinationAddr;
  200.  
  201.   LOOP
  202.     IF BytesToMove = 0 THEN
  203.       EXIT;
  204.     END;
  205.     DestinationWord^ := SourceWord^;
  206.     DestinationWord  := ADDRESS(LONGCARD(DestinationWord) + 2);
  207.     SourceWord       := ADDRESS(LONGCARD(SourceWord) + 2);
  208.     BytesToMove      := BytesToMove - 2;
  209.   END;
  210.  
  211.   DObject := DestinationAddr;
  212.  
  213.   IF DObject^.NextLower <> NIL THEN
  214.     DObject^.NextLower^.NextHigher := DObject;
  215.   END;
  216.  
  217.   IF DObject^.NextHigher <> NIL THEN
  218.     DObject^.NextHigher^.NextLower := DObject;
  219.   END;
  220.  
  221.   RETURN Object(DestinationAddr);
  222. END MoveDown;
  223.  
  224.  
  225. PROCEDURE NextAddr(DObject: Object): ADDRESS;
  226. BEGIN
  227.   RETURN ADDRESS(LONGCARD(DObject) + DObject^.Size);
  228. END NextAddr;
  229.  
  230.  
  231. PROCEDURE NilObject(): Object;
  232. BEGIN
  233.   RETURN NIL;
  234. END NilObject;
  235.  
  236.  
  237. PROCEDURE Nil(DObject: Object): BOOLEAN;
  238. BEGIN
  239.   RETURN (DObject = NIL);
  240. END Nil;
  241.  
  242.  
  243. BEGIN
  244.   ItemTypeSize := WordAlign(TSIZE(Item));
  245. END DynItem.
  246.