home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / LISTS12.ZIP / LISTS12.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-01-04  |  6.5 KB  |  275 lines

  1. (*****************************************************************************
  2.    Program:  Lists.Pas
  3.    Author:   Mark Addleman
  4.    Version:  1.2
  5.    Date:     June 27, 1988
  6.    Note:     Public domain software
  7.              Please distribute in complete form
  8.  
  9.  
  10. VERSION RECORD
  11. 1.0 - Gosh, I thought everything was right!
  12. 1.1 - Minor bug found in DisposeOfList routine
  13.       If no windows were created, DisposeOfList would try to
  14.       dispose of a NIL variable (List.FirstItem).  This is a no-no
  15. 1.2 - Bug in DeleteItemFromList routine
  16.       If list contained only 1 item, the routine would not properly
  17.       reclaim the used memory
  18. ******************************************************************************)
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26. {$R-,S-,I-,D-,T-,F-,V+,B-,N-,L+ }
  27. {$M 16384,0,655360 }
  28. Unit Lists;
  29.  
  30. INTERFACE
  31. Type
  32.    ItemPtr                   =   ^ItemRec;
  33.    ItemRec                   =   Record
  34.                                     PrevItem   :   ItemPtr;
  35.                                     NextItem   :   ItemPtr;
  36.                                     Ptr        :   Pointer;
  37.                                  End;
  38.  
  39.    ListRec                   =   Record
  40.                                     FirstItem  :   ItemPtr;
  41.                                     LastItem   :   ItemPtr;
  42.                                     Item       :   ItemPtr;
  43.                                     ListOK     :   Boolean;
  44.                                  End;
  45.  
  46. Procedure InitList(Var List:ListRec);
  47. Procedure AddToList(NewItem:Pointer; Var List:ListRec);
  48. Procedure InsertInList(NewItem:Pointer; Var List:ListRec);
  49. Procedure DeleteItemFromList(Var List:ListRec);
  50.  
  51. Function NextItemPtr(List:ListRec):Pointer;
  52. Function PrevItemPtr(List:ListRec):Pointer;
  53. Function LastItemPtr(List:ListRec):Pointer;
  54. Function FirstItemPtr(List:ListRec):Pointer;
  55. Function CurrentItemPtr(List:ListRec):Pointer;
  56. Function ItemInList(Item:Pointer; List:ListRec):Boolean;
  57.  
  58. Procedure MoveToNextItem(Var List:ListRec);
  59. Procedure MoveToPrevItem(Var List:ListRec);
  60. Procedure MoveToFirstItem(Var List:ListRec);
  61. Procedure MoveToLastItem(Var List:ListRec);
  62. Procedure MoveToItem(Item:Pointer; Var List:ListRec);
  63. Procedure DisposeOfList(Var List:ListRec);
  64.  
  65. IMPLEMENTATION
  66.  
  67. Procedure InitList(Var List:ListRec);
  68. Begin
  69.    With List Do Begin
  70.       FirstItem:=nil; FirstItem^.PrevItem:=nil;
  71.       LastItem:=nil;  LastItem^.NextItem:=nil;
  72.       Item:=nil;
  73.       With Item^ Do Begin
  74.          NextItem:=nil;
  75.          PrevItem:=nil;
  76.          Ptr:=nil;
  77.       End;
  78.       ListOK:=True;
  79.    End;
  80. End;
  81.  
  82. Procedure AddToList(NewItem:Pointer; Var List:ListRec);
  83. Begin
  84.    With List Do
  85.    If FirstItem=nil Then Begin
  86.       New(FirstItem);
  87.  
  88.       With FirstItem^ Do Begin
  89.          NextItem:=nil;
  90.          PrevItem:=nil;
  91.          Ptr:=NewItem;
  92.       End;
  93.       Item:=FirstItem;
  94.       LastItem:=FirstItem;
  95.    End
  96.    Else Begin
  97.       New(LastItem^.NextItem);
  98.  
  99.       LastItem^.NextItem^.PrevItem:=LastItem;
  100.  
  101.       LastItem:=LastItem^.NextItem;
  102.       LastItem^.NextItem:=nil;
  103.       LastItem^.Ptr:=NewItem;
  104.    End;
  105. End;
  106.  
  107. Procedure InsertInList(NewItem:Pointer; Var List:ListRec);
  108. Var
  109.    NewItemPtr                :   ItemPtr;
  110.  
  111. Begin
  112.    With List Do
  113.    If (Item=LastItem) or (Item=nil) Then AddToList(NewItem, List)
  114.    Else
  115.    If Not (FirstItem=nil) Then Begin
  116.       New(NewItemPtr);
  117.  
  118.       With NewItemPtr^ Do Begin
  119.          Ptr:=NewItem;
  120.          PrevItem:=Item^.PrevItem;
  121.          NextItem:=Item;
  122.       End;
  123.  
  124.       With Item^ Do Begin
  125.          PrevItem^.NextItem:=NewItemPtr;
  126.          PrevItem:=NewItemPtr;
  127.       End;
  128.  
  129.       If Item=FirstItem Then FirstItem:=NewItemPtr;
  130.    End
  131.    Else ListOK:=False;
  132. End;
  133.  
  134. Function NextItemPtr(List:ListRec):Pointer;
  135. Begin
  136.    With List Do
  137.    If Item^.NextItem=nil Then NextItemPtr:=nil
  138.    Else NextItemPtr:=Item^.NextItem^.Ptr;
  139. End;
  140.  
  141. Function PrevItemPtr(List:ListRec):Pointer;
  142. Begin
  143.    With List Do
  144.    If Item^.PrevItem=nil Then PrevItemPtr:=nil
  145.    Else PrevItemPtr:=Item^.PrevItem^.Ptr;
  146. End;
  147.  
  148. Function FirstItemPtr(List:ListRec):Pointer;
  149. Begin
  150.    FirstItemPtr:=List.FirstItem^.Ptr;
  151. End;
  152.  
  153. Function LastItemPtr(List:ListRec):Pointer;
  154. Begin
  155.    LastItemPtr:=List.LastItem^.Ptr;
  156. End;
  157.  
  158. Function CurrentItemPtr(List:ListRec):Pointer;
  159. Begin
  160.    With List Do
  161.    If Not (Item=nil) Then CurrentItemPtr:=Item^.Ptr
  162.    Else ListOK:=False;
  163. End;
  164.  
  165.  
  166.  
  167.  
  168.  
  169. Procedure MoveToNextItem(Var List:ListRec);
  170. Begin
  171.    With List Do
  172.    If Not (Item^.NextItem=nil) Then Begin
  173.       Item:=Item^.NextItem;
  174.       ListOK:=True;
  175.    End
  176.    Else ListOK:=False;
  177. End;
  178.  
  179. Procedure MoveToPrevItem(Var List:ListRec);
  180. Begin
  181.    With List Do
  182.    If Not (Item^.PrevItem=nil) Then Begin
  183.       Item:=Item^.PrevItem;
  184.       ListOK:=True;
  185.    End
  186.    Else ListOK:=False;
  187. End;
  188.  
  189. Procedure MoveToFirstItem(Var List:ListRec);
  190. Begin
  191.    With List Do
  192.    If FirstItem=nil Then ListOK:=False
  193.    Else Begin
  194.       Item:=FirstItem;
  195.       ListOK:=True;
  196.    End;
  197. End;
  198.  
  199. Procedure MoveToLastItem(Var List:ListRec);
  200. Begin
  201.    With List Do
  202.    If FirstItem^.NextItem=nil Then ListOK:=False
  203.    Else Begin
  204.       Item:=LastItem;
  205.       ListOK:=True;
  206.    End;
  207. End;
  208.  
  209. Procedure DeleteItemFromList(Var List:ListRec);
  210. Var
  211.    TempItem                  :   Pointer;
  212.  
  213. Begin
  214.    With List Do Begin
  215.       TempItem:=Item^.NextItem;
  216.       If TempItem=nil Then TempItem:=Item^.PrevItem;
  217.  
  218.       If Not (Item=nil) Then Dispose(Item)
  219.       Else ListOK:=False;
  220.  
  221.       If LastItem=FirstItem Then InitList(List)
  222.       Else
  223.       If Item=LastItem Then Begin
  224.          LastItem:=LastItem^.PrevItem;
  225.          LastItem^.NextItem:=nil;
  226.       End
  227.       Else
  228.       If Item=FirstItem Then Begin
  229.          FirstItem:=FirstItem^.NextItem;
  230.          FirstItem^.PrevItem:=nil;
  231.       End
  232.       Else Begin
  233.          Item^.PrevItem^.NextItem:=Item^.NextItem;
  234.          Item^.NextItem^.PrevItem:=Item^.PrevItem;
  235.       End;
  236.  
  237.       Item:=TempItem;
  238.    End;
  239. End;
  240.  
  241. Procedure DisposeOfList(Var List:ListRec);
  242. Begin
  243.    MoveToLastItem(List);
  244.    If List.ListOK Then Begin
  245.       Repeat
  246.          DeleteItemFromList(List);
  247.          MoveToPrevItem(List);
  248.       Until Not List.ListOK;
  249.  
  250.       Dispose(List.FirstItem);
  251.    End;
  252.  
  253.    InitList(List);
  254. End;
  255.  
  256. Procedure MoveToItem(Item:Pointer; Var List:ListRec);
  257. Begin
  258.    If CurrentItemPtr(List)=Item Then Exit;
  259.  
  260.    MoveToFirstItem(List);
  261.    While List.ListOK Do Begin
  262.       If CurrentItemPtr(List)=Item Then Exit;
  263.       MoveToNextItem(List);
  264.    End;
  265. End;
  266.  
  267. Function ItemInList(Item:Pointer; List:ListRec):Boolean;
  268. Begin
  269.    MoveToItem(Item, List);
  270.    ItemInList:=List.ListOK;
  271. End;
  272.  
  273. Begin
  274. End.
  275.