FILESYST.MOD 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. (* Release 3.10 *)
  2. (*-------------------------------------------------------------------------*
  3. * *
  4. * FILESYST.MOD - File utilities *
  5. * *
  6. * COPYRIGHT (C) 1987..1992 Clarion Software Corporation. *
  7. * All Rights Reserved *
  8. * *
  9. *--------------------------------------------------------------------------*)
  10. (*# call(o_a_copy=>off) *)
  11. (*%F _fdata *)
  12. (*# call(seg_name => null) *)
  13. (*%E *)
  14. (*# data(seg_name => null) *)
  15. (*# check(stack=>off,
  16. index=>off,
  17. range=>off,
  18. overflow=>off,
  19. nil_ptr=>off) *)
  20. IMPLEMENTATION MODULE FileSystem;
  21. IMPORT Str, Storage, CoreIO;
  22. VAR
  23. LastTempExt: ARRAY [0..8] OF CHAR;
  24. PROCEDURE GetTempFileName(VAR Name: FileNameType): BOOLEAN;
  25. VAR
  26. n, p: INTEGER;
  27. BEGIN
  28. n:=Str.Length(Name)-8;
  29. IF n < 0 THEN
  30. RETURN FALSE;
  31. END;
  32. p:=0;
  33. WHILE p < 8 DO (* append previous extension *)
  34. Name[n]:=LastTempExt[p];
  35. INC(p);
  36. INC(n);
  37. END;
  38. DEC(n, 5);
  39. p:=3; (* if yes increment counters *)
  40. REPEAT
  41. LOOP
  42. IF Name[n] < '9' THEN
  43. INC(Name[n]);
  44. INC(LastTempExt[p]);
  45. EXIT;
  46. END;
  47. IF p >= 0 THEN
  48. Name[n]:='0';
  49. DEC(n);
  50. LastTempExt[p]:='0';
  51. DEC(p);
  52. ELSE
  53. RETURN FALSE;
  54. END;
  55. END;
  56. UNTIL NOT FIO.Exists(Name);
  57. RETURN TRUE;
  58. END GetTempFileName;
  59. PROCEDURE SetErrorType(VAR f: File);
  60. BEGIN
  61. CASE FIO.IOresult() OF
  62. | 0 :
  63. f.res:=done;
  64. | 1 :
  65. f.res:=callerror;
  66. | 2 :
  67. f.res:=unknownfile;
  68. | 3 :
  69. f.res:=unknownpath;
  70. | 4 :
  71. f.res:=toomanyfiles;
  72. | 5 :
  73. f.res:=softprotected;
  74. | 15 :
  75. f.res:=unknownmedium;
  76. | 19 :
  77. f.res:=hardprotected;
  78. ELSE
  79. f.res:=notdone;
  80. END;
  81. END SetErrorType;
  82. PROCEDURE Create(VAR f: File; Device: ARRAY OF CHAR);
  83. BEGIN
  84. f.flags:=FlagSet{};
  85. f.eof:=FALSE;
  86. f.fileno:=MAX(CARDINAL);
  87. Str.Copy(f.name, Device);
  88. Str.Append(f.name, '\');
  89. Str.Append(f.name, 'FSYSXXXX.XXX');
  90. IF GetTempFileName(f.name) = FALSE THEN
  91. f.res:=toomanyfiles;
  92. RETURN;
  93. END;
  94. f.fileno:=FIO.Create(f.name);
  95. IF f.fileno = MAX(CARDINAL) THEN
  96. SetErrorType(f);
  97. RETURN;
  98. END;
  99. Storage.ALLOCATE(f.buffer, BufferSize);
  100. FIO.AssignBuffer(f.fileno, f.buffer^);
  101. INCL(f.flags, tf);
  102. f.res:=done;
  103. RETURN;
  104. END Create;
  105. PROCEDURE Close(VAR f: File);
  106. BEGIN
  107. FIO.Close(f.fileno);
  108. Storage.DEALLOCATE(f.buffer, BufferSize);
  109. IF tf IN f.flags THEN
  110. FIO.Erase(f.name);
  111. END;
  112. f.flags:=FlagSet{};
  113. f.fileno:=MAX(CARDINAL);
  114. f.res:=done;
  115. END Close;
  116. PROCEDURE Lookup(VAR f: File; Filename: ARRAY OF CHAR; New: BOOLEAN);
  117. VAR
  118. OK: BOOLEAN;
  119. BEGIN
  120. f.flags:=FlagSet{};
  121. f.eof:=FALSE;
  122. f.fileno:=MAX(CARDINAL);
  123. OK:=TRUE;
  124. Str.Copy(f.name, Filename);
  125. IF FIO.Exists(f.name) THEN
  126. f.fileno:=FIO.Open(f.name);
  127. IF f.fileno = MAX(CARDINAL) THEN
  128. OK:=FALSE;
  129. END;
  130. ELSIF New THEN
  131. f.fileno:=FIO.Create(f.name);
  132. IF f.fileno = MAX(CARDINAL) THEN
  133. OK:=FALSE;
  134. END;
  135. ELSE
  136. OK:=FALSE;
  137. END;
  138. IF NOT OK THEN
  139. f.res:=notdone;
  140. RETURN;
  141. END;
  142. Storage.ALLOCATE(f.buffer, BufferSize);
  143. FIO.AssignBuffer(f.fileno, f.buffer^);
  144. f.res:=done;
  145. RETURN;
  146. END Lookup;
  147. PROCEDURE Rename(VAR f: File; Filename: ARRAY OF CHAR);
  148. VAR
  149. NewName: FileNameType;
  150. BEGIN
  151. EXCL(f.flags, tf);
  152. Close(f);
  153. IF Filename[0] = CHAR(0) THEN
  154. Str.Copy(NewName, '\');
  155. Str.Append(NewName, 'FSYSXXXX.XXX');
  156. IF GetTempFileName(NewName) = FALSE THEN
  157. f.res:=toomanyfiles;
  158. RETURN;
  159. END;
  160. FIO.Rename(f.name, NewName);
  161. Lookup(f, NewName, FALSE);
  162. IF f.res # done THEN RETURN END;
  163. INCL(f.flags, tf);
  164. ELSE
  165. FIO.Rename(f.name, Filename);
  166. Lookup(f, Filename, FALSE);
  167. IF f.res # done THEN RETURN END;
  168. END;
  169. f.res:=done;
  170. END Rename;
  171. PROCEDURE SetRead(VAR f: File);
  172. VAR
  173. CurrentPos: LONGCARD;
  174. BEGIN
  175. CurrentPos:=FIO.GetPos(f.fileno);
  176. FIO.Seek(f.fileno, CurrentPos);
  177. f.flags:= f.flags - FlagSet{wr, mo};
  178. INCL(f.flags, rd);
  179. f.res:=done;
  180. END SetRead;
  181. PROCEDURE SetWrite(VAR f: File);
  182. VAR
  183. CurrentPos: LONGCARD;
  184. BEGIN
  185. CurrentPos:=FIO.GetPos(f.fileno);
  186. FIO.Seek(f.fileno, CurrentPos);
  187. f.flags:=f.flags - FlagSet{rd ,mo};
  188. f.flags:=f.flags + FlagSet{pi, wr};
  189. f.res:=done;
  190. END SetWrite;
  191. PROCEDURE SetModify(VAR f: File);
  192. VAR
  193. CurrentPos: LONGCARD;
  194. BEGIN
  195. CurrentPos:=FIO.GetPos(f.fileno);
  196. FIO.Seek(f.fileno, CurrentPos);
  197. f.flags:=f.flags - FlagSet{rd, wr};
  198. INCL(f.flags, mo);
  199. f.res:=done;
  200. END SetModify;
  201. PROCEDURE SetOpen(VAR f: File);
  202. VAR
  203. CurrentPos: LONGCARD;
  204. BEGIN
  205. CurrentPos:=FIO.GetPos(f.fileno);
  206. FIO.Seek(f.fileno, CurrentPos);
  207. f.flags:=f.flags - FlagSet{rd, mo, wr};
  208. f.res:=done;
  209. END SetOpen;
  210. PROCEDURE FillBuffer(f: File);
  211. VAR
  212. F: FIO.FileInf;
  213. NumRead: INTEGER;
  214. BEGIN
  215. F:=FIO.GetStreamPointer(f.fileno);
  216. WITH F^ DO
  217. IF (Flag = {}) OR ((Flag * (CoreIO._F_ERR + CoreIO._F_OUT)) # {}) THEN
  218. f.res:=callerror;
  219. RETURN
  220. END;
  221. IF (Flag >= CoreIO._F_EOF) THEN
  222. f.eof:=TRUE;
  223. f.res:=notdone;
  224. RETURN;
  225. END;
  226. IF (Flag >= CoreIO._F_RST) THEN
  227. Flag := Flag - CoreIO._F_RST;
  228. END;
  229. NumRead := CoreIO.read(Handle, Base, Size);
  230. Ptr := Base;
  231. IF (NumRead = -1) AND (NumRead # Size) THEN
  232. Flag := Flag + CoreIO._F_ERR;
  233. Cnt := 0;
  234. f.res:=notdone;
  235. RETURN;
  236. END;
  237. Cnt := NumRead; (* reset pointers *)
  238. Flag := Flag + CoreIO._F_IN; (* set input flag *)
  239. IF NumRead = 0 THEN
  240. Flag := Flag + CoreIO._F_EOF; (* end of file *)
  241. f.eof:=TRUE;
  242. f.res:=notdone;
  243. RETURN;
  244. END;
  245. f.res:=done;
  246. RETURN;
  247. END;
  248. END FillBuffer;
  249. PROCEDURE Doio(VAR f: File);
  250. VAR
  251. CurPos: LONGCARD;
  252. BEGIN
  253. IF (rd IN f.flags) THEN
  254. CurPos:=FIO.GetPos(f.fileno);
  255. FIO.Seek(f.fileno, CurPos);
  256. FillBuffer(f);
  257. ELSIF (wr IN f.flags) THEN
  258. FIO.Flush(f.fileno);
  259. ELSIF (mo IN f.flags) THEN
  260. FIO.Flush(f.fileno);
  261. FillBuffer(f);
  262. ELSE
  263. f.res:=done;
  264. END;
  265. END Doio;
  266. PROCEDURE SetPos(VAR f: File; HighPos, LowPos: CARDINAL);
  267. VAR
  268. Pos: LONGCARD;
  269. BEGIN
  270. Pos:=LONGCARD(LowPos)+LONGCARD(HighPos)<<16;
  271. FIO.Seek(f.fileno, Pos);
  272. INCL(f.flags, pi);
  273. f.res:=done;
  274. END SetPos;
  275. PROCEDURE GetPos(VAR f: File; VAR HighPos, LowPos: CARDINAL);
  276. VAR
  277. Pos: LONGCARD;
  278. BEGIN
  279. Pos:=FIO.GetPos(f.fileno);
  280. IF Pos = MAX(LONGCARD) THEN
  281. SetErrorType(f);
  282. RETURN;
  283. END;
  284. LowPos:=CARDINAL(Pos);
  285. HighPos:=CARDINAL(Pos>>16);
  286. f.res:=done;
  287. END GetPos;
  288. PROCEDURE Length(VAR f: File; VAR HighPos, LowPos: CARDINAL);
  289. VAR
  290. Len: LONGCARD;
  291. BEGIN
  292. Len:=FIO.Size(f.fileno);
  293. IF Len = MAX(LONGCARD) THEN
  294. SetErrorType(f);
  295. RETURN;
  296. END;
  297. LowPos:=CARDINAL(Len);
  298. HighPos:=CARDINAL(Len>>16);
  299. f.res:=done;
  300. RETURN;
  301. END Length;
  302. PROCEDURE Reset(VAR f: File);
  303. BEGIN
  304. SetPos(f, 0, 0);
  305. f.flags:=f.flags - FlagSet{rd, mo, wr};
  306. f.eof:=FALSE;
  307. f.res:=done;
  308. END Reset;
  309. PROCEDURE Again(VAR f: File);
  310. BEGIN
  311. IF f.flags * FlagSet{mo, rd} # FlagSet{} THEN
  312. INCL(f.flags, ag);
  313. f.res:=done;
  314. ELSE
  315. f.res:=callerror;
  316. END;
  317. RETURN;
  318. END Again;
  319. PROCEDURE ReadWord(VAR f: File; VAR w: WORD);
  320. BEGIN
  321. IF wr IN f.flags THEN
  322. f.res:=callerror;
  323. RETURN;
  324. ELSIF f.flags * FlagSet{mo, rd} = FlagSet{} THEN
  325. INCL(f.flags, rd);
  326. END;
  327. FIO.EOF:=FALSE;
  328. IF ag IN f.flags THEN
  329. EXCL(f.flags, ag);
  330. w:=f.again;
  331. f.res:=done;
  332. RETURN;
  333. END;
  334. IF FIO.RdBin(f.fileno, w, SIZE(WORD)) # SIZE(WORD) THEN
  335. SetErrorType(f);
  336. f.eof:=FIO.EOF;
  337. ELSE
  338. f.again:=w;
  339. f.res:=done;
  340. END;
  341. RETURN;
  342. END ReadWord;
  343. PROCEDURE WriteWord(VAR f: File; w: WORD);
  344. BEGIN
  345. IF rd IN f.flags THEN
  346. f.res:=callerror;
  347. RETURN;
  348. ELSIF f.flags * FlagSet{mo, wr} = FlagSet{} THEN
  349. INCL(f.flags, wr);
  350. END;
  351. FIO.WrBin(f.fileno, w, SIZE(WORD));
  352. f.res:=done;
  353. RETURN;
  354. END WriteWord;
  355. PROCEDURE ReadChar(VAR f: File; VAR ch: CHAR);
  356. BEGIN
  357. IF wr IN f.flags THEN
  358. f.res:=callerror;
  359. RETURN;
  360. ELSIF f.flags * FlagSet{mo, rd} = FlagSet{} THEN
  361. INCL(f.flags, rd);
  362. END;
  363. FIO.EOF:=FALSE;
  364. IF ag IN f.flags THEN
  365. EXCL(f.flags, ag);
  366. ch:=CHAR(f.again);
  367. f.res:=done;
  368. RETURN;
  369. END;
  370. ch:=FIO.RdChar(f.fileno);
  371. IF ch = CHAR(0DH) THEN
  372. ch:=FIO.RdChar(f.fileno);
  373. END;
  374. IF ch = CHR(26) THEN
  375. SetErrorType(f);
  376. f.eof:=FIO.EOF;
  377. f.res:=notdone;
  378. ELSE
  379. f.again:=WORD(ch);
  380. f.res:=done;
  381. END;
  382. END ReadChar;
  383. PROCEDURE WriteChar(VAR f: File; ch: CHAR);
  384. VAR
  385. HighEnd, LowEnd: CARDINAL;
  386. BEGIN
  387. IF rd IN f.flags THEN
  388. f.res:=callerror;
  389. RETURN;
  390. ELSIF f.flags * FlagSet{mo, wr} = FlagSet{} THEN
  391. f.flags:= f.flags + FlagSet{pi, wr};
  392. END;
  393. IF pi IN f.flags THEN
  394. Length(f, HighEnd, LowEnd);
  395. SetPos(f, HighEnd, LowEnd);
  396. EXCL(f.flags, pi);
  397. END;
  398. IF ch = EOL THEN
  399. FIO.WrLn(f.fileno);
  400. ELSE
  401. FIO.WrChar(f.fileno, ch);
  402. END;
  403. f.res:=done;
  404. RETURN;
  405. END WriteChar;
  406. BEGIN
  407. FIO.IOcheck:=FALSE;
  408. LastTempExt:= "0000.$$$";
  409. END FileSystem.
  410.