[fpc-devel] Publish some of FPC's internal cross-platform functionality

Anton Shepelev anton.txt at gmail.com
Tue Mar 12 18:30:36 CET 2019

I wrote:

>> > Notice also that FreePascal's TextRec handling is
>> > incompatible with that of Delphi.  The TextRec
>> > operations OpenFunc, InOutFunc, FlushFunc, and CloseFunc
>> > return a longint, which Delphi interprets as the result
>> > code but FreePascal ignores.  Therefore, I must set
>> > InOutRes in FreePascal and return the error in Delphi.
> Sven Barth:
>> Now *that* is something that can and probably also should
>> be talked about.
>OK.  system.inc defines FileFunc as a procedure without a
>return value:
>   FileFunc = Procedure(var t : TextRec);
>whereas streamio.pp defines the same operations as functions
>returning longint, e.g.:
>   Function StreamRead(var F: TTextRec) : longint;
>and reports errors through the return value, which is
>ignored in text.inc .  Not so in Delphi, where the internal
>mechanism forwards the return value to IOResult, relieving
>the driver writer of setting it manually.
>In addition to system.inc and text.inc, a patch will modify
>all platform-specfic files that implement the TextRec
>operations and set InOutRes.  Many of them already use the
>return value for the size of data read or written, but one
>could use negative values to encode errors.  text.inc would
>   procedure FileReadFunc( var t:TextRec ): LongInt;
>   var fres: LongInt;
>   begin
>      fres := do_read( f.Handle, f.Bufptr, f.BufSize );
>      if fres < 0 then { fres has a negative IOResult value. }
>      begin
>         result := -fres; exit;
>      end;
>      result   := 0; { Success }
>      t.BufEnd := fres;
>      t.BufPos := 0;
>   end;
>and will check the return value of every TextRec operation.

( should be `function' instead of `procedure' )

Will the developers consider such a patch, or are these
deviations from Delphi intentional?

Please, do not forward replies to the list to my e-mail.

More information about the fpc-devel mailing list