fpc/api/inc/filectrl.pas

210 lines
6.2 KiB
ObjectPascal

{
$Id$
System independent low-level file interface
Copyright (c) 1997 Balazs Scheidler (bazsi@balabit.hu)
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
****************************************************************************
Todo:
OS/2 versions of TruncateFile, FlushFile
****************************************************************************}
unit FileCtrl;
interface
{$I platform.inc}
uses
ApiComm, FileSys;
{ The following platforms are supported
OS/2 either 1.x, or 2.x
Linux
DOS 16 bit, DPMI, Windows 3.1
Not supported:
Win32 (yet)
}
const
{ standard file handles under DOS, under linux only stdin, stdout and strerr
is defined }
stdin = 0;
stdout = 1;
stderr = 2;
stdaux = 3;
stdprn = 4;
{ file access constants }
filRead = 0;
filWrite = 1;
filReadWrite = 2;
{ seek constants }
skBeg = 0;
skCur = 1;
skEnd = 2;
FilePerms: Word = $1A4; { rw-r--r-- }
type
{$IFDEF BIT_16}
TFileHandle = Word;
{$ELSE}
TFileHandle = Longint;
{$ENDIF}
{ System independent calls }
{ All of these functions do what their name imply, set ErrorCode (in Common)
to the returned error. }
{ Under linux, I'll use FilePerms as permissions, instead of expecting an
additional parameter }
{$IFDEF PPC_Feature_Overriding}
function OpenFile(FName: PChar; Flags: Longint): TFileHandle;
function CreateFile(FName: PChar): TFileHandle;
procedure DeleteFile(FName: PChar); { should be moved to FileSys }
{$ENDIF}
function OpenFileStr(FName: PChar; Flags: Longint): TFileHandle;
function CreateFileStr(FName: PChar): TFileHandle;
procedure DeleteFileStr(FName: PChar); { should be moved to FileSys }
function OpenFile(FName: TFileName; Flags: Longint): TFileHandle;
function CreateFile(FName: TFileName): TFileHandle;
procedure DeleteFile(FName: TFileName);
procedure CloseFile(Handle: TFileHandle);
function SeekFile(Handle: TFileHandle; Pos: TFileInt; SeekType: Word): TFileInt;
function ReadFile(Handle: TFileHandle; var Buff; Count: CPUWord): CPUWord;
function WriteFile(Handle: TFileHandle; var Buff; Count: CPUWord): CPUWord;
procedure FlushFile(Handle: TFileHandle);
procedure TruncateFile(Handle: TFileHandle);
function EndOfFile(Handle: TFileHandle): Boolean;
function FilePos(Handle: TFileHandle): TFileInt;
function FileSize(Handle: TFileHandle): TFileInt;
procedure CopyFile(F1, F2: TFileHandle; Length: TFileInt);
implementation
{ Include system dependent part }
{$i filectrl.inc}
function OpenFile(FName: TFileName; Flags: Longint): TFileHandle;
begin
FName := FName + #0;
OpenFile := OpenFileStr(@FName[1], Flags);
end;
function CreateFile(FName: TFileName): TFileHandle;
begin
FName := FName+#0;
CreateFile := CreateFileStr(@FName[1]);
end;
procedure DeleteFile(FName: TFileName);
begin
FName := FName + #0;
DeleteFileStr(@FName[1]);
end;
{$IFDEF PPC_Feature_Overriding}
function OpenFile(FName: PChar; Flags: Longint): TFileHandle;
begin
OpenFile := OpenFileStr(FName, Flags);
end;
function CreateFile(FName: PChar): TFileHandle;
begin
CreateFile := CreateFileStr(FName);
end;
procedure DeleteFile(FName: PChar);
begin
DeleteFileStr(FName);
end;
{$ENDIF}
procedure CopyFile(F1, F2: TFileHandle; Length: TFileInt);
var
Buf: array [0..1023] of Byte;
Len: Word;
begin
while (ErrorCode = 0) and (Length <> 0) do begin
if Length < 1024 then Len := Length else Len := 1024;
Len := ReadFile(F1, Buf, Len);
WriteFile(F2, Buf, Len);
Dec(Length, Len);
end;
end;
end.
{
$Log$
Revision 1.2 2000-02-29 11:43:16 pierre
Common renamed APIComm to avoid problems with free vision
Revision 1.1 2000/01/06 01:20:31 peter
* moved out of packages/ back to topdir
Revision 1.1 1999/12/23 19:36:47 peter
* place unitfiles in target dirs
Revision 1.1 1999/11/24 23:36:37 peter
* moved to packages dir
Revision 1.3 1999/04/13 09:29:44 daniel
* Reverted a terrible mistake
Revision 1.1 1998/12/04 12:48:24 peter
* moved some dirs
Revision 1.6 1998/10/26 11:22:49 peter
* updates
Date Version Who Comments
07/06/97 0.1 bazsi Initial implementation
many of the platforms implemented, but not
tested at all
07/07/97 0.1.1 bazsi Some changes suggested by Marco Schmidt
(TFileInt)
Tested under Linux (FPC) and DOS (BP).
07/12/97 0.1.2 bazsi Converted to the new error-handling scheme,
began adding error codes, but this will be
changed (!)
07/18/97 0.2 bazsi Error codes moved to common
07/18/97 0.2.1 bazsi Corrected some syntactical errors (haven't
checked before uploading...)
07/19/97 0.2.2 bazsi Overriden versions using Pascal style strings
07/19/97 0.3 bazsi EndOfFile, TruncateFile added, FlushFile
implemented on Linux, DOS
07/28/97 0.3.1 bazsi Corrected some DOS 16 bit bugs (setting ErrorCode)
08/07/97 0.3.2 bazsi renamed to .PAS
PChar versions are named xxxxStr, overriden
versions are provided if PPC_Feature_Overriding is
defined (the Str versions are provided in both cases)
08/24/97 0.3.3 bazsi FileSys added to uses clause
04/15/98 0.3.4 Michael Updated Linux implementation.
05/05/98 0.3.5 mkoeppe Fixed ReadFile, WriteFile return value in Linux.
}