[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [tyndur-devel] [PATCH] Pascal-RTL: Short Writes berücksichtigen



On Mon, Aug 30 00:03, Kevin Wolf wrote:
> ! Pascal-RTL: Do_Write muss die übergebenen Daten komplett schreiben,
>   fwrite kann allerdings Short Writes zurückgeben.
> 
> Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
> ---
>  src/modules/pas/lib/rtl/sysfile.inc |   21 +++++++++++++++++----
>  1 files changed, 17 insertions(+), 4 deletions(-)
> 
> diff --git a/src/modules/pas/lib/rtl/sysfile.inc b/src/modules/pas/lib/rtl/sysfile.inc
> index 5143ef8..bcd0889 100644
> --- a/src/modules/pas/lib/rtl/sysfile.inc
> +++ b/src/modules/pas/lib/rtl/sysfile.inc
> @@ -6,8 +6,8 @@ const
>  function c_fopen(filename, mode: PChar): THandle; cdecl; external name 'fopen';
>  function c_fclose(f: THandle): integer; cdecl; external name 'fclose';
>  
> -function c_fwrite(src: Pointer; blocksize, blockcount: TSize; f: THandle): TSize; cdecl; external name 'fwrite';
> -function c_fread(dest: Pointer; blocksize, blockcount: TSize; f: THandle): TSize; cdecl; external name 'fread';
> +function c_fwrite(src: Pointer; blocksize, blockcount: TSize; f: THandle): longint; cdecl; external name 'fwrite';
> +function c_fread(dest: Pointer; blocksize, blockcount: TSize; f: THandle): longint; cdecl; external name 'fread';

Also bei den Pascal-Typen bin ich mir ja nicht wirklich sicher, aber
fread/fwrite haben in C size_t als Rückgabetyp. ;-)

>  function c_fseek(f: THandle; offset, whence: longint): longint; cdecl; external name 'fseek';
>  function c_ftell(f: THandle): TSize; cdecl; external name 'ftell';
>  
> @@ -36,8 +36,21 @@ begin { TODO } end;
>  
>  
>  Function Do_Write(f: THandle; src: Pointer; len: TSize): TSize;
> -begin 
> -    Do_Write := c_fwrite(src, 1, len, f);
> +var
> +    ret: longint;
> +begin
> +    Do_Write := 0;
> +    while len > 0 do begin
> +        ret := c_fwrite(src, 1, len, f);
> +        if ret < 0 then begin

Ich glaube du bist bei write ohne f. fwrite gibt im Fehlerfall weniger
als len oder 0 zurück, und du musst dann noch mit ferror nachsehen ob es
ein Fehler war.

> +            InOutRes := 101;
> +            exit(0);
> +        end;
> +
> +        Inc(Do_Write, ret);
> +        Inc(src, ret);
> +        Dec(len, ret);
> +    end;
>  end;

-- 
Antoine Kaufmann
<toni@xxxxxxxxxxxxxxxx>

Attachment: pgpoVT9JHTECv.pgp
Description: PGP signature