HANDLEIO.LST 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549
  1. Listing:
  2. 1 IMPLEMENTATION MODULE HandleIO;
  3. 2 (*
  4. 3 * REPERTOIRE
  5. 4 * Release 1.6
  6. 5 * By Charles Bradford and Cole Brecheen
  7. 6 * (c) Copyright 1985-1992 PMI
  8. 7 * Green Bay, Wisconsin
  9. 8 * All rights reserved
  10. 9 * (414) 468-6040
  11. 10 *
  12. 11 * $Header: D:/logfiles/mods/handleio.mov 1.5 17 Mar 1991 17:54:52 coleb $
  13. 12 *
  14. 13 *)
  15. 14
  16. 15
  17. 16 (*EntryDiag:
  18. 17 IMPORT Diagnostics;
  19. 18 :EntryDiag*)
  20. 19
  21. 20 IMPORT FAPI;
  22. 21 IMPORT ByteFiddler;
  23. 22 IMPORT Drectory;
  24. 23 IMPORT EnvironUtils;
  25. 24 IMPORT ErrorManager;
  26. 25 IMPORT LowLevel;
  27. 26 IMPORT M2Strings;
  28. 27 IMPORT Numbers;
  29. 28 IMPORT NumTypes;
  30. 29 IMPORT StrEdit;
  31. 30 IMPORT StringIO;
  32. 31 IMPORT SYSTEM;
  33. 32 IMPORT VStorage;
  34. 33
  35. 34 VAR
  36. 35 Initialized : BOOLEAN;
  37. 36
  38. 37 PROCEDURE Init();
  39. 38 BEGIN
  40. 39 IF Initialized THEN
  41. 40 RETURN;
  42. 41 ELSE
  43. 42 Initialized := TRUE;
  44. 43 END;
  45. 44 (*EntryDiag:
  46. 45 Diagnostics.Init();
  47. 46 :EntryDiag*)
  48. 47
  49. 48 ByteFiddler.Init();
  50. ***** ^ not supported yet
  51. ***** ^ not supported yet
  52. ***** ^ not supported yet
  53. 49 Drectory.Init();
  54. ***** ^ not supported yet
  55. ***** ^ not supported yet
  56. ***** ^ not supported yet
  57. 50 EnvironUtils.Init();
  58. ***** ^ not supported yet
  59. ***** ^ not supported yet
  60. ***** ^ not supported yet
  61. 51 ErrorManager.Init();
  62. ***** ^ not supported yet
  63. ***** ^ not supported yet
  64. ***** ^ not supported yet
  65. 52 LowLevel.Init();
  66. ***** ^ not supported yet
  67. ***** ^ not supported yet
  68. ***** ^ not supported yet
  69. 53 M2Strings.Init();
  70. ***** ^ not supported yet
  71. ***** ^ not supported yet
  72. ***** ^ not supported yet
  73. 54 Numbers.Init();
  74. ***** ^ not supported yet
  75. ***** ^ not supported yet
  76. ***** ^ not supported yet
  77. 55 NumTypes.Init();
  78. ***** ^ not supported yet
  79. ***** ^ not supported yet
  80. ***** ^ not supported yet
  81. 56 StrEdit.Init();
  82. ***** ^ not supported yet
  83. ***** ^ not supported yet
  84. ***** ^ not supported yet
  85. 57 StringIO.Init();
  86. ***** ^ not supported yet
  87. ***** ^ not supported yet
  88. ***** ^ not supported yet
  89. 58 VStorage.Init();
  90. ***** ^ not supported yet
  91. ***** ^ not supported yet
  92. ***** ^ not supported yet
  93. 59 (*EntryDiag:
  94. 60 Diagnostics.diagS( 'Entering HandleIO', '' );
  95. 61 :EntryDiag*)
  96. 62 DefaultFileAttribute := BITSET{};
  97. ***** ^ undeclared identifier
  98. ***** ^ undeclared identifier
  99. 63 (*Normal--not system, hidden, or ReadOnly.*)
  100. 64 DefaultFileMode := BITSET{ 6, 1 };
  101. 65 (* Open for Read/Write access; allow all access requests from other
  102. 66 processes. *)
  103. 67 (*
  104. 68 DefaultFileMode := BITSET{ 5, 1 };
  105. 69 (* Open for Read/Write access; deny write access requests by
  106. 70 other processes, but allow read access requests. Commented out
  107. 71 because it seems always to cause the CreateFile operation to
  108. 72 fail with an error 32, File Sharing Violation. Doesn't interfere
  109. 73 with OpenFile operation. *)
  110. 74 *)
  111. 75 (*EntryDiag:
  112. 76 Diagnostics.diagS( 'Exiting HandleIO', '' );
  113. 77 :EntryDiag*)
  114. 78 END Init;
  115. 79
  116. 80
  117. 81 PROCEDURE OpenFile(VAR FileHandle : CARDINAL; fname : ARRAY OF CHAR) :
  118. 82 CARDINAL;
  119. 83 VAR
  120. 84 ErrorReturn: CARDINAL;
  121. 85 LongZero, Reserved: LONGINT;
  122. 86 OpenFlag: BITSET;
  123. 87 ActionTaken: CARDINAL;
  124. 88 filen : ARRAY [0..79] OF CHAR;
  125. 89 BEGIN
  126. 90 StrEdit.AssignStr(fname, filen);
  127. 91 FileHandle := 0;
  128. 92
  129. 93 OpenFlag := {0}; (* Open if it does exist; fail if it doesn't *)
  130. 94 LongZero := VAL(LONGINT, 0);
  131. 95 Reserved := VAL(LONGINT, 0);
  132. 96 ErrorReturn := FAPI.DOSOPEN( SYSTEM.ADR(filen),
  133. 97 SYSTEM.ADR(FileHandle), SYSTEM.ADR(ActionTaken),
  134. 98 LongZero, FAPI.FILE_NORMAL,
  135. 99 FAPI.USHORT(OpenFlag), FAPI.USHORT(DefaultFileMode), Reserved );
  136. 100 RETURN ErrorReturn;
  137. 101 END OpenFile;
  138. 102
  139. 103
  140. 104 PROCEDURE FindFile(VAR FileHandle : CARDINAL;
  141. 105 VAR fname: ARRAY OF CHAR;
  142. 106 EnvironVariable : ARRAY OF CHAR) : CARDINAL;
  143. 107 VAR
  144. 108 SavedMessage : CARDINAL;
  145. 109 name,PathName, ProgName, prefix, PathStr : ARRAY [0..128] OF CHAR;
  146. 110 DriveLetter: CHAR;
  147. 111
  148. 112 PROCEDURE SplitFirstDir(VAR str1, str2 : ARRAY OF CHAR);
  149. 113 VAR
  150. 114 lngth1, ndx : CARDINAL;
  151. 115 BEGIN
  152. 116 StrEdit.CutLeadingChars(' ', str1);
  153. 117 lngth1 := M2Strings.Length(str1);
  154. 118 ndx := M2Strings.Pos(';', str1);
  155. 119 IF (lngth1=0) OR (ndx=0) THEN
  156. 120 IF ndx=0 THEN
  157. 121 M2Strings.Delete(str1, 0, 1);
  158. 122 (*If str1 starts with a semicolon, get rid of it so it
  159. 123 won't mess us up next time.*)
  160. 124 END;
  161. 125 StrEdit.SetLength(str2, 0);
  162. 126 RETURN;
  163. 127 END;
  164. 128 IF ndx>HIGH(str1) THEN
  165. 129 ndx := HIGH(str1)-1;
  166. 130 (*We always want ndx to point to the last real character
  167. 131 of the first directory name in str1. If there's only
  168. 132 one directory name in str1--i.e., if there's no
  169. 133 semicolon in str1--ndx should point to the last
  170. 134 character of str1. If there is a semicolon in str1,
  171. 135 ndx should point to the character immediately preceding
  172. 136 it.*)
  173. 137 ELSE
  174. 138 DEC(ndx);
  175. 139 END;
  176. 140 M2Strings.Copy(str1, 0, ndx+1, str2);
  177. 141 StrEdit.CutTrailingChars(' ', str2);
  178. 142 IF (str2[M2Strings.Length(str2)-1]#'\') THEN
  179. 143 StrEdit.Append(str2, '\');
  180. 144 END;
  181. 145 M2Strings.Delete(str1, 0, ndx+1);
  182. 146 END SplitFirstDir;
  183. 147
  184. 148 PROCEDURE DirRemoved(VAR FileName : ARRAY OF CHAR) : BOOLEAN;
  185. 149 VAR
  186. 150 SlashSpot, ColonSpot : CARDINAL;
  187. 151 tmp : BOOLEAN;
  188. 152 BEGIN
  189. 153 tmp := FALSE;
  190. 154 SlashSpot := M2Strings.Pos('\', FileName);
  191. 155 WHILE SlashSpot<=HIGH(FileName) DO
  192. 156 tmp := TRUE;
  193. 157 M2Strings.Delete(FileName, 0, SlashSpot+1);
  194. 158 SlashSpot := M2Strings.Pos('\', FileName);
  195. 159 END;
  196. 160 ColonSpot := M2Strings.Pos(':', FileName);
  197. 161 IF ColonSpot<=HIGH(FileName) THEN
  198. 162 M2Strings.Delete(FileName, 0, ColonSpot+1);
  199. 163 tmp := FALSE;
  200. 164 END;
  201. 165 RETURN (tmp);
  202. 166 END DirRemoved;
  203. 167
  204. 168 BEGIN
  205. 169 M2Strings.Assign(fname,name);
  206. 170 SavedMessage := OpenFile(FileHandle, fname);
  207. 171 (*First we look for the file in any directory specified in
  208. 172 fname. If no directory is specified in fname, we'll be
  209. 173 looking in the current directory of the current drive at
  210. 174 this step.*)
  211. 175 IF SavedMessage # StringIO.NoError THEN
  212. 176 (*First check the directory in which the program is
  213. 177 stored.*)
  214. 178 EnvironUtils.GetExeName(PathStr);
  215. 179 Drectory.GetDrivePathAndName( PathStr, DriveLetter,
  216. 180 PathName, ProgName );
  217. 181 M2Strings.Insert( ':', PathName, 0 );
  218. 182 M2Strings.Insert( DriveLetter, PathName, 0 );
  219. 183 IF DirRemoved(fname) THEN
  220. 184 (*We do this to strip the old prefix out of fname.*)
  221. 185 END;
  222. 186 StrEdit.Append( PathName, fname );
  223. 187 SavedMessage := OpenFile(FileHandle, PathName);
  224. 188 IF (SavedMessage#StringIO.NoError) THEN
  225. 189 (* We do this to make sure we search the current
  226. 190 directory before moving on to a path search.*)
  227. 191 SavedMessage := OpenFile(FileHandle, fname);
  228. 192 END;
  229. 193 EnvironUtils.ReadEnvironment(EnvironVariable, PathStr);
  230. 194 END;
  231. 195 WHILE (SavedMessage#StringIO.NoError) AND
  232. 196 (M2Strings.Length(PathStr)>0) DO
  233. 197 SplitFirstDir(PathStr, prefix);
  234. 198 M2Strings.Assign(name,fname);
  235. 199 M2Strings.Insert(prefix, fname, 0);
  236. 200 SavedMessage := OpenFile(FileHandle, fname);
  237. 201 IF SavedMessage = StringIO.NoError THEN
  238. 202 RETURN (SavedMessage);
  239. 203 ELSE
  240. 204 IF DirRemoved(fname) THEN
  241. 205 (*We do this to strip the old prefix out of fname.*)
  242. 206 END;
  243. 207 END;
  244. 208 END;
  245. 209 RETURN (SavedMessage);
  246. 210 END FindFile;
  247. 211
  248. 212
  249. 213 PROCEDURE CreateFile( VAR FileHandle : CARDINAL; fname :
  250. 214 ARRAY OF CHAR ) : CARDINAL;
  251. 215 VAR
  252. 216 ErrorReturn, ActionTaken: CARDINAL;
  253. 217 OpenFlag: BITSET;
  254. 218 Reserved: LONGINT;
  255. 219 filen : ARRAY [0..79] OF CHAR;
  256. 220 BEGIN
  257. 221 StrEdit.AssignStr(fname, filen);
  258. 222 FileHandle := 0;
  259. 223 OpenFlag := {1, 4};
  260. 224 (* create if the file does not exist; truncate if it does exist *)
  261. 225 Reserved := VAL(LONGINT, 0);
  262. 226 ErrorReturn := FAPI.DOSOPEN( SYSTEM.ADR(filen),
  263. 227 SYSTEM.ADR(FileHandle), SYSTEM.ADR(ActionTaken), VAL(LONGINT, 0),
  264. 228 FAPI.FILE_NORMAL, FAPI.USHORT(OpenFlag),
  265. 229 FAPI.USHORT(DefaultFileMode), Reserved );
  266. 230 RETURN ErrorReturn;
  267. 231 END CreateFile;
  268. 232
  269. 233
  270. 234 PROCEDURE CreateUniqueFile(VAR FileHandle : CARDINAL; VAR fname :
  271. 235 ARRAY OF CHAR) : CARDINAL;
  272. 236 VAR
  273. 237 filen, TryName : ARRAY [0..79] OF CHAR;
  274. 238 h,m,s,hs: CARDINAL;
  275. 239 BEGIN
  276. 240 (*RETURN ( StringIO.BadFunction); *)
  277. 241 (* not implimented in OS/2 *)
  278. 242 IF( fname[0]#0C) AND (fname[M2Strings.Length(fname)-1]#'\')
  279. 243 THEN (* if not nil string make sure end with \ *)
  280. 244 StrEdit.Append(fname,'\');
  281. 245 END;
  282. 246 StrEdit.AssignStr(fname, filen);
  283. 247 IF TRUE (*MajorVersion < 3*) THEN
  284. 248 REPEAT
  285. 249 EnvironUtils.GetTime( h, m, s, hs, TryName );
  286. 250 StrEdit.DeleteChar(':', TryName );
  287. 251 StrEdit.DeleteChar(' ', TryName );
  288. 252 StrEdit.Append( TryName, '13852940' );
  289. 253 StrEdit.SetLength( TryName, 12);
  290. 254 TryName[8] := '.';
  291. 255 M2Strings.Insert( fname, TryName, 0 );
  292. 256 UNTIL NOT FileExists( TryName );
  293. 257 StrEdit.AssignStr( TryName, filen );
  294. 258 StrEdit.AssignStr( TryName, fname );
  295. 259 (* added 10 July 87 *)
  296. 260 RETURN CreateFile( FileHandle, fname );
  297. 261 (* changed from filen 10 July 87 *)
  298. 262 END;
  299. 263 RETURN StringIO.NoError;
  300. 264
  301. 265 END CreateUniqueFile;
  302. 266
  303. 267
  304. 268 PROCEDURE CloseHandle(FileHandle : CARDINAL) : CARDINAL;
  305. 269 VAR
  306. 270 ErrorReturn: CARDINAL;
  307. 271 BEGIN
  308. 272 ErrorReturn := FAPI.DOSCLOSE(FileHandle);
  309. 273 IF ErrorReturn # 0 THEN
  310. 274 ErrorManager.WarnNumber( 'DOSCLOSE error', ErrorReturn );
  311. 275 END;
  312. 276 RETURN ErrorReturn;
  313. 277 END CloseHandle;
  314. 278
  315. 279
  316. 280 PROCEDURE GetFilePtr(FileHandle : CARDINAL) : LONGINT;
  317. 281 (*Returns the current DOS position in the file
  318. 282 identified by FileHandle.*)
  319. 283 VAR
  320. 284 CurrentPTR: LONGINT;
  321. 285 ErrorReturn: CARDINAL;
  322. 286 BEGIN
  323. 287 ErrorReturn := FAPI.DOSCHGFILEPTR( FileHandle, VAL(LONGINT, 0),
  324. 288 1, SYSTEM.ADR(CurrentPTR));
  325. 289 IF ErrorReturn # 0 THEN
  326. 290 ErrorManager.WarnNumber("DosChgFilePtr error", ErrorReturn );
  327. 291 END;
  328. 292 RETURN CurrentPTR;
  329. 293 END GetFilePtr;
  330. 294
  331. 295
  332. 296 PROCEDURE FileLengthWithMove(FileHandle : CARDINAL) : LONGINT;
  333. 297 (*Returns the number of bytes in the file identified by
  334. 298 FileHandle and leaves pointer at the file end.*)
  335. 299 VAR
  336. 300 CurrentPTR: LONGINT;
  337. 301 ErrorReturn: CARDINAL;
  338. 302 BEGIN
  339. 303 ErrorReturn :=FAPI.DOSCHGFILEPTR( FileHandle, VAL(LONGINT, 0),
  340. 304 2, SYSTEM.ADR(CurrentPTR));
  341. 305 IF ErrorReturn # 0 THEN
  342. 306 ErrorManager.WarnNumber("DosChgFilePtr error", ErrorReturn );
  343. 307 END;
  344. 308 RETURN CurrentPTR;
  345. 309 END FileLengthWithMove;
  346. 310
  347. 311
  348. 312 PROCEDURE FileLength(FileHandle : CARDINAL) : LONGINT;
  349. 313 (*Returns the number of bytes in the file identified by
  350. 314 FileHandle.*)
  351. 315 VAR
  352. 316 answer, oldpos : LONGINT;
  353. 317 BEGIN
  354. 318 (* First, save current position so we can restore the pointer
  355. 319 to its original location at the end.*)
  356. 320 oldpos := GetFilePtr(FileHandle);
  357. 321 (* now check file size with move to file end *)
  358. 322 answer := FileLengthWithMove(FileHandle);
  359. 323 (* now, restore the file pointer to where it was *)
  360. 324 SetFilePtr(FileHandle, FromStart, oldpos);
  361. 325 RETURN (answer);
  362. 326 END FileLength;
  363. 327
  364. 328
  365. 329 PROCEDURE EndReached(FileHandle : CARDINAL) : BOOLEAN;
  366. 330 VAR
  367. 331 curpos : LONGINT;
  368. 332 ErrorReturn, BytesRead: CARDINAL;
  369. 333 x : ARRAY [0..1] OF CHAR;
  370. 334 BEGIN
  371. 335 ErrorReturn := FAPI.DOSCHGFILEPTR( FileHandle, VAL(LONGINT, 0),
  372. 336 1, SYSTEM.ADR(curpos));
  373. 337 (* Get current position. *)
  374. 338 ErrorReturn := FAPI.DOSREAD( FileHandle, SYSTEM.ADR(x), 1,
  375. 339 SYSTEM.ADR(BytesRead));
  376. 340 (* Try to read one byte. *)
  377. 341 IF BytesRead = 1 THEN
  378. 342 (* Read was successful, so we must not have reached the end. *)
  379. 343 ErrorReturn := FAPI.DOSCHGFILEPTR( FileHandle, curpos,
  380. 344 0, SYSTEM.ADR(curpos));
  381. 345 (* Move file pointer back to its original position. *)
  382. 346 RETURN FALSE;
  383. 347 ELSE
  384. 348 RETURN TRUE;
  385. 349 END;
  386. 350 END EndReached;
  387. 351
  388. 352
  389. 353 PROCEDURE FileExists(fname : ARRAY OF CHAR) : BOOLEAN;
  390. 354 VAR
  391. 355 FileAttribute: CARDINAL;
  392. 356 Reserved: LONGINT;
  393. 357 filen : ARRAY [0..79] OF CHAR;
  394. 358 BEGIN
  395. 359 StrEdit.AssignStr(fname, filen);
  396. 360 Reserved := VAL(LONGINT, 0);
  397. 361 IF FAPI.DOSQFILEMODE( SYSTEM.ADR(filen),
  398. 362 SYSTEM.ADR(FileAttribute), Reserved)= 0 THEN
  399. 363 RETURN TRUE;
  400. 364 ELSE
  401. 365 RETURN FALSE;
  402. 366 END;
  403. 367 END FileExists;
  404. 368
  405. 369
  406. 370 PROCEDURE SetFilePtr(FileHandle : CARDINAL; Origin : FileOffSet;
  407. 371 OffSet : LONGINT);
  408. 372 VAR
  409. 373 NewPtr : LONGINT;
  410. 374 ErrorReturn: CARDINAL;
  411. 375 BEGIN
  412. 376 (* what if file length is zero??*)
  413. 377 ErrorReturn := FAPI.DOSCHGFILEPTR(FileHandle, OffSet, ORD(Origin),
  414. 378 SYSTEM.ADR(NewPtr));
  415. 379 IF ErrorReturn # 0 THEN
  416. 380 ErrorManager.WarnNumber( "DosChgFilePtr error", ErrorReturn );
  417. 381 END;
  418. 382 END SetFilePtr;
  419. 383
  420. 384
  421. 385 PROCEDURE OpenForAppending( name : ARRAY OF CHAR; VAR handl : CARDINAL);
  422. 386 VAR
  423. 387 TmpName, msg: ARRAY [0..79] OF CHAR;
  424. 388 BEGIN
  425. 389 StrEdit.AssignStr( name, TmpName );
  426. 390 IF FindFile( handl, TmpName, "path") <> StringIO.NoError THEN
  427. 391 IF CreateFile( handl, TmpName) <> StringIO.NoError THEN
  428. 392 StrEdit.AssignStr( "Cannot create ", msg);
  429. 393 StrEdit.Append( msg, TmpName );
  430. 394 StrEdit.Append( msg, '.' );
  431. 395 ErrorManager.WARN( msg );
  432. 396 END;
  433. 397 ELSE
  434. 398 SetFilePtr( handl, FromEnd, NumTypes.L0);
  435. 399 END;
  436. 400 END OpenForAppending;
  437. 401
  438. 402
  439. 403 PROCEDURE BlockRead(FileHandle : CARDINAL; ptr : SYSTEM.ADDRESS; size :
  440. 404 CARDINAL) : CARDINAL;
  441. 405 VAR
  442. 406 ErrorReturn, BytesRead: CARDINAL;
  443. 407 BEGIN
  444. 408 ErrorReturn := FAPI.DOSREAD( FileHandle, ptr, size,
  445. 409 SYSTEM.ADR(BytesRead));
  446. 410 IF ErrorReturn # 0 THEN
  447. 411 ErrorManager.WarnNumber( "DOSREAD error", ErrorReturn );
  448. 412 END;
  449. 413 (* Looks like something may be wrong here. *)
  450. 414 IF BytesRead < size THEN
  451. 415 IF BytesRead = 0 THEN
  452. 416 RETURN (StringIO.EndOfFile);
  453. 417 ELSE
  454. 418 RETURN (StringIO.PartialRead);
  455. 419 END;
  456. 420 END;
  457. 421 RETURN ErrorReturn;
  458. 422 END BlockRead;
  459. 423
  460. 424
  461. 425 PROCEDURE BlockWrite(FileHandle : CARDINAL; ptr : SYSTEM.ADDRESS; size :
  462. 426 CARDINAL) : CARDINAL;
  463. 427 VAR
  464. 428 ErrorReturn, BytesWritten: CARDINAL;
  465. 429 BEGIN
  466. 430 ErrorReturn := FAPI.DOSWRITE(FileHandle, ptr, size,
  467. 431 SYSTEM.ADR(BytesWritten));
  468. 432 IF ErrorReturn # 0 THEN
  469. 433 ErrorManager.WarnNumber( 'DOSWRITE error', ErrorReturn );
  470. 434 END;
  471. 435 RETURN ErrorReturn;
  472. 436 END BlockWrite;
  473. 437
  474. 438
  475. 439 PROCEDURE NewHandleCopy( OldHandle: CARDINAL;
  476. 440 VAR NewHandle: CARDINAL ): CARDINAL;
  477. 441 (*Duplicates an open file handle and returns a new handle
  478. 442 number that refers to the same file or device. Useful for
  479. 443 updating files without closing them.*)
  480. 444 VAR
  481. 445 ErrorReturn: CARDINAL;
  482. 446 BEGIN
  483. 447 NewHandle := 0FFFFH;
  484. 448 ErrorReturn := FAPI.DOSDUPHANDLE(OldHandle, SYSTEM.ADR(NewHandle));
  485. 449 RETURN ErrorReturn;
  486. 450 END NewHandleCopy;
  487. 451
  488. 452
  489. 453 PROCEDURE ForceHandleCopy( OldHandle, NewHandle: CARDINAL):
  490. 454 CARDINAL;
  491. 455 (*Similar to NewHandleCopy, but makes an existing handle
  492. 456 (NewHandle) refer to another one (OldHandle). Closes
  493. 457 NewHandle first, and then reopens it as a copy of
  494. 458 OldHandle. Useful for dynamic I/O redirection.*)
  495. 459 VAR
  496. 460 ErrorReturn: CARDINAL;
  497. 461 BEGIN
  498. 462 ErrorReturn := FAPI.DOSDUPHANDLE(OldHandle, SYSTEM.ADR(NewHandle));
  499. 463 RETURN ErrorReturn;
  500. 464 END ForceHandleCopy;
  501. 465
  502. 466
  503. 467 PROCEDURE UpdateDisk( FileHandle: CARDINAL );
  504. 468 (*Writes a file's current buffers to the disk and writes its
  505. 469 current length and time to the directory without requiring
  506. 470 it to be closed.*)
  507. 471 VAR
  508. 472 ErrorCode,
  509. 473 TmpHandle: CARDINAL;
  510. 474 BEGIN
  511. 475 ErrorCode:=FAPI.DOSBUFRESET( FileHandle );
  512. 476 IF ErrorCode # 0 THEN
  513. 477 ErrorManager.WarnNumber('UpdateDisk Error',ErrorCode );
  514. 478 END;
  515. 479
  516. 480 (* IF NewHandleCopy( FileHandle, TmpHandle ) = StringIO.NoError THEN
  517. 481 StringIO.PrintMessage( CloseHandle(TmpHandle) );
  518. 482 END;*)
  519. 483 END UpdateDisk;
  520. 484
  521. 485 PROCEDURE FillFile( FileHandle: CARDINAL; NumberOfBytes:
  522. 486 CARDINAL; TheByte: CHAR ): CARDINAL;
  523. 487 VAR
  524. 488 TmpAdr: SYSTEM.ADDRESS;
  525. 489 SavedMessage: CARDINAL;
  526. 490 BEGIN
  527. 491 IF NOT VStorage.DosAvail( NumberOfBytes ) THEN
  528. 492 RETURN StringIO.TooLittleMemory;
  529. 493 END;
  530. 494 VStorage.DosAlloc( TmpAdr, NumberOfBytes );
  531. 495 LowLevel.Fill( TmpAdr, NumberOfBytes, TheByte );
  532. 496 SavedMessage := BlockWrite( FileHandle, TmpAdr,
  533. 497 NumberOfBytes );
  534. 498 VStorage.DosDealloc( TmpAdr, NumberOfBytes );
  535. 499 RETURN SavedMessage;
  536. 500 END FillFile;
  537. 501
  538. 502
  539. 503
  540. 504 BEGIN
  541. 505 Initialized := FALSE;
  542. 506 Init();
  543. 507 Init();
  544. 508 END HandleIO.
  545. 35 errors