123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725 |
- { $Id$ }
- {********[ SOURCE FILE OF GRAPHICAL FREE VISION ]**********}
- { }
- { System independent FILE I/O control }
- { }
- { Copyright (c) 1996, 1997, 1998, 1999 by Leon de Boer }
- { [email protected] - primary e-mail address }
- { [email protected] - backup e-mail address }
- { }
- {****************[ THIS CODE IS FREEWARE ]*****************}
- { }
- { This sourcecode is released for the purpose to }
- { promote the pascal language on all platforms. You may }
- { redistribute it and/or modify with the following }
- { DISCLAIMER. }
- { }
- { This SOURCE CODE is distributed "AS IS" WITHOUT }
- { WARRANTIES AS TO PERFORMANCE OF MERCHANTABILITY OR }
- { ANY OTHER WARRANTIES WHETHER EXPRESSED OR IMPLIED. }
- { }
- {*****************[ SUPPORTED PLATFORMS ]******************}
- { 16 and 32 Bit compilers }
- { DOS - Turbo Pascal 7.0 + (16 Bit) }
- { DPMI - Turbo Pascal 7.0 + (16 Bit) }
- { - FPC 0.9912+ (GO32V2) (32 Bit) }
- { WINDOWS - Turbo Pascal 7.0 + (16 Bit) }
- { - Delphi 1.0+ (16 Bit) }
- { WIN95/NT - Delphi 2.0+ (32 Bit) }
- { - Virtual Pascal 2.0+ (32 Bit) }
- { - Speedsoft Sybil 2.0+ (32 Bit) }
- { - FPC 0.9912+ (32 Bit) }
- { OS2 - Virtual Pascal 1.0+ (32 Bit) }
- { - Speed Pascal 1.0+ (32 Bit) }
- { - C'T patch to BP (16 Bit) }
- { LINUX - FPC 1.0.2+ (32 Bit) }
- { }
- {******************[ REVISION HISTORY ]********************}
- { Version Date Fix }
- { ------- --------- --------------------------------- }
- { 1.00 12 Jun 96 First DOS/DPMI platform release }
- { 1.10 12 Mar 97 Windows conversion added. }
- { 1.20 29 Aug 97 Platform.inc sort added. }
- { 1.30 12 Jun 98 Virtual pascal 2.0 code added. }
- { 1.40 10 Sep 98 Checks run & commenting added. }
- { 1.50 28 Oct 98 Fixed for FPC version 0.998 }
- { Only Go32v2 supported no Go32v1 }
- { 1.60 14 Jun 99 References to Common.pas added. }
- { 1.61 07 Jul 99 Speedsoft SYBIL 2.0 code added. }
- { 1.62 03 Nov 99 FPC windows support added. }
- { 1.70 10 Nov 00 Revamp using changed common unit }
- {**********************************************************}
- UNIT FileIO;
- {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
- INTERFACE
- {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
- {====Include file to sort compiler platform out =====================}
- {$I Platform.inc}
- {====================================================================}
- {==== Compiler directives ===========================================}
- {$IFNDEF PPC_FPC} { FPC doesn't support these switches }
- {$F-} { Short calls are okay }
- {$A+} { Word Align Data }
- {$B-} { Allow short circuit boolean evaluations }
- {$O+} { This unit may be overlaid }
- {$G+} { 286 Code optimization - if you're on an 8088 get a real computer }
- {$P-} { Normal string variables }
- {$E+} { Emulation is on }
- {$N-} { No 80x87 code generation }
- {$ENDIF}
- {$X+} { Extended syntax is ok }
- {$R-} { Disable range checking }
- {$IFNDEF OS_UNIX}
- {$S-} { Disable Stack Checking }
- {$ENDIF}
- {$I-} { Disable IO Checking }
- {$Q-} { Disable Overflow Checking }
- {$V-} { Turn off strict VAR strings }
- {====================================================================}
- {$IFDEF OS_DOS} { DOS/DPMI ONLY }
- {$IFDEF PPC_FPC} { FPC COMPILER }
- {$IFNDEF GO32V2} { MUST BE GO32V2 }
- This only works in GO32V2 mode in FPC!
- {$ENDIF}
- {$ENDIF}
- {$ENDIF}
- USES
- {$IFDEF WIN16} WinTypes, WinProcs, {$ENDIF} { Stardard BP units }
- FVCommon; { Standard GFV unit }
- {***************************************************************************}
- { PUBLIC CONSTANTS }
- {***************************************************************************}
- {---------------------------------------------------------------------------}
- { FILE ACCESS MODE CONSTANTS }
- {---------------------------------------------------------------------------}
- CONST
- fa_Create = $3C00; { Create new file }
- fa_OpenRead = $3D00; { Read access only }
- fa_OpenWrite = $3D01; { Write access only }
- fa_Open = $3D02; { Read/write access }
- {---------------------------------------------------------------------------}
- { FILE SHARE MODE CONSTANTS }
- {---------------------------------------------------------------------------}
- CONST
- fm_DenyAll = $0010; { Exclusive file use }
- fm_DenyWrite = $0020; { Deny write access }
- fm_DenyRead = $0030; { Deny read access }
- fm_DenyNone = $0040; { Deny no access }
- {$IFDEF OS_DOS} { DOS/DPMI CODE }
- CONST
- HFILE_ERROR = -1; { File handle error }
- {$ENDIF}
- {***************************************************************************}
- { PUBLIC TYPE DEFINITIONS }
- {***************************************************************************}
- {---------------------------------------------------------------------------}
- { ASCIIZ FILENAME }
- {---------------------------------------------------------------------------}
- TYPE
- AsciiZ = Array [0..255] Of Char; { Filename array }
- {***************************************************************************}
- { INTERFACE ROUTINES }
- {***************************************************************************}
- {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
- { FILE CONTROL ROUTINES }
- {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
- {-FileClose----------------------------------------------------------
- The file opened by the handle is closed. If close action is successful
- true is returned but if the handle is invalid or a file error occurs
- false will be returned.
- 14Nov00 LdB
- ---------------------------------------------------------------------}
- FUNCTION FileClose (Handle: THandle): Boolean;
- {-FileOpen-----------------------------------------------------------
- Given a valid filename to file that exists, is not locked with a valid
- access mode the file is opened and the file handle returned. If the
- name or mode is invalid or an error occurs the return will be zero.
- 27Oct98 LdB
- ---------------------------------------------------------------------}
- FUNCTION FileOpen (Const FileName: AsciiZ; Mode: Word): THandle;
- {-SetFileSize--------------------------------------------------------
- The file opened by the handle is set the given size. If the action is
- successful zero is returned but if the handle is invalid or a file error
- occurs a standard file error value will be returned.
- 21Oct98 LdB
- ---------------------------------------------------------------------}
- FUNCTION SetFileSize (Handle: THandle; FileSize: LongInt): Word;
- {-SetFilePos---------------------------------------------------------
- The file opened by the handle is set the given position in the file.
- If the action is successful zero is returned but if the handle is invalid
- the position is beyond the file size or a file error occurs a standard
- file error value will be returned.
- 21Oct98 LdB
- ---------------------------------------------------------------------}
- FUNCTION SetFilePos (Handle: THandle; Pos: LongInt; MoveType: Word;
- Var Actual: LongInt): Word;
- {-FileRead-----------------------------------------------------------
- The file opened by the handle has count bytes read from it an placed
- into the given buffer. If the read action is successful the actual bytes
- transfered is returned in actual and the function returns zero. If an
- error occurs the function will return a file error constant and actual
- will contain the bytes transfered before the error if any.
- 22Oct98 LdB
- ---------------------------------------------------------------------}
- FUNCTION FileRead (Handle: THandle; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
- {-FileWrite----------------------------------------------------------
- The file opened by the handle has count bytes written to it from the
- given buffer. If the write action is successful the actual bytes
- transfered is returned in actual and the function returns zero. If an
- error occurs the function will return a file error constant and actual
- will contain the bytes transfered before the error if any.
- 22Oct98 LdB
- ---------------------------------------------------------------------}
- FUNCTION FileWrite (Handle: THandle; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
- {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
- IMPLEMENTATION
- {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
- {$IFDEF OS_WINDOWS} { WIN/NT UNITS }
- {$IFNDEF PPC_SPEED} { NON SPEED COMPILER }
- {$IFDEF WIN32} { WIN32 COMPILER }
- USES Windows; { Standard unit }
- {$ENDIF}
- TYPE LongWord = LongInt; { Type fixup }
- {$ELSE} { SPEEDSOFT COMPILER }
- USES WinNT, WinBase; { Standard units }
- {$ENDIF}
- {$ENDIF}
- {$IFDEF OS_OS2} { OS2 COMPILERS }
- {$IFDEF PPC_VIRTUAL} { VIRTUAL PASCAL UNITS }
- USES OS2Base; { Standard unit }
- {$ENDIF}
- {$IFDEF PPC_SPEED} { SPEED PASCAL UNITS }
- USES BseDos, Os2Def; { Standard units }
- {$ENDIF}
- {$IFDEF PPC_BPOS2} { C'T PATCH TO BP UNITS }
- USES DosTypes, DosProcs; { Standard units }
- {$ENDIF}
- {$IFDEF PPC_FPC} { FPC UNITS }
- USES DosCalls, OS2Def; { Standard units }
- {$ENDIF}
-
- {$ENDIF}
- {$IFDEF OS_UNIX} { LINUX COMPILER }
- USES
- {$ifdef VER1_0}
- linux;
- {$else}
- Baseunix,unix;
- {$endif}
- {$ENDIF}
- {***************************************************************************}
- { INTERFACE ROUTINES }
- {***************************************************************************}
- {---------------------------------------------------------------------------}
- { FileClose -> Platforms DOS/DPMI/WIN/NT/OS2/LINUX - Updated 14Nov00 LdB }
- {---------------------------------------------------------------------------}
- FUNCTION FileClose (Handle: THandle): Boolean;
- {$IFDEF OS_DOS} { DOS/DPMI CODE }
- {$IFDEF ASM_BP} { BP COMPATABLE ASM }
- ASSEMBLER;
- ASM
- MOV BX, Handle; { DOS file handle }
- MOV AX, $3E00; { Close function }
- PUSH BP; { Store register }
- INT $21; { Close the file }
- POP BP; { Reload register }
- MOV AL, True; { Preset true }
- JNC @@Exit1; { Return success }
- MOV AL, False; { Return failure }
- @@Exit1:
- END;
- {$ENDIF}
- {$IFDEF ASM_FPC} { FPC COMPATABLE ASM }
- VAR Regs: TRealRegs;
- BEGIN
- Regs.RealEBX := Handle; { Transfer handle }
- Regs.RealEAX := $3E00; { Close file function }
- SysRealIntr($21, Regs); { Call DOS interrupt }
- If (Regs.RealFlags AND $1 = 0) Then { Check carry flag }
- FileClose := True Else FileClose := False; { Return true/false }
- END;
- {$ENDIF}
- {$ENDIF}
- {$IFDEF OS_WINDOWS} { WIN/NT CODE }
- BEGIN
- {$IFDEF BIT_16} { 16 BIT WINDOWS CODE }
- If (_lclose(Handle) = 0) Then FileClose := True { Close the file }
- Else FileClose := False; { Closure failed }
- {$ENDIF}
- {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
- FileClose := CloseHandle(Handle); { Close the file }
- {$ENDIF}
- END;
- {$ENDIF}
- {$IFDEF OS_OS2} { OS2 CODE }
- BEGIN
- If (DosClose(Handle) = 0) Then FileClose := True { Try to close file }
- Else FileClose := False; { Closure failed }
- END;
- {$ENDIF}
- {$IFDEF OS_UNIX} { LINUX CODE }
- BEGIN
- {$ifdef ver1_0}fdClose{$else}fpclose{$endif}(Handle); { Close the file }
- FileClose := LinuxError <= 0
- END;
- {$ENDIF}
- {---------------------------------------------------------------------------}
- { FileOpen -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 27Oct98 LdB }
- {---------------------------------------------------------------------------}
- FUNCTION FileOpen (Const FileName: AsciiZ; Mode: Word): THandle;
- {$IFDEF OS_DOS} { DOS/DPMI CODE }
- {$IFDEF ASM_BP} { BP COMPATABLE ASM }
- ASSEMBLER;
- ASM
- MOV AX, Mode; { Mode to open file }
- XOR CX, CX; { No attributes set }
- PUSH DS; { Save segment }
- LDS DX, FileName; { Filename to open }
- PUSH BP; { Store register }
- INT $21; { Open/create file }
- POP BP; { Restore register }
- POP DS; { Restore segment }
- JNC @@Exit2; { Check for error }
- XOR AX, AX; { Open fail return 0 }
- @@Exit2:
- END;
- {$ENDIF}
- {$IFDEF ASM_FPC} { FPC COMPATABLE ASM }
- VAR Regs: TRealRegs;
- BEGIN
- SysCopyToDos(LongInt(@FileName), 256); { Transfer filename }
- Regs.RealEDX := Tb MOD 16;
- Regs.RealDS := Tb DIV 16; { Linear addr of Tb }
- Regs.RealEAX := Mode; { Mode to open with }
- Regs.RealECX := 0; { No attributes set }
- SysRealIntr($21, Regs); { Call DOS int 21 }
- If (Regs.RealFlags AND 1 <> 0) Then FileOpen := 0{ Error encountered }
- Else FileOpen := Regs.RealEAX AND $FFFF; { Return file handle }
- END;
- {$ENDIF}
- {$ENDIF}
- {$IFDEF OS_WINDOWS} { WIN/NT CODE }
- VAR Hnd: Integer; OpenMode: Sw_Word;
- {$IFDEF BIT_16} Buf: TOfStruct; {$ENDIF} { 16 BIT VARIABLES }
- {$IFDEF BIT_32} ShareMode, Flags: LongInt; {$ENDIF} { 32 BIT VARIABLES }
- BEGIN
- {$IFDEF BIT_16} { 16 BIT WINDOW CODE }
- If (Mode = fa_Create) Then OpenMode := of_Create { Set create mask bit }
- Else OpenMode := Mode AND $00FF; { Set open mask bits }
- Hnd := OpenFile(FileName, Buf, OpenMode); { Open the file }
- {$ENDIF}
- {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
- If (Mode = fa_Create) Then Begin { Create file }
- OpenMode := Generic_Read OR Generic_Write; { Set access mask bit }
- Flags := Create_Always; { Create always mask }
- End Else Begin { Open the file }
- OpenMode := Generic_Read; { Read only access set }
- If (Mode AND $0001 <> 0) Then { Check write flag }
- OpenMode := OpenMode AND NOT Generic_Read; { Write only access set }
- If (Mode AND $0002 <> 0) Then { Check read/write flag }
- OpenMode := OpenMode OR Generic_Write; { Read/Write access }
- Flags := Open_Existing; { Open existing mask }
- End;
- ShareMode := file_Share_Read OR
- file_Share_Write; { Deny none flag set }
- Hnd := CreateFile(FileName, OpenMode, ShareMode,
- Nil, Flags, File_Attribute_Normal, 0); { Open the file }
- {$ENDIF}
- If (Hnd <> -1) Then FileOpen := Hnd Else { Return handle }
- FileOpen := 0; { Return error }
- END;
- {$ENDIF}
- {$IFDEF OS_OS2} { OS2 CODE }
- VAR OpenFlags, OpenMode: Word; Handle, ActionTaken: Sw_Word;
- BEGIN
- If (Mode = fa_Create) Then Begin { Create file }
- OpenMode := Open_Flags_NoInherit OR
- Open_Share_DenyNone OR
- Open_Access_ReadWrite; { Open mode }
- OpenFlags := OPEN_ACTION_CREATE_IF_NEW OR
- OPEN_ACTION_REPLACE_IF_EXISTS; { Open flags }
- End Else Begin
- OpenMode := Mode AND $00FF OR
- Open_Share_DenyNone; { Set open mode bits }
- OpenFlags := OPEN_ACTION_OPEN_IF_EXISTS; { Set open flags }
- End;
- {$IFDEF PPC_BPOS2} { C'T patched COMPILER }
- If (DosOpen(@FileName, Handle, ActionTaken, 0, 0,
- OpenFlags, OpenMode, 0) = 0) Then
- FileOpen := Handle Else FileOpen := 0; { Return handle/fail }
- {$ELSE} { OTHER OS2 COMPILERS }
- {$IFDEF PPC_FPC}
- If (DosOpen(@FileName, Longint(Handle), ActionTaken, 0, 0,
- OpenFlags, OpenMode, Nil) = 0) Then
- FileOpen := Handle Else FileOpen := 0; { Return handle/fail }
- {$ELSE}
- If (DosOpen(FileName, Handle, ActionTaken, 0, 0,
- OpenFlags, OpenMode, Nil) = 0) Then
- FileOpen := Handle Else FileOpen := 0; { Return handle/fail }
- {$ENDIF}
- {$ENDIF}
- END;
- {$ENDIF}
- {$IFDEF OS_UNIX}
- {$ifndef ver1_0}
- var tmp : ansistring;
- {$endif}
- BEGIN
- if mode = fa_Create then mode := Open_Creat or Open_RdWr else
- if mode = fa_OpenRead then mode := Open_RdOnly else
- if mode = fa_OpenWrite then mode := Open_WrOnly else
- if mode = fa_Open then mode := Open_RdWr;
- {$ifdef ver1_0}
- FileOpen := fdOpen(FileName,mode);
- {$else}
- tmp:=filename;
- FileOpen := fpopen(tmp,longint(mode));
- {$endif}
- END;
- {$ENDIF}
- {---------------------------------------------------------------------------}
- { SetFileSize -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 26Feb97 LdB }
- {---------------------------------------------------------------------------}
- FUNCTION SetFileSize (Handle: THandle; FileSize: LongInt): Word;
- {$IFDEF OS_DOS} { DOS/DPMI CODE }
- {$IFDEF ASM_BP} { BP COMPATABLE ASM }
- ASSEMBLER;
- ASM
- MOV DX, FileSize.Word[0]; { Load file position }
- MOV CX, FileSize.Word[2];
- MOV BX, Handle; { Load file handle }
- MOV AX, $4200; { Load function id }
- PUSH BP; { Store register }
- INT $21; { Position the file }
- POP BP; { Reload register }
- JC @@Exit3; { Exit if error }
- XOR CX, CX; { Force truncation }
- MOV BX, Handle; { File handle }
- MOV AX, $4000; { Load function id }
- PUSH BP; { Store register }
- INT $21; { Truncate file }
- POP BP; { Reload register }
- JC @@Exit3; { Exit if error }
- XOR AX, AX; { Return successful }
- @@Exit3:
- END;
- {$ENDIF}
- {$IFDEF ASM_FPC} { FPC COMPATABLE ASM }
- VAR Regs: TRealRegs;
- BEGIN
- Regs.RealEDX := FileSize AND $FFFF; { Lo word of filesize }
- Regs.RealECX := (FileSize SHR 16) AND $FFFF; { Hi word of filesize }
- Regs.RealEBX := LongInt(Handle); { Load file handle }
- Regs.RealEAX := $4000; { Load function id }
- SysRealIntr($21, Regs); { Call DOS int 21 }
- If (Regs.RealFlags AND 1 <> 0) Then
- SetFileSize := Regs.RealEAX AND $FFFF { Error encountered }
- Else SetFileSize := 0; { Return successful }
- END;
- {$ENDIF}
- {$ENDIF}
- {$IFDEF OS_WINDOWS} { WIN/NT CODE }
- VAR {$IFDEF BIT_16} Buf, {$ENDIF} Actual: LongInt;
- BEGIN
- {$IFDEF BIT_16} { 16 BIT WINDOWS CODE }
- Actual := _llseek(Handle, FileSize, 0); { Position file }
- If (Actual = FileSize) Then Begin { No position error }
- Actual := _lwrite(Handle, Pointer(@Buf), 0); { Truncate the file }
- If (Actual <> -1) Then SetFileSize := 0 Else { No truncate error }
- SetFileSize := 103; { File truncate error }
- End Else SetFileSize := 103; { File truncate error }
- {$ENDIF}
- {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
- Actual := SetFilePointer(Handle, FileSize, Nil, 0);{ Position file }
- If (Actual = FileSize) Then Begin { No position error }
- If SetEndOfFile(Handle) Then SetFileSize := 0 { No truncate error }
- Else SetFileSize := 103; { File truncate error }
- End Else SetFileSize := 103; { File truncate error }
- {$ENDIF}
- END;
- {$ENDIF}
- {$IFDEF OS_OS2} { OS2 CODE }
- BEGIN
- {$IFDEF PPC_BPOS2} { C'T patched COMPILER }
- SetFileSize := DosNewSize(Handle, FileSize); { Truncate the file }
- {$ELSE} { OTHER OS2 COMPILERS }
- SetFileSize := DosSetFileSize(Handle, FileSize); { Truncate the file }
- {$ENDIF}
- END;
- {$ENDIF}
- {$IFDEF OS_UNIX}
- VAR
- Actual : LongInt;
- BEGIN
- Actual := {$ifdef ver1_0}fdSeek{$else} fplseek{$endif}(Handle, FileSize, 0); { Position file }
- If (Actual = FileSize) Then Begin { No position error }
- if ({$ifdef ver1_0}fdTruncate{$else}fpftruncate{$endif}(Handle,FileSize)){$ifndef ver1_0}=0{$endif} { Truncate the file }
- Then SetFileSize := 0 { No truncate error }
- else SetFileSize := 103; { File truncate error }
- End Else SetFileSize := 103; { File truncate error }
- END;
- {$ENDIF}
- {---------------------------------------------------------------------------}
- { SetFilePos -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 25Feb97 LdB }
- {---------------------------------------------------------------------------}
- FUNCTION SetFilePos (Handle: THandle; Pos: LongInt; MoveType: Word;
- Var Actual: LongInt): Word;
- {$IFDEF OS_DOS} { DOS/DPMI CODE }
- {$IFDEF ASM_BP} { BP COMPATABLE ASM }
- ASSEMBLER;
- ASM
- MOV AX, MoveType; { Load move type }
- MOV AH, $42; { Load function id }
- MOV DX, Pos.Word[0]; { Load file position }
- MOV CX, Pos.Word[2];
- MOV BX, Handle; { Load file handle }
- PUSH BP; { Store register }
- INT $21; { Position the file }
- POP BP; { Reload register }
- JC @@Exit6;
- LES DI, Actual; { Actual var addr }
- MOV ES:[DI], AX;
- MOV ES:[DI+2], DX; { Update actual }
- XOR AX, AX; { Set was successful }
- @@Exit6:
- END;
- {$ENDIF}
- {$IFDEF ASM_FPC} { FPC COMPATABLE ASM }
- VAR Regs: TRealRegs;
- BEGIN
- Actual := 0; { Zero actual count }
- Regs.RealEAX := ($42 SHL 8) + Byte(MoveType); { Set function id }
- Regs.RealEBX := LongInt(Handle); { Fetch file handle }
- Regs.RealEDX := Pos AND $FFFF; { Keep low word }
- Regs.RealECX := Pos SHR 16; { Keep high word }
- SysRealIntr($21, Regs); { Call dos interrupt }
- If (Regs.RealFlags AND $1 = 0) Then Begin
- Actual := Lo(Regs.RealEDX) SHL 16 +
- Lo(Regs.RealEAX); { Current position }
- SetFilePos := 0; { Function successful }
- End Else SetFilePos := Lo(Regs.RealEAX); { I/O error returned }
- END;
- {$ENDIF}
- {$ENDIF}
- {$IFDEF OS_WINDOWS} { WINDOWS CODE }
- BEGIN
- {$IFDEF BIT_16} { 16 BIT WINDOWS CODE }
- Actual := _llseek(Handle, Pos, MoveType); { Position file }
- If (Actual <> -1) Then SetFilePos := 0 Else { No position error }
- SetFilePos := 107; { File position error }
- {$ENDIF}
- {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
- Actual := SetFilePointer(Handle, Pos, Nil, MoveType);{ Position file }
- If (Actual <> -1) Then SetFilePos := 0 Else { No position error }
- SetFilePos := 107; { File position error }
- {$ENDIF}
- END;
- {$ENDIF}
- {$IFDEF OS_OS2} { OS2 CODE }
- BEGIN
- {$IFDEF PPC_BPOS2}
- If (DosChgFilePtr(Handle, Pos, MoveType, Actual)=0){ Set file position }
- Then SetFilePos := 0 Else SetFilePos := 107; { File position error }
- {$ELSE} { OTHER OS2 COMPILERS }
- If (DosSetFilePtr(Handle, Pos, MoveType, Actual)=0){ Set file position }
- Then SetFilePos := 0 Else SetFilePos := 107; { File position error }
- {$ENDIF}
- END;
- {$ENDIF}
- {$IFDEF OS_UNIX}
- BEGIN
- Actual := {$ifdef ver1_0}fdSeek{$else}fplseek{$endif}(Handle, Pos, MoveType);
- If (Actual <> -1) Then SetFilePos := 0 Else { No position error }
- SetFilePos := 107; { File position error }
- END;
- {$ENDIF}
- {---------------------------------------------------------------------------}
- { FileRead -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct98 LdB }
- {---------------------------------------------------------------------------}
- FUNCTION FileRead (Handle: THandle; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
- {$IFDEF OS_DOS} { DOS/DPMI CODE }
- {$IFDEF ASM_BP} { BP COMPATABLE ASM }
- ASSEMBLER;
- ASM
- XOR AX, AX; { Zero register }
- LES DI, Actual; { Actual var address }
- MOV ES:[DI], AX; { Zero actual var }
- PUSH DS; { Save segment }
- LDS DX, Buf; { Data destination }
- MOV CX, Count; { Amount to read }
- MOV BX, Handle; { Load file handle }
- MOV AX, $3F00; { Load function id }
- PUSH BP; { Store register }
- INT $21; { Read from file }
- POP BP; { Reload register }
- POP DS; { Restore segment }
- JC @@Exit4; { Check for error }
- LES DI, Actual; { Actual var address }
- MOV ES:[DI], AX; { Update bytes moved }
- XOR AX, AX; { Return success }
- @@Exit4:
- END;
- {$ENDIF}
- {$IFDEF ASM_FPC} { FPC COMPATABLE ASM }
- BEGIN
- Actual := System.Do_Read(LongInt(Handle),
- LongInt(@Buf), Count); { Read data from file }
- FileRead := InOutRes; { I/O status returned }
- END;
- {$ENDIF}
- {$ENDIF}
- {$IFDEF OS_WINDOWS} { WIN/NT CODE }
- BEGIN
- {$IFDEF BIT_16} { 16 BIT WINDOWS CODE }
- Actual := _lread(Handle, Pointer(@Buf), Count); { Read from file }
- If (Actual = Count) Then FileRead := 0 Else { No read error }
- FileRead := 104; { File read error }
- {$ENDIF}
- {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
- If ReadFile(Handle, Buf, Count, DWord(Actual),
- Nil) AND (Actual = Count) Then FileRead := 0 { No read error }
- Else FileRead := 104; { File read error }
- {$ENDIF}
- END;
- {$ENDIF}
- {$IFDEF OS_OS2} { OS2 CODE }
- BEGIN
- If (DosRead(Handle, Buf, Count, Actual) = 0) AND { Read from file }
- (Actual = Count) Then FileRead := 0 Else { No read error }
- FileRead := 104; { File read error }
- END;
- {$ENDIF}
- {$IFDEF OS_UNIX}
- BEGIN
- Actual := {$ifdef ver1_0}fdRead{$else} fpread{$endif}(Handle, Buf, Count);
- if (Actual = Count) Then FileRead := 0 { No read error }
- Else FileRead := 104; { File read error }
- END;
- {$ENDIF}
- {---------------------------------------------------------------------------}
- { FileWrite -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct98 LdB }
- {---------------------------------------------------------------------------}
- FUNCTION FileWrite (Handle: THandle; Var Buf; Count: Sw_Word; Var Actual: Sw_Word): Word;
- {$IFDEF OS_DOS} { DOS/DPMI CODE }
- {$IFDEF ASM_BP} { BP COMPATABLE ASM }
- ASSEMBLER;
- ASM
- XOR AX, AX; { Zero register }
- LES DI, Actual; { Actual var address }
- MOV ES:[DI], AX; { Zero actual var }
- PUSH DS; { Save segment }
- LDS DX, Buf; { Data source buffer }
- MOV CX, Count; { Amount to write }
- MOV BX, Handle; { Load file handle }
- MOV AX, $4000; { Load function id }
- PUSH BP; { Store register }
- INT $21; { Write to file }
- POP BP; { Reload register }
- POP DS; { Restore segment }
- JC @@Exit5; { Check for error }
- LES DI, Actual; { Actual var address }
- MOV ES:[DI], AX; { Update bytes moved }
- XOR AX, AX; { Write successful }
- @@Exit5:
- END;
- {$ENDIF}
- {$IFDEF ASM_FPC} { FPC COMPATABLE ASM }
- BEGIN
- Actual := System.Do_Write(LongInt(Handle),
- LongInt(@Buf), Count); { Write data to file }
- FileWrite := InOutRes; { I/O status returned }
- END;
- {$ENDIF}
- {$ENDIF}
- {$IFDEF OS_WINDOWS} { WIN/NT CODE }
- BEGIN
- {$IFDEF BIT_16} { 16 BIT WINDOWS CODE }
- Actual := _lwrite(Handle, Pointer(@Buf), Count); { Write to file }
- If (Actual = Count) Then FileWrite := 0 Else { No write error }
- FileWrite := 105; { File write error }
- {$ENDIF}
- {$IFDEF BIT_32} { 32 BIT WINDOWS CODE }
- If WriteFile(Handle, Buf, Count, DWord(Actual),
- Nil) AND (Actual = Count) Then FileWrite := 0 { No write error }
- Else FileWrite := 105; { File write error }
- {$ENDIF}
- END;
- {$ENDIF}
- {$IFDEF OS_OS2} { OS2 CODE }
- BEGIN
- If (DosWrite(Handle, Buf, Count, Actual) = 0) AND { Write to file }
- (Actual = Count) Then FileWrite := 0 Else { No write error }
- FileWrite := 105; { File write error }
- END;
- {$ENDIF}
- {$IFDEF OS_UNIX}
- BEGIN
- Actual := {$ifdef ver1_0}fdWrite{$else}fpwrite{$endif}(Handle, Buf, Count);
- If (Actual = Count) Then FileWrite := 0 Else { No write error }
- FileWrite := 105; { File write error }
- END;
- {$ENDIF}
- END.
- {
- $Log$
- Revision 1.11 2003-10-01 16:20:27 marco
- * baseunix fixes for 1.1
- Revision 1.10 2002/10/13 20:52:09 hajny
- * mistyping corrected
- Revision 1.9 2002/10/12 19:39:00 hajny
- * FPC/2 support
- Revision 1.8 2002/09/22 19:42:22 hajny
- + FPC/2 support added
- Revision 1.7 2002/09/07 15:06:36 peter
- * old logs removed and tabs fixed
- Revision 1.6 2002/06/04 11:12:41 marco
- * Renamefest
- }
|