home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / PRECOM.ZIP / LISTS.MOD < prev    next >
Text File  |  1992-12-17  |  5KB  |  254 lines

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