home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #5 / Amiga Plus CD - 2000 - No. 5.iso / Tools / Dev / fpc / oop / ExecObject.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2000-01-01  |  13.0 KB  |  547 lines

  1. unit ExecObject;
  2.  
  3. {
  4.     This is my first attempt at oop. I have translated
  5.     my unit linklist to oop.
  6.  
  7.     nils.sjoholm@mailbox.swipnet.se
  8.  
  9. }
  10.  
  11. interface
  12.  
  13. uses Exec,amigalib,strings;
  14.  
  15.  
  16.  
  17. type
  18.     pExecObject = ^tExecObject;
  19.     tExecObject = object
  20.         public
  21.         constructor Create;
  22.         destructor Free;
  23.         {
  24.           We can't have overlay functions in the
  25.           current amiga version. Have to change
  26.           this later. (Add and AddS)
  27.         }
  28.         function AddS( s : string): pNode;
  29.         function Add(s : PChar): pNode;
  30.         procedure PrintList;
  31.         function Count: integer;
  32.         function TheList: pList;
  33.         procedure Clear;
  34.         procedure Delete( node : pNode);
  35.         { Have to change FindS and Find }
  36.         function FindS(data : string): pNode;
  37.         function Find(data : PChar): pNode;
  38.         function First: pNode;
  39.         function Last: pNode;
  40.         function Next(node : pNode): pNode;
  41.         function GetData(node : pNode): pChar;
  42.         function IndexOf( num : integer): pNode;
  43.         function Prev( node : pNode): pNode;
  44.         function InsertS( data : string; node : pNode): pNode;
  45.         function Insert( data : PChar; node : pNode): pNode;
  46.         procedure ToBuffer(var buf: PChar);
  47.         procedure Bottom(node : pNode);
  48.         procedure Down(node : pNode);
  49.         procedure Top(node : pNode);
  50.         procedure Up(node : pNode);
  51.         procedure DeleteLast;
  52.         
  53.         procedure DeleteDup;
  54.         function SizeOfList: longint;
  55.         procedure Sort;
  56.         function UpDateS(node : pNode; data : string): boolean;
  57.         function UpDate(node : pNode; data : PChar): boolean;
  58.         function FileToList(thefile : PChar): boolean;
  59.         function FileToListS(thefile : String): boolean;
  60.         function ListToFile(TheFile : PChar): Boolean;
  61.         function ListToFileS(TheFile : String): Boolean;
  62.          {
  63.         function Copy: pList;
  64.         }
  65.         private
  66.         elist : pList;
  67.         number  : integer;
  68.         totalsize : longint;
  69.         procedure Error(err : integer);
  70.         end;
  71.  
  72. implementation
  73.  
  74. constructor tExecObject.Create;
  75. begin
  76.     elist := nil;
  77.     New(elist);
  78.     NewList(elist);
  79.     number := 0;
  80. end;
  81.  
  82. destructor tExecObject.Free;
  83. var
  84.     temp : pNode;
  85. begin
  86.     while elist^.lh_Head <> @elist^.lh_Tail do begin
  87.        temp := pNode(elist^.lh_Head);
  88.        if assigned(temp) then begin
  89.            if assigned(temp^.ln_Name) then begin
  90.               { writeln('freeing ',temp^.ln_Name);}
  91.                StrDispose(temp^.ln_Name);
  92.            end;
  93.            RemHead(elist);
  94.            Dispose(temp);
  95.        end;
  96.     end;
  97.     if assigned(elist) then begin
  98.      {  writeln('freeing the list');}
  99.        Dispose(elist);
  100.        elist := nil;
  101.     end; 
  102. end;
  103.  
  104. function tExecObject.AddS( s : string): pNode;
  105. var
  106.     temp : pNode;
  107. begin
  108.     New(temp);
  109.     temp^.ln_Name := StrAlloc(Length(s)+1);
  110.     if Assigned(temp^.ln_Name) then begin
  111.         StrPCopy(temp^.ln_Name,s);
  112.         temp^.ln_Type := 0;
  113.         temp^.ln_Pri := 0;
  114.         AddTail(elist,temp);
  115.         inc(number);
  116.         AddS := temp;
  117.     end else AddS := nil;
  118. end;
  119.  
  120. function tExecObject.Add( s : PChar): pNode;
  121. var
  122.     temp : pNode;
  123. begin
  124.     New(temp);
  125.     temp^.ln_Name := StrAlloc(StrLen(s)+1);
  126.     if Assigned(temp^.ln_Name) then begin
  127.         StrCopy(temp^.ln_Name,s);
  128.         temp^.ln_Type := 0;
  129.         temp^.ln_Pri := 0;
  130.         AddTail(elist,temp);
  131.         inc(number);
  132.         Add := temp;
  133.     end else Add := nil;
  134. end;
  135.  
  136. procedure tExecObject.PrintList;
  137. var
  138.    temp : pNode;
  139.    i : integer;
  140. begin
  141.    temp := elist^.lh_Head;
  142.    for i := 1 to Count do begin
  143.       if assigned(temp^.ln_Name) then writeln('Node ',i,': ',temp^.ln_Name);
  144.       temp := temp^.ln_Succ;
  145.    end;
  146. end;
  147.  
  148. function tExecObject.Count: Integer;
  149. begin
  150.    Count := number;
  151. end;
  152.  
  153. function tExecObject.TheList: pList;
  154. begin
  155.    TheList := elist;
  156. end;
  157.  
  158. procedure tExecObject.Error(err : integer);
  159. begin
  160.    Halt(err);
  161. end;
  162.  
  163. procedure tExecObject.Clear;
  164. var
  165.     temp : pNode;
  166. begin
  167.     while elist^.lh_Head <> @elist^.lh_Tail do begin
  168.         temp := elist^.lh_Head;
  169.         if assigned(temp) then begin
  170.             if assigned(temp^.ln_Name) then StrDispose(temp^.ln_Name);
  171.             RemHead(elist);
  172.             Dispose(temp);
  173.         end;
  174.     end;
  175. end;
  176.  
  177. procedure tExecObject.Delete( node : pNode);
  178. begin
  179.    if assigned(node) then begin
  180.       if assigned(node^.ln_Name) then StrDispose(node^.ln_Name);
  181.       Remove(node);
  182.       Dispose(node);
  183.       dec(number);
  184.    end;
  185. end;
  186.  
  187. function tExecObject.FindS(data : string): pNode;
  188. var
  189.    temp : pNode;
  190.    result : pNode;
  191.    p : PChar;
  192. begin
  193.    result := nil;
  194.    p := StrAlloc(length(data)+1);
  195.    StrPCopy(p,data);
  196.    if elist^.lh_Head^.ln_Succ <> nil then begin
  197.       temp := elist^.lh_Head;
  198.       while (temp^.ln_Succ <> nil) do begin
  199.           if (StrIComp(temp^.ln_Name,p)=0) then begin
  200.               result := temp;
  201.               break;
  202.           end;
  203.           temp := temp^.ln_Succ;
  204.       end;
  205.    end;
  206.    StrDispose(p);
  207.    FindS := result;
  208. end;
  209.  
  210. function tExecObject.Find(data : PChar): pNode;
  211. var
  212.    temp : pNode;
  213.    result : pNode;
  214. begin
  215.    result := nil;
  216.    if elist^.lh_Head^.ln_Succ <> nil then begin
  217.       temp := elist^.lh_Head;
  218.       while (temp^.ln_Succ <> nil) do begin
  219.           if (StrIComp(temp^.ln_Name,data)=0) then begin
  220.               result := temp;
  221.               break;
  222.           end;
  223.           temp := temp^.ln_Succ;
  224.       end;
  225.    end;
  226.    Find := result;
  227. end;
  228.  
  229. function tExecObject.First: pNode;
  230. var
  231.    head : pNode;
  232. begin
  233.    head := elist^.lh_Head;
  234.    if assigned(head^.ln_Succ) then First := head
  235.    else First := nil;
  236. end;
  237.  
  238. function tExecObject.Last: pNode;
  239. var
  240.    tail : pNode;
  241. begin
  242.    tail := elist^.lh_TailPred;
  243.    if assigned(tail^.ln_pred) then Last := tail
  244.    else Last := nil;
  245. end;
  246.  
  247. function tExecObject.Next(node : pNode): pNode;
  248. var
  249.    nxt : pNode;
  250. begin
  251.    nxt := node^.ln_Succ;
  252.    if assigned(nxt^.ln_Succ) then Next := nxt
  253.    else Next := nil;
  254. end;
  255.  
  256. function tExecObject.GetData(node : pNode): pChar;
  257. begin
  258.    if assigned(node) then begin
  259.       if assigned(node^.ln_Name) then GetData := node^.ln_Name
  260.       else GetData := nil;
  261.    end;
  262. end;
  263.  
  264. function tExecObject.IndexOf( num : integer): pNode;
  265. var
  266.    node : pNode;
  267.    i : integer;
  268. begin
  269.    if num <=Count then begin
  270.       node := elist^.lh_Head;
  271.       for i := 1 to num do begin
  272.          node := node^.ln_Succ;
  273.       end;
  274.       IndexOf := node;
  275.    end else IndexOf := nil;
  276. end;
  277.  
  278. function tExecObject.Prev( node : pNode): pNode;
  279. var
  280.    pred : pNode;
  281. begin
  282.    pred := node^.ln_Pred;
  283.    if assigned(pred^.ln_Pred) then Prev := pred
  284.    else Pred := nil;
  285. end;
  286.  
  287. function tExecObject.InsertS( data : string; node : pNode): pNode;
  288. var
  289.    temp : pNode;
  290. begin
  291.    temp := AddS(data);
  292.    if assigned(temp) then begin
  293.       if assigned(node) then begin
  294.           Remove(temp);
  295.           ExecInsert(elist,temp,node);
  296.       end;
  297.       InsertS := temp;
  298.    end else InsertS := nil;
  299. end;
  300.  
  301. function tExecObject.Insert( data : PChar; node : pNode): pNode;
  302. var
  303.    temp : pNode;
  304. begin
  305.    temp := Add(data);
  306.    if assigned(temp) then begin
  307.       if assigned(node) then begin
  308.           Remove(temp);
  309.           ExecInsert(elist,temp,node);
  310.       end;
  311.       Insert := temp;
  312.    end else Insert := nil;
  313. end;
  314.  
  315. procedure tExecObject.ToBuffer(var buf: PChar);
  316. var
  317.    i : integer;
  318.    temp : pNode;
  319. begin
  320.    buf[0] := #0;
  321.    temp := elist^.lh_Head;
  322.    for i := 1 to number do begin
  323.       if assigned(temp^.ln_Name) then begin
  324.          strcat(buf,temp^.ln_Name);
  325.          if i < number then strCat(buf,PChar(';'#0));
  326.       end;
  327.       temp := temp^.ln_Succ;
  328.    end;
  329. end;
  330.  
  331. procedure tExecObject.Bottom(node : pNode);
  332. begin
  333.    if assigned(node) then begin
  334.       Remove(node);
  335.       AddTail(elist,node);
  336.    end;
  337. end;
  338.  
  339. procedure tExecObject.Down(node : pNode);
  340. var
  341.    succ : pNode;
  342. begin
  343.    succ := node^.ln_Succ;
  344.    if assigned(node) and assigned(succ) then begin
  345.       Remove(node);
  346.       ExecInsert(elist,node,succ);
  347.    end;
  348. end;
  349.  
  350. procedure tExecObject.Top(node : pNode);
  351. begin
  352.    if assigned(node) then begin
  353.       Remove(node);
  354.       AddHead(elist,node);
  355.    end;
  356. end;
  357.  
  358. procedure tExecObject.Up(node : pNode);
  359. var
  360.    pred : pNode;
  361. begin
  362.    pred := node^.ln_Pred;
  363.    if assigned(node) and assigned(pred) then begin
  364.       pred := pred^.ln_Pred;
  365.       Remove(node);
  366.       ExecInsert(elist,node,pred);
  367.    end;
  368. end;
  369. procedure tExecObject.DeleteLast;
  370. var
  371.    temp : pNode;
  372. begin
  373.    temp := elist^.lh_TailPred;
  374.    if assigned(temp) then begin
  375.       if assigned(temp^.ln_Name) then StrDispose(temp^.ln_Name);
  376.       RemTail(elist);
  377.       Dispose(temp);
  378.       dec(number);
  379.    end;
  380. end;
  381.  
  382. procedure tExecObject.DeleteDup;
  383. var
  384.    temp : pNode;
  385.    nxt  : pNode;
  386. begin
  387.    temp := elist^.lh_Head;
  388.    while assigned(temp^.ln_Succ) do begin
  389.       nxt := temp^.ln_Succ;
  390.       if (StrIComp(temp^.ln_Name,nxt^.ln_Name)=0) then begin
  391.          Delete(temp);
  392.       end;
  393.       temp := nxt;
  394.    end;
  395. end;
  396.  
  397. function tExecObject.SizeOfList: longint;
  398. var
  399.    temp : pNode;
  400.    tsize : longint;
  401.    i : integer;
  402. begin
  403.    tsize := 0;
  404.    temp := elist^.lh_Head;
  405.    for i := 1 to number do begin
  406.       if assigned(temp^.ln_Name) then tsize := tsize + (StrLen(temp^.ln_Name));
  407.       temp := temp^.ln_Succ;
  408.    end;
  409.    SizeOfList := tsize;
  410. end;
  411.  
  412. procedure tExecObject.Sort;
  413. VAR
  414.     notfinished : BOOLEAN;
  415.     tfirst, second : pNode;
  416.     n   : Longint;
  417.  
  418. BEGIN
  419.     IF assigned(elist^.lh_Head^.ln_Succ) then begin
  420.         notfinished := True;
  421.         WHILE (notfinished) DO BEGIN
  422.             notfinished := FALSE;
  423.             tfirst := elist^.lh_Head;
  424.             IF assigned(tfirst) THEN BEGIN
  425.                 n := 1;
  426.                 second := tfirst^.ln_Succ;
  427.                 WHILE n <> number DO BEGIN
  428.                     n := n + 1;
  429.                     IF (StrIComp(tfirst^.ln_Name,second^.ln_Name)>0) THEN BEGIN
  430.                         Remove(tfirst);
  431.                         ExecInsert(elist,tfirst,second);
  432.                         notfinished := True;
  433.                     END ELSE
  434.                         tfirst := second;
  435.                     second := tfirst^.ln_Succ;
  436.                 END;
  437.             END;
  438.         END;
  439.     END;
  440. END;
  441.  
  442.  
  443. function tExecObject.UpDateS(node : pNode; data : string): boolean;
  444. var
  445.    result : boolean;
  446. begin
  447.    if assigned(node^.ln_Succ) then begin
  448.       if assigned(node^.ln_Name) then begin
  449.          StrDispose(node^.ln_Name);
  450.          node^.ln_Name := StrAlloc(length(data)+1);
  451.          if assigned(node^.ln_Name) then begin
  452.             StrPCopy(node^.ln_Name,data);
  453.             result := true;
  454.          end else result := false;
  455.       end;
  456.       UpDateS := result;
  457.    end;
  458. end;
  459.  
  460. function tExecObject.UpDate(node : pNode; data : PChar): boolean;
  461. var
  462.    result : boolean;
  463. begin
  464.    if assigned(node^.ln_Succ) then begin
  465.       if assigned(node^.ln_Name) then begin
  466.          StrDispose(node^.ln_Name);
  467.          node^.ln_Name := StrAlloc(strlen(data)+1);
  468.          if assigned(node^.ln_Name) then begin
  469.             StrCopy(node^.ln_Name,data);
  470.             result := true;
  471.          end else result := false;
  472.       end;
  473.       UpDate := result;
  474.    end;
  475. end;
  476.  
  477. function tExecObject.FileToList(thefile : PChar): boolean;
  478. begin
  479.     FileToList := FileToListS(strpas(thefile));
  480. end;
  481.  
  482. function tExecObject.FileToListS(thefile : String): boolean;
  483. var
  484.    Inf : Text;
  485.    temp : pNode;
  486.    buffer : PChar;
  487.    buf : Array [0..500] of Char;
  488. begin
  489.    buffer := @buf;
  490.    Assign(Inf, thefile);
  491.    {$I-}
  492.    Reset(Inf);
  493.    {$I+}
  494.    if IOResult = 0 then begin
  495.       while not eof(Inf) do begin
  496.       { I don't want end of lines here (for use with amiga listviews)
  497.         just change this if you need newline characters.
  498.       }
  499.          Read(Inf, buffer);
  500.          temp := Add(buffer);
  501.          Readln(inf, buffer);
  502.       end;
  503.       CLose(Inf);
  504.       FileToListS := true;
  505.    end else FileToListS := false;
  506. end;
  507.  
  508. function tExecObject.ListToFile(TheFile : PChar): Boolean;
  509. begin
  510.     ListToFile := ListToFileS(strpas(TheFile));
  511. end;
  512.  
  513. function tExecObject.ListToFileS(TheFile : String): Boolean;
  514. VAR
  515.     Out      : Text;
  516.     dummy    : Longint;
  517.     temp     : pNode;
  518. begin
  519.     Assign(Out, TheFile);
  520.     {$I-}
  521.     Rewrite(Out);
  522.     {$I+}
  523.     if IOResult = 0 then begin
  524.        IF number > 0 THEN BEGIN
  525.           temp := elist^.lh_Head;
  526.           FOR dummy := 1 TO number DO BEGIN
  527.              IF temp^.ln_Name <> NIL THEN BEGIN
  528.                 {
  529.                   Have to check the strlen here, if it's an
  530.                   empty pchar fpc will write out a #0
  531.                 }
  532.                 if strlen(temp^.ln_Name) > 0 then
  533.                    WriteLN(Out,temp^.ln_Name)
  534.                 else writeln(Out);
  535.              END;
  536.              temp := temp^.ln_Succ;
  537.           END;
  538.         END;
  539.         Close(Out);
  540.         ListToFileS := True;
  541.     END Else ListToFileS := False;
  542. END;
  543.  
  544.  
  545. end.
  546.  
  547.