fileio.pas 32 KB

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