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

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



On Sat, Sep 18, 2010 at 12:01:00PM +0200, Antoine Kaufmann wrote:
> 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. ;-)

Wie du unten korrekt erkannt hast, war ich gedanklich bei read/write,
die ein ssize_t zurückgeben, für das ich keine Entsprechung gefunden
hatte. ;-)

> >  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.

Wierum fixen wir es am besten? read/write benutzen oder mit ferror
prüfen?