home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / dev / m2 / CycloneModules.lha / modules / txt / FileSystem.mod < prev    next >
Text File  |  1995-09-20  |  7KB  |  325 lines

  1. IMPLEMENTATION MODULE FileSystem;
  2.  
  3. (* (C) Copyright 1994 Marcel Timmermans. All rights reserved. *)
  4.  
  5. FROM SYSTEM IMPORT ADR,ADDRESS,BYTE;
  6. IMPORT el:ExecL,
  7.        ed:ExecD,
  8.        dd:DosD,
  9.        dl:DosL;
  10.  
  11. CONST
  12.   maxFileName=255;
  13.  
  14. TYPE
  15.   FileListPtr=POINTER TO FileList;
  16.   FileList=RECORD
  17.     next:FileListPtr;
  18.     fsFile:File;
  19.     nameString:ARRAY[0..maxFileName] OF CHAR;
  20.   END;
  21.  
  22. VAR
  23.   inUsedFiles:FileListPtr;
  24.  
  25.  
  26. PROCEDURE ClearFile(VAR file:File);
  27. BEGIN
  28.   WITH file DO (* Clear file *)
  29.     handle:=NIL;
  30.     eof:=FALSE;
  31.     mode:=FileModeSet{};
  32.     bufPos:=0;
  33.     bufLen:=0;
  34.     pos:=0;
  35.     res:=notdone;
  36.   END;
  37. END ClearFile;
  38.  
  39. PROCEDURE Lookup(VAR file:File; name:ARRAY OF CHAR;new:BOOLEAN);
  40. (*$ autoRegs- *)
  41. VAR
  42.   am:LONGINT;
  43.   i:INTEGER;
  44.   nfl:FileListPtr;
  45. BEGIN
  46.   ClearFile(file);
  47.   nfl:=el.AllocMem(SIZE(FileList),ed.MemReqSet{ed.memClear});
  48.   IF nfl#NIL THEN
  49.     i:=0;
  50.     WHILE (i<maxFileName) & (i<=HIGH(name)) & (name[i]#0C) DO
  51.       nfl^.nameString[i]:=name[i];
  52.       INC(i);
  53.     END;
  54.     nfl^.nameString[i]:=0C;
  55.     IF new THEN 
  56.         am:=dd.newFile; file.mode:=FileModeSet{write};
  57.     ELSE 
  58.         am:=dd.oldFile; file.mode:=FileModeSet{read};
  59.     END;
  60.     file.handle:=dl.Open(ADR(nfl^.nameString),am);
  61.     IF file.handle=NIL THEN
  62.       file.res:=openfileErr;
  63.     ELSE
  64.       WITH nfl^ DO
  65.         fsFile:=file;
  66.         next:=inUsedFiles;
  67.       END;
  68.       inUsedFiles:=nfl;
  69.       file.res:=done;
  70.     END;
  71.   ELSE
  72.     file.res:=memErr;
  73.   END;
  74. END Lookup;
  75.  
  76. PROCEDURE ReadBytes(VAR file:File; adr:ADDRESS; size:LONGINT);
  77. VAR
  78.   actual,i,bpos:LONGINT;
  79.   bptr:POINTER TO CHAR;
  80. BEGIN
  81.   WITH file DO
  82.     i:=0; bpos:=bufPos;
  83.     IF adr=NIL THEN res:=bufErr; END;
  84.     bptr:=adr;
  85.     WHILE i<size DO
  86.       IF (bpos=bufLen) THEN
  87.         bufPos:=0; bpos:=0;
  88.         bufLen:=dl.Read(handle,ADR(buffer[0]),BufSize);
  89.         IF bufLen<0 THEN res:=readErr; RETURN END;
  90.         IF bufLen=0 THEN eof:=TRUE; RETURN; END;
  91.       END;
  92.       bptr^:=buffer[bpos]; INC(bptr); INC(bpos);
  93.       INC(i);
  94.     END;
  95.     bufPos:=bpos;
  96.     INC(pos,size);
  97.     res:=done;
  98.   END;
  99. END ReadBytes;
  100.  
  101. PROCEDURE ReadChar(VAR file:File; VAR ch:CHAR);
  102. BEGIN
  103.   WITH file DO
  104.     IF (bufPos=bufLen) THEN
  105.       bufPos:=0;
  106.       bufLen:=dl.Read(handle,ADR(buffer[0]),BufSize);
  107.       IF bufLen<0 THEN res:=readErr; RETURN END;
  108.       IF bufLen=0 THEN eof:=TRUE; RETURN; END;
  109.     END;
  110.     ch:=buffer[bufPos];
  111.     INC(bufPos);
  112.     INC(pos);
  113.   END;
  114. END ReadChar;
  115.  
  116. PROCEDURE ReadByteBlock(VAR file:File; VAR block:ARRAY OF BYTE);
  117. VAR
  118.   actual,i,bpos:LONGINT;
  119. BEGIN
  120.   WITH file DO
  121.     i:=0; bpos:=bufPos;
  122.     WHILE i<HIGH(block)+1 DO
  123.       IF (bpos=bufLen) THEN
  124.         bufPos:=0; bpos:=0;
  125.         bufLen:=dl.Read(handle,ADR(buffer[0]),BufSize);
  126.         IF bufLen<0 THEN res:=readErr; RETURN END;
  127.         IF bufLen=0 THEN eof:=TRUE; RETURN; END;
  128.       END;
  129.       block[i]:=buffer[bpos]; INC(bpos);
  130.       INC(i);
  131.     END;
  132.     bufPos:=bpos;
  133.     INC(pos,i);
  134.     res:=done;
  135.   END;
  136. END ReadByteBlock;
  137.  
  138. PROCEDURE FlushBuf(VAR file:File):BOOLEAN;
  139. VAR i,j,len:LONGINT;
  140. BEGIN
  141.   i:=0;
  142.   j:=file.bufPos;
  143.   file.bufPos:=0;
  144.   REPEAT
  145.     len:=dl.Write(file.handle,ADR(file.buffer[i]),j);
  146.     IF len<0 THEN
  147.       file.res:=writeErr;
  148.       RETURN FALSE;
  149.     END;
  150.     INC(i,len);
  151.     DEC(j,len);
  152.   UNTIL j<=0;
  153.   file.res:=done;
  154.   RETURN TRUE;
  155. END FlushBuf;
  156.  
  157. PROCEDURE WriteBytes(VAR file:File; adr:ADDRESS; size:LONGINT);
  158. VAR
  159.   actual,i,bpos:LONGINT;
  160.   bptr:POINTER TO CHAR;
  161. BEGIN
  162.   WITH file DO
  163.     i:=0; bpos:=bufPos;
  164.     IF adr=NIL THEN res:=bufErr; END;
  165.     bptr:=adr;
  166.     WHILE i<size DO
  167.       IF (bpos=BufSize) THEN
  168.         bufPos:=bpos; bpos:=0;
  169.         IF ~FlushBuf(file) THEN res:=writeErr; RETURN; END;
  170.       END;
  171.       buffer[bpos]:=bptr^; INC(bptr); INC(bpos);
  172.       INC(i);
  173.     END;
  174.     bufPos:=bpos;
  175.     INC(pos,size);
  176.     res:=done;
  177.   END;
  178. END WriteBytes;
  179.  
  180. PROCEDURE WriteChar(VAR file:File; ch:CHAR);
  181. BEGIN
  182.   WITH file DO
  183.     IF (bufPos=BufSize) THEN
  184.       IF ~FlushBuf(file) THEN res:=writeErr; RETURN; END;
  185.     END;
  186.     buffer[bufPos]:=ch;
  187.     INC(bufPos);
  188.     INC(pos);
  189.   END;
  190. END WriteChar;
  191.  
  192. PROCEDURE WriteByteBlock(VAR file:File; VAR block:ARRAY OF BYTE);
  193. VAR
  194.   actual,i,bpos:LONGINT;
  195.   bptr:POINTER TO CHAR;
  196. BEGIN
  197.   WITH file DO
  198.     i:=0; bpos:=bufPos;
  199.     WHILE i<HIGH(block)+1 DO
  200.       IF (bpos=BufSize) THEN
  201.         bufPos:=bpos; bpos:=0;
  202.         IF ~FlushBuf(file) THEN res:=writeErr; RETURN; END;
  203.       END;
  204.       buffer[bpos]:=CHAR(block[i]); INC(bpos);
  205.       INC(i);
  206.     END;
  207.     bufPos:=bpos;
  208.     INC(pos,i);
  209.     res:=done;
  210.   END;
  211. END WriteByteBlock;
  212.  
  213. PROCEDURE GetPos(VAR file:File; VAR Pos:LONGINT);
  214. BEGIN
  215.   Pos:=file.pos;
  216. END GetPos;
  217.  
  218. PROCEDURE SetPos(VAR file:File;Pos:LONGINT);
  219. BEGIN
  220.   WITH file DO
  221.     IF res=done THEN
  222.       IF dl.Seek(handle,Pos,dd.beginning)=-1 THEN
  223.         res:=seekErr;
  224.       ELSE
  225.         bufLen:=0;
  226.         bufPos:=0;
  227.         pos:=Pos;
  228.       END;
  229.     END;
  230.   END;
  231. END SetPos;
  232.  
  233. PROCEDURE Close(VAR file:File);
  234. VAR f,prev:FileListPtr;
  235. BEGIN
  236.   f:=inUsedFiles; prev:=NIL;
  237.   file.res:=notdone;
  238.   WHILE f#NIL DO
  239.     IF f^.fsFile.handle=file.handle THEN
  240.       (* match*)
  241.       IF prev=NIL THEN
  242.         inUsedFiles:=f^.next;
  243.       ELSE
  244.        prev^.next:=f^.next;
  245.       END;
  246.       IF write IN file.mode THEN
  247.         IF FlushBuf(file) THEN END;
  248.       END;
  249.       dl.Close(file.handle);
  250.       el.FreeMem(f,SIZE(FileList));
  251.       ClearFile(file);
  252.       file.res:=done;
  253.       RETURN;
  254.     END;
  255.     prev:=f;
  256.     f:=f^.next;
  257.   END;
  258. END Close;
  259.  
  260. PROCEDURE Delete(VAR file:File);
  261. VAR f,prev:FileListPtr;
  262. BEGIN
  263.   f:=inUsedFiles; prev:=NIL;
  264.   WHILE f#NIL DO
  265.     IF f^.fsFile.handle=file.handle THEN
  266.       (* match*)
  267.       IF prev=NIL THEN
  268.         inUsedFiles:=f^.next;
  269.       ELSE
  270.        prev^.next:=f^.next;
  271.       END;
  272.       IF write IN file.mode THEN
  273.         IF FlushBuf(file) THEN END;
  274.       END;
  275.       dl.Close(file.handle); file.handle:=NIL;
  276.       IF dl.DeleteFile(ADR(f^.nameString)) THEN 
  277.         file.res:=done 
  278.       ELSE 
  279.         file.res:=deleteErr; 
  280.       END;
  281.       el.FreeMem(f,SIZE(FileList));
  282.       RETURN;
  283.     END;
  284.     prev:=f;
  285.     f:=f^.next;
  286.   END;
  287. END Delete;
  288.  
  289. PROCEDURE Length(VAR file:File; VAR len:LONGINT);
  290. VAR old:LONGINT;
  291. BEGIN
  292.   WITH file DO
  293.     IF res=done THEN
  294.       IF read IN mode THEN 
  295.         old:=dl.Seek(handle,0,dd.end);
  296.         len:=dl.Seek(handle,old,dd.beginning);
  297.       ELSE (* write *)
  298.         len:=pos;
  299.       END; 
  300.     END;
  301.   END;
  302. END Length;
  303.  
  304. PROCEDURE CleanFileSystem;
  305. VAR f,prev:FileListPtr;
  306. BEGIN
  307.   f:=inUsedFiles; prev:=NIL;
  308.   WHILE f#NIL DO
  309.     IF write IN f^.fsFile.mode THEN
  310.       IF FlushBuf(f^.fsFile) THEN END;
  311.     END;
  312.     IF f^.fsFile.handle#NIL THEN dl.Close(f^.fsFile.handle); END;
  313.     prev:=f;
  314.     f:=f^.next;
  315.     el.FreeMem(prev,SIZE(FileList));
  316.   END;
  317.   inUsedFiles:=NIL;
  318. END CleanFileSystem;
  319.  
  320. BEGIN
  321.  inUsedFiles:=NIL;
  322. CLOSE
  323.  CleanFileSystem;
  324. END FileSystem.
  325.