FILESYST.LST 16 KB

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