{ BP-like file operations for binary files } { simple workaround for the CRLF-bug in GCC/GPC } { Sven Hilscher - sven@rufus.central.de }
unit DosFile; { version 0.01Beta } { provisional arrangement }
Interface
Type WrkStr = String(255); Pointer = ^void; NameT = array[1..13] of char;
BinFile = record Name : NameT; Handle : Integer; BSize : Integer; end;
Var IOResultTemp : Integer;
procedure Assign(var F: BinFile; Name: WrkStr); procedure Reset(var F: BinFile; RecSize: Integer); procedure Rewrite(var F: BinFile; RecSize: Integer); procedure BlockWrite(var F: BinFile; var Buf: void; Count: Integer; var Result: Integer); procedure BlockRead(var F: BinFile; var Buf: Void; Count: Integer; var Result: Integer); procedure Close(var F: BinFile); function IOResult: Integer;
Implementation
procedure Assign(var F: BinFile; Name: WrkStr); var i : Integer; begin for i := 1 to 12 do if length(Name) >= i then F.Name[i] := Name[i] else F.Name[i] := chr(0);
F.Name[13] := chr(0); F.Handle := 0; end;
{ functions converted from "dos.h" }
function DosOpen(n: Pointer; i: Integer; h: pointer):Integer; AsmName '_dos_open'; function DosCreate(var n: NameT; i: Integer; h: pointer):Integer; AsmName '_dos_creat'; function DosClose(h: Integer): Integer; AsmName '_dos_close'; function DosWrite(h: Integer; b: Pointer; c: Integer; var r: Integer): Integer; AsmName '_dos_write'; function DosRead(h: Integer; b: Pointer; c: Integer; var r: Integer): Integer; AsmName '_dos_read';
procedure Reset(var F: BinFile; RecSize: Integer); begin if F.handle <> 0 then IOResultTemp := DosClose(F.Handle); IOResultTemp := DosOpen(@F.Name, 0, @F.Handle); F.BSize := RecSize; end;
procedure Rewrite(var F: BinFile; RecSize: Integer); begin if F.Handle <> 0 then IOResultTemp := DosClose(F.Handle); IOResultTemp := DosCreate(F.Name, 0, @F.Handle); F.BSize := RecSize; end;
procedure Close(var F: BinFile); begin IOResultTemp := DosClose(F.Handle); F.Handle := 0; F.BSize := 0; end;
function IOResult: Integer; begin IOResult := IOResultTemp; IOResultTemp := 0; end;
procedure BlockWrite(var F: BinFile; var Buf: void; Count: Integer; var Result: Integer); begin IOResultTemp := DosWrite(F.Handle, @Buf, Count * F.BSize, Result); Result := Result div F.BSize end;
procedure BlockRead(var F: BinFile; var Buf: Void; Count: Integer; var Result: Integer); begin IOResultTemp := DosRead(F.Handle, @Buf, Count * F.BSize, Result); Result := Result div F.BSize end;
begin IOResultTemp := 0; end.