bug-gnulib
[Top][All Lists]
Advanced

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

Re: new module 'freadptr'


From: Bruno Haible
Subject: Re: new module 'freadptr'
Date: Fri, 29 Feb 2008 00:57:51 +0100
User-agent: KMail/1.5.4

What happens with freadahead() and freadptr() after ungetc?

In theory it is possible that an implementation stores the bytes pushed-back
by ungetc in a location that freadahead() does not see. The implementations
that I tested don't do this, but the API should support this. I can see three
possible ways to support this situation:

  (a) Change freadahead(), so that freadahead() after ungetc return 0.
  (b) Change freadptr() so that it returns NULL after ungetc, even though
      freadahead() > 0.
  (c) Add a new API that tests whether the stream is current reading pushed-back
      bytes.

(a) would break the closein.c code. It assumes that when freadahead() there
are no buffers in memory (except for the pushed-back bytes).

(c) may be difficult. I already had problems implementing it on glibc.

So this implements (b).

*** lib/freadptr.h.orig 2008-02-29 00:49:20.000000000 +0100
--- lib/freadptr.h      2008-02-28 23:32:46.000000000 +0100
***************
*** 23,30 ****
  
  /* Assuming the stream STREAM is open for reading:
     Return a pointer to the input buffer of STREAM.
!    If freadahead (STREAM) > 0, the result is a pointer to freadahead (STREAM)
!    bytes.
     If freadahead (STREAM) == 0, the result is not usable; it may be NULL.
     In this case, you should use getc (STREAM), fgetc (STREAM), or
     fread (..., STREAM) to access the input from STREAM.
--- 23,31 ----
  
  /* Assuming the stream STREAM is open for reading:
     Return a pointer to the input buffer of STREAM.
!    If freadahead (STREAM) > 0, the result is either a pointer to
!    freadahead (STREAM) bytes, or NULL.  The latter case can happen after
!    use of 'ungetc (..., STREAM)'.
     If freadahead (STREAM) == 0, the result is not usable; it may be NULL.
     In this case, you should use getc (STREAM), fgetc (STREAM), or
     fread (..., STREAM) to access the input from STREAM.





reply via email to

[Prev in Thread] Current Thread [Next in Thread]