home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / PRECOM.ZIP / LISTS.BAK next >
Text File  |  1992-09-25  |  5KB  |  244 lines

  1. IMPLEMENTATION MODULE Lists;
  2. FROM Storage IMPORT ALLOCATE,DEALLOCATE;
  3. FROM Lib IMPORT Move;
  4. FROM FIO IMPORT Exists,Open,RdStr,IOresult,Close,File,EOF;
  5. FROM Str IMPORT Copy;
  6.  
  7.  
  8. CLASS IMPLEMENTATION Element;
  9.   VIRTUAL PROCEDURE Compare ( P : ElmtPntr) : BOOLEAN;
  10.   BEGIN
  11.     RETURN TRUE;
  12.   END Compare;
  13.  
  14. BEGIN
  15. END Element;
  16.  
  17. CLASS IMPLEMENTATION StrElmt;
  18.   PROCEDURE Assign(AString : ARRAY OF CHAR);
  19.   BEGIN
  20.     Copy(TheStr,AString);
  21.   END Assign;
  22.  
  23.   PROCEDURE GetStr(VAR AString : ARRAY OF CHAR);
  24.   BEGIN
  25.     Copy(AString,TheStr);
  26.   END GetStr;
  27. BEGIN
  28. END StrElmt;
  29.  
  30.  
  31.  
  32.  
  33. CLASS IMPLEMENTATION GenList;
  34.   PROCEDURE InitList;
  35.   BEGIN
  36.     First := NIL;
  37.     Last  := NIL;
  38.     Now   := NIL;
  39.     Type[0]  := 0C;
  40.     NbrInLst := 0;
  41.     NowNbr   := 0;
  42.   END InitList;
  43.  
  44.  
  45.   PROCEDURE ListLength():CARDINAL;
  46.   BEGIN
  47.    RETURN NbrInLst;
  48.   END ListLength;
  49.  
  50.   PROCEDURE Initialized(): BOOLEAN;
  51.   BEGIN
  52.     RETURN (First <> NIL);
  53.   END Initialized;
  54.  
  55.  
  56.   PROCEDURE DisposeList;
  57.   VAR
  58.     J , K : CARDINAL;
  59.   BEGIN
  60.    K := NbrInLst;
  61.    Now := First;
  62.    WHILE Now # NIL DO
  63.      First := Now^.Next;
  64.      DEALLOCATE(Now,Now^.ElmtSize);
  65.      Now := First;
  66.    END;
  67.    NbrInLst := 0;
  68.    NowNbr := 0;
  69.    First := NIL;
  70.    Last  := NIL;
  71.    Now   := NIL;
  72.     Init  := 0;
  73.   END DisposeList;
  74.  
  75.   PROCEDURE MoveToSpot(Spot : CARDINAL);
  76.   VAR J : CARDINAL;
  77.   BEGIN
  78.  
  79.     IF Spot >= NbrInLst
  80.       THEN
  81.         Now := Last;
  82.         NowNbr := NbrInLst;
  83.         RETURN;
  84.       END;
  85.     IF Spot < NowNbr
  86.       THEN
  87.         Now := First;
  88.         NowNbr := 1;
  89.       END;
  90.     WHILE NowNbr < Spot DO
  91.       INC(NowNbr);
  92.       Now := Now^.Next;
  93.     END;
  94.  
  95.   END MoveToSpot;
  96.  
  97.  
  98.   PROCEDURE AddItem(VAR Item : Element);  (* always stick at end *)
  99.   VAR
  100.     New : ElmtPntr;
  101.   BEGIN
  102.     ALLOCATE(New,SIZE(Item));
  103.     Move(ADR(Item),New,SIZE(Item));
  104.     New^.ElmtSize := SIZE(Item);  (* keep the size for deallocate *)
  105.     New^.Next := NIL;
  106.     New^.Prev := NIL;
  107.     INC(NbrInLst);
  108.     NowNbr := NbrInLst;
  109.     IF First = NIL     (* empty list *)
  110.       THEN
  111.          First := New;
  112.          Last  := New;
  113.          Now   := New;
  114.          RETURN;
  115.       END;
  116.    Last^.Next := New;
  117.    New^.Prev := Last;
  118.    Last := New;
  119.    Now  := New;
  120.  
  121.   END AddItem;
  122.  
  123.   PROCEDURE InsertItem(VAR Item : Element; Spot : CARDINAL);
  124.    VAR
  125.      New : ElmtPntr;
  126.   BEGIN
  127.     IF Spot > NbrInLst  (* simple add to list *)
  128.       THEN AddItem(Item);
  129.       RETURN;
  130.     END;
  131.     ALLOCATE(New,SIZE(Item));
  132.     Move(ADR(Item),New,SIZE(Item));
  133.     New^.ElmtSize := SIZE(Item);  (* keep the size for deallocate *)
  134.     New^.Next := NIL;
  135.     New^.Prev := NIL;
  136.     MoveToSpot(Spot);
  137.     INC(NbrInLst);
  138.     NowNbr := NbrInLst;
  139.     IF Spot = 1   (* special case - insert at beginint *)
  140.       THEN
  141.         New^.Next := First;
  142.         First := New;
  143.       ELSE
  144.         New^.Prev := Now^.Prev;
  145.     END;
  146.     Now^.Prev := New;
  147.     Now := New;
  148.   END InsertItem;
  149.  
  150.   PROCEDURE DeleteItem(Spot : CARDINAL);
  151.   VAR
  152.     Tmp : ADDRESS;
  153.   BEGIN
  154.     IF NbrInLst = 0
  155.       THEN
  156.         RETURN;  (* empty list - cant delete *)
  157.       END;
  158.     MoveToSpot(Spot);
  159.     DEC(NbrInLst);
  160.     IF Spot = 1  (* delete the first item *)
  161.      THEN
  162.        Now := First;
  163.        First := First^.Next;
  164.        First^.Prev := NIL;
  165.        DEALLOCATE(Now,Now^.ElmtSize);
  166.        Now := First;
  167.        NowNbr := 1;
  168.        RETURN;
  169.     END;
  170.     IF Now = Last   (* delete the last in list *)
  171.       THEN
  172.         Last := Last^.Prev;
  173.         Last^.Next := NIL;
  174.         DEALLOCATE(Now,Now^.ElmtSize);
  175.         Now := Last;
  176.         NowNbr := NbrInLst;
  177.         RETURN;
  178.       END;
  179.                    (* delete from center of list *)
  180.    Tmp := Now^.Next;
  181.    Now^.Next^.Prev := Now^.Prev;
  182.    Now^.Prev^.Next := Now^.Next;
  183.    DEALLOCATE(Now,Now^.ElmtSize);
  184.    Now := Tmp;
  185.   END DeleteItem;
  186.  
  187.   PROCEDURE GetItem(VAR Item : Element; Spot:CARDINAL);
  188.   BEGIN
  189.     MoveToSpot (Spot);
  190.     Move(Now,ADR(Item),Now^.ElmtSize);
  191.   END GetItem;
  192.  
  193.   PROCEDURE GetItemAdr(VAR Item : ElmtPntr; Spot: CARDINAL);
  194.   BEGIN
  195.    MoveToSpot(Spot);
  196.       Item := Now;
  197.   END GetItemAdr;
  198.  
  199.   PROCEDURE Apply(Proc : ApplyProc);  (* apply procedure to every element*)
  200.   VAR
  201.     EP : ElmtPntr;
  202.     J:CARDINAL;
  203.   BEGIN
  204.     FOR J := 1 TO NbrInLst DO
  205.       GetItemAdr( EP,J);
  206.       Proc(EP);
  207.     END;
  208.   END Apply;
  209.  
  210.   PROCEDURE FileToList(FileName : ARRAY OF CHAR);
  211.   VAR
  212.    Error : CARDINAL;
  213.    F : File;
  214.    Str : ARRAY [0..80] OF CHAR;
  215.    E : StrElmt;
  216.  BEGIN
  217.    InitList;
  218.    IF Exists(FileName)
  219.      THEN
  220.         F := Open(FileName);
  221.         REPEAT
  222.           RdStr(F,Str);
  223.           E.Assign(Str);
  224.           AddItem(E);
  225.         UNTIL EOF;
  226.         Close(F);
  227.      END;
  228.   END FileToList;
  229.  
  230.   PROCEDURE ListToFile(FileName : ARRAY OF CHAR);
  231.   END ListToFile;
  232.  
  233. BEGIN   (* automatic initialization stuff - constructors *)
  234.     First := NIL;
  235.     Last  := NIL;
  236.     Now   := NIL;
  237.     Type[0]  := 0C;
  238.     NbrInLst := 0;
  239.     NowNbr   := 0;
  240. END GenList;
  241.  
  242. END Lists.
  243. 
  244.