unit exported;
interface
function FileOpen(FileName: string): Integer;
function FileSeek(F, OffSet, Origin: Integer): Integer;
function FilePos(F: Integer): Integer;
function FileEnd(F: Integer): Boolean;
function FileSize(F: Integer): Integer;
function FileReadln(F: Integer; var S: string): Integer;
procedure FileWriteln(F: Integer; S: string);
procedure FileClose(F: Integer);
implementation
uses
{$IFDEF MSWINDOWS}
Windows;
{$ELSE}
Libc;
{$ENDIF}
function FileOpen(FileName: string): Integer;
begin
{$IFDEF MSWINDOWS}
Cardinal(Result) := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, GENERIC_READ);
{$ELSE}
Result := open(PChar(FileName), O_RDWR);
if Result < 0 then
Result := open(PChar(FileName), O_RDWR or O_CREAT, S_IREAD or S_IWRITE);
{$ENDIF}
end;
function FileRead(F: Integer; var Buffer; Count: Cardinal): Cardinal;
begin
{$IFDEF MSWINDOWS}
if not ReadFile(Cardinal(F), Buffer, Count, Cardinal(Result), nil) then
Result := 0;
{$ELSE}
Result := __read(F, Buffer, Count);
{$ENDIF}
end;
function FileWrite(F: Integer; const Buffer; Count: Cardinal): Cardinal;
begin
{$IFDEF MSWINDOWS}
if not WriteFile(Cardinal(F), Buffer, Count, Cardinal(Result), nil) then
Result := 0;
{$ELSE}
Result := __write(F, Buffer, Count);
{$ENDIF}
end;
function FileSeek(F, OffSet, Origin: Integer): Integer;
begin
{$IFDEF MSWINDOWS}
Result := SetFilePointer(Cardinal(F), Offset, nil, Origin);
{$ELSE}
Result := __lseek(F, Offset, Origin);
{$ENDIF}
end;
function FilePos(F: Integer): Integer;
begin
Result := FileSeek(F, 0, 1);
end;
function FileSize(F: Integer): Integer;
var
LastFilePos: Integer;
begin
LastFilePos := FilePos(F);
Result := FileSeek(F, 0, 2);
FileSeek(F, LastFilePos, 0);
end;
function FileEnd(F: Integer): Boolean;
begin
Result := FilePos(F) >= FileSize(F);
end;
function CharPos(const Str: PChar; C: Char): PChar;
begin
Result := Str;
if Result = nil then
Exit;
while (Result^ <> #0) do
begin
if Result^ = C then
Exit;
Inc(Result);
end;
Result := nil;
end;
function FileReadln(F: Integer; var S: string): Integer;
var
C, P: Char;
begin
S := '';
repeat
P := C;
if FileRead(F, C, 1) = 0 then
Break;
if C = #10 then
begin
if P = #13 then
SetLength(S, Length(S) - 1);
Break;
end;
S := S + C;
until False;
Result := Length(S);
end;
procedure FileWriteln(F: Integer; S: string);
const
EOL = #13#10;
begin
FileWrite(F, PChar(S)^, Length(S));
FileWrite(F, PChar(EOL)^, Length(EOL));
end;
procedure FileClose(F: Integer);
begin
{$IFDEF MSWINDOWS}
CloseHandle(Cardinal(F));
{$ELSE}
__close(F);
{$ENDIF}
end;
end.