fileio.pas 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631
  1. { $Id$ }
  2. {********[ SOURCE FILE OF GRAPHICAL FREE VISION ]**********}
  3. { }
  4. { System independent FILE I/O control }
  5. { }
  6. { Copyright (c) 1996, 1997, 1998, 1999 by Leon de Boer }
  7. { [email protected] - primary e-mail address }
  8. { [email protected] - backup e-mail address }
  9. { }
  10. {****************[ THIS CODE IS FREEWARE ]*****************}
  11. { }
  12. { This sourcecode is released for the purpose to }
  13. { promote the pascal language on all platforms. You may }
  14. { redistribute it and/or modify with the following }
  15. { DISCLAIMER. }
  16. { }
  17. { This SOURCE CODE is distributed "AS IS" WITHOUT }
  18. { WARRANTIES AS TO PERFORMANCE OF MERCHANTABILITY OR }
  19. { ANY OTHER WARRANTIES WHETHER EXPRESSED OR IMPLIED. }
  20. { }
  21. {*****************[ SUPPORTED PLATFORMS ]******************}
  22. { 16 and 32 Bit compilers }
  23. { DOS - Turbo Pascal 7.0 + (16 Bit) }
  24. { DPMI - Turbo Pascal 7.0 + (16 Bit) }
  25. { - FPC 0.9912+ (GO32V2) (32 Bit) }
  26. { WINDOWS - Turbo Pascal 7.0 + (16 Bit) }
  27. { - Delphi 1.0+ (16 Bit) }
  28. { WIN95/NT - Delphi 2.0+ (32 Bit) }
  29. { - Virtual Pascal 2.0+ (32 Bit) }
  30. { - Speedsoft Sybil 2.0+ (32 Bit) }
  31. { - FPC 0.9912+ (32 Bit) }
  32. { OS2 - Virtual Pascal 1.0+ (32 Bit) }
  33. { - Speed Pascal 1.0+ (32 Bit) }
  34. { - C'T patch to BP (16 Bit) }
  35. { }
  36. {******************[ REVISION HISTORY ]********************}
  37. { Version Date Fix }
  38. { ------- --------- --------------------------------- }
  39. { 1.00 12 Jun 96 First DOS/DPMI platform release }
  40. { 1.10 12 Mar 97 Windows conversion added. }
  41. { 1.20 29 Aug 97 Platform.inc sort added. }
  42. { 1.30 12 Jun 98 Virtual pascal 2.0 code added. }
  43. { 1.40 10 Sep 98 Checks run & commenting added. }
  44. { 1.50 28 Oct 98 Fixed for FPC version 0.998 }
  45. { Only Go32v2 supported no Go32v1 }
  46. { 1.60 14 Jun 99 References to Common.pas added. }
  47. { 1.61 07 Jul 99 Speedsoft SYBIL 2.0 code added. }
  48. { 1.62 03 Nov 99 FPC windows support added. }
  49. {**********************************************************}
  50. UNIT FileIO;
  51. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  52. INTERFACE
  53. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  54. {====Include file to sort compiler platform out =====================}
  55. {$I Platform.inc}
  56. {====================================================================}
  57. {==== Compiler directives ===========================================}
  58. {$IFNDEF PPC_FPC} { FPC doesn't support these switches }
  59. {$F-} { Short calls are okay }
  60. {$A+} { Word Align Data }
  61. {$B-} { Allow short circuit boolean evaluations }
  62. {$O+} { This unit may be overlaid }
  63. {$G+} { 286 Code optimization - if you're on an 8088 get a real computer }
  64. {$P-} { Normal string variables }
  65. {$E+} { Emulation is on }
  66. {$N-} { No 80x87 code generation }
  67. {$ENDIF}
  68. {$X+} { Extended syntax is ok }
  69. {$R-} { Disable range checking }
  70. {$S-} { Disable Stack Checking }
  71. {$I-} { Disable IO Checking }
  72. {$Q-} { Disable Overflow Checking }
  73. {$V-} { Turn off strict VAR strings }
  74. {====================================================================}
  75. {$IFDEF OS_DOS} { DOS/DPMI ONLY }
  76. {$IFDEF PPC_FPC} { FPC COMPILER }
  77. {$IFNDEF GO32V2} { MUST BE GO32V2 }
  78. This only works in GO32V2 mode in FPC!
  79. {$ENDIF}
  80. {$ENDIF}
  81. {$ENDIF}
  82. USES Common; { Standard GFV unit }
  83. {***************************************************************************}
  84. { PUBLIC CONSTANTS }
  85. {***************************************************************************}
  86. {---------------------------------------------------------------------------}
  87. { FILE ACCESS MODE CONSTANTS }
  88. {---------------------------------------------------------------------------}
  89. CONST
  90. fa_Create = $3C00; { Create new file }
  91. fa_OpenRead = $3D00; { Read access only }
  92. fa_OpenWrite = $3D01; { Write access only }
  93. fa_Open = $3D02; { Read/write access }
  94. {---------------------------------------------------------------------------}
  95. { FILE SHARE MODE CONSTANTS }
  96. {---------------------------------------------------------------------------}
  97. CONST
  98. fm_DenyAll = $0010; { Exclusive file use }
  99. fm_DenyWrite = $0020; { Deny write access }
  100. fm_DenyRead = $0030; { Deny read access }
  101. fm_DenyNone = $0040; { Deny no access }
  102. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  103. CONST
  104. HFILE_ERROR = -1; { File handle error }
  105. {$ENDIF}
  106. {***************************************************************************}
  107. { PUBLIC TYPE DEFINITIONS }
  108. {***************************************************************************}
  109. {---------------------------------------------------------------------------}
  110. { ASCIIZ FILENAME }
  111. {---------------------------------------------------------------------------}
  112. TYPE
  113. AsciiZ = Array [0..255] Of Char; { Filename array }
  114. {***************************************************************************}
  115. { INTERFACE ROUTINES }
  116. {***************************************************************************}
  117. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  118. { FILE CONTROL ROUTINES }
  119. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  120. {-FileClose----------------------------------------------------------
  121. The file opened by the handle is closed. If close action is successful
  122. true is returned but if the handle is invalid or a file error occurs
  123. false will be returned.
  124. 20Oct98 LdB
  125. ---------------------------------------------------------------------}
  126. FUNCTION FileClose (Handle: Word): Boolean;
  127. {-FileOpen-----------------------------------------------------------
  128. Given a valid filename to file that exists, is not locked with a valid
  129. access mode the file is opened and the file handle returned. If the
  130. name or mode is invalid or an error occurs the return will be zero.
  131. 27Oct98 LdB
  132. ---------------------------------------------------------------------}
  133. FUNCTION FileOpen (Var FileName: AsciiZ; Mode: Word): Word;
  134. {-SetFileSize--------------------------------------------------------
  135. The file opened by the handle is set the given size. If the action is
  136. successful zero is returned but if the handle is invalid or a file error
  137. occurs a standard file error value will be returned.
  138. 21Oct98 LdB
  139. ---------------------------------------------------------------------}
  140. FUNCTION SetFileSize (Handle: Word; FileSize: LongInt): Word;
  141. {-SetFilePos---------------------------------------------------------
  142. The file opened by the handle is set the given position in the file.
  143. If the action is successful zero is returned but if the handle is invalid
  144. the position is beyond the file size or a file error occurs a standard
  145. file error value will be returned.
  146. 21Oct98 LdB
  147. ---------------------------------------------------------------------}
  148. FUNCTION SetFilePos (Handle: Word; Pos: LongInt; MoveType: Word;
  149. Var Actual: LongInt): Word;
  150. {-FileRead-----------------------------------------------------------
  151. The file opened by the handle has count bytes read from it an placed
  152. into the given buffer. If the read action is successful the actual bytes
  153. transfered is returned in actual and the function returns zero. If an
  154. error occurs the function will return a file error constant and actual
  155. will contain the bytes transfered before the error if any.
  156. 22Oct98 LdB
  157. ---------------------------------------------------------------------}
  158. FUNCTION FileRead (Handle: Word; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
  159. {-FileWrite----------------------------------------------------------
  160. The file opened by the handle has count bytes written to it from the
  161. given buffer. If the write action is successful the actual bytes
  162. transfered is returned in actual and the function returns zero. If an
  163. error occurs the function will return a file error constant and actual
  164. will contain the bytes transfered before the error if any.
  165. 22Oct98 LdB
  166. ---------------------------------------------------------------------}
  167. FUNCTION FileWrite (Handle: Word; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
  168. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  169. IMPLEMENTATION
  170. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  171. {$IFDEF OS_WINDOWS} { WIN/NT UNITS }
  172. {$IFNDEF PPC_SPEED} { NON SPEED COMPILER }
  173. {$IFDEF PPC_FPC} { FPC WINDOWS COMPILER }
  174. USES Windows; { Standard unit }
  175. {$ELSE} { NON FPC COMPILER }
  176. USES WinTypes, WinProcs; { Stardard units }
  177. {$ENDIF}
  178. TYPE LongWord = LongInt; { Type fixup }
  179. {$ELSE} { SPEEDSOFT COMPILER }
  180. USES WinNT, WinBase; { Standard units }
  181. {$ENDIF}
  182. {$ENDIF}
  183. {$IFDEF OS_OS2} { OS2 COMPILERS }
  184. {$IFDEF PPC_VIRTUAL} { VIRTUAL PASCAL UNITS }
  185. USES OS2Base; { Standard unit }
  186. {$ENDIF}
  187. {$IFDEF PPC_SPEED} { SPEED PASCAL UNITS }
  188. USES BseDos, Os2Def; { Standard units }
  189. {$ENDIF}
  190. {$IFDEF PPC_BPOS2} { C'T PATCH TO BP UNITS }
  191. USES DosTypes, DosProcs; { Standard units }
  192. {$ENDIF}
  193. {$ENDIF}
  194. {***************************************************************************}
  195. { INTERFACE ROUTINES }
  196. {***************************************************************************}
  197. {---------------------------------------------------------------------------}
  198. { FileClose -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 20Oct98 LdB }
  199. {---------------------------------------------------------------------------}
  200. FUNCTION FileClose (Handle: Word): Boolean;
  201. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  202. {$IFDEF ASM_BP} { BP COMPATABLE ASM }
  203. ASSEMBLER;
  204. ASM
  205. MOV BX, Handle; { DOS file handle }
  206. MOV AX, $3E00; { Close function }
  207. PUSH BP; { Store register }
  208. INT $21; { Close the file }
  209. POP BP; { Reload register }
  210. MOV AL, True; { Preset true }
  211. JNC @@Exit1; { Return success }
  212. MOV AL, False; { Return failure }
  213. @@Exit1:
  214. END;
  215. {$ENDIF}
  216. {$IFDEF ASM_FPC} { FPC COMPATABLE ASM }
  217. VAR Regs: TRealRegs;
  218. BEGIN
  219. Regs.RealEBX := Handle; { Transfer handle }
  220. Regs.RealEAX := $3E00; { Close file function }
  221. SysRealIntr($21, Regs); { Call DOS interrupt }
  222. If (Regs.RealFlags AND $1 = 0) Then { Check carry flag }
  223. FileClose := True Else FileClose := False; { Return true/false }
  224. END;
  225. {$ENDIF}
  226. {$ENDIF}
  227. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  228. BEGIN
  229. {$IFDEF BIT_16} { 16 BIT WINDOWS CODE }
  230. If (_lclose(Handle) = 0) Then FileClose := True { Close the file }
  231. Else FileClose := False; { Closure failed }
  232. {$ENDIF}
  233. {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
  234. FileClose := CloseHandle(Handle); { Close the file }
  235. {$ENDIF}
  236. END;
  237. {$ENDIF}
  238. {$IFDEF OS_OS2} { OS2 CODE }
  239. BEGIN
  240. If (DosClose(Handle) = 0) Then FileClose := True { Try to close file }
  241. Else FileClose := False; { Closure failed }
  242. END;
  243. {$ENDIF}
  244. {---------------------------------------------------------------------------}
  245. { FileOpen -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 27Oct98 LdB }
  246. {---------------------------------------------------------------------------}
  247. FUNCTION FileOpen (Var FileName: AsciiZ; Mode: Word): Word;
  248. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  249. {$IFDEF ASM_BP} { BP COMPATABLE ASM }
  250. ASSEMBLER;
  251. ASM
  252. MOV AX, Mode; { Mode to open file }
  253. XOR CX, CX; { No attributes set }
  254. PUSH DS; { Save segment }
  255. LDS DX, FileName; { Filename to open }
  256. PUSH BP; { Store register }
  257. INT $21; { Open/create file }
  258. POP BP; { Restore register }
  259. POP DS; { Restore segment }
  260. JNC @@Exit2; { Check for error }
  261. XOR AX, AX; { Open fail return 0 }
  262. @@Exit2:
  263. END;
  264. {$ENDIF}
  265. {$IFDEF ASM_FPC} { FPC COMPATABLE ASM }
  266. VAR Regs: TRealRegs;
  267. BEGIN
  268. SysCopyToDos(LongInt(@FileName), 256); { Transfer filename }
  269. Regs.RealEDX := Tb MOD 16;
  270. Regs.RealDS := Tb DIV 16; { Linear addr of Tb }
  271. Regs.RealEAX := Mode; { Mode to open with }
  272. Regs.RealECX := 0; { No attributes set }
  273. SysRealIntr($21, Regs); { Call DOS int 21 }
  274. If (Regs.RealFlags AND 1 <> 0) Then FileOpen := 0{ Error encountered }
  275. Else FileOpen := Regs.RealEAX AND $FFFF; { Return file handle }
  276. END;
  277. {$ENDIF}
  278. {$ENDIF}
  279. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  280. VAR Hnd: Integer; OpenMode: Sw_Word;
  281. {$IFDEF BIT_16} Buf: TOfStruct; {$ENDIF} { 16 BIT VARIABLES }
  282. {$IFDEF BIT_32} ShareMode, Flags: LongInt; {$ENDIF} { 32 BIT VARIABLES }
  283. BEGIN
  284. {$IFDEF BIT_16} { 16 BIT WINDOW CODE }
  285. If (Mode = fa_Create) Then OpenMode := of_Create { Set create mask bit }
  286. Else OpenMode := Mode AND $00FF; { Set open mask bits }
  287. Hnd := OpenFile(FileName, Buf, OpenMode); { Open the file }
  288. {$ENDIF}
  289. {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
  290. If (Mode = fa_Create) Then Begin { Create file }
  291. OpenMode := Generic_Read OR Generic_Write; { Set access mask bit }
  292. Flags := Create_Always; { Create always mask }
  293. End Else Begin { Open the file }
  294. OpenMode := Generic_Read; { Read only access set }
  295. If (Mode AND $0001 <> 0) Then { Check write flag }
  296. OpenMode := OpenMode AND NOT Generic_Read; { Write only access set }
  297. If (Mode AND $0002 <> 0) Then { Check read/write flag }
  298. OpenMode := OpenMode OR Generic_Write; { Read/Write access }
  299. Flags := Open_Existing; { Open existing mask }
  300. End;
  301. ShareMode := file_Share_Read OR
  302. file_Share_Write; { Deny none flag set }
  303. Hnd := CreateFile(FileName, OpenMode, ShareMode,
  304. Nil, Flags, File_Attribute_Normal, 0); { Open the file }
  305. {$ENDIF}
  306. If (Hnd <> -1) Then FileOpen := Hnd Else { Return handle }
  307. FileOpen := 0; { Return error }
  308. END;
  309. {$ENDIF}
  310. {$IFDEF OS_OS2} { OS2 CODE }
  311. VAR OpenFlags, OpenMode: Word; Handle, ActionTaken: Sw_Word;
  312. BEGIN
  313. If (Mode = fa_Create) Then Begin { Create file }
  314. OpenMode := Open_Flags_NoInherit OR
  315. Open_Share_DenyNone OR
  316. Open_Access_ReadWrite; { Open mode }
  317. OpenFlags := OPEN_ACTION_CREATE_IF_NEW OR
  318. OPEN_ACTION_REPLACE_IF_EXISTS; { Open flags }
  319. End Else Begin
  320. OpenMode := Mode AND $00FF OR
  321. Open_Share_DenyNone; { Set open mode bits }
  322. OpenFlags := OPEN_ACTION_OPEN_IF_EXISTS; { Set open flags }
  323. End;
  324. {$IFDEF PPC_BPOS2} { C'T patched COMPILER }
  325. If (DosOpen(@FileName, Handle, ActionTaken, 0, 0,
  326. OpenFlags, OpenMode, 0) = 0) Then
  327. FileOpen := Handle Else FileOpen := 0; { Return handle/fail }
  328. {$ELSE} { OTHER OS2 COMPILERS }
  329. If (DosOpen(FileName, Handle, ActionTaken, 0, 0,
  330. OpenFlags, OpenMode, Nil) = 0) Then
  331. FileOpen := Handle Else FileOpen := 0; { Return handle/fail }
  332. {$ENDIF}
  333. END;
  334. {$ENDIF}
  335. {---------------------------------------------------------------------------}
  336. { SetFileSize -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 26Feb97 LdB }
  337. {---------------------------------------------------------------------------}
  338. FUNCTION SetFileSize (Handle: Word; FileSize: LongInt): Word;
  339. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  340. {$IFDEF ASM_BP} { BP COMPATABLE ASM }
  341. ASSEMBLER;
  342. ASM
  343. MOV DX, FileSize.Word[0]; { Load file position }
  344. MOV CX, FileSize.Word[2];
  345. MOV BX, Handle; { Load file handle }
  346. MOV AX, $4200; { Load function id }
  347. PUSH BP; { Store register }
  348. INT $21; { Position the file }
  349. POP BP; { Reload register }
  350. JC @@Exit3; { Exit if error }
  351. XOR CX, CX; { Force truncation }
  352. MOV BX, Handle; { File handle }
  353. MOV AX, $4000; { Load function id }
  354. PUSH BP; { Store register }
  355. INT $21; { Truncate file }
  356. POP BP; { Reload register }
  357. JC @@Exit3; { Exit if error }
  358. XOR AX, AX; { Return successful }
  359. @@Exit3:
  360. END;
  361. {$ENDIF}
  362. {$IFDEF ASM_FPC} { FPC COMPATABLE ASM }
  363. VAR Regs: TRealRegs;
  364. BEGIN
  365. Regs.RealEDX := FileSize AND $FFFF; { Lo word of filesize }
  366. Regs.RealECX := (FileSize SHR 16) AND $FFFF; { Hi word of filesize }
  367. Regs.RealEBX := LongInt(Handle); { Load file handle }
  368. Regs.RealEAX := $4000; { Load function id }
  369. SysRealIntr($21, Regs); { Call DOS int 21 }
  370. If (Regs.RealFlags AND 1 <> 0) Then
  371. SetFileSize := Regs.RealEAX AND $FFFF { Error encountered }
  372. Else SetFileSize := 0; { Return successful }
  373. END;
  374. {$ENDIF}
  375. {$ENDIF}
  376. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  377. VAR {$IFDEF BIT_16} Buf, {$ENDIF} Actual: LongInt;
  378. BEGIN
  379. {$IFDEF BIT_16} { 16 BIT WINDOWS CODE }
  380. Actual := _llseek(Handle, FileSize, 0); { Position file }
  381. If (Actual = FileSize) Then Begin { No position error }
  382. Actual := _lwrite(Handle, Pointer(@Buf), 0); { Truncate the file }
  383. If (Actual <> -1) Then SetFileSize := 0 Else { No truncate error }
  384. SetFileSize := 103; { File truncate error }
  385. End Else SetFileSize := 103; { File truncate error }
  386. {$ENDIF}
  387. {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
  388. Actual := SetFilePointer(Handle, FileSize, Nil, 0);{ Position file }
  389. If (Actual = FileSize) Then Begin { No position error }
  390. If SetEndOfFile(Handle) Then SetFileSize := 0 { No truncate error }
  391. Else SetFileSize := 103; { File truncate error }
  392. End Else SetFileSize := 103; { File truncate error }
  393. {$ENDIF}
  394. END;
  395. {$ENDIF}
  396. {$IFDEF OS_OS2} { OS2 CODE }
  397. BEGIN
  398. {$IFDEF PPC_BPOS2} { C'T patched COMPILER }
  399. SetFileSize := DosNewSize(Handle, FileSize); { Truncate the file }
  400. {$ELSE} { OTHER OS2 COMPILERS }
  401. SetFileSize := DosSetFileSize(Handle, FileSize); { Truncate the file }
  402. {$ENDIF}
  403. END;
  404. {$ENDIF}
  405. {---------------------------------------------------------------------------}
  406. { SetFilePos -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 25Feb97 LdB }
  407. {---------------------------------------------------------------------------}
  408. FUNCTION SetFilePos (Handle: Word; Pos: LongInt; MoveType: Word;
  409. Var Actual: LongInt): Word;
  410. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  411. {$IFDEF ASM_BP} { BP COMPATABLE ASM }
  412. ASSEMBLER;
  413. ASM
  414. MOV AX, MoveType; { Load move type }
  415. MOV AH, $42; { Load function id }
  416. MOV DX, Pos.Word[0]; { Load file position }
  417. MOV CX, Pos.Word[2];
  418. MOV BX, Handle; { Load file handle }
  419. PUSH BP; { Store register }
  420. INT $21; { Position the file }
  421. POP BP; { Reload register }
  422. JC @@Exit6;
  423. LES DI, Actual; { Actual var addr }
  424. MOV ES:[DI], AX;
  425. MOV ES:[DI+2], DX; { Update actual }
  426. XOR AX, AX; { Set was successful }
  427. @@Exit6:
  428. END;
  429. {$ENDIF}
  430. {$IFDEF ASM_FPC} { FPC COMPATABLE ASM }
  431. VAR Regs: TRealRegs;
  432. BEGIN
  433. Actual := 0; { Zero actual count }
  434. Regs.RealEAX := ($42 SHL 8) + Byte(MoveType); { Set function id }
  435. Regs.RealEBX := LongInt(Handle); { Fetch file handle }
  436. Regs.RealEDX := Pos AND $FFFF; { Keep low word }
  437. Regs.RealECX := Pos SHR 16; { Keep high word }
  438. SysRealIntr($21, Regs); { Call dos interrupt }
  439. If (Regs.RealFlags AND $1 = 0) Then Begin
  440. Actual := Lo(Regs.RealEDX) SHL 16 +
  441. Lo(Regs.RealEAX); { Current position }
  442. SetFilePos := 0; { Function successful }
  443. End Else SetFilePos := Lo(Regs.RealEAX); { I/O error returned }
  444. END;
  445. {$ENDIF}
  446. {$ENDIF}
  447. {$IFDEF OS_WINDOWS} { WINDOWS CODE }
  448. BEGIN
  449. {$IFDEF BIT_16} { 16 BIT WINDOWS CODE }
  450. Actual := _llseek(Handle, Pos, MoveType); { Position file }
  451. If (Actual <> -1) Then SetFilePos := 0 Else { No position error }
  452. SetFilePos := 107; { File position error }
  453. {$ENDIF}
  454. {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
  455. Actual := SetFilePointer(Handle, Pos, Nil, MoveType);{ Position file }
  456. If (Actual <> -1) Then SetFilePos := 0 Else { No position error }
  457. SetFilePos := 107; { File position error }
  458. {$ENDIF}
  459. END;
  460. {$ENDIF}
  461. {$IFDEF OS_OS2} { OS2 CODE }
  462. BEGIN
  463. {$IFDEF PPC_BPOS2}
  464. If (DosChgFilePtr(Handle, Pos, MoveType, Actual)=0){ Set file position }
  465. Then SetFilePos := 0 Else SetFilePos := 107; { File position error }
  466. {$ELSE} { OTHER OS2 COMPILERS }
  467. If (DosSetFilePtr(Handle, Pos, MoveType, Actual)=0){ Set file position }
  468. Then SetFilePos := 0 Else SetFilePos := 107; { File position error }
  469. {$ENDIF}
  470. END;
  471. {$ENDIF}
  472. {---------------------------------------------------------------------------}
  473. { FileRead -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct98 LdB }
  474. {---------------------------------------------------------------------------}
  475. FUNCTION FileRead (Handle: Word; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
  476. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  477. {$IFDEF ASM_BP} { BP COMPATABLE ASM }
  478. ASSEMBLER;
  479. ASM
  480. XOR AX, AX; { Zero register }
  481. LES DI, Actual; { Actual var address }
  482. MOV ES:[DI], AX; { Zero actual var }
  483. PUSH DS; { Save segment }
  484. LDS DX, Buf; { Data destination }
  485. MOV CX, Count; { Amount to read }
  486. MOV BX, Handle; { Load file handle }
  487. MOV AX, $3F00; { Load function id }
  488. PUSH BP; { Store register }
  489. INT $21; { Read from file }
  490. POP BP; { Reload register }
  491. POP DS; { Restore segment }
  492. JC @@Exit4; { Check for error }
  493. LES DI, Actual; { Actual var address }
  494. MOV ES:[DI], AX; { Update bytes moved }
  495. XOR AX, AX; { Return success }
  496. @@Exit4:
  497. END;
  498. {$ENDIF}
  499. {$IFDEF ASM_FPC} { FPC COMPATABLE ASM }
  500. BEGIN
  501. Actual := System.Do_Read(LongInt(Handle),
  502. LongInt(@Buf), Count); { Read data from file }
  503. FileRead := InOutRes; { I/O status returned }
  504. END;
  505. {$ENDIF}
  506. {$ENDIF}
  507. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  508. BEGIN
  509. {$IFDEF BIT_16} { 16 BIT WINDOWS CODE }
  510. Actual := _lread(Handle, Pointer(@Buf), Count); { Read from file }
  511. If (Actual = Count) Then FileRead := 0 Else { No read error }
  512. FileRead := 104; { File read error }
  513. {$ENDIF}
  514. {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
  515. If ReadFile(Handle, Buf, Count, DWord(Actual),
  516. Nil) AND (Actual = Count) Then FileRead := 0 { No read error }
  517. Else FileRead := 104; { File read error }
  518. {$ENDIF}
  519. END;
  520. {$ENDIF}
  521. {$IFDEF OS_OS2} { OS2 CODE }
  522. BEGIN
  523. If (DosRead(Handle, Buf, Count, Actual) = 0) AND { Read from file }
  524. (Actual = Count) Then FileRead := 0 Else { No read error }
  525. FileRead := 104; { File read error }
  526. END;
  527. {$ENDIF}
  528. {---------------------------------------------------------------------------}
  529. { FileWrite -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct98 LdB }
  530. {---------------------------------------------------------------------------}
  531. FUNCTION FileWrite (Handle: Word; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
  532. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  533. {$IFDEF ASM_BP} { BP COMPATABLE ASM }
  534. ASSEMBLER;
  535. ASM
  536. XOR AX, AX; { Zero register }
  537. LES DI, Actual; { Actual var address }
  538. MOV ES:[DI], AX; { Zero actual var }
  539. PUSH DS; { Save segment }
  540. LDS DX, Buf; { Data source buffer }
  541. MOV CX, Count; { Amount to write }
  542. MOV BX, Handle; { Load file handle }
  543. MOV AX, $4000; { Load function id }
  544. PUSH BP; { Store register }
  545. INT $21; { Write to file }
  546. POP BP; { Reload register }
  547. POP DS; { Restore segment }
  548. JC @@Exit5; { Check for error }
  549. LES DI, Actual; { Actual var address }
  550. MOV ES:[DI], AX; { Update bytes moved }
  551. XOR AX, AX; { Write successful }
  552. @@Exit5:
  553. END;
  554. {$ENDIF}
  555. {$IFDEF ASM_FPC} { FPC COMPATABLE ASM }
  556. BEGIN
  557. Actual := System.Do_Write(LongInt(Handle),
  558. LongInt(@Buf), Count); { Write data to file }
  559. FileWrite := InOutRes; { I/O status returned }
  560. END;
  561. {$ENDIF}
  562. {$ENDIF}
  563. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  564. BEGIN
  565. {$IFDEF BIT_16} { 16 BIT WINDOWS CODE }
  566. Actual := _lwrite(Handle, Pointer(@Buf), Count); { Write to file }
  567. If (Actual = Count) Then FileWrite := 0 Else { No write error }
  568. FileWrite := 105; { File write error }
  569. {$ENDIF}
  570. {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
  571. If WriteFile(Handle, Buf, Count, DWord(Actual),
  572. Nil) AND (Actual = Count) Then FileWrite := 0 { No write error }
  573. Else FileWrite := 105; { File write error }
  574. {$ENDIF}
  575. END;
  576. {$ENDIF}
  577. {$IFDEF OS_OS2} { OS2 CODE }
  578. BEGIN
  579. If (DosWrite(Handle, Buf, Count, Actual) = 0) AND { Write to file }
  580. (Actual = Count) Then FileWrite := 0 Else { No write error }
  581. FileWrite := 105; { File write error }
  582. END;
  583. {$ENDIF}
  584. END.
  585. {
  586. $Log$
  587. Revision 1.2 2000-08-24 12:00:21 marco
  588. * CVS log and ID tags
  589. }