1. 29 5月, 2015 1 次提交
    • R
      fix failure of ungetc and ungetwc to work on files in eof status · 2b4fcfda
      Rich Felker 提交于
      these functions were written to handle clearing eof status, but failed
      to account for the __toread function's handling of eof. with this
      patch applied, __toread still returns EOF when the file is in eof
      status, so that read operations will fail, but it also sets up valid
      buffer pointers for read mode, which are set to the end of the buffer
      rather than the beginning in order to make the whole buffer available
      to ungetc/ungetwc.
      
      minor changes to __uflow were needed since it's now possible to have
      non-zero buffer pointers while in eof status. as made, these changes
      remove a 'fast path' bypassing the function call to __toread, which
      could be reintroduced with slightly different logic, but since
      ordinary files have a syscall in f->read, optimizing the code path
      does not seem worthwhile.
      
      the __stdio_read function is also updated not to zero the read buffer
      pointers on eof/error. while not necessary for correctness, this
      change avoids the overhead of calling __toread in ungetc after
      reaching eof, and it also reduces code size and increases consistency
      with the fmemopen read operation which does not zero the pointers.
      2b4fcfda
  2. 29 3月, 2011 1 次提交
  3. 28 3月, 2011 1 次提交
    • R
      major stdio overhaul, using readv/writev, plus other changes · e3cd6c5c
      Rich Felker 提交于
      the biggest change in this commit is that stdio now uses readv to fill
      the caller's buffer and the FILE buffer with a single syscall, and
      likewise writev to flush the FILE buffer and write out the caller's
      buffer in a single syscall.
      
      making this change required fundamental architectural changes to
      stdio, so i also made a number of other improvements in the process:
      
      - the implementation no longer assumes that further io will fail
        following errors, and no longer blocks io when the error flag is set
        (though the latter could easily be changed back if desired)
      
      - unbuffered mode is no longer implemented as a one-byte buffer. as a
        consequence, scanf unreading has to use ungetc, to the unget buffer
        has been enlarged to hold at least 2 wide characters.
      
      - the FILE structure has been rearranged to maintain the locations of
        the fields that might be used in glibc getc/putc type macros, while
        shrinking the structure to save some space.
      
      - error cases for fflush, fseek, etc. should be more correct.
      
      - library-internal macros are used for getc_unlocked and putc_unlocked
        now, eliminating some ugly code duplication. __uflow and __overflow
        are no longer used anywhere but these macros. switch to read or
        write mode is also separated so the code can be better shared, e.g.
        with ungetc.
      
      - lots of other small things.
      e3cd6c5c
  4. 12 2月, 2011 1 次提交