about summary refs log tree commit diff
path: root/src
Commit message (Collapse)AuthorAgeFilesLines
* remove redundant (unmaintained) check in floatscanRich Felker2012-04-221-3/+3
| | | | also be extra careful to avoid wrapping the circular buffer early
* add getresuid and getresgid syscall wrappersRich Felker2012-04-222-0/+16
|
* fix major breakage in iconv, bogus rejecting of dest charsetsRich Felker2012-04-211-1/+1
|
* make floatscan correctly set errno for overflow/underflowRich Felker2012-04-211-4/+16
| | | | | | | | | | | care is taken that the setting of errno correctly reflects underflow condition. scanning exact denormal values does not result in ERANGE, nor does scanning values (such as the usual string definition of FLT_MIN) which are actually less than the smallest normal number but which round to a normal result. only the decimal case is handled so far; hex float require a separate fix to come later.
* skip leading zeros even after decimal point in floatscanRich Felker2012-04-211-4/+9
| | | | | | in principle this should just be an optimization, but it happens to also fix a nasty bug where values like 0.00000000001 were getting caught by the early zero detection path and wrongly scanned as zero.
* fix overread (consuming an extra byte) scanning NANRich Felker2012-04-211-1/+1
| | | | bug detected by glib test suite
* fix broken sysconf when correct value is -1Rich Felker2012-04-211-1/+1
| | | | | this caused glib to try to allocate >2gb for getpwnam_r, and probably numerous other problems.
* further fixes to leading space issue (forgot the wide versions)Rich Felker2012-04-192-5/+9
|
* fix really bad breakage in strtol, etc.: failure to accept leading spacesRich Felker2012-04-195-10/+9
|
* legacy junk compatibility grab-bagRich Felker2012-04-182-0/+2
| | | | | | - add the rest of the junk traditionally in sys/param.h - add prototypes for some nonstandard functions - add _GNU_SOURCE to their source files so the compiler can check proto
* fix typo in exponent reading code or floatsRich Felker2012-04-181-1/+1
| | | | | this was basically harmless, but could have resulted in misreading inputs with more than a few gigabytes worth of digits..
* fix wide scanf's handling of input failure on %c, and simplify %[Rich Felker2012-04-171-5/+6
|
* fix failure to distinguish input/match failure in wide %[ scanfRich Felker2012-04-172-2/+4
| | | | | this also includes a related fix for vswscanf's read function, which was returning a spurious (uninitialized) character for empty strings.
* fix over-read in %ls with non-wide scanfRich Felker2012-04-171-0/+1
|
* fix broken %s and %[ with no width specifier in wide scanfRich Felker2012-04-171-3/+7
|
* fix failure to read infinity in scanfRich Felker2012-04-171-3/+4
| | | | | | this code worked in strtod, but not in scanf. more evidence that i should design a better interface for discarding multiple tail characters than just calling unget repeatedly...
* fix failure of int parser to unget an initial mismatching characterRich Felker2012-04-171-0/+1
|
* make wide scanf %[ respect widthRich Felker2012-04-171-2/+3
|
* fix wide scanf to respect field width for stringsRich Felker2012-04-171-4/+7
|
* fix some bugs in scanf %[ handling detected while writing the wide versionRich Felker2012-04-171-4/+4
|
* introduce new wide scanf code and remove the last remnants of old scanfRich Felker2012-04-174-524/+312
| | | | | | | | | at this point, strto* and all scanf family functions are using the new unified integer and floating point parser/converter code. the wide scanf is largely a wrapper for ordinary byte-based scanf; since numbers can only contain ascii characters, only strings need to be handled specially.
* avoid depending on POSIX symbol in code used from plain C functionsRich Felker2012-04-171-1/+3
|
* avoid null pointer dereference on %*p fields in scanfRich Felker2012-04-171-1/+1
|
* also ensure that write buffer is bounded when __stdio_write returnsRich Felker2012-04-171-0/+1
| | | | | assuming other code is correct, this should be a no-op, but better to be safe...
* fix buffer overflow in vfprintf on long writes to unbuffered filesRich Felker2012-04-171-1/+2
| | | | | | | | | | | | | | | | | | vfprintf temporarily swaps in a local buffer (for the duration of the operation) when the target stream is unbuffered; this both simplifies the implementation of functions like dprintf (they don't need their own buffers) and eliminates the pathologically bad performance of writing the formatted output with one or more write syscalls per formatting field. in cases like dprintf where we are dealing with a virgin FILE structure, everything worked correctly. however for long-lived files (like stderr), it's possible that the buffer bounds were already set for the internal zero-size buffer. on the next write, __stdio_write would pick up and use the new buffer provided by vfprintf, but the bound (wend) field was still pointing at the internal zero-size buffer's end. this in turn allowed unbounded writes to the temporary buffer.
* fix %lf, etc. with printfRich Felker2012-04-161-0/+2
| | | | | | the l prefix is redundant/no-op with printf, since default promotions always promote floats to double; however, it is valid, and printf was wrongly rejecting it.
* better description for errno==0Rich Felker2012-04-161-1/+1
|
* implement wcstod and familyRich Felker2012-04-161-0/+61
| | | | not heavily tested but these functions appear to work correctly
* avoid hitting eof in wcstolRich Felker2012-04-161-2/+3
| | | | | | | | | | shunget cannot unget eof status, causing wcstol to leave endptr pointing to the wrong place when scanning, for example, L"0x". cheap fix is to make the read function provide an infinite stream of bogus characters rather than eof. really this is something of a design flaw in how the shgetc system is used for strto* and wcsto*; in the long term, I believe multi-character unget should be scrapped and replaced with a function that can subtract from the f->shcnt counter.
* use the new integer parser (FILE/shgetc based) for strtol, wcstol, etc.Rich Felker2012-04-1614-405/+120
|
* new scanf implementation and corresponding integer parser/converterRich Felker2012-04-166-30/+450
| | | | | | | | | | | | | | | advantages over the old code: - correct results for floating point (old code was bogus) - wide/regular scanf separated so scanf does not pull in wide code - well-defined behavior on integers that overflow dest type - support for %[a-b] ranges with %[ (impl-defined by widely used) - no intermediate conversion of fmt string to wide string - cleaner, easier to share code with strto* functions - better standards conformance for corner cases the old code remains in the source tree, as the wide versions of the scanf-family functions are still using it. it will be removed when no longer needed.
* fix buggy limiter handling in shgetcRich Felker2012-04-161-4/+3
| | | | this is needed for upcoming new scanf
* wordexp must set the we_offs entries of we_wordv to null pointersRich Felker2012-04-161-0/+4
|
* fix crash in wordfree if we_offs is not initialized by the callerRich Felker2012-04-161-0/+2
| | | | | | | I'm not sure if it's legal for wordexp to modify this field, but this is the only easy/straightforward fix, and applications should not care. if it's an issue, i can work out a different (but more complex) solution later.
* fix broken shgetc limiter logic (wasn't working)Rich Felker2012-04-162-2/+5
|
* floatscan: fix incorrect count of leading nonzero digitsRich Felker2012-04-161-1/+1
| | | | | | | this off-by-one error was causing values with just one digit past the decimal point to be treated by the integer case. in many cases it would yield the correct result, but if expressions are evaluated in excess precision, double rounding may occur.
* fix signedness error handling invalid multibyte sequences in regexecRich Felker2012-04-141-2/+2
| | | | | | | the "< 0" test was always false due to use of an unsigned type. this resulted in infinite loops on 32-bit machines (adding -1U to a pointer is the same as adding -1) and crashes on 64-bit machines (offsetting the string pointer by 4gb-1b when an illegal sequence was hit).
* remove invalid code from TRERich Felker2012-04-131-14/+0
| | | | | | | | | | | TRE wants to treat + and ? after a +, ?, or * as special; ? means ungreedy and + is reserved for future use. however, this is non-conformant. although redundant, these redundant characters have well-defined (no-op) meaning for POSIX ERE, and are actually _literal_ characters (which TRE is wrongly ignoring) in POSIX BRE mode. the simplest fix is to simply remove the unneeded nonstandard functionality. as a plus, this shaves off a small amount of bloat.
* fix broken regerror (typo) and missing messageRich Felker2012-04-131-2/+2
|
* use fast version of the int reading code for the high-order digits tooRich Felker2012-04-131-3/+13
| | | | | this increases code size slightly, but it's considerably faster, especially for power-of-2 bases.
* use macros instead of inline functions in shgetc.hRich Felker2012-04-131-20/+4
| | | | | | at -Os optimization level, gcc refuses to inline these functions even though the inlined code would roughly the same size as the function call, and much faster. the easy solution is to make them into macros.
* fix spurious overflows in strtoull with small basesRich Felker2012-04-131-7/+3
| | | | | | | whenever the base was small enough that more than one digit could still fit after UINTMAX_MAX/36-1 was reached, only the first would be allowed; subsequent digits would trigger spurious overflow, making it impossible to read the largest values in low bases.
* remove magic numbers from floatscanRich Felker2012-04-121-5/+5
|
* optimize more integer cases in floatscan; comment the whole procedureRich Felker2012-04-121-8/+27
|
* revert invalid optimization in floatscanRich Felker2012-04-111-2/+2
|
* fix stupid typo in floatscan that caused excess rounding of some valuesRich Felker2012-04-111-1/+1
|
* Merge remote branch 'nsz/master'Rich Felker2012-04-112-5/+6
|\
| * math: fix x86 asin accuracynsz2012-04-042-5/+6
| | | | | | | | | | use (1-x)*(1+x) instead of (1-x*x) in asin.s the later can be inaccurate with upward rounding when x is close to 1
* | optimize floatscan downscaler to skip results that won't be neededRich Felker2012-04-111-2/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | when upscaling, even the very last digit is needed in cases where the input is exact; no digits can be discarded. but when downscaling, any digits less significant than the mantissa bits are destined for the great bitbucket; the only influence they can have is their presence (being nonzero). thus, we simply throw them away early. the result is nearly a 4x performance improvement for processing huge values. the particular threshold LD_B1B_DIG+3 is not chosen sharply; it's simply a "safe" distance past the significant bits. it would be nice to replace it with a sharp bound, but i suspect performance will be comparable (within a few percent) anyway.
* | simplify/debloat radix point alignment code in floatscanRich Felker2012-04-111-9/+4
| | | | | | | | | | | | | | | | | | | | | | | | now that this is the first operation, it can rely on the circular buffer contents not being wrapped when it begins. we limit the number of digits read slightly in the initial parsing loops too so that this code does not have to consider the case where it might cause the circular buffer to wrap; this is perfectly fine because KMAX is chosen as a power of two for circular-buffer purposes and is much larger than it otherwise needs to be, anyway. these changes should not affect performance at all.