home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 3 / goldfish_volume_3.bin / files / fish / disks / d1115.lha / Programs / CX / Quelltext / CXFileIO.mod < prev    next >
Encoding:
Modula Implementation  |  1995-06-06  |  5.7 KB  |  232 lines

  1. IMPLEMENTATION MODULE CXFileIO;
  2.  
  3. (*$ DEFINE DEBUG:=FALSE *)
  4.  
  5. IMPORT
  6.     dd:DosD, dl:DosL, ds:DosSupport,
  7.     ed:ExecD, el:ExecL, es:ExecSupport,
  8.     String,
  9.     cxw:CXWindow;
  10.  
  11. (*$ IF DEBUG *)
  12. IMPORT io:InOut;
  13. (*$ ENDIF *)
  14.  
  15. FROM SYSTEM IMPORT
  16.     ADDRESS, CAST, ADR;
  17.  
  18.  
  19.  
  20. TYPE
  21.     ListItem = ARRAY [0..39] OF CHAR;
  22.     StrPtr = POINTER TO ARRAY [0..127] OF CHAR;
  23.  
  24.  
  25.  
  26. VAR
  27.     removeList: ed.ListPtr;
  28.     removeItems: POINTER TO ARRAY [0..99] OF ListItem;
  29.     itemCount: INTEGER;
  30.  
  31. (* --------------------------------------------------------------- *)
  32.  
  33. PROCEDURE AddToRemoveList (VAR n: INTEGER; string: ARRAY OF CHAR);
  34. (* Fügt den neuen Broker zur "nur * entfernen"-Liste dazu. *)
  35. VAR
  36.     newnode: ed.NodePtr;
  37. BEGIN
  38.     (*$ IF DEBUG *)
  39.         io.WriteString ("cxf.AddToRemoveList...\n");
  40.     (*$ ENDIF *)
  41.  
  42.     newnode := el.AllocMem(SIZE(ed.Node), ed.MemReqSet{ed.memClear});
  43.     IF newnode # NIL THEN
  44.         String.Copy (removeItems^[n], string);
  45.         newnode^.name := ADR(removeItems^[n]);
  46.         el.AddTail (removeList, newnode);
  47.         INC (n);
  48.     END;
  49. END AddToRemoveList;
  50.  
  51. (* --------------------------------------------------------------- *)
  52.  
  53. PROCEDURE LoadRemoveList (filename: ADDRESS);
  54. (* "nur * entfernen"-Liste laden *)
  55. VAR
  56.     hdl: dd.FileHandlePtr;
  57.     li: LONGINT;
  58.     newstring: ARRAY [0..127] OF CHAR;
  59.     n, nc: INTEGER;
  60.     c: CHAR;
  61. BEGIN
  62.     (*$ IF DEBUG *)
  63.         io.WriteString ("cxf.LoadRemoveList...\n");
  64.     (*$ ENDIF *)
  65.  
  66.     IF removeList # NIL THEN
  67.         hdl := ds.Open(filename, dd.readOnly);
  68.  
  69.         IF hdl # NIL THEN
  70.             (* LineFeeds zählen: *)
  71.             itemCount := 0;
  72.             REPEAT
  73.                 li := dl.Read(hdl, ADR(c), 1);
  74.                 IF c = CHR(10) THEN
  75.                     INC (itemCount);
  76.                 END;
  77.             UNTIL li <= 0;
  78.             li := dl.Seek(hdl, 0, dd.beginning);
  79.  
  80.             (* Speicher für Strings reservieren: *)
  81.             removeItems := el.AllocMem(SIZE(ListItem)*itemCount, ed.MemReqSet{ed.memClear});
  82.             IF removeItems # NIL THEN
  83.                 n := 0;
  84.                 REPEAT
  85.                     newstring := "";
  86.                     nc := 0;
  87.                     LOOP
  88.                         li := dl.Read(hdl, ADR(c), 1);
  89.                         IF (li <= 0) OR (c = "\n") THEN EXIT; END;
  90.                         newstring[nc] := c;
  91.                         INC (nc);
  92.                     END;
  93.                     newstring[nc] := 0C;
  94.                     AddToRemoveList (n, newstring);
  95.                 UNTIL (li = -1) OR (li = 0);
  96.             END;
  97.             ds.Close (hdl);
  98.         END;
  99.     END;
  100. END LoadRemoveList;
  101.  
  102. (* --------------------------------------------------------------- *)
  103.  
  104. PROCEDURE IsInRemoveList (name: ADDRESS) : BOOLEAN;
  105. (* Überprüft, ob der übergebene Broker(name) in der "nur * entfernen"-
  106.  * Liste vorhanden ist und gibt dann TRUE zurück, FALSE, wenn nicht.
  107.  *)
  108. BEGIN
  109.     (*$ IF DEBUG *)
  110.         io.WriteString ("cxf.IsInRemoveList...\n");
  111.     (*$ ENDIF *)
  112.  
  113.     IF removeList # NIL THEN
  114.         RETURN el.FindName(removeList, name) # NIL;
  115.     END;
  116. END IsInRemoveList;
  117.  
  118. (* --------------------------------------------------------------- *)
  119.  
  120. PROCEDURE FreeRemoveList;
  121. (* Belegte Resourcen wieder freigeben. *)
  122. VAR
  123.     node, nnode: ed.NodePtr;
  124. BEGIN
  125.     (*$ IF DEBUG *)
  126.         io.WriteString ("cxf.FreeRemoveList...\n");
  127.     (*$ ENDIF *)
  128.  
  129.     IF removeList # NIL THEN
  130.         IF removeItems # NIL THEN
  131.             node := removeList^.head;
  132.             WHILE node^.succ # NIL DO
  133.                 nnode := node^.succ;
  134.                 el.FreeMem (node, SIZE(ed.Node));
  135.                 node := nnode;
  136.             END;
  137.  
  138.             el.FreeMem(removeItems, itemCount*SIZE(ListItem));
  139.             removeItems := NIL;
  140.         END;
  141.         el.FreeMem (removeList, SIZE(ed.List));
  142.         removeList := NIL;
  143.     END;
  144. END FreeRemoveList;
  145.  
  146. (* --------------------------------------------------------------- *)
  147.  
  148. CONST
  149.     OPTIONSCOUNT = 4;
  150.  
  151. PROCEDURE LoadOptions (VAR options: cxw.Options);
  152. VAR
  153.     hdl: dd.FileHandlePtr;
  154.     li: LONGINT;
  155.     opt: ARRAY [0..OPTIONSCOUNT-1] OF CHAR;
  156. BEGIN
  157.     (*$ IF DEBUG *)
  158.         io.WriteString ("cxf.LoadOptions...\n");
  159.     (*$ ENDIF *)
  160.  
  161.     hdl := ds.Open(ADR("S:CX.prefs"), dd.readOnly);
  162.     IF hdl # NIL THEN
  163.         li := dl.Read(hdl, ADR(opt), OPTIONSCOUNT);
  164.         ds.Close (hdl);
  165.         WITH options DO
  166.             AUTOSIZE := opt[0] = "1";
  167.             REQUESTER := opt[1] = "1";
  168.             REMOVEONLY := opt[2] = "1";
  169.             SIZEABLE := opt[3] = "1";
  170.         END;
  171.     END;
  172. END LoadOptions;
  173.  
  174. PROCEDURE SaveOptions (VAR options: cxw.Options);
  175. VAR
  176.     hdl: dd.FileHandlePtr;
  177.     li: LONGINT;
  178.     opt: ARRAY [0..OPTIONSCOUNT-1] OF CHAR;
  179. BEGIN
  180.     (*$ IF DEBUG *)
  181.         io.WriteString ("cxf.SaveOptions...\n");
  182.     (*$ ENDIF *)
  183.  
  184.     WITH options DO
  185.         IF AUTOSIZE THEN
  186.             opt[0] := "1";
  187.         ELSE
  188.             opt[0] := "0";
  189.         END;
  190.         IF REQUESTER THEN
  191.             opt[1] := "1";
  192.         ELSE
  193.             opt[1] := "0";
  194.         END;
  195.         IF REMOVEONLY THEN
  196.             opt[2] := "1";
  197.         ELSE
  198.             opt[2] := "0";
  199.         END;
  200.         IF SIZEABLE THEN
  201.             opt[3] := "1";
  202.         ELSE
  203.             opt[3] := "0";
  204.         END;
  205.     END;
  206.     hdl := ds.Open(ADR("S:CX.prefs"), dd.newFile);
  207.     IF hdl # NIL THEN
  208.         li := dl.Write(hdl, ADR(opt), OPTIONSCOUNT);
  209.         ds.Close (hdl);
  210.     END;
  211. END SaveOptions;
  212.  
  213. (* --------------------------------------------------------------- *)
  214.  
  215. BEGIN
  216.     (*$ IF DEBUG *)
  217.         io.WriteString ("Module CXFileIO loaded...\n");
  218.     (*$ ENDIF *)
  219.  
  220.     removeList := el.AllocMem(SIZE(ed.List), ed.MemReqSet{ed.memClear});
  221.     IF removeList # NIL THEN
  222.         es.NewList (removeList);
  223.     END;
  224.  
  225. CLOSE
  226.     FreeRemoveList;
  227.  
  228.     (*$ IF DEBUG *)
  229.         io.WriteString ("Module CXFileIO closed.\n");
  230.     (*$ ENDIF *)
  231. END CXFileIO.
  232.