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.