fileio.pas 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725
  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. {$IFNDEF OS_UNIX}
  73. {$S-} { Disable Stack Checking }
  74. {$ENDIF}
  75. {$I-} { Disable IO Checking }
  76. {$Q-} { Disable Overflow Checking }
  77. {$V-} { Turn off strict VAR strings }
  78. {====================================================================}
  79. {$IFDEF OS_DOS} { DOS/DPMI ONLY }
  80. {$IFDEF PPC_FPC} { FPC COMPILER }
  81. {$IFNDEF GO32V2} { MUST BE GO32V2 }
  82. This only works in GO32V2 mode in FPC!
  83. {$ENDIF}
  84. {$ENDIF}
  85. {$ENDIF}
  86. USES
  87. {$IFDEF WIN16} WinTypes, WinProcs, {$ENDIF} { Stardard BP units }
  88. FVCommon; { Standard GFV unit }
  89. {***************************************************************************}
  90. { PUBLIC CONSTANTS }
  91. {***************************************************************************}
  92. {---------------------------------------------------------------------------}
  93. { FILE ACCESS MODE CONSTANTS }
  94. {---------------------------------------------------------------------------}
  95. CONST
  96. fa_Create = $3C00; { Create new file }
  97. fa_OpenRead = $3D00; { Read access only }
  98. fa_OpenWrite = $3D01; { Write access only }
  99. fa_Open = $3D02; { Read/write access }
  100. {---------------------------------------------------------------------------}
  101. { FILE SHARE MODE CONSTANTS }
  102. {---------------------------------------------------------------------------}
  103. CONST
  104. fm_DenyAll = $0010; { Exclusive file use }
  105. fm_DenyWrite = $0020; { Deny write access }
  106. fm_DenyRead = $0030; { Deny read access }
  107. fm_DenyNone = $0040; { Deny no access }
  108. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  109. CONST
  110. HFILE_ERROR = -1; { File handle error }
  111. {$ENDIF}
  112. {***************************************************************************}
  113. { PUBLIC TYPE DEFINITIONS }
  114. {***************************************************************************}
  115. {---------------------------------------------------------------------------}
  116. { ASCIIZ FILENAME }
  117. {---------------------------------------------------------------------------}
  118. TYPE
  119. AsciiZ = Array [0..255] Of Char; { Filename array }
  120. {***************************************************************************}
  121. { INTERFACE ROUTINES }
  122. {***************************************************************************}
  123. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  124. { FILE CONTROL ROUTINES }
  125. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  126. {-FileClose----------------------------------------------------------
  127. The file opened by the handle is closed. If close action is successful
  128. true is returned but if the handle is invalid or a file error occurs
  129. false will be returned.
  130. 14Nov00 LdB
  131. ---------------------------------------------------------------------}
  132. FUNCTION FileClose (Handle: THandle): Boolean;
  133. {-FileOpen-----------------------------------------------------------
  134. Given a valid filename to file that exists, is not locked with a valid
  135. access mode the file is opened and the file handle returned. If the
  136. name or mode is invalid or an error occurs the return will be zero.
  137. 27Oct98 LdB
  138. ---------------------------------------------------------------------}
  139. FUNCTION FileOpen (Const FileName: AsciiZ; Mode: Word): THandle;
  140. {-SetFileSize--------------------------------------------------------
  141. The file opened by the handle is set the given size. If the action is
  142. successful zero is returned but if the handle is invalid or a file error
  143. occurs a standard file error value will be returned.
  144. 21Oct98 LdB
  145. ---------------------------------------------------------------------}
  146. FUNCTION SetFileSize (Handle: THandle; FileSize: LongInt): Word;
  147. {-SetFilePos---------------------------------------------------------
  148. The file opened by the handle is set the given position in the file.
  149. If the action is successful zero is returned but if the handle is invalid
  150. the position is beyond the file size or a file error occurs a standard
  151. file error value will be returned.
  152. 21Oct98 LdB
  153. ---------------------------------------------------------------------}
  154. FUNCTION SetFilePos (Handle: THandle; Pos: LongInt; MoveType: Word;
  155. Var Actual: LongInt): Word;
  156. {-FileRead-----------------------------------------------------------
  157. The file opened by the handle has count bytes read from it an placed
  158. into the given buffer. If the read action is successful the actual bytes
  159. transfered is returned in actual and the function returns zero. If an
  160. error occurs the function will return a file error constant and actual
  161. will contain the bytes transfered before the error if any.
  162. 22Oct98 LdB
  163. ---------------------------------------------------------------------}
  164. FUNCTION FileRead (Handle: THandle; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
  165. {-FileWrite----------------------------------------------------------
  166. The file opened by the handle has count bytes written to it from the
  167. given buffer. If the write action is successful the actual bytes
  168. transfered is returned in actual and the function returns zero. If an
  169. error occurs the function will return a file error constant and actual
  170. will contain the bytes transfered before the error if any.
  171. 22Oct98 LdB
  172. ---------------------------------------------------------------------}
  173. FUNCTION FileWrite (Handle: THandle; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
  174. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  175. IMPLEMENTATION
  176. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  177. {$IFDEF OS_WINDOWS} { WIN/NT UNITS }
  178. {$IFNDEF PPC_SPEED} { NON SPEED COMPILER }
  179. {$IFDEF WIN32} { WIN32 COMPILER }
  180. USES Windows; { Standard unit }
  181. {$ENDIF}
  182. TYPE LongWord = LongInt; { Type fixup }
  183. {$ELSE} { SPEEDSOFT COMPILER }
  184. USES WinNT, WinBase; { Standard units }
  185. {$ENDIF}
  186. {$ENDIF}
  187. {$IFDEF OS_OS2} { OS2 COMPILERS }
  188. {$IFDEF PPC_VIRTUAL} { VIRTUAL PASCAL UNITS }
  189. USES OS2Base; { Standard unit }
  190. {$ENDIF}
  191. {$IFDEF PPC_SPEED} { SPEED PASCAL UNITS }
  192. USES BseDos, Os2Def; { Standard units }
  193. {$ENDIF}
  194. {$IFDEF PPC_BPOS2} { C'T PATCH TO BP UNITS }
  195. USES DosTypes, DosProcs; { Standard units }
  196. {$ENDIF}
  197. {$IFDEF PPC_FPC} { FPC UNITS }
  198. USES DosCalls, OS2Def; { Standard units }
  199. {$ENDIF}
  200. {$ENDIF}
  201. {$IFDEF OS_UNIX} { LINUX COMPILER }
  202. USES
  203. {$ifdef VER1_0}
  204. linux;
  205. {$else}
  206. Baseunix,unix;
  207. {$endif}
  208. {$ENDIF}
  209. {***************************************************************************}
  210. { INTERFACE ROUTINES }
  211. {***************************************************************************}
  212. {---------------------------------------------------------------------------}
  213. { FileClose -> Platforms DOS/DPMI/WIN/NT/OS2/LINUX - Updated 14Nov00 LdB }
  214. {---------------------------------------------------------------------------}
  215. FUNCTION FileClose (Handle: THandle): Boolean;
  216. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  217. {$IFDEF ASM_BP} { BP COMPATABLE ASM }
  218. ASSEMBLER;
  219. ASM
  220. MOV BX, Handle; { DOS file handle }
  221. MOV AX, $3E00; { Close function }
  222. PUSH BP; { Store register }
  223. INT $21; { Close the file }
  224. POP BP; { Reload register }
  225. MOV AL, True; { Preset true }
  226. JNC @@Exit1; { Return success }
  227. MOV AL, False; { Return failure }
  228. @@Exit1:
  229. END;
  230. {$ENDIF}
  231. {$IFDEF ASM_FPC} { FPC COMPATABLE ASM }
  232. VAR Regs: TRealRegs;
  233. BEGIN
  234. Regs.RealEBX := Handle; { Transfer handle }
  235. Regs.RealEAX := $3E00; { Close file function }
  236. SysRealIntr($21, Regs); { Call DOS interrupt }
  237. If (Regs.RealFlags AND $1 = 0) Then { Check carry flag }
  238. FileClose := True Else FileClose := False; { Return true/false }
  239. END;
  240. {$ENDIF}
  241. {$ENDIF}
  242. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  243. BEGIN
  244. {$IFDEF BIT_16} { 16 BIT WINDOWS CODE }
  245. If (_lclose(Handle) = 0) Then FileClose := True { Close the file }
  246. Else FileClose := False; { Closure failed }
  247. {$ENDIF}
  248. {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
  249. FileClose := CloseHandle(Handle); { Close the file }
  250. {$ENDIF}
  251. END;
  252. {$ENDIF}
  253. {$IFDEF OS_OS2} { OS2 CODE }
  254. BEGIN
  255. If (DosClose(Handle) = 0) Then FileClose := True { Try to close file }
  256. Else FileClose := False; { Closure failed }
  257. END;
  258. {$ENDIF}
  259. {$IFDEF OS_UNIX} { LINUX CODE }
  260. BEGIN
  261. {$ifdef ver1_0}fdClose{$else}fpclose{$endif}(Handle); { Close the file }
  262. FileClose := LinuxError <= 0
  263. END;
  264. {$ENDIF}
  265. {---------------------------------------------------------------------------}
  266. { FileOpen -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 27Oct98 LdB }
  267. {---------------------------------------------------------------------------}
  268. FUNCTION FileOpen (Const FileName: AsciiZ; Mode: Word): THandle;
  269. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  270. {$IFDEF ASM_BP} { BP COMPATABLE ASM }
  271. ASSEMBLER;
  272. ASM
  273. MOV AX, Mode; { Mode to open file }
  274. XOR CX, CX; { No attributes set }
  275. PUSH DS; { Save segment }
  276. LDS DX, FileName; { Filename to open }
  277. PUSH BP; { Store register }
  278. INT $21; { Open/create file }
  279. POP BP; { Restore register }
  280. POP DS; { Restore segment }
  281. JNC @@Exit2; { Check for error }
  282. XOR AX, AX; { Open fail return 0 }
  283. @@Exit2:
  284. END;
  285. {$ENDIF}
  286. {$IFDEF ASM_FPC} { FPC COMPATABLE ASM }
  287. VAR Regs: TRealRegs;
  288. BEGIN
  289. SysCopyToDos(LongInt(@FileName), 256); { Transfer filename }
  290. Regs.RealEDX := Tb MOD 16;
  291. Regs.RealDS := Tb DIV 16; { Linear addr of Tb }
  292. Regs.RealEAX := Mode; { Mode to open with }
  293. Regs.RealECX := 0; { No attributes set }
  294. SysRealIntr($21, Regs); { Call DOS int 21 }
  295. If (Regs.RealFlags AND 1 <> 0) Then FileOpen := 0{ Error encountered }
  296. Else FileOpen := Regs.RealEAX AND $FFFF; { Return file handle }
  297. END;
  298. {$ENDIF}
  299. {$ENDIF}
  300. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  301. VAR Hnd: Integer; OpenMode: Sw_Word;
  302. {$IFDEF BIT_16} Buf: TOfStruct; {$ENDIF} { 16 BIT VARIABLES }
  303. {$IFDEF BIT_32} ShareMode, Flags: LongInt; {$ENDIF} { 32 BIT VARIABLES }
  304. BEGIN
  305. {$IFDEF BIT_16} { 16 BIT WINDOW CODE }
  306. If (Mode = fa_Create) Then OpenMode := of_Create { Set create mask bit }
  307. Else OpenMode := Mode AND $00FF; { Set open mask bits }
  308. Hnd := OpenFile(FileName, Buf, OpenMode); { Open the file }
  309. {$ENDIF}
  310. {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
  311. If (Mode = fa_Create) Then Begin { Create file }
  312. OpenMode := Generic_Read OR Generic_Write; { Set access mask bit }
  313. Flags := Create_Always; { Create always mask }
  314. End Else Begin { Open the file }
  315. OpenMode := Generic_Read; { Read only access set }
  316. If (Mode AND $0001 <> 0) Then { Check write flag }
  317. OpenMode := OpenMode AND NOT Generic_Read; { Write only access set }
  318. If (Mode AND $0002 <> 0) Then { Check read/write flag }
  319. OpenMode := OpenMode OR Generic_Write; { Read/Write access }
  320. Flags := Open_Existing; { Open existing mask }
  321. End;
  322. ShareMode := file_Share_Read OR
  323. file_Share_Write; { Deny none flag set }
  324. Hnd := CreateFile(FileName, OpenMode, ShareMode,
  325. Nil, Flags, File_Attribute_Normal, 0); { Open the file }
  326. {$ENDIF}
  327. If (Hnd <> -1) Then FileOpen := Hnd Else { Return handle }
  328. FileOpen := 0; { Return error }
  329. END;
  330. {$ENDIF}
  331. {$IFDEF OS_OS2} { OS2 CODE }
  332. VAR OpenFlags, OpenMode: Word; Handle, ActionTaken: Sw_Word;
  333. BEGIN
  334. If (Mode = fa_Create) Then Begin { Create file }
  335. OpenMode := Open_Flags_NoInherit OR
  336. Open_Share_DenyNone OR
  337. Open_Access_ReadWrite; { Open mode }
  338. OpenFlags := OPEN_ACTION_CREATE_IF_NEW OR
  339. OPEN_ACTION_REPLACE_IF_EXISTS; { Open flags }
  340. End Else Begin
  341. OpenMode := Mode AND $00FF OR
  342. Open_Share_DenyNone; { Set open mode bits }
  343. OpenFlags := OPEN_ACTION_OPEN_IF_EXISTS; { Set open flags }
  344. End;
  345. {$IFDEF PPC_BPOS2} { C'T patched COMPILER }
  346. If (DosOpen(@FileName, Handle, ActionTaken, 0, 0,
  347. OpenFlags, OpenMode, 0) = 0) Then
  348. FileOpen := Handle Else FileOpen := 0; { Return handle/fail }
  349. {$ELSE} { OTHER OS2 COMPILERS }
  350. {$IFDEF PPC_FPC}
  351. If (DosOpen(@FileName, Longint(Handle), ActionTaken, 0, 0,
  352. OpenFlags, OpenMode, Nil) = 0) Then
  353. FileOpen := Handle Else FileOpen := 0; { Return handle/fail }
  354. {$ELSE}
  355. If (DosOpen(FileName, Handle, ActionTaken, 0, 0,
  356. OpenFlags, OpenMode, Nil) = 0) Then
  357. FileOpen := Handle Else FileOpen := 0; { Return handle/fail }
  358. {$ENDIF}
  359. {$ENDIF}
  360. END;
  361. {$ENDIF}
  362. {$IFDEF OS_UNIX}
  363. {$ifndef ver1_0}
  364. var tmp : ansistring;
  365. {$endif}
  366. BEGIN
  367. if mode = fa_Create then mode := Open_Creat or Open_RdWr else
  368. if mode = fa_OpenRead then mode := Open_RdOnly else
  369. if mode = fa_OpenWrite then mode := Open_WrOnly else
  370. if mode = fa_Open then mode := Open_RdWr;
  371. {$ifdef ver1_0}
  372. FileOpen := fdOpen(FileName,mode);
  373. {$else}
  374. tmp:=filename;
  375. FileOpen := fpopen(tmp,longint(mode));
  376. {$endif}
  377. END;
  378. {$ENDIF}
  379. {---------------------------------------------------------------------------}
  380. { SetFileSize -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 26Feb97 LdB }
  381. {---------------------------------------------------------------------------}
  382. FUNCTION SetFileSize (Handle: THandle; FileSize: LongInt): Word;
  383. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  384. {$IFDEF ASM_BP} { BP COMPATABLE ASM }
  385. ASSEMBLER;
  386. ASM
  387. MOV DX, FileSize.Word[0]; { Load file position }
  388. MOV CX, FileSize.Word[2];
  389. MOV BX, Handle; { Load file handle }
  390. MOV AX, $4200; { Load function id }
  391. PUSH BP; { Store register }
  392. INT $21; { Position the file }
  393. POP BP; { Reload register }
  394. JC @@Exit3; { Exit if error }
  395. XOR CX, CX; { Force truncation }
  396. MOV BX, Handle; { File handle }
  397. MOV AX, $4000; { Load function id }
  398. PUSH BP; { Store register }
  399. INT $21; { Truncate file }
  400. POP BP; { Reload register }
  401. JC @@Exit3; { Exit if error }
  402. XOR AX, AX; { Return successful }
  403. @@Exit3:
  404. END;
  405. {$ENDIF}
  406. {$IFDEF ASM_FPC} { FPC COMPATABLE ASM }
  407. VAR Regs: TRealRegs;
  408. BEGIN
  409. Regs.RealEDX := FileSize AND $FFFF; { Lo word of filesize }
  410. Regs.RealECX := (FileSize SHR 16) AND $FFFF; { Hi word of filesize }
  411. Regs.RealEBX := LongInt(Handle); { Load file handle }
  412. Regs.RealEAX := $4000; { Load function id }
  413. SysRealIntr($21, Regs); { Call DOS int 21 }
  414. If (Regs.RealFlags AND 1 <> 0) Then
  415. SetFileSize := Regs.RealEAX AND $FFFF { Error encountered }
  416. Else SetFileSize := 0; { Return successful }
  417. END;
  418. {$ENDIF}
  419. {$ENDIF}
  420. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  421. VAR {$IFDEF BIT_16} Buf, {$ENDIF} Actual: LongInt;
  422. BEGIN
  423. {$IFDEF BIT_16} { 16 BIT WINDOWS CODE }
  424. Actual := _llseek(Handle, FileSize, 0); { Position file }
  425. If (Actual = FileSize) Then Begin { No position error }
  426. Actual := _lwrite(Handle, Pointer(@Buf), 0); { Truncate the file }
  427. If (Actual <> -1) Then SetFileSize := 0 Else { No truncate error }
  428. SetFileSize := 103; { File truncate error }
  429. End Else SetFileSize := 103; { File truncate error }
  430. {$ENDIF}
  431. {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
  432. Actual := SetFilePointer(Handle, FileSize, Nil, 0);{ Position file }
  433. If (Actual = FileSize) Then Begin { No position error }
  434. If SetEndOfFile(Handle) Then SetFileSize := 0 { No truncate error }
  435. Else SetFileSize := 103; { File truncate error }
  436. End Else SetFileSize := 103; { File truncate error }
  437. {$ENDIF}
  438. END;
  439. {$ENDIF}
  440. {$IFDEF OS_OS2} { OS2 CODE }
  441. BEGIN
  442. {$IFDEF PPC_BPOS2} { C'T patched COMPILER }
  443. SetFileSize := DosNewSize(Handle, FileSize); { Truncate the file }
  444. {$ELSE} { OTHER OS2 COMPILERS }
  445. SetFileSize := DosSetFileSize(Handle, FileSize); { Truncate the file }
  446. {$ENDIF}
  447. END;
  448. {$ENDIF}
  449. {$IFDEF OS_UNIX}
  450. VAR
  451. Actual : LongInt;
  452. BEGIN
  453. Actual := {$ifdef ver1_0}fdSeek{$else} fplseek{$endif}(Handle, FileSize, 0); { Position file }
  454. If (Actual = FileSize) Then Begin { No position error }
  455. if ({$ifdef ver1_0}fdTruncate{$else}fpftruncate{$endif}(Handle,FileSize)){$ifndef ver1_0}=0{$endif} { Truncate the file }
  456. Then SetFileSize := 0 { No truncate error }
  457. else SetFileSize := 103; { File truncate error }
  458. End Else SetFileSize := 103; { File truncate error }
  459. END;
  460. {$ENDIF}
  461. {---------------------------------------------------------------------------}
  462. { SetFilePos -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 25Feb97 LdB }
  463. {---------------------------------------------------------------------------}
  464. FUNCTION SetFilePos (Handle: THandle; Pos: LongInt; MoveType: Word;
  465. Var Actual: LongInt): Word;
  466. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  467. {$IFDEF ASM_BP} { BP COMPATABLE ASM }
  468. ASSEMBLER;
  469. ASM
  470. MOV AX, MoveType; { Load move type }
  471. MOV AH, $42; { Load function id }
  472. MOV DX, Pos.Word[0]; { Load file position }
  473. MOV CX, Pos.Word[2];
  474. MOV BX, Handle; { Load file handle }
  475. PUSH BP; { Store register }
  476. INT $21; { Position the file }
  477. POP BP; { Reload register }
  478. JC @@Exit6;
  479. LES DI, Actual; { Actual var addr }
  480. MOV ES:[DI], AX;
  481. MOV ES:[DI+2], DX; { Update actual }
  482. XOR AX, AX; { Set was successful }
  483. @@Exit6:
  484. END;
  485. {$ENDIF}
  486. {$IFDEF ASM_FPC} { FPC COMPATABLE ASM }
  487. VAR Regs: TRealRegs;
  488. BEGIN
  489. Actual := 0; { Zero actual count }
  490. Regs.RealEAX := ($42 SHL 8) + Byte(MoveType); { Set function id }
  491. Regs.RealEBX := LongInt(Handle); { Fetch file handle }
  492. Regs.RealEDX := Pos AND $FFFF; { Keep low word }
  493. Regs.RealECX := Pos SHR 16; { Keep high word }
  494. SysRealIntr($21, Regs); { Call dos interrupt }
  495. If (Regs.RealFlags AND $1 = 0) Then Begin
  496. Actual := Lo(Regs.RealEDX) SHL 16 +
  497. Lo(Regs.RealEAX); { Current position }
  498. SetFilePos := 0; { Function successful }
  499. End Else SetFilePos := Lo(Regs.RealEAX); { I/O error returned }
  500. END;
  501. {$ENDIF}
  502. {$ENDIF}
  503. {$IFDEF OS_WINDOWS} { WINDOWS CODE }
  504. BEGIN
  505. {$IFDEF BIT_16} { 16 BIT WINDOWS CODE }
  506. Actual := _llseek(Handle, Pos, MoveType); { Position file }
  507. If (Actual <> -1) Then SetFilePos := 0 Else { No position error }
  508. SetFilePos := 107; { File position error }
  509. {$ENDIF}
  510. {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
  511. Actual := SetFilePointer(Handle, Pos, Nil, MoveType);{ Position file }
  512. If (Actual <> -1) Then SetFilePos := 0 Else { No position error }
  513. SetFilePos := 107; { File position error }
  514. {$ENDIF}
  515. END;
  516. {$ENDIF}
  517. {$IFDEF OS_OS2} { OS2 CODE }
  518. BEGIN
  519. {$IFDEF PPC_BPOS2}
  520. If (DosChgFilePtr(Handle, Pos, MoveType, Actual)=0){ Set file position }
  521. Then SetFilePos := 0 Else SetFilePos := 107; { File position error }
  522. {$ELSE} { OTHER OS2 COMPILERS }
  523. If (DosSetFilePtr(Handle, Pos, MoveType, Actual)=0){ Set file position }
  524. Then SetFilePos := 0 Else SetFilePos := 107; { File position error }
  525. {$ENDIF}
  526. END;
  527. {$ENDIF}
  528. {$IFDEF OS_UNIX}
  529. BEGIN
  530. Actual := {$ifdef ver1_0}fdSeek{$else}fplseek{$endif}(Handle, Pos, MoveType);
  531. If (Actual <> -1) Then SetFilePos := 0 Else { No position error }
  532. SetFilePos := 107; { File position error }
  533. END;
  534. {$ENDIF}
  535. {---------------------------------------------------------------------------}
  536. { FileRead -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct98 LdB }
  537. {---------------------------------------------------------------------------}
  538. FUNCTION FileRead (Handle: THandle; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
  539. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  540. {$IFDEF ASM_BP} { BP COMPATABLE ASM }
  541. ASSEMBLER;
  542. ASM
  543. XOR AX, AX; { Zero register }
  544. LES DI, Actual; { Actual var address }
  545. MOV ES:[DI], AX; { Zero actual var }
  546. PUSH DS; { Save segment }
  547. LDS DX, Buf; { Data destination }
  548. MOV CX, Count; { Amount to read }
  549. MOV BX, Handle; { Load file handle }
  550. MOV AX, $3F00; { Load function id }
  551. PUSH BP; { Store register }
  552. INT $21; { Read from file }
  553. POP BP; { Reload register }
  554. POP DS; { Restore segment }
  555. JC @@Exit4; { Check for error }
  556. LES DI, Actual; { Actual var address }
  557. MOV ES:[DI], AX; { Update bytes moved }
  558. XOR AX, AX; { Return success }
  559. @@Exit4:
  560. END;
  561. {$ENDIF}
  562. {$IFDEF ASM_FPC} { FPC COMPATABLE ASM }
  563. BEGIN
  564. Actual := System.Do_Read(LongInt(Handle),
  565. LongInt(@Buf), Count); { Read data from file }
  566. FileRead := InOutRes; { I/O status returned }
  567. END;
  568. {$ENDIF}
  569. {$ENDIF}
  570. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  571. BEGIN
  572. {$IFDEF BIT_16} { 16 BIT WINDOWS CODE }
  573. Actual := _lread(Handle, Pointer(@Buf), Count); { Read from file }
  574. If (Actual = Count) Then FileRead := 0 Else { No read error }
  575. FileRead := 104; { File read error }
  576. {$ENDIF}
  577. {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
  578. If ReadFile(Handle, Buf, Count, DWord(Actual),
  579. Nil) AND (Actual = Count) Then FileRead := 0 { No read error }
  580. Else FileRead := 104; { File read error }
  581. {$ENDIF}
  582. END;
  583. {$ENDIF}
  584. {$IFDEF OS_OS2} { OS2 CODE }
  585. BEGIN
  586. If (DosRead(Handle, Buf, Count, Actual) = 0) AND { Read from file }
  587. (Actual = Count) Then FileRead := 0 Else { No read error }
  588. FileRead := 104; { File read error }
  589. END;
  590. {$ENDIF}
  591. {$IFDEF OS_UNIX}
  592. BEGIN
  593. Actual := {$ifdef ver1_0}fdRead{$else} fpread{$endif}(Handle, Buf, Count);
  594. if (Actual = Count) Then FileRead := 0 { No read error }
  595. Else FileRead := 104; { File read error }
  596. END;
  597. {$ENDIF}
  598. {---------------------------------------------------------------------------}
  599. { FileWrite -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct98 LdB }
  600. {---------------------------------------------------------------------------}
  601. FUNCTION FileWrite (Handle: THandle; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
  602. {$IFDEF OS_DOS} { DOS/DPMI CODE }
  603. {$IFDEF ASM_BP} { BP COMPATABLE ASM }
  604. ASSEMBLER;
  605. ASM
  606. XOR AX, AX; { Zero register }
  607. LES DI, Actual; { Actual var address }
  608. MOV ES:[DI], AX; { Zero actual var }
  609. PUSH DS; { Save segment }
  610. LDS DX, Buf; { Data source buffer }
  611. MOV CX, Count; { Amount to write }
  612. MOV BX, Handle; { Load file handle }
  613. MOV AX, $4000; { Load function id }
  614. PUSH BP; { Store register }
  615. INT $21; { Write to file }
  616. POP BP; { Reload register }
  617. POP DS; { Restore segment }
  618. JC @@Exit5; { Check for error }
  619. LES DI, Actual; { Actual var address }
  620. MOV ES:[DI], AX; { Update bytes moved }
  621. XOR AX, AX; { Write successful }
  622. @@Exit5:
  623. END;
  624. {$ENDIF}
  625. {$IFDEF ASM_FPC} { FPC COMPATABLE ASM }
  626. BEGIN
  627. Actual := System.Do_Write(LongInt(Handle),
  628. LongInt(@Buf), Count); { Write data to file }
  629. FileWrite := InOutRes; { I/O status returned }
  630. END;
  631. {$ENDIF}
  632. {$ENDIF}
  633. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  634. BEGIN
  635. {$IFDEF BIT_16} { 16 BIT WINDOWS CODE }
  636. Actual := _lwrite(Handle, Pointer(@Buf), Count); { Write to file }
  637. If (Actual = Count) Then FileWrite := 0 Else { No write error }
  638. FileWrite := 105; { File write error }
  639. {$ENDIF}
  640. {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
  641. If WriteFile(Handle, Buf, Count, DWord(Actual),
  642. Nil) AND (Actual = Count) Then FileWrite := 0 { No write error }
  643. Else FileWrite := 105; { File write error }
  644. {$ENDIF}
  645. END;
  646. {$ENDIF}
  647. {$IFDEF OS_OS2} { OS2 CODE }
  648. BEGIN
  649. If (DosWrite(Handle, Buf, Count, Actual) = 0) AND { Write to file }
  650. (Actual = Count) Then FileWrite := 0 Else { No write error }
  651. FileWrite := 105; { File write error }
  652. END;
  653. {$ENDIF}
  654. {$IFDEF OS_UNIX}
  655. BEGIN
  656. Actual := {$ifdef ver1_0}fdWrite{$else}fpwrite{$endif}(Handle, Buf, Count);
  657. If (Actual = Count) Then FileWrite := 0 Else { No write error }
  658. FileWrite := 105; { File write error }
  659. END;
  660. {$ENDIF}
  661. END.
  662. {
  663. $Log$
  664. Revision 1.11 2003-10-01 16:20:27 marco
  665. * baseunix fixes for 1.1
  666. Revision 1.10 2002/10/13 20:52:09 hajny
  667. * mistyping corrected
  668. Revision 1.9 2002/10/12 19:39:00 hajny
  669. * FPC/2 support
  670. Revision 1.8 2002/09/22 19:42:22 hajny
  671. + FPC/2 support added
  672. Revision 1.7 2002/09/07 15:06:36 peter
  673. * old logs removed and tabs fixed
  674. Revision 1.6 2002/06/04 11:12:41 marco
  675. * Renamefest
  676. }