home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / pascal / pslst100.zip / LIST.PAS < prev    next >
Pascal/Delphi Source File  |  1993-01-01  |  5KB  |  277 lines

  1. {
  2.  
  3.                                                       ╔══════════════════╗
  4.                                                       ║  List Control    ║
  5.                                                       ║                  ║
  6.                                                       ║    Rev. 1.00     ║
  7.                                                       ╚══════════════════╝
  8.  
  9. }
  10.  
  11. {$F-} {$O-} {$A+} {$G-} {$R-}
  12. {$V-} {$B-} {$X-} {$N+} {$E+}
  13.  
  14. {$I FINAL.PAS}
  15.  
  16. {$IFDEF FINAL}
  17.   {$I-} {$S-}
  18.   {$D-} {$L-}
  19. {$ENDIF}
  20.  
  21. Unit List;
  22.  
  23. Interface
  24.  
  25. Type
  26.  
  27.   ListData    = Word;
  28.  
  29.   SorterType  = Function(FirstItem,SecondItem:ListData):Boolean;
  30.  
  31.   ListArray   = Array [1..1] of ListData;  {1..??, Range Checking is Off}
  32.  
  33.   ListArrayPtr= ^ListArray;
  34.  
  35.   ListObject  = Object
  36.  
  37.                   Data      :ListArrayPtr;
  38.                   CurPtr    :Word;
  39.                   MaxItems  :Word;
  40.                   TotalItems:Word;
  41.  
  42.                   Procedure Init     (Resv:Word);
  43.                   Procedure Get      (Var Item:ListData);
  44.                   Procedure Put      (Item:ListData);
  45.                   Procedure Insert   (Item:ListData);
  46.                   Procedure Delete;
  47.                   Procedure ShiftUp;
  48.                   Procedure GotoNext;
  49.                   Procedure GotoPrev;
  50.                   Procedure GotoBegin;
  51.                   Procedure GotoLast;
  52.                   Procedure GotoEnd;
  53.                   Procedure GotoItem (Here:Word);
  54.                   Procedure Hop      (By  :LongInt);
  55.                   Procedure SwapWith (This:Word);
  56.                   Procedure ShellSort;
  57.                   Function  CurPoint :Word;
  58.                   Function  CurSize  :Word;
  59.                   Function  AtBegin  :Boolean;
  60.                   Function  AtLast   :Boolean;
  61.                   Function  AtEnd    :Boolean;
  62.                   Function  Empty    :Boolean;
  63.                   Function  Full     :Boolean;
  64.                   Procedure Done;
  65.  
  66.                 End;
  67.  
  68. Var
  69.   UserSort : SorterType;
  70.  
  71. Implementation
  72.  
  73. Procedure ListObject.Init(Resv:Word);
  74. Begin
  75.   GetMem(Data,Resv*SizeOf(ListData));
  76.   FillChar(Data^,Resv*SizeOf(ListData),0);
  77.   MaxItems   :=Resv;
  78.   TotalItems :=0;
  79.   CurPtr     :=1;
  80. End;
  81.  
  82. Procedure ListObject.Get(Var Item:ListData);
  83. Begin
  84.   Item:=Data^[CurPtr];
  85. End;
  86.  
  87. Procedure ListObject.Put(Item:ListData);
  88. Begin
  89.   Data^[CurPtr]:=Item;
  90.   If TotalItems<CurPtr Then TotalItems:=CurPtr;
  91. End;
  92.  
  93. Procedure ListObject.Insert(Item:ListData);
  94. Begin
  95.   ShiftUp;
  96.   Put(Item);
  97. End;
  98.  
  99. Procedure ListObject.Delete;
  100.  
  101. Var
  102.   X:Word;
  103.  
  104. Begin
  105.   Dec(TotalItems);
  106.   For X:=CurPtr to TotalItems do
  107.     Data^[X]:=Data^[X+1];
  108.   If CurPtr>TotalItems Then CurPtr:=TotalItems;
  109.   If CurPtr=0 Then CurPtr:=1;
  110. End;
  111.  
  112. Procedure ListObject.ShiftUp;
  113.  
  114. Var
  115.   X:Word;
  116.  
  117. Begin
  118.   For X:=TotalItems DownTo CurPtr do
  119.     Data^[X+1]:=Data^[X];
  120.   Inc(TotalItems);
  121. End;
  122.  
  123. Procedure ListObject.GotoNext;
  124. Begin
  125.   Inc(CurPtr);
  126. End;
  127.  
  128. Procedure ListObject.GotoPrev;
  129. Begin
  130.   Dec(CurPtr);
  131. End;
  132.  
  133. Procedure ListObject.GotoBegin;
  134. Begin
  135.   CurPtr:=1;
  136. End;
  137.  
  138. Procedure ListObject.GotoLast;
  139. Begin
  140.   If TotalItems=0 Then
  141.     CurPtr:=1
  142.   Else
  143.     CurPtr:=TotalItems;
  144. End;
  145.  
  146. Procedure ListObject.GotoEnd;
  147. Begin
  148.   CurPtr:=TotalItems+1;
  149. End;
  150.  
  151. Procedure ListObject.GotoItem(Here:Word);
  152. Begin
  153.   CurPtr:=Here;
  154. End;
  155.  
  156. Procedure ListObject.Hop(By:LongInt);
  157. Begin
  158.   Inc(CurPtr,By);
  159. End;
  160.  
  161. Procedure ListObject.SwapWith(This:Word);
  162.  
  163. Var
  164.   Temp2,
  165.   Temp1   :ListData;
  166.   OldP    :Word;
  167.  
  168. Begin
  169.   OldP:=CurPoint;
  170.   Get(Temp1);
  171.   GotoItem(This);
  172.   Get(Temp2);
  173.   Put(Temp1);
  174.   GotoItem(OldP);
  175.   Put(Temp2);
  176. End;
  177.  
  178. Procedure ListObject.ShellSort;
  179.  
  180. Var
  181.   OldPoint    :Word;
  182.   i,j,k       :LongInt;
  183.   DataB,
  184.   DataA       :ListData;
  185.  
  186. Begin
  187.   OldPoint:=CurPoint;
  188.   k:=TotalItems Div 2;
  189.   While k>0 do
  190.   Begin
  191.     For i:=k+1 to TotalItems do
  192.     Begin
  193.       j:=i-k;
  194.       While j>0 do
  195.       Begin
  196.         GotoItem(j);
  197.         Get(DataA);
  198.         GotoItem(j+k);
  199.         Get(DataB);
  200.         If UserSort(DataA,DataB) Then
  201.         Begin
  202.           Put(DataA);
  203.           GotoItem(j);
  204.           Put(DataB);
  205.           Dec(j,k);
  206.         End
  207.         Else
  208.           j:=0;
  209.       End;
  210.     End;
  211.     k:=k Div 2;
  212.   End;
  213.   GotoItem(OldPoint);
  214. End;
  215.  
  216. Function ListObject.CurPoint:Word;
  217. Begin
  218.   CurPoint:=CurPtr;
  219. End;
  220.  
  221. Function ListObject.CurSize:Word;
  222. Begin
  223.   CurSize:=TotalItems;
  224. End;
  225.  
  226. Function ListObject.AtBegin:Boolean;
  227. Begin
  228.   If CurPtr=1 Then
  229.     AtBegin:=True
  230.   Else
  231.     AtBegin:=False;
  232. End;
  233.  
  234. Function ListObject.AtLast:Boolean;
  235. Begin
  236.   If CurPtr=TotalItems Then
  237.     AtLast:=True
  238.   Else
  239.     AtLast:=False;
  240. End;
  241.  
  242. Function ListObject.AtEnd:Boolean;
  243. Begin
  244.   If CurPtr>TotalItems Then
  245.     AtEnd:=True
  246.   Else
  247.     AtEnd:=False;
  248. End;
  249.  
  250. Function ListObject.Empty:Boolean;
  251. Begin
  252.   If TotalItems=0 Then
  253.     Empty:=True
  254.   Else
  255.     Empty:=False;
  256. End;
  257.  
  258. Function ListObject.Full:Boolean;
  259. Begin
  260.   If TotalItems=MaxItems Then
  261.     Full:=True
  262.   Else
  263.     Full:=False;
  264. End;
  265.  
  266. Procedure ListObject.Done;
  267. Begin
  268.   FreeMem(Data,MaxItems*SizeOf(ListData));
  269.   MaxItems    :=0;
  270.   TotalItems  :=0;
  271.   CurPtr      :=0;
  272. End;
  273.  
  274. End.
  275.  
  276. { Copyright 1993, Michael Gallias }
  277.