mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-13 21:59:28 +02:00
448 lines
8.7 KiB
PHP
448 lines
8.7 KiB
PHP
{
|
||
$Id$
|
||
This file is part of the Free Pascal Run time library.
|
||
Copyright (c) 1993,97 by the Free Pascal development team
|
||
|
||
See the file COPYING.FPC, included in this distribution,
|
||
for details about the copyright.
|
||
|
||
This program 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.
|
||
|
||
**********************************************************************}
|
||
|
||
{****************************************************************************
|
||
subroutines For UnTyped File handling
|
||
****************************************************************************}
|
||
|
||
type
|
||
UnTypedFile=File;
|
||
|
||
Procedure Assign(var f:File;const Name:string);
|
||
{
|
||
Assign Name to file f so it can be used with the file routines
|
||
}
|
||
Begin
|
||
FillChar(f,SizeOf(FileRec),0);
|
||
FileRec(f).Handle:=UnusedHandle;
|
||
FileRec(f).mode:=fmClosed;
|
||
Move(Name[1],FileRec(f).Name,Length(Name));
|
||
End;
|
||
|
||
|
||
Procedure assign(var f:File;p:pchar);
|
||
{
|
||
Assign Name to file f so it can be used with the file routines
|
||
}
|
||
begin
|
||
Assign(f,StrPas(p));
|
||
end;
|
||
|
||
|
||
Procedure assign(var f:File;c:char);
|
||
{
|
||
Assign Name to file f so it can be used with the file routines
|
||
}
|
||
begin
|
||
Assign(f,string(c));
|
||
end;
|
||
|
||
|
||
Procedure Rewrite(var f:File;l:Longint);[IOCheck];
|
||
{
|
||
Create file f with recordsize of l
|
||
}
|
||
Begin
|
||
If InOutRes <> 0 then
|
||
exit;
|
||
Case FileRec(f).mode Of
|
||
fmInOut,fmInput,fmOutput : Close(f);
|
||
fmClosed : ;
|
||
else
|
||
Begin
|
||
InOutRes:=102;
|
||
exit;
|
||
End;
|
||
End;
|
||
If l=0 Then
|
||
InOutRes:=2
|
||
else
|
||
Begin
|
||
Do_Open(f,PChar(@FileRec(f).Name),$101);
|
||
FileRec(f).RecSize:=l;
|
||
End;
|
||
End;
|
||
|
||
|
||
Procedure Reset(var f:File;l:Longint);[IOCheck];
|
||
{
|
||
Open file f with recordsize of l and filemode
|
||
}
|
||
Begin
|
||
If InOutRes <> 0 then
|
||
Exit;
|
||
Case FileRec(f).mode Of
|
||
fmInOut,fmInput,fmOutput : Close(f);
|
||
fmClosed : ;
|
||
else
|
||
Begin
|
||
InOutRes:=102;
|
||
exit;
|
||
End;
|
||
End;
|
||
If l=0 Then
|
||
InOutRes:=2
|
||
else
|
||
Begin
|
||
Do_Open(f,PChar(@FileRec(f).Name),Filemode);
|
||
FileRec(f).RecSize:=l;
|
||
End;
|
||
End;
|
||
|
||
|
||
Procedure Rewrite(Var f:File);[IOCheck];
|
||
{
|
||
Create file with (default) 128 byte records
|
||
}
|
||
Begin
|
||
If InOutRes <> 0 then
|
||
exit;
|
||
Rewrite(f,128);
|
||
End;
|
||
|
||
|
||
Procedure Reset(Var f:File);[IOCheck];
|
||
{
|
||
Open file with (default) 128 byte records
|
||
}
|
||
Begin
|
||
If InOutRes <> 0 then
|
||
exit;
|
||
Reset(f,128);
|
||
End;
|
||
|
||
|
||
Procedure BlockWrite(Var f:File;Var Buf;Count:Longint;var Result:Longint);[IOCheck];
|
||
{
|
||
Write Count records from Buf to file f, return written records in result
|
||
}
|
||
Begin
|
||
Result:=0;
|
||
If InOutRes <> 0 then
|
||
exit;
|
||
case FileRec(f).Mode of
|
||
fmInOut,fmOutput : ;
|
||
else
|
||
begin
|
||
InOutRes:=103;
|
||
exit;
|
||
end;
|
||
end;
|
||
Result:=Do_Write(FileRec(f).Handle,Longint(@Buf),Count*FileRec(f).RecSize) div FileRec(f).RecSize;
|
||
End;
|
||
|
||
|
||
Procedure BlockWrite(Var f:File;Var Buf;Count:Word;var Result:Word);[IOCheck];
|
||
{
|
||
Write Count records from Buf to file f, return written records in Result
|
||
}
|
||
var
|
||
l : longint;
|
||
Begin
|
||
BlockWrite(f,Buf,Count,l);
|
||
Result:=l;
|
||
End;
|
||
|
||
|
||
Procedure BlockWrite(Var f:File;Var Buf;Count:Word;var Result:Integer);[IOCheck];
|
||
{
|
||
Write Count records from Buf to file f, return written records in Result
|
||
}
|
||
var
|
||
l : longint;
|
||
Begin
|
||
BlockWrite(f,Buf,Count,l);
|
||
Result:=l;
|
||
End;
|
||
|
||
|
||
Procedure BlockWrite(Var f:File;Var Buf;Count:Longint);[IOCheck];
|
||
{
|
||
Write Count records from Buf to file f, if none a Read and Count>0 then
|
||
InOutRes is set
|
||
}
|
||
var
|
||
Result : Longint;
|
||
Begin
|
||
BlockWrite(f,Buf,Count,Result);
|
||
If (Result=0) and (Count>0) Then
|
||
InOutRes:=101;
|
||
End;
|
||
|
||
|
||
Procedure BlockRead(var f:File;var Buf;Count:Longint;var Result:Longint);[IOCheck];
|
||
{
|
||
Read Count records from file f ro Buf, return nu<EFBFBD>ber of read records in
|
||
Result
|
||
}
|
||
Begin
|
||
Result:=0;
|
||
If InOutRes <> 0 then
|
||
exit;
|
||
case FileRec(f).Mode of
|
||
fmInOut,fmInput : ;
|
||
else
|
||
begin
|
||
InOutRes:=103;
|
||
exit;
|
||
end;
|
||
end;
|
||
Result:=Do_Read(FileRec(f).Handle,Longint(@Buf),count*FileRec(f).RecSize) div FileRec(f).RecSize;
|
||
End;
|
||
|
||
|
||
Procedure BlockRead(var f:File;var Buf;count:Word;var Result:Word);[IOCheck];
|
||
{
|
||
Read Count records from file f to Buf, return number of read records in
|
||
Result
|
||
}
|
||
var
|
||
l : longint;
|
||
Begin
|
||
BlockRead(f,Buf,Count,l);
|
||
Result:=l;
|
||
End;
|
||
|
||
|
||
Procedure BlockRead(var f:File;var Buf;count:Word;var Result:Integer);[IOCheck];
|
||
{
|
||
Read Count records from file f to Buf, return number of read records in
|
||
Result
|
||
}
|
||
var
|
||
l : longint;
|
||
Begin
|
||
BlockRead(f,Buf,Count,l);
|
||
Result:=l;
|
||
End;
|
||
|
||
|
||
Procedure BlockRead(Var f:File;Var Buf;Count:Longint);[IOCheck];
|
||
{
|
||
Read Count records from file f to Buf, if none are read and Count>0 then
|
||
InOutRes is set
|
||
}
|
||
var
|
||
Result : Longint;
|
||
Begin
|
||
BlockRead(f,Buf,Count,Result);
|
||
If (Result=0) and (Count>0) Then
|
||
InOutRes:=100;
|
||
End;
|
||
|
||
|
||
Function FilePos(var f:File):Longint;[IOCheck];
|
||
{
|
||
Return current Position In file f in records
|
||
}
|
||
Begin
|
||
FilePos:=0;
|
||
If InOutRes <> 0 then
|
||
exit;
|
||
case FileRec(f).Mode of
|
||
fmInOut,fmInput,fmOutput : ;
|
||
else
|
||
begin
|
||
InOutRes:=103;
|
||
exit;
|
||
end;
|
||
end;
|
||
FilePos:=Do_FilePos(FileRec(f).Handle) div FileRec(f).RecSize;
|
||
End;
|
||
|
||
|
||
Function FileSize(var f:File):Longint;[IOCheck];
|
||
{
|
||
Return the size of file f in records
|
||
}
|
||
Begin
|
||
FileSize:=0;
|
||
If InOutRes <> 0 then
|
||
exit;
|
||
case FileRec(f).Mode of
|
||
fmInOut,fmInput,fmOutput : ;
|
||
else
|
||
begin
|
||
InOutRes:=103;
|
||
exit;
|
||
end;
|
||
end;
|
||
if (FileRec(f).RecSize>0) then
|
||
FileSize:=Do_FileSize(FileRec(f).Handle) div FileRec(f).RecSize;
|
||
End;
|
||
|
||
|
||
Function Eof(var f:File):Boolean;[IOCheck];
|
||
{
|
||
Return True if we're at the end of the file f, else False is returned
|
||
}
|
||
Begin
|
||
Eof:=false;
|
||
If InOutRes <> 0 then
|
||
exit;
|
||
case FileRec(f).Mode of
|
||
fmInOut,fmInput,fmOutput : ;
|
||
else
|
||
begin
|
||
InOutRes:=103;
|
||
exit;
|
||
end;
|
||
end;
|
||
{Can't use do_ routines because we need record support}
|
||
Eof:=(FileSize(f)<=FilePos(f));
|
||
End;
|
||
|
||
|
||
Procedure Seek(var f:File;Pos:Longint);[IOCheck];
|
||
{
|
||
Goto record Pos in file f
|
||
}
|
||
Begin
|
||
If InOutRes <> 0 then
|
||
exit;
|
||
case FileRec(f).Mode of
|
||
fmInOut,fmInput,fmOutput : ;
|
||
else
|
||
begin
|
||
InOutRes:=103;
|
||
exit;
|
||
end;
|
||
end;
|
||
Do_Seek(FileRec(f).Handle,Pos*FileRec(f).RecSize);
|
||
End;
|
||
|
||
|
||
Procedure Truncate(Var f:File);[IOCheck];
|
||
{
|
||
Truncate/Cut file f at the current record Position
|
||
}
|
||
Begin
|
||
If InOutRes <> 0 then
|
||
exit;
|
||
case FileRec(f).Mode of
|
||
fmInOut,fmOutput : ;
|
||
else
|
||
begin
|
||
InOutRes:=103;
|
||
exit;
|
||
end;
|
||
end;
|
||
Do_Truncate(FileRec(f).Handle,FilePos(f)*FileRec(f).RecSize);
|
||
End;
|
||
|
||
|
||
Procedure Close(var f:File);[IOCheck];
|
||
{
|
||
Close file f
|
||
}
|
||
Begin
|
||
If InOutRes <> 0 then
|
||
exit;
|
||
case FileRec(f).Mode of
|
||
fmInOut,fmInput,fmOutput : ;
|
||
else
|
||
begin
|
||
InOutRes:=103;
|
||
exit;
|
||
end;
|
||
end;
|
||
FileRec(f).mode:=fmClosed;
|
||
if FileRec(f).Handle>4 then
|
||
Do_Close(FileRec(f).Handle);
|
||
End;
|
||
|
||
|
||
Procedure Erase(var f : File);[IOCheck];
|
||
Begin
|
||
If InOutRes <> 0 then
|
||
exit;
|
||
If FileRec(f).mode=fmClosed Then
|
||
Do_Erase(PChar(@FileRec(f).Name));
|
||
End;
|
||
|
||
|
||
Procedure Rename(var f : File;p:pchar);[IOCheck];
|
||
Begin
|
||
If InOutRes <> 0 then
|
||
exit;
|
||
If FileRec(f).mode=fmClosed Then
|
||
Begin
|
||
Do_Rename(PChar(@FileRec(f).Name),p);
|
||
Move(p^,FileRec(f).Name,StrLen(p)+1);
|
||
End;
|
||
End;
|
||
|
||
|
||
Procedure Rename(var f : File;const s : string);[IOCheck];
|
||
var
|
||
p : array[0..255] Of Char;
|
||
Begin
|
||
If InOutRes <> 0 then
|
||
exit;
|
||
Move(s[1],p,Length(s));
|
||
p[Length(s)]:=#0;
|
||
Rename(f,Pchar(@p));
|
||
End;
|
||
|
||
|
||
Procedure Rename(var f : File;c : char);[IOCheck];
|
||
var
|
||
p : array[0..1] Of Char;
|
||
Begin
|
||
If InOutRes <> 0 then
|
||
exit;
|
||
p[0]:=c;
|
||
p[1]:=#0;
|
||
Rename(f,Pchar(@p));
|
||
End;
|
||
|
||
{
|
||
$Log$
|
||
Revision 1.10 1998-11-29 23:10:12 peter
|
||
* also check fmInput,fmOutput
|
||
|
||
Revision 1.9 1998/11/29 22:28:11 peter
|
||
+ io-error 103 added
|
||
|
||
Revision 1.8 1998/09/17 16:34:16 peter
|
||
* new eof,eoln,seekeoln,seekeof
|
||
* speed upgrade for read_string
|
||
* inoutres 104/105 updates for read_* and write_*
|
||
|
||
Revision 1.7 1998/09/04 18:16:12 peter
|
||
* uniform filerec/textrec (with recsize:longint and name:0..255)
|
||
|
||
Revision 1.6 1998/07/19 19:55:32 michael
|
||
+ fixed rename. Changed p to p^
|
||
|
||
Revision 1.5 1998/07/02 12:15:39 carl
|
||
+ Each IOCheck routine now checks for InOures before executing, like TP
|
||
|
||
Revision 1.4 1998/06/23 16:57:16 peter
|
||
* fixed the filesize() problems under linux and filerec.size=0 error
|
||
|
||
Revision 1.3 1998/05/21 19:30:56 peter
|
||
* objects compiles for linux
|
||
+ assign(pchar), assign(char), rename(pchar), rename(char)
|
||
* fixed read_text_as_array
|
||
+ read_text_as_pchar which was not yet in the rtl
|
||
|
||
Revision 1.2 1998/05/12 10:42:44 peter
|
||
* moved getopts to inc/, all supported OS's need argc,argv exported
|
||
+ strpas, strlen are now exported in the systemunit
|
||
* removed logs
|
||
* removed $ifdef ver_above
|
||
|
||
}
|