home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / turbopas / pslst102.zip / LISTCON.PAS < prev    next >
Pascal/Delphi Source File  |  1994-01-10  |  7KB  |  332 lines

  1. {
  2.  
  3. List Control
  4.  
  5. Rev. 1.02
  6.  
  7. (c) Copyright 1994, Michael Gallias
  8.  
  9. Target: Real, Protected, Windows
  10.  
  11. }
  12.  
  13. {$V-} {$B-}
  14.  
  15. {$IFOPT I+} {$DEFINE IOCHECK} {$ENDIF}
  16.  
  17. Unit ListCon;
  18.  
  19. Interface
  20.  
  21. Type
  22.   {$I LISTCON.TYP}   {User Defined Data Type}
  23.  
  24.   SorterType  = Function(FirstItem,SecondItem:ListData):Boolean;
  25.  
  26.   PListArray  = ^TListArray;
  27.   TListArray  = Array [1..(65530 Div SizeOf(ListData))-1] of ListData;
  28.                           {Name Changes Here}
  29.   PList       = ^TList;   {In Ver 1.00: ListArrayPtr}
  30.   TList       = Object    {In Ver 1.00: ListObject}
  31.                   Data      :PListArray;
  32.                   CurPtr    :Word;
  33.                   MaxItems  :Word;
  34.                   TotalItems:Word;
  35.  
  36.                   Procedure Init     (Const Resv:Word);
  37.                   Procedure Load     (Const FileName:String; Var Error:Word); {Don't call Init First!}
  38.                   Procedure Get      (Var   Item:ListData);
  39.                   Procedure Put      (Const Item:ListData);
  40.                   Procedure Insert   (Const Item:ListData);
  41.                   Procedure Delete;
  42.                   Procedure ShiftUp;
  43.                   Procedure GotoNext;
  44.                   Procedure GotoPrev;
  45.                   Procedure GotoBegin;
  46.                   Procedure GotoLast;
  47.                   Procedure GotoEnd;
  48.                   Procedure GotoItem (Const Here:Word);
  49.                   Procedure Hop      (Const By  :LongInt);
  50.                   Procedure SwapWith (Const This:Word);
  51.                   Procedure ShellSort;
  52.                   Procedure Save     (Const FileName:String; Var Error:Word);
  53.                   Function  CurPoint :Word;
  54.                   Function  CurSize  :Word;
  55.                   Function  AtBegin  :Boolean;
  56.                   Function  AtLast   :Boolean;
  57.                   Function  AtEnd    :Boolean;
  58.                   Function  Empty    :Boolean;
  59.                   Function  Full     :Boolean;
  60.                   Procedure Done;
  61.  
  62.                 End;
  63.  
  64. Var
  65.   UserSort : SorterType;
  66.  
  67. Implementation
  68.  
  69. Procedure TList.Init(Const Resv:Word);
  70. Begin
  71.   GetMem(Data,Resv*SizeOf(ListData));
  72.   FillChar(Data^,Resv*SizeOf(ListData),0);
  73.   MaxItems   :=Resv;
  74.   TotalItems :=0;
  75.   CurPtr     :=1;
  76. End;
  77.  
  78. Procedure TList.Load(Const FileName:String; Var Error:Word);
  79.  
  80. Var
  81.   F     :File;
  82.   X     :Word;
  83.  
  84. Begin
  85.   {$I-}
  86.   Assign(F,FileName);
  87.   Reset(F,1);
  88.   Error:=IOResult;
  89.   If Error>0 Then Begin Inc(Error,1000); Exit; End;  {No Init Done}
  90.   If FileSize(F)=0 Then
  91.   Begin
  92.     Close(F);
  93.     Assign(F,FileName);
  94.     Erase(F);
  95.     Error:=1002;
  96.     Exit;
  97.   End;
  98.   BlockRead(F,X,SizeOf(X));
  99.   Init(X);
  100.   BlockRead(F,Data^,MaxItems*SizeOf(ListData));
  101.   BlockRead(F,CurPtr,SizeOf(CurPtr));
  102.   BlockRead(F,TotalItems,SizeOf(TotalItems));
  103.   Error:=IOResult;
  104.   If Error>0 Then Exit;
  105.   Close(F);
  106.   Error:=IOResult;
  107.   {$IFDEF IOCHECK} {$I+} {$ENDIF}
  108. End;
  109.  
  110. Procedure TList.Get(Var Item:ListData);
  111. Begin
  112.   If CurPtr=0 Then RunError(250);
  113.   Item:=Data^[CurPtr];
  114. End;
  115.  
  116. Procedure TList.Put(Const Item:ListData);
  117. Begin
  118.   If CurPtr=0 Then RunError(250);
  119.   Data^[CurPtr]:=Item;
  120.   If TotalItems<CurPtr Then TotalItems:=CurPtr;
  121. End;
  122.  
  123. Procedure TList.Insert(Const Item:ListData);
  124. Begin
  125.   If TotalItems=0 Then
  126.     CurPtr:=1
  127.   Else
  128.     ShiftUp;
  129.   Put(Item);
  130. End;
  131.  
  132. Procedure TList.Delete;
  133.  
  134. Var
  135.   X:Word;
  136.  
  137. Begin
  138.   Dec(TotalItems);
  139.   For X:=CurPtr to TotalItems do
  140.     Data^[X]:=Data^[X+1];
  141.   If CurPtr>TotalItems Then CurPtr:=TotalItems;
  142.   If CurPtr=0 Then CurPtr:=1;
  143. End;
  144.  
  145. Procedure TList.ShiftUp;
  146.  
  147. Var
  148.   X:Word;
  149.  
  150. Begin
  151.   If CurPtr=0 Then CurPtr:=1;
  152.   If TotalItems>0 Then
  153.     For X:=TotalItems DownTo CurPtr do
  154.       Data^[X+1]:=Data^[X];
  155.   Inc(TotalItems);
  156. End;
  157.  
  158. Procedure TList.GotoNext;
  159. Begin
  160.   Inc(CurPtr);
  161. End;
  162.  
  163. Procedure TList.GotoPrev;
  164. Begin
  165.   Dec(CurPtr);
  166. End;
  167.  
  168. Procedure TList.GotoBegin;
  169. Begin
  170.   CurPtr:=1;
  171. End;
  172.  
  173. Procedure TList.GotoLast;
  174. Begin
  175.   If TotalItems=0 Then
  176.     CurPtr:=1
  177.   Else
  178.     CurPtr:=TotalItems;
  179. End;
  180.  
  181. Procedure TList.GotoEnd;
  182. Begin
  183.   CurPtr:=TotalItems+1;
  184. End;
  185.  
  186. Procedure TList.GotoItem(Const Here:Word);
  187. Begin
  188.   CurPtr:=Here;
  189. End;
  190.  
  191. Procedure TList.Hop(Const By:LongInt);
  192. Begin
  193.   Inc(CurPtr,By);
  194. End;
  195.  
  196. Procedure TList.SwapWith(Const This:Word);
  197.  
  198. Var
  199.   Temp2,
  200.   Temp1   :ListData;
  201.   OldP    :Word;
  202.  
  203. Begin
  204.   OldP:=CurPoint;
  205.   Get(Temp1);
  206.   GotoItem(This);
  207.   Get(Temp2);
  208.   Put(Temp1);
  209.   GotoItem(OldP);
  210.   Put(Temp2);
  211. End;
  212.  
  213. Procedure TList.ShellSort;
  214.  
  215. Var
  216.   OldPoint    :Word;
  217.   i,j,k       :LongInt;
  218.   DataB,
  219.   DataA       :ListData;
  220.  
  221. Begin
  222.   OldPoint:=CurPoint;
  223.   k:=TotalItems Div 2;
  224.   While k>0 do
  225.   Begin
  226.     For i:=k+1 to TotalItems do
  227.     Begin
  228.       j:=i-k;
  229.       While j>0 do
  230.       Begin
  231.         GotoItem(j);
  232.         Get(DataA);
  233.         GotoItem(j+k);
  234.         Get(DataB);
  235.         If UserSort(DataA,DataB) Then
  236.         Begin
  237.           Put(DataA);
  238.           GotoItem(j);
  239.           Put(DataB);
  240.           Dec(j,k);
  241.         End
  242.         Else
  243.           j:=0;
  244.       End;
  245.     End;
  246.     k:=k Div 2;
  247.   End;
  248.   GotoItem(OldPoint);
  249. End;
  250.  
  251. Procedure TList.Save(Const FileName:String; Var Error:Word);
  252.  
  253. Var
  254.   F     :File;
  255.  
  256. Begin
  257.   {$I-}
  258.   Assign(F,FileName);
  259.   Rewrite(F,1);
  260.   Error:=IOResult;
  261.   If Error>0 Then Exit;
  262.   BlockWrite(F,MaxItems,SizeOf(MaxItems));
  263.   BlockWrite(F,Data^,MaxItems*SizeOf(ListData));
  264.   BlockWrite(F,CurPtr,SizeOf(CurPtr));
  265.   BlockWrite(F,TotalItems,SizeOf(TotalItems));
  266.   Error:=IOResult;
  267.   If Error>0 Then Exit;
  268.   Close(F);
  269.   Error:=IOResult;
  270.   {$IFDEF IOCHECK} {$I+} {$ENDIF}
  271. End;
  272.  
  273. Function TList.CurPoint:Word;
  274. Begin
  275.   CurPoint:=CurPtr;
  276. End;
  277.  
  278. Function TList.CurSize:Word;
  279. Begin
  280.   CurSize:=TotalItems;
  281. End;
  282.  
  283. Function TList.AtBegin:Boolean;
  284. Begin
  285.   If CurPtr=1 Then
  286.     AtBegin:=True
  287.   Else
  288.     AtBegin:=False;
  289. End;
  290.  
  291. Function TList.AtLast:Boolean;
  292. Begin
  293.   If CurPtr=TotalItems Then
  294.     AtLast:=True
  295.   Else
  296.     AtLast:=False;
  297. End;
  298.  
  299. Function TList.AtEnd:Boolean;
  300. Begin
  301.   If CurPtr>TotalItems Then
  302.     AtEnd:=True
  303.   Else
  304.     AtEnd:=False;
  305. End;
  306.  
  307. Function TList.Empty:Boolean;
  308. Begin
  309.   If TotalItems=0 Then
  310.     Empty:=True
  311.   Else
  312.     Empty:=False;
  313. End;
  314.  
  315. Function TList.Full:Boolean;
  316. Begin
  317.   If TotalItems=MaxItems Then
  318.     Full:=True
  319.   Else
  320.     Full:=False;
  321. End;
  322.  
  323. Procedure TList.Done;
  324. Begin
  325.   FreeMem(Data,MaxItems*SizeOf(ListData));
  326.   MaxItems    :=0;
  327.   TotalItems  :=0;
  328.   CurPtr      :=0;
  329. End;
  330.  
  331. End.
  332.