All pastes #824051 Raw Edit

Stuff

public text v1 · immutable
·published 2007-12-19 19:26 UTC
rendered paste body
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.