DRECTORY.LST 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880
  1. Listing:
  2. 1 IMPLEMENTATION MODULE Drectory;
  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/drectory.mov 1.8 17 Mar 1991 18:00:54 coleb $
  13. 12 *
  14. 13 *)
  15. 14
  16. 15 IMPORT ByteFiddler;
  17. 16 IMPORT EnvironUtils;
  18. 17 IMPORT ErrorManager;
  19. 18 IMPORT HandleIO;
  20. 19 IMPORT LowLevel;
  21. 20 IMPORT M2Strings;
  22. 21 IMPORT Numbers;
  23. 22 IMPORT NumTypes;
  24. 23 IMPORT PosUtils;
  25. 24 IMPORT StrConv;
  26. 25 IMPORT StrEdit;
  27. 26 IMPORT StringIO;
  28. 27 IMPORT VStorage;
  29. 28
  30. 29 IMPORT FAPI;
  31. 30 IMPORT SYSTEM;
  32. 31
  33. 32 VAR
  34. 33 Initialized : BOOLEAN;
  35. 34
  36. 35 PROCEDURE Init();
  37. 36 BEGIN
  38. 37 IF Initialized THEN
  39. 38 RETURN;
  40. 39 ELSE
  41. 40 Initialized := TRUE;
  42. 41 END;
  43. 42 ByteFiddler.Init();
  44. ***** ^ not supported yet
  45. ***** ^ not supported yet
  46. ***** ^ not supported yet
  47. 43 EnvironUtils.Init();
  48. ***** ^ not supported yet
  49. ***** ^ not supported yet
  50. ***** ^ not supported yet
  51. 44 ErrorManager.Init();
  52. ***** ^ not supported yet
  53. ***** ^ not supported yet
  54. ***** ^ not supported yet
  55. 45 HandleIO.Init();
  56. ***** ^ not supported yet
  57. ***** ^ not supported yet
  58. ***** ^ not supported yet
  59. 46 LowLevel.Init();
  60. ***** ^ not supported yet
  61. ***** ^ not supported yet
  62. ***** ^ not supported yet
  63. 47 M2Strings.Init();
  64. ***** ^ not supported yet
  65. ***** ^ not supported yet
  66. ***** ^ not supported yet
  67. 48 Numbers.Init();
  68. ***** ^ not supported yet
  69. ***** ^ not supported yet
  70. ***** ^ not supported yet
  71. 49 NumTypes.Init();
  72. ***** ^ not supported yet
  73. ***** ^ not supported yet
  74. ***** ^ not supported yet
  75. 50 PosUtils.Init();
  76. ***** ^ not supported yet
  77. ***** ^ not supported yet
  78. ***** ^ not supported yet
  79. 51 StrConv.Init();
  80. ***** ^ not supported yet
  81. ***** ^ not supported yet
  82. ***** ^ not supported yet
  83. 52 StrEdit.Init();
  84. ***** ^ not supported yet
  85. ***** ^ not supported yet
  86. ***** ^ not supported yet
  87. 53 StringIO.Init();
  88. ***** ^ not supported yet
  89. ***** ^ not supported yet
  90. ***** ^ not supported yet
  91. 54 VStorage.Init();
  92. ***** ^ not supported yet
  93. ***** ^ not supported yet
  94. ***** ^ not supported yet
  95. 55 END Init;
  96. ***** ^ not supported yet
  97. 56
  98. 57 CONST
  99. 58 blank = ' ';
  100. 59 null = '';
  101. 60 semicolon = ';';
  102. 61 backslash = '\';
  103. 62 fwdslash = '/';
  104. 63 byte1 = 0;
  105. 64 OrdA = 65;
  106. 65
  107. 66 TYPE
  108. 67 ModeSetCaster =
  109. 68 RECORD
  110. 69 CASE : BOOLEAN OF
  111. ***** ^ not supported yet
  112. ***** ^ 'POINTER' expected
  113. 70 TRUE :
  114. 71 a : ModeSet;
  115. 72 | FALSE :
  116. 73 b : BITSET;
  117. 74 END;
  118. 75 END;
  119. 76
  120. 77
  121. 78 (*==================== Utility Procedures =====================*)
  122. 79
  123. 80 PROCEDURE LastByte( FileHandle: CARDINAL ): CHAR;
  124. 81 VAR
  125. 82 bufch: CHAR;
  126. 83 BEGIN
  127. 84 HandleIO.SetFilePtr(FileHandle, HandleIO.FromEnd, Numbers.Li( -1) );
  128. 85 StringIO.PrintMessage(HandleIO.BlockRead( FileHandle,
  129. 86 SYSTEM.ADR(bufch), 1 ));
  130. 87 RETURN bufch;
  131. 88 END LastByte;
  132. 89
  133. 90
  134. 91 (*================== Exported Procedures ==================*)
  135. 92
  136. 93 PROCEDURE AddBlockToFile(FileName : ARRAY OF CHAR;
  137. 94 FileHandle : CARDINAL; BlockAdr: SYSTEM.ADDRESS;
  138. 95 BlockSize: CARDINAL );
  139. 96 VAR
  140. 97 AlreadyOpen : BOOLEAN;
  141. 98 EofChar: CHAR;
  142. 99 BEGIN
  143. 100 EofChar := CHR(26);
  144. 101 IF (M2Strings.Length(FileName)=0) OR (FileHandle>4) THEN
  145. 102 AlreadyOpen := TRUE;
  146. 103 ELSE
  147. 104 AlreadyOpen := FALSE;
  148. 105 StringIO.PrintMessage(HandleIO.OpenFile(FileHandle,FileName));
  149. 106 END;
  150. 107 IF LastByte( FileHandle ) = CHR(26) THEN
  151. 108 HandleIO.SetFilePtr(FileHandle, HandleIO.FromEnd, Numbers.Li( -1) );
  152. 109 (*Back up to write over the eof.*)
  153. 110 StringIO.PrintMessage(
  154. 111 HandleIO.BlockWrite( FileHandle, BlockAdr, BlockSize ));
  155. 112 StringIO.PrintMessage(
  156. 113 HandleIO.BlockWrite( FileHandle, SYSTEM.ADR(EofChar), 1 ));
  157. 114 (*Write a new eof.*)
  158. 115 ELSE
  159. 116 HandleIO.SetFilePtr(FileHandle, HandleIO.FromEnd, NumTypes.L0 );
  160. 117 (*Don't back up to write over the eof.*)
  161. 118 StringIO.PrintMessage(
  162. 119 HandleIO.BlockWrite( FileHandle, BlockAdr, BlockSize ));
  163. 120 END;
  164. 121 IF AlreadyOpen THEN
  165. 122 HandleIO.UpdateDisk( FileHandle )
  166. 123 ELSE
  167. 124 StringIO.PrintMessage(HandleIO.CloseHandle(FileHandle));
  168. 125 (*Updates the file's directory entry.*)
  169. 126 END;
  170. 127 END AddBlockToFile;
  171. 128
  172. 129
  173. 130 PROCEDURE AddToFile(FileName : ARRAY OF CHAR; FileHandle : CARDINAL;
  174. 131 message : ARRAY OF CHAR);
  175. 132 BEGIN
  176. 133 (*AddToFile*)
  177. 134 AddBlockToFile( FileName, FileHandle, SYSTEM.ADR(message),
  178. 135 M2Strings.Length(message) );
  179. 136 END AddToFile;
  180. 137
  181. 138
  182. 139 PROCEDURE ChDir(DirName : ARRAY OF CHAR) : CARDINAL;
  183. 140 VAR
  184. 141 ErrorReturn :CARDINAL;
  185. 142 Reserved:LONGINT;
  186. 143 BEGIN
  187. 144 ErrorReturn := FAPI.DOSCHDIR(SYSTEM.ADR(DirName), Reserved);
  188. 145 RETURN ErrorReturn;
  189. 146 END ChDir;
  190. 147
  191. 148
  192. 149 PROCEDURE CopyFile(OldHandle : CARDINAL; NewFileName : ARRAY OF CHAR) :
  193. 150 CARDINAL;
  194. 151 TYPE
  195. 152 memptr =
  196. 153 RECORD
  197. 154 addr : LowLevel.Address8086;
  198. 155 size : CARDINAL;
  199. 156 END;
  200. 157
  201. 158 VAR
  202. 159 TheDrive : CHAR;
  203. 160 MemoryPtr : memptr;
  204. 161 NewHandle : CARDINAL;
  205. 162 SavedMessage : CARDINAL;
  206. 163 FreeBytes, FileSize, BytesToBeFreed, BytesToRead : LONGINT;
  207. 164
  208. 165 PROCEDURE ReadOldFile(VAR MemoryPtr : memptr);
  209. 166 VAR
  210. 167 BytesRead,ErrorReturn:CARDINAL;
  211. 168 BytesAvailable : CARDINAL;
  212. 169 BEGIN
  213. 170 (*ReadOldFile*)
  214. 171 IF BytesToRead <= Numbers.Lc( 0 ) THEN
  215. 172 MemoryPtr.addr.x := NIL;
  216. 173 RETURN;
  217. 174 END;
  218. 175 BytesAvailable := EnvironUtils.MemAvail( 10000);
  219. 176 WITH MemoryPtr DO
  220. 177 IF BytesToRead > Numbers.Lc( BytesAvailable ) THEN
  221. 178 size := BytesAvailable;
  222. 179 ELSE
  223. 180 size := Numbers.C( BytesToRead );
  224. 181 END;
  225. 182 VStorage.DosAlloc(addr.a, size);
  226. 183 END;
  227. 184 ErrorReturn := FAPI.DOSREAD(OldHandle, MemoryPtr.addr.a,
  228. 185 MemoryPtr.size, SYSTEM.ADR(BytesRead));
  229. 186 IF BytesRead < MemoryPtr.size THEN
  230. 187 IF BytesRead = 0 THEN
  231. 188 StringIO.PrintMessage (StringIO.EndOfFile);
  232. 189 ELSE
  233. 190 StringIO.PrintMessage (StringIO.PartialRead);
  234. 191 END;
  235. 192 ELSE
  236. 193 IF ErrorReturn # 0 THEN
  237. 194 StringIO.PrintMessage(ErrorReturn);
  238. 195 ELSE
  239. 196 BytesToRead := BytesToRead - Numbers.Lc( MemoryPtr.size );
  240. 197 (* Can't use DEC here because JPI doesn't allow LONGINTs
  241. 198 to be decremented by CARDINAL values. *)
  242. 199 END;
  243. 200 END;
  244. 201 END ReadOldFile;
  245. 202
  246. 203 PROCEDURE WriteNewFile(MemoryPtr : memptr);
  247. 204 VAR
  248. 205 ErrorReturn, BytesWritten: CARDINAL;
  249. 206 BEGIN
  250. 207 (*WriteNewFile*)
  251. 208 IF MemoryPtr.addr.x=NIL THEN
  252. 209 RETURN;
  253. 210 END;
  254. 211 ErrorReturn := FAPI.DOSWRITE( NewHandle, MemoryPtr.addr.a,
  255. 212 MemoryPtr.size, SYSTEM.ADR(BytesWritten) );
  256. 213 IF BytesWritten < MemoryPtr.size THEN
  257. 214 ErrorManager.WARN('No room to write.');
  258. 215 END;
  259. 216 IF ErrorReturn # 0 THEN
  260. 217 StringIO.PrintMessage(ErrorReturn);
  261. 218 END;
  262. 219 VStorage.DosDealloc(MemoryPtr.addr.x, MemoryPtr.size);
  263. 220 END WriteNewFile;
  264. 221
  265. 222 PROCEDURE SetDateAndTime();
  266. 223 VAR
  267. 224 month, day, year, hours, minutes, seconds : CARDINAL;
  268. 225 BEGIN
  269. 226 GetFileDateAndTime(OldHandle, month, day, year, hours, minutes,
  270. 227 seconds);
  271. 228 (*
  272. 229 Diagnostics.diagC( 'month', month );
  273. 230 Diagnostics.diagC( 'day', day );
  274. 231 Diagnostics.diagC( 'year', year );
  275. 232 Diagnostics.diagC( 'hours', hours );
  276. 233 Diagnostics.diagC( 'minutes', minutes );
  277. 234 Diagnostics.diagC( 'seconds', seconds );
  278. 235 *)
  279. 236 SetFileDateAndTime(NewHandle, month, day, year, hours, minutes,
  280. 237 seconds);
  281. 238 END SetDateAndTime;
  282. 239
  283. 240 BEGIN
  284. 241 (*CopyFile*)
  285. 242 BytesToBeFreed := Numbers.Lc( 0 );
  286. 243 FileSize := HandleIO.FileLength(OldHandle);
  287. 244 BytesToRead := FileSize;
  288. 245 IF M2Strings.Pos(':',NewFileName)=(1+byte1) THEN
  289. 246 TheDrive := NewFileName[0+byte1];
  290. 247 ELSE
  291. 248 TheDrive := 'Z';
  292. 249 (*Determines the drive to which we're copying.
  293. 250 'Z' means "default drive" to FreeDiskSpace.*)
  294. 251 END;
  295. 252 SavedMessage := FreeDiskSpace(TheDrive,FreeBytes);
  296. 253 IF SavedMessage # StringIO.NoError THEN
  297. 254 RETURN SavedMessage;
  298. 255 END;
  299. 256 SavedMessage := HandleIO.OpenFile(NewHandle,NewFileName);
  300. 257 IF SavedMessage = StringIO.NoError THEN
  301. 258 BytesToBeFreed := HandleIO.FileLength(NewHandle);
  302. 259 SavedMessage := HandleIO.CloseHandle(NewHandle);
  303. 260 ELSE
  304. 261 IF (SavedMessage # StringIO.FileNotFound) AND
  305. 262 (SavedMessage # 110) THEN (* explicit fail command *)
  306. 263 RETURN SavedMessage;
  307. 264 END;
  308. 265 END;
  309. 266 IF FileSize > (FreeBytes + BytesToBeFreed) THEN
  310. 267 SavedMessage := StringIO.AccessDenied;
  311. 268 (*This will have to stand for 'Not enough room.'*)
  312. 269 RETURN SavedMessage;
  313. 270 END;
  314. 271 SavedMessage := HandleIO.CreateFile( NewHandle, NewFileName );
  315. 272 IF SavedMessage # StringIO.NoError THEN
  316. 273 RETURN SavedMessage;
  317. 274 END;
  318. 275 REPEAT
  319. 276 ReadOldFile(MemoryPtr);
  320. 277 WriteNewFile(MemoryPtr);
  321. 278 UNTIL BytesToRead <= Numbers.Lc( 0 );
  322. 279 SetDateAndTime();
  323. 280 RETURN HandleIO.CloseHandle(NewHandle);
  324. 281 END CopyFile;
  325. 282
  326. 283 (*
  327. 284 We can't use this, unfortunately, because DOSCOPY isn't FAPI, and
  328. 285 the Logitech linker can't handle unresolved symbols, even if the
  329. 286 references aren't going to get linked in.
  330. 287
  331. 288 PROCEDURE CopyFile2( SourceName, TargetName: ARRAY OF CHAR ): CARDINAL;
  332. 289 VAR
  333. 290 OldFileHandle, ErrorReturn, OSversion: CARDINAL;
  334. 291 Reserved: LONGINT;
  335. 292 BEGIN
  336. 293 FAPI.DOSGETVERSION( SYSTEM.ADR(OSversion) );
  337. 294 IF OSversion >= 10 THEN
  338. 295 (* We're under some version of OS/2 *)
  339. 296 Reserved := NumTypes.L0;
  340. 297 ErrorReturn := FAPI.DOSCOPY( SYSTEM.ADR(SourceName),
  341. 298 SYSTEM.ADR(TargetName), BITSET(0), Reserved );
  342. 299 ELSE
  343. 300 ErrorReturn := HandleIO.OpenFile( OldFileHandle, SourceName );
  344. 301 IF ErrorReturn # 0 THEN
  345. 302 ErrorManager.WarnNumber( 'CopyFile2 error', ErrorReturn );
  346. 303 END;
  347. 304 ErrorReturn := CopyFile( OldFileHandle, TargetName );
  348. 305 END;
  349. 306 RETURN ErrorReturn;
  350. 307 END CopyFile2;
  351. 308 *)
  352. 309
  353. 310 PROCEDURE DeleteFile(FileName : ARRAY OF CHAR) : CARDINAL;
  354. 311 VAR
  355. 312 ErrorReturn:CARDINAL;
  356. 313 Reserved:LONGINT;
  357. 314
  358. 315 LocalStr: ARRAY [0..79] OF CHAR;
  359. 316 BEGIN
  360. 317 M2Strings.Assign( FileName, LocalStr );
  361. 318 (*We assign to the local string to guarantee that it ends
  362. 319 with a null byte.*)
  363. 320 Reserved := VAL(LONGINT,0);
  364. 321 ErrorReturn := FAPI.DOSDELETE(SYSTEM.ADR(FileName), Reserved);
  365. 322 (* IF ErrorReturn # 0 THEN
  366. 323 ErrorManager.WarnNumber( "DOSDELETE error", ErrorReturn );
  367. 324 END; let it return error JEM 2/4/92 *)
  368. 325 RETURN ErrorReturn;
  369. 326 END DeleteFile;
  370. 327
  371. 328
  372. 329
  373. 330 PROCEDURE FindFirstFile(FileSpec : ARRAY OF
  374. 331 CHAR; VAR DirHandle: CARDINAL; VAR
  375. 332 FileInfo : FileInfoRec) : CARDINAL;
  376. 333 VAR
  377. 334 ErrorReturn : CARDINAL;
  378. 335 Reserved : LONGINT;
  379. 336 SearchCount : CARDINAL;
  380. 337 FileInfoRecord : FAPI.FILEFINDBUF;
  381. 338 TmpSet : FAPI.USHORT;
  382. 339 TmpStr : ARRAY [0..80] OF CHAR;
  383. 340 BEGIN
  384. 341 (*FindFirstFile*)
  385. 342 StrEdit.AssignStr(FileSpec, TmpStr);
  386. 343 (*We have to assign to a local string because the string that
  387. 344 comes in through the parameter list may not be null terminated. *)
  388. 345 TmpSet := FAPI.FILE_READONLY + FAPI.FILE_HIDDEN +
  389. 346 FAPI.FILE_SYSTEM + FAPI.FILE_DIRECTORY;
  390. 347 SearchCount := 1;
  391. 348 Reserved :=VAL(LONGINT,0);
  392. 349 ErrorReturn := FAPI.DOSFINDFIRST( SYSTEM.ADR(TmpStr),
  393. 350 SYSTEM.ADR(DirHandle), TmpSet,
  394. 351 SYSTEM.ADR(FileInfoRecord), SYSTEM.SIZE(FileInfoRecord),
  395. 352 SYSTEM.ADR(SearchCount), Reserved);
  396. 353 IF ErrorReturn # 0 THEN
  397. 354 RETURN ErrorReturn;
  398. 355 END;
  399. 356 WITH FileInfo DO
  400. 357 ByteFiddler.CardinalToTime( CARDINAL(FileInfoRecord.ftimeLastWrite),
  401. 358 hour, minute, second );
  402. 359 ByteFiddler.CardinalToDate( CARDINAL(FileInfoRecord.fdateLastWrite),
  403. 360 month, day, year );
  404. 361 size := FileInfoRecord.cbFile;
  405. 362 attribute := ModeSet(FileInfoRecord.attrFile);
  406. 363 M2Strings.Assign( FileInfoRecord.achName, name );
  407. 364 END;
  408. 365 RETURN StringIO.NoError;
  409. 366 END FindFirstFile;
  410. 367
  411. 368
  412. 369 PROCEDURE FindNextFile( DirHandle: CARDINAL;
  413. 370 VAR FileInfo : FileInfoRec) : CARDINAL;
  414. 371 VAR
  415. 372 ErrorReturn : CARDINAL;
  416. 373 Reserved : LONGINT;
  417. 374 SearchCount : CARDINAL;
  418. 375 FileInfoRecord : FAPI.FILEFINDBUF;
  419. 376 BEGIN
  420. 377 SearchCount := 1;
  421. 378 ErrorReturn := FAPI.DOSFINDNEXT( DirHandle,
  422. 379 SYSTEM.ADR(FileInfoRecord), SYSTEM.SIZE(FileInfoRecord),
  423. 380 SYSTEM.ADR(SearchCount) );
  424. 381 IF ErrorReturn # 0 THEN
  425. 382 RETURN ErrorReturn;
  426. 383 END;
  427. 384 WITH FileInfo DO
  428. 385 ByteFiddler.CardinalToTime( CARDINAL(FileInfoRecord.ftimeLastWrite),
  429. 386 hour, minute, second );
  430. 387 ByteFiddler.CardinalToDate( CARDINAL(FileInfoRecord.fdateLastWrite),
  431. 388 month, day, year );
  432. 389 size := FileInfoRecord.cbFile;
  433. 390 attribute := ModeSet(FileInfoRecord.attrFile);
  434. 391 StrEdit.AssignStr( FileInfoRecord.achName, name );
  435. 392 END;
  436. 393 RETURN StringIO.NoError;
  437. 394 END FindNextFile;
  438. 395
  439. 396
  440. 397 PROCEDURE FreeDiskSpace(DriveLetter : CHAR; VAR FreeBytes : LONGINT) :
  441. 398 CARDINAL;
  442. 399 VAR
  443. 400 DriveNum, ErrorReturn: CARDINAL;
  444. 401 Level1Data:FAPI.FSALLOCATE;
  445. 402 BEGIN
  446. 403 FreeBytes := Numbers.Lc( 0 );
  447. 404 DriveLetter := CAP(DriveLetter);
  448. 405 IF (DriveLetter < 'A') OR (DriveLetter > 'Z') THEN
  449. 406 (* 26 July 87: changed from AND at suggestion of Marc
  450. 407 Scheuner and Gregor Kley. *)
  451. 408 ErrorManager.WARN('Invalid drive specification');
  452. 409 END;
  453. 410 IF DriveLetter='Z' THEN
  454. 411 (*'Z' means default drive*)
  455. 412 DriveNum := 0;
  456. 413 ELSE
  457. 414 DriveNum := ORD(DriveLetter)-64;
  458. 415 END;
  459. 416 (*turns an A into a 1, etc*)
  460. 417 ErrorReturn := FAPI.DOSQFSINFO( DriveNum,
  461. 418 1, SYSTEM.ADR(Level1Data), SYSTEM.SIZE(Level1Data));
  462. 419 IF ErrorReturn # 0 THEN
  463. 420 RETURN ErrorReturn;
  464. 421 ELSE
  465. 422 FreeBytes := (Level1Data.cUnitAvail) *
  466. 423 (Numbers.Lc (Level1Data.cbSector) *
  467. 424 Level1Data.cSectorUnit);
  468. 425 RETURN StringIO.NoError;
  469. 426 END;
  470. 427 END FreeDiskSpace;
  471. 428
  472. 429
  473. 430 PROCEDURE GetCurrentDir(TheDrive : CHAR; VAR ThePath : ARRAY OF CHAR) :
  474. 431 CARDINAL;
  475. 432 VAR
  476. 433 ErrorReturn, PathLength, DriveNum:CARDINAL;
  477. 434 cnt : CARDINAL;
  478. 435 BEGIN
  479. 436 TheDrive := CAP(TheDrive);
  480. 437 IF TheDrive = 'Z' THEN
  481. 438 DriveNum := 0;
  482. 439 ELSE
  483. 440 DriveNum := ((ORD(TheDrive)-OrdA)+1);
  484. 441 END;
  485. 442 PathLength := HIGH( ThePath ) + 1;
  486. 443 ErrorReturn := FAPI.DOSQCURDIR(DriveNum, SYSTEM.ADR(ThePath),
  487. 444 SYSTEM.ADR(PathLength) );
  488. 445 M2Strings.Insert( backslash, ThePath, 0 );
  489. 446 RETURN ErrorReturn;
  490. 447 END GetCurrentDir;
  491. 448
  492. 449
  493. 450 PROCEDURE GetDefaultDrive() : CHAR;
  494. 451 (*Returns the current default drive as an upper case letter.*)
  495. 452 VAR
  496. 453 DriveNum, ErrorReturn: CARDINAL;
  497. 454 LogicalDriveMap: FAPI.ULONG;
  498. 455 BEGIN
  499. 456 ErrorReturn := FAPI.DOSQCURDISK( SYSTEM.ADR(DriveNum),
  500. 457 SYSTEM.ADR(LogicalDriveMap) );
  501. 458 IF ErrorReturn # 0 THEN
  502. 459 ErrorManager.WarnNumber("DOSQCURDISK Error", ErrorReturn );
  503. 460 END;
  504. 461 RETURN( CHR( ORD(DriveNum) + OrdA - 1 ) );
  505. 462 END GetDefaultDrive;
  506. 463
  507. 464
  508. 465 PROCEDURE GetDiskInfo( TheDrive: CHAR; VAR BytesPerSector,
  509. 466 SectorsPerCluster, ClustersOnDisk: CARDINAL; VAR
  510. 467 KindOfDisk: DiskTypes );
  511. 468 VAR
  512. 469 DriveNum, ErrorReturn: CARDINAL;
  513. 470 FatIDByte: CHAR;
  514. 471 Level1Data: FAPI.FSALLOCATE;
  515. 472 BEGIN
  516. 473 TheDrive := CAP(TheDrive);
  517. 474 IF TheDrive = 'Z' THEN
  518. 475 DriveNum := 0;
  519. 476 ELSE
  520. 477 DriveNum := (ORD(TheDrive) - OrdA) + 1;
  521. 478 END;
  522. 479 ErrorReturn := FAPI.DOSQFSINFO( DriveNum, 1, SYSTEM.ADR(Level1Data),
  523. 480 SYSTEM.SIZE(Level1Data) );
  524. 481 IF ErrorReturn # 0 THEN
  525. 482 ErrorManager.WarnNumber( "DOSQFSINFO error", ErrorReturn );
  526. 483 END;
  527. 484 BytesPerSector := Level1Data.cbSector;
  528. 485 SectorsPerCluster := Numbers.C(Level1Data.cSectorUnit);
  529. 486 ClustersOnDisk := Numbers.C(Level1Data.cUnit);
  530. 487 KindOfDisk := unknown;
  531. 488 END GetDiskInfo;
  532. 489
  533. 490
  534. 491 PROCEDURE GetDirFromList( PathStyleStr: ARRAY OF CHAR; whichDir: CARDINAL;
  535. 492 VAR output: ARRAY OF CHAR ): BOOLEAN;
  536. 493 VAR
  537. 494 StartSpot, EndSpot, inStrLngth: CARDINAL;
  538. 495 BEGIN
  539. 496 inStrLngth := M2Strings.Length(PathStyleStr);
  540. 497 output[0] := 0C;
  541. 498 IF whichDir = 0 THEN
  542. 499 RETURN( FALSE );
  543. 500 END;
  544. 501 IF whichDir = 1 THEN
  545. 502 StartSpot := LowLevel.ScanEQ( inStrLngth, '=',
  546. 503 SYSTEM.ADR(PathStyleStr) );
  547. 504 IF StartSpot >= inStrLngth THEN
  548. 505 StartSpot := 0;
  549. 506 END;
  550. 507 ELSE
  551. 508 StartSpot := PosUtils.FindNthPattern(semicolon, whichDir - 1,
  552. 509 PathStyleStr);
  553. 510 IF StartSpot >= inStrLngth THEN
  554. 511 RETURN( FALSE );
  555. 512 END;
  556. 513 END;
  557. 514 EndSpot := PosUtils.FindNthPattern(semicolon, whichDir, PathStyleStr);
  558. 515 IF EndSpot >= inStrLngth THEN
  559. 516 IF PosUtils.LastNonMatching(blank, PathStyleStr) = semicolon THEN
  560. 517 RETURN( FALSE );
  561. 518 END;
  562. 519 EndSpot := inStrLngth;
  563. 520 END;
  564. 521 (* At this point, EndSpot is either sitting on the trailing null
  565. 522 or on the semicolon following the directory name we want to
  566. 523 copy out. *)
  567. 524 M2Strings.Copy( PathStyleStr, StartSpot, EndSpot - StartSpot,
  568. 525 output );
  569. 526 IF PosUtils.LastNonMatching(blank, output) # backslash THEN
  570. 527 StrEdit.Append( output, backslash );
  571. 528 END;
  572. 529 RETURN( TRUE );
  573. 530 END GetDirFromList;
  574. 531
  575. 532
  576. 533 PROCEDURE GetDrivePathAndName( FileSpec: ARRAY OF CHAR; VAR
  577. 534 DriveLetter: CHAR; VAR PathName, FileName : ARRAY OF CHAR);
  578. 535 VAR
  579. 536 TmpStr : ARRAY [0..79] OF CHAR;
  580. 537 spot: CARDINAL;
  581. 538 SavedMessage: CARDINAL;
  582. 539 BEGIN
  583. 540 (*GetDrivePathAndName*)
  584. 541 StrEdit.AssignStr( null, PathName );
  585. 542 StrEdit.AssignStr( null, FileName );
  586. 543 DriveLetter := 'Z';
  587. 544 spot := 0;
  588. 545 WHILE spot+1 <= M2Strings.Length(FileSpec) DO
  589. 546 IF FileSpec[spot] = ':' THEN
  590. 547 DriveLetter := FileSpec[ spot - 1 ];
  591. 548 M2Strings.Delete(FileSpec, 0, 1 + spot);
  592. 549 spot := 0;
  593. 550 ELSIF (FileSpec[spot]=backslash) OR (FileSpec[spot]=fwdslash) THEN
  594. 551 M2Strings.Copy(FileSpec, 0, spot + 1, TmpStr);
  595. 552 StrEdit.Append(PathName, TmpStr);
  596. 553 M2Strings.Delete(FileSpec, 0, 1 + spot);
  597. 554 spot := 0;
  598. 555 ELSE
  599. 556 INC(spot);
  600. 557 END;
  601. 558 END;
  602. 559 IF DriveLetter = 'Z' THEN
  603. 560 DriveLetter := GetDefaultDrive();
  604. 561 END;
  605. 562 IF M2Strings.Length(PathName) = 0 THEN
  606. 563 SavedMessage := GetCurrentDir( DriveLetter, PathName );
  607. 564 IF SavedMessage # StringIO.NoError THEN
  608. 565 StringIO.PrintMessage( SavedMessage );
  609. 566 HALT();
  610. 567 (*This error shouldn't be possible.*)
  611. 568 END;
  612. 569 IF PathName[ M2Strings.Length(PathName) - 1 ] # backslash THEN
  613. 570 StrEdit.Append( PathName, backslash );
  614. 571 END;
  615. 572 END;
  616. 573 IF (M2Strings.Length(FileSpec) > 0) AND (NOT (PosUtils.Present('*',
  617. 574 FileSpec))) AND (NOT (PosUtils.Present('?', FileSpec))) THEN
  618. 575 StrEdit.AssignStr( FileSpec, FileName );
  619. 576 END;
  620. 577 END GetDrivePathAndName;
  621. 578
  622. 579
  623. 580 PROCEDURE GetFileDateAndTime(FileHandle : CARDINAL; VAR month,
  624. 581 day, year, hours, minutes, seconds : CARDINAL);
  625. 582 VAR
  626. 583 ErrorReturn: CARDINAL;
  627. 584 FileInfoRec: FAPI.FILEFINDBUF;
  628. 585
  629. 586 BEGIN
  630. 587 (*GetFileDateAndTime*)
  631. 588 LowLevel.Fill( SYSTEM.ADR(FileInfoRec), SYSTEM.SIZE(FileInfoRec), 0C );
  632. 589 ErrorReturn := FAPI.DOSQFILEINFO( FileHandle, 1,
  633. 590 SYSTEM.ADR(FileInfoRec), SYSTEM.SIZE(FileInfoRec) );
  634. 591 (*
  635. 592 Diagnostics.diagC( 'FileHandle', FileHandle );
  636. 593 Diagnostics.diagC( 'fdateCreation', FileInfoRec.fdateCreation );
  637. 594 Diagnostics.diagC( 'ftimeCreation', FileInfoRec.ftimeCreation );
  638. 595 Diagnostics.diagC( 'fdateLastAccess', FileInfoRec.fdateLastAccess );
  639. 596 Diagnostics.diagC( 'ftimeLastAccess', FileInfoRec.ftimeLastAccess );
  640. 597 Diagnostics.diagC( 'fdateLastWrite', FileInfoRec.fdateLastWrite );
  641. 598 Diagnostics.diagC( 'ftimeLastWrite', FileInfoRec.ftimeLastWrite );
  642. 599 Diagnostics.diagL( 'file', FileInfoRec.file );
  643. 600 Diagnostics.diagL( 'fileAlloc', FileInfoRec.fileAlloc );
  644. 601 Diagnostics.diagC( 'attrFile', FileInfoRec.attrFile );
  645. 602 Diagnostics.diagC( 'cname', ORD(FileInfoRec.cname) );
  646. 603 Diagnostics.diagS( 'name', FileInfoRec.name );
  647. 604 Diagnostics.diagBlock( 'FileInfoRec', SYSTEM.ADR(FileInfoRec), SYSTEM.SIZE(FileInfoRec) );
  648. 605 *)
  649. 606 IF ErrorReturn # 0 THEN
  650. 607 ErrorManager.WarnNumber( "GetFileDateAndTime error ", ErrorReturn );
  651. 608 ELSE
  652. 609 ByteFiddler.CardinalToTime( CARDINAL(FileInfoRec.ftimeLastWrite),
  653. 610 hours, minutes, seconds );
  654. 611 ByteFiddler.CardinalToDate( CARDINAL(FileInfoRec.fdateLastWrite),
  655. 612 month, day, year );
  656. 613 END;
  657. 614 END GetFileDateAndTime;
  658. 615
  659. 616
  660. 617 PROCEDURE GetFileMode(FileName : ARRAY OF CHAR; VAR TheSet : ModeSet) :
  661. 618 CARDINAL;
  662. 619 VAR
  663. 620 ErrorReturn: CARDINAL;
  664. 621 DosFileAttr: FAPI.USHORT;
  665. 622 Reserved: LONGINT;
  666. 623 TmpSet: ModeSetCaster;
  667. 624 LocalStr: ARRAY [0..79] OF CHAR;
  668. 625 BEGIN
  669. 626 TmpSet.a := ModeSet{};
  670. 627 M2Strings.Assign( FileName, LocalStr );
  671. 628 ErrorReturn:= FAPI.DOSQFILEMODE(SYSTEM.ADR(LocalStr),
  672. 629 SYSTEM.ADR(DosFileAttr), Reserved);
  673. 630 IF ErrorReturn # 0 THEN
  674. 631 TheSet := TmpSet.a;
  675. 632 ErrorManager.WarnNumber("DosQFileMode error", ErrorReturn );
  676. 633 RETURN ErrorReturn;
  677. 634 ELSE
  678. 635 TmpSet.b := BITSET(CARDINAL(DosFileAttr));
  679. 636 TheSet := TmpSet.a;
  680. 637 RETURN StringIO.NoError;
  681. 638 END;
  682. 639 END GetFileMode;
  683. 640
  684. 641
  685. 642 PROCEDURE MkDir(DirName : ARRAY OF CHAR) : CARDINAL;
  686. 643 VAR
  687. 644 Reserved:LONGINT;
  688. 645 ErrorReturn:CARDINAL;
  689. 646 LocalStr: ARRAY [0..79] OF CHAR;
  690. 647 BEGIN
  691. 648 M2Strings.Assign( DirName, LocalStr );
  692. 649 ErrorReturn := FAPI.DOSMKDIR(SYSTEM.ADR(LocalStr),Reserved);
  693. 650 RETURN ErrorReturn;
  694. 651 END MkDir;
  695. 652
  696. 653
  697. 654 PROCEDURE RenameFile(OldFileName, NewFileName : ARRAY OF CHAR) :
  698. 655 CARDINAL;
  699. 656 VAR
  700. 657 ErrorReturn:CARDINAL;
  701. 658 dumstr : ARRAY [0..5] OF CHAR;
  702. 659 LocalStr1, LocalStr2: ARRAY [0..79] OF CHAR;
  703. 660 BEGIN
  704. 661 M2Strings.Assign( OldFileName, LocalStr1 );
  705. 662 M2Strings.Assign( NewFileName, LocalStr2 );
  706. 663 IF M2Strings.Pos(':',LocalStr2) = 1 THEN
  707. 664 M2Strings.Delete(LocalStr2, 0, 2);
  708. 665 END;
  709. 666 IF M2Strings.Pos(':',LocalStr1) = 1 THEN
  710. 667 M2Strings.Copy(LocalStr1, 0, 2, dumstr);
  711. 668 (* 26 July 87: changed from 1, 2 at suggestion of Marc
  712. 669 Scheuner and Gregor Kley. *)
  713. 670 M2Strings.Insert(dumstr, LocalStr2, 0+byte1);
  714. 671 END;
  715. 672 ErrorReturn := FAPI.DOSMOVE( SYSTEM.ADR(LocalStr1),
  716. 673 SYSTEM.ADR(LocalStr2), NumTypes.L0);
  717. 674 RETURN ErrorReturn;
  718. 675 END RenameFile;
  719. 676
  720. 677
  721. 678 PROCEDURE RmDir(DirName : ARRAY OF CHAR) : CARDINAL;
  722. 679 VAR
  723. 680 ErrorReturn: CARDINAL;
  724. 681 Reserved: LONGINT;
  725. 682 LocalStr: ARRAY [0..79] OF CHAR;
  726. 683 BEGIN
  727. 684 M2Strings.Assign( DirName, LocalStr );
  728. 685 ErrorReturn := FAPI.DOSRMDIR(SYSTEM.ADR(LocalStr),
  729. 686 Reserved);
  730. 687 RETURN ErrorReturn;
  731. 688 END RmDir;
  732. 689
  733. 690
  734. 691 PROCEDURE SetDefaultDrive(DriveLetter : CHAR);
  735. 692 (*Needs to return an ErrorMessage so that you can
  736. 693 determine how many drives there are in the system.*)
  737. 694 VAR
  738. 695 ErrorReturn: CARDINAL;
  739. 696 DriveNum: CARDINAL;
  740. 697 BEGIN
  741. 698 DriveLetter := CAP(DriveLetter);
  742. 699 IF (DriveLetter<'A') OR (DriveLetter>'Z') THEN
  743. 700 StringIO.PrintMessage(StringIO.InvalidDrive);
  744. 701 END;
  745. 702 DriveNum := (ORD(DriveLetter)-OrdA);
  746. 703 ErrorReturn := FAPI.DOSSELECTDISK(DriveNum);
  747. 704 IF ErrorReturn # 0 THEN
  748. 705 StringIO.PrintMessage(ErrorReturn);
  749. 706 END;
  750. 707 END SetDefaultDrive;
  751. 708
  752. 709
  753. 710 PROCEDURE SetFileDateAndTime(FileHandle, month, day, year, hours,
  754. 711 minutes, seconds : CARDINAL);
  755. 712 VAR
  756. 713 ErrorReturn: CARDINAL;
  757. 714 FileInfoRec: FAPI.FILEFINDBUF;
  758. 715 BEGIN
  759. 716 (*SetFileDateAndTime*)
  760. 717 LowLevel.Fill( SYSTEM.ADR(FileInfoRec), SYSTEM.SIZE(FileInfoRec), 0C );
  761. 718 FileInfoRec.fdateLastWrite := FAPI.FDATE(ByteFiddler.DateToCardinal(month, day,
  762. 719 year));
  763. 720 FileInfoRec.ftimeLastWrite := FAPI.FTIME(ByteFiddler.TimeToCardinal(hours,
  764. 721 minutes, seconds));
  765. 722 ErrorReturn := FAPI.DOSSETFILEINFO( FileHandle, 1,
  766. 723 SYSTEM.ADR(FileInfoRec), SYSTEM.TSIZE(FAPI.FILEFINDBUF) );
  767. 724 IF ErrorReturn # 0 THEN
  768. 725 ErrorManager.WarnNumber( 'SetFileDateAndTime error', ErrorReturn );
  769. 726 END;
  770. 727 END SetFileDateAndTime;
  771. 728
  772. 729
  773. 730 PROCEDURE SetFileMode(FileName : ARRAY OF CHAR; TheSet : ModeSet) :
  774. 731 CARDINAL;
  775. 732 VAR
  776. 733 ErrorReturn: CARDINAL;
  777. 734 Reserved: LONGINT;
  778. 735 TmpSet: ModeSetCaster;
  779. 736 LocalStr: ARRAY [0..79] OF CHAR;
  780. 737 BEGIN
  781. 738 TmpSet.a := TheSet;
  782. 739 M2Strings.Assign( FileName, LocalStr );
  783. 740 ErrorReturn := FAPI.DOSSETFILEMODE(SYSTEM.ADR(LocalStr),
  784. 741 FAPI.FILE_NORMAL, Reserved);
  785. 742 RETURN ErrorReturn;
  786. 743 END SetFileMode;
  787. 744
  788. 745 PROCEDURE SetFileLength( TheHandle:CARDINAL;length:LONGINT):CARDINAL;
  789. 746
  790. 747 BEGIN
  791. 748 RETURN FAPI.DOSNEWSIZE(TheHandle,length);
  792. 749 END SetFileLength;
  793. 750
  794. 751
  795. 752 PROCEDURE ValidFile( fname: ARRAY OF CHAR ): BOOLEAN;
  796. 753 VAR
  797. 754 TmpHandle: CARDINAL;
  798. 755 ErrorReturn: CARDINAL;
  799. 756 BEGIN
  800. 757 IF HandleIO.FileExists( fname ) THEN
  801. 758 RETURN TRUE;
  802. 759 END;
  803. 760 IF HandleIO.CreateFile( TmpHandle, fname ) = StringIO.NoError THEN
  804. 761 ErrorReturn := HandleIO.CloseHandle(TmpHandle);
  805. 762 ErrorReturn := DeleteFile( fname );
  806. 763 RETURN (ErrorReturn = StringIO.NoError);
  807. 764 ELSE
  808. 765 RETURN FALSE;
  809. 766 END;
  810. 767 END ValidFile;
  811. 768
  812. 769
  813. 770 PROCEDURE VolumeLabel(TheDrive : CHAR; VAR TheLabel : ARRAY OF CHAR);
  814. 771 (*Returns the label of the disk in TheDrive.*)
  815. 772 VAR
  816. 773 DriveNum, ErrorReturn: CARDINAL;
  817. 774 Level2Data: FAPI.FSINFO;
  818. 775 cnt : CARDINAL;
  819. 776 nextchar : CHAR;
  820. 777 BEGIN
  821. 778 (*VolumeLabel*)
  822. 779 TheDrive := CAP(TheDrive);
  823. 780 IF TheDrive='Z' THEN
  824. 781 DriveNum := 0;
  825. 782 ELSE
  826. 783 DriveNum := ORD(TheDrive) - OrdA + 1;
  827. 784 (*sets 'A' to 1, 'B' to 2, etc.*)
  828. 785 END;
  829. 786 StrEdit.AssignStr(null, TheLabel);
  830. 787 ErrorReturn := FAPI.DOSQFSINFO( DriveNum,
  831. 788 2, SYSTEM.ADR(Level2Data), SYSTEM.TSIZE(FAPI.FSINFO));
  832. 789 IF (ErrorReturn = 125) THEN
  833. 790 (* DOSQFSINFO returns 125 if the drive has no volume label.
  834. 791 In this case we set TheLabel to preserve compatibility with
  835. 792 DOS version. *)
  836. 793 StrEdit.AssignStr( 'unlabelled volume', TheLabel );
  837. 794 ELSIF (ErrorReturn # 0) THEN
  838. 795 ErrorManager.WarnNumber( "DosQFSInfo error", ErrorReturn );
  839. 796 ELSE
  840. 797 StrEdit.AssignStr( Level2Data.vol.szVolLabel, TheLabel );
  841. 798 END;
  842. 799 END VolumeLabel;
  843. 800
  844. 801
  845. 802 PROCEDURE FindFiles(FileName : ARRAY OF CHAR; FileProc :
  846. 803 FileInfoProc) : CARDINAL;
  847. 804 VAR
  848. 805 info : FileInfoRec;
  849. 806 DirHandle, result : CARDINAL;
  850. 807 BEGIN
  851. 808 DirHandle := 0FFFFH;
  852. 809 result := FindFirstFile(FileName, DirHandle, info);
  853. 810 IF result=StringIO.NoError THEN
  854. 811 LOOP
  855. 812 IF NOT FileProc(info) THEN
  856. 813 EXIT;
  857. 814 END;
  858. 815 result := FindNextFile(DirHandle, info);
  859. 816 IF result#StringIO.NoError THEN
  860. 817 IF result = StringIO.NoMoreFiles THEN
  861. 818 result := StringIO.NoError;
  862. 819 END;
  863. 820 EXIT;
  864. 821 END;
  865. 822 END;
  866. 823 END;
  867. 824 IF 0 # FAPI.DOSFINDCLOSE( DirHandle ) THEN END;
  868. 825 RETURN result;
  869. 826 END FindFiles;
  870. 827
  871. 828
  872. 829 BEGIN
  873. 830 Initialized := FALSE;
  874. 831 Init();
  875. 832 END Drectory.
  876. 42 errors