153 Commits

Author SHA1 Message Date
Rich Felker
94a0171d80 fix logic error in fread
fread was calling f->read without checking that the file was in
reading mode. this could:
1. crash, if f->read was a null pointer
2. cause unwanted blocking on a terminal already at eof
3. allow reading on a write-only file
2011-07-16 21:24:02 -04:00
Rich Felker
a9e6d01114 printf: "if a precision is specified, the '0' flag shall be ignored." 2011-07-04 11:55:52 -04:00
Rich Felker
cc44d9f201 zero precision with zero value should not inhibit prefix/width printing 2011-07-04 01:57:00 -04:00
Rich Felker
3d54adbe47 printf("%#x",0) should print 0 not 0x0 2011-07-04 01:01:58 -04:00
Rich Felker
e5cb55fedd fix logic in __fwriting 2011-06-30 13:27:08 -04:00
Rich Felker
a0b56b947a add and consolidate nasty stdio_ext junk
hopefully this resolves the rest of the issues with hideously
nonportable hacks in programs that use gnulib.
2011-06-30 12:44:48 -04:00
Rich Felker
7640497f5f implement the nonstandard GNU function fpurge
this is a really ugly and backwards function, but its presence will
prevent lots of broken gnulib software from trying to define its own
version of fpurge and thereby failing to build or worse.
2011-06-30 11:42:33 -04:00
Rich Felker
0e1762539c avoid 64bit warnings when using pointers as entropy for temp names 2011-06-13 20:52:01 -04:00
Rich Felker
8628eff912 fix the last known rounding bug in floating point printing
the observed symptom was that the code was incorrectly rounding up
1.0625 to 1.063 despite the rounding mode being round-to-nearest with
ties broken by rounding to even last place. however, the code was just
not right in many respects, and i'm surprised it worked as well as it
did. this time i tested the values that end up in the variables round,
small, and the expression round+small, and all look good.
2011-05-11 19:58:03 -04:00
Rich Felker
77f15d108e reduce some ridiculously large spin counts
these should be tweaked according to testing. offhand i know 1000 is
too low and 5000 is likely to be sufficiently high. consider trying to
add futexes to file locking, too...
2011-05-06 21:45:48 -04:00
Rich Felker
78c808b126 fix fclose return status logic, again
the previous fix was incorrect, as it would prevent f->close(f) from
being called if fflush(f) failed. i believe this was the original
motivation for using | rather than ||. so now let's just use a second
statement to constrain the order of function calls, and to back to
using |.
2011-05-02 09:18:03 -04:00
Rich Felker
bd67467325 fix undefined call order in fclose, possible lost output depending on compiler
pcc turned up this bug by calling f->close(f) before fflush(f),
resulting in lost output and error on flush.
2011-05-01 22:59:14 -04:00
Rich Felker
d02c50d6a3 minor optimization in puts: use inline putc_unlocked macro for newline 2011-05-01 20:12:51 -04:00
Rich Felker
5efc6af4eb fix 2 eof-related bugs in scanf
1. failed match of literal chars from the format string would always
return matching failure rather than input failure at eof, leading to
infinite loops in some programs.

2. unread of eof would wrongly adjust the character counts reported by
%n, yielding an off-by-one error.
2011-04-25 10:40:25 -04:00
Rich Felker
9080cc153c clean up handling of thread/nothread mode, locking 2011-04-17 16:53:54 -04:00
Rich Felker
eb0e8fa0b1 debloat: use __syscall instead of syscall where possible
don't waste time (and significant code size due to function call
overhead!) setting errno when the result of a syscall does not matter
or when it can't fail.
2011-04-17 16:32:15 -04:00
Rich Felker
69cf09c821 avoid setting errno when checking for tty
setting errno here is completely valid, but some programs, notably
busybox printf, assume that errno will not be set during output and
treat this as an error condition. in any case, skipping it slightly
reduces code size and saves time.
2011-04-15 12:04:13 -04:00
Rich Felker
b172dc8b58 make tmpfile slightly more efficient (use unlink syscall instead of remove) 2011-04-14 21:43:49 -04:00
Rich Felker
e514228043 fix printf("%.9g", 1.1) and similar not dropping trailing zeros 2011-04-12 11:50:52 -04:00
Rich Felker
52458cfa8c fix fputwc return value 2011-04-11 01:52:23 -04:00
Rich Felker
2cff36a84f work around a nasty bug in linux readv syscall
according to posix, readv "shall be equivalent to read(), except..."
that it places the data into the buffers specified by the iov array.
however on linux, when reading from a terminal, each iov element
behaves almost like a separate read. this means that if the first iov
exactly satisfied the request (e.g. a length-one read of '\n') and the
second iov is nonzero length, the syscall will block again after
getting the blank line from the terminal until another line is read.
simply put, entering a single blank line becomes impossible.

the solution, fortunately, is simple. whenever the buffer size is
nonzero, reduce the length of the requested read by one byte and let
the last byte go through the buffer. this way, readv will already be
in the second (and last) iov, and won't re-block on the second iov.
2011-04-09 01:17:55 -04:00
Rich Felker
e72180083e add more legacy functions: setlinebuf and setbuffer 2011-04-05 12:25:31 -04:00
Rich Felker
2f3d02cd83 fix overflow in printf %N$ argument handling 2011-04-05 09:24:03 -04:00
Rich Felker
f9569662c0 fix various floating point rounding and formatting errors in *printf 2011-04-05 09:16:40 -04:00
Rich Felker
98c5583ad5 simplify vdprintf implementation greatly based on recent vfprintf changes
since vfprintf will provide a temporary buffer in the case where the
target FILE has a zero buffer size, don't bother setting up a real
buffer for vdprintf. this also allows us to skip the call to fflush
since we know everything will be written out before vfprintf returns.
2011-04-04 16:30:39 -04:00
Rich Felker
bd57e2b43a use a local temp buffer for unbuffered streams in vfprintf
this change makes it so most calls to fprintf(stderr, ...) will result
in a single writev syscall, as opposed to roughly 2*N syscalls (and
possibly more) where N is the number of format specifiers. in
principle we could use a much larger buffer, but it's best not to
increase the stack requirements too much. most messages are under 80
chars.
2011-04-04 16:24:49 -04:00
Rich Felker
8de03e1a90 don't disable seeking after first seek failure
this could cause problems if the application uses dup2(fd,fileno(f))
to redirect, and the old fd was not seekable but the new fd is.
2011-04-02 13:55:54 -04:00
Rich Felker
9a909fcd91 apparently fseek should not set the error flag on failed seek 2011-04-02 13:54:55 -04:00
Rich Felker
8250742b90 fix tempnam name generation, and a small bug in tmpnam on retry limit 2011-03-29 09:00:22 -04:00
Rich Felker
a88edbec15 make tmpfile fail after exceeding max tries. 2011-03-29 08:37:57 -04:00
Rich Felker
507a9fa6ff fix tmpnam to generate better names, not depend on non-ISO-C symbols 2011-03-29 08:34:47 -04:00
Rich Felker
9646e4d024 fix messed-up errno if remove fails for a non-EISDIR reason 2011-03-29 08:25:59 -04:00
Rich Felker
0b240ccf52 learned something new - remove is supposed to support directories on POSIX 2011-03-29 08:24:28 -04:00
Rich Felker
4106cdcd2d revert some more spin optimizations that turned out to be pessimizations 2011-03-28 22:36:55 -04:00
Rich Felker
05b694028e fix getc - the classic error of trying to store EOF+0-255 in a char type.. 2011-03-28 17:31:01 -04:00
Rich Felker
e3cd6c5c26 major stdio overhaul, using readv/writev, plus other changes
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.
2011-03-28 01:14:44 -04:00
Rich Felker
9ae8d5fc71 fix all implicit conversion between signed/unsigned pointers
sadly the C language does not specify any such implicit conversion, so
this is not a matter of just fixing warnings (as gcc treats it) but
actual errors. i would like to revisit a number of these changes and
possibly revise the types used to reduce the number of casts required.
2011-03-25 16:34:03 -04:00
Rich Felker
a37452430f simplify and optimize FILE lock handling 2011-03-24 23:16:52 -04:00
Rich Felker
8ae2fa6563 fix non-atomicity of puts 2011-03-24 22:58:21 -04:00
Rich Felker
aa398f56fa global cleanup to use the new syscall interface 2011-03-20 00:16:43 -04:00
Rich Felker
e18b563821 implement [v]swprintf 2011-03-18 09:19:09 -04:00
Rich Felker
c35bb6645f implement wprintf family of functions
this implementation is extremely ugly and inefficient, but it avoids a
good deal of code duplication and bloat. it may be cleaned up later to
eliminate the remaining code duplication and some of the warts, but i
don't really care about its performance.

note that swprintf is not yet implemented.
2011-03-17 22:55:43 -04:00
Rich Felker
4d9cc0b399 optimize file locking: avoid cache-polluting writes to global storage 2011-03-16 10:39:45 -04:00
Rich Felker
9dd7d7e3f6 partially-written draft of fmemopen, still in #if 0 2011-03-14 11:49:55 -04:00
Rich Felker
5eb0d33ec0 implement flockfile api, rework stdio locking 2011-03-12 21:55:45 -05:00
Rich Felker
a6238c30d1 rewind must clear the error indicator in addition to seeking 2011-02-22 17:11:35 -05:00
Rich Felker
4ee039f354 avoid referencing address of extern function from vdprintf
this change is in preparation for upcoming PIC/shared library support.
the intent is to avoid going through the GOT, mainly so that dprintf
is operable immediately, prior to processing of relocations. having
dprintf accessible from the dynamic linker will make writing and
debugging the dynamic linker much easier.
2011-02-20 22:24:28 -05:00
Rich Felker
3075f7e847 cleanup asprintf stuff 2011-02-20 17:19:37 -05:00
Rich Felker
bdc9ed1565 fix %n specifier, again. this time it was storing the wrong value. 2011-02-20 17:10:40 -05:00
Rich Felker
5cbd76c6b0 fix printf %n specifier - missing breaks had it clobbering memory 2011-02-16 18:19:46 -05:00