Eric Blake wrote:
> It also fixes a bug where when the stream is at EOF, sometimes the
> function returned 0 and sometimes -1; the patch makes sure EOF always
> results in -1 (similar to the Posix 200x specification of getdelim always
> returning -1 at EOF).
>
> -  return bytes_stored;
> +  return bytes_stored ? bytes_stored : -1;

I disagree with this part of your patch and with your explanation.

There are 5 ways how getndelim2 can terminate:

  1. There are errors. Return value is -1.

  2. At least one byte is read and stored, and no error. Return value is > 0.

  3. At least one byte is read, but not stored (due to nmax), and no error.
     Return value was 0 and is now -1.

  4. EOF when reading the first byte, no error, and offset > 0.
     Return value was 0 and is now -1.

  5. EOF when reading the first byte, no error, and offset == 0.
     Return value is -1.

The change in cases 3 and 4
  - is IMO not appropriate, since the inability to _extend_ the current
    line (due to nmax or EOF) does not mean that the part of the line that
    was read so far should be ignored,
  - should have been mentioned in NEWS as a behaviour change of getndelim,
  - cannot be justified by pointing to getdelim in POSIX, because getdelim
    does not have the nmax and offset arguments.

I am in favour of reverting this change, and adding comments to clarify the
5 possible outcomes of getndelim2.

Bruno



Reply via email to