diff options
Diffstat (limited to 'stdlib')
-rw-r--r-- | stdlib/Makefile | 4 | ||||
-rw-r--r-- | stdlib/strtod_l.c | 23 | ||||
-rw-r--r-- | stdlib/tens_in_limb.c | 31 | ||||
-rw-r--r-- | stdlib/tst-strtod6.c | 53 |
4 files changed, 91 insertions, 20 deletions
diff --git a/stdlib/Makefile b/stdlib/Makefile index 736c562374..1fe7f70177 100644 --- a/stdlib/Makefile +++ b/stdlib/Makefile @@ -52,7 +52,7 @@ routines := \ rpmatch strfmon strfmon_l getsubopt xpg_basename fmtmsg \ strtoimax strtoumax wcstoimax wcstoumax \ getcontext setcontext makecontext swapcontext -aux = grouping groupingwc +aux = grouping groupingwc tens_in_limb # These routines will be omitted from the libc shared object. # Instead the static object files will be included in a special archive @@ -69,7 +69,7 @@ tests := tst-strtol tst-strtod testmb testrand testsort testdiv \ test-a64l tst-qsort tst-system testmb2 bug-strtod2 \ tst-atof1 tst-atof2 tst-strtod2 tst-strtod3 tst-rand48-2 \ tst-makecontext tst-strtod4 tst-strtod5 tst-qsort2 \ - tst-makecontext2 + tst-makecontext2 tst-strtod6 include ../Makeconfig diff --git a/stdlib/strtod_l.c b/stdlib/strtod_l.c index 86b408e1fe..9c2f86a32b 100644 --- a/stdlib/strtod_l.c +++ b/stdlib/strtod_l.c @@ -1,5 +1,5 @@ /* Convert string representing a number to float value, using given locale. - Copyright (C) 1997,1998,2002,2004,2005,2006,2007 + Copyright (C) 1997,1998,2002,2004,2005,2006,2007,2008 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -148,23 +148,7 @@ extern FLOAT MPN2FLOAT (mp_srcptr mpn, int exponent, int negative); # error "mp_limb_t size " BITS_PER_MP_LIMB "not accounted for" #endif - -/* Local data structure. */ -static const mp_limb_t _tens_in_limb[MAX_DIG_PER_LIMB + 1] = -{ 0, 10, 100, - 1000, 10000, 100000L, - 1000000L, 10000000L, 100000000L, - 1000000000L -#if BITS_PER_MP_LIMB > 32 - , 10000000000ULL, 100000000000ULL, - 1000000000000ULL, 10000000000000ULL, 100000000000000ULL, - 1000000000000000ULL, 10000000000000000ULL, 100000000000000000ULL, - 1000000000000000000ULL, 10000000000000000000ULL -#endif -#if BITS_PER_MP_LIMB > 64 - #error "Need to expand tens_in_limb table to" MAX_DIG_PER_LIMB -#endif -}; +extern const mp_limb_t _tens_in_limb[MAX_DIG_PER_LIMB + 1]; #ifndef howmany #define howmany(x,y) (((x)+((y)-1))/(y)) @@ -610,6 +594,9 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) mant = STRTOULL (startp + 1, &endp, 0); if (endp == cp) SET_MANTISSA (retval, mant); + + /* Consume the closing brace. */ + ++cp; } } diff --git a/stdlib/tens_in_limb.c b/stdlib/tens_in_limb.c new file mode 100644 index 0000000000..b6e35aa35a --- /dev/null +++ b/stdlib/tens_in_limb.c @@ -0,0 +1,31 @@ +#include <gmp.h> + + +/* Definitions according to limb size used. */ +#if BITS_PER_MP_LIMB == 32 +# define MAX_DIG_PER_LIMB 9 +# define MAX_FAC_PER_LIMB 1000000000UL +#elif BITS_PER_MP_LIMB == 64 +# define MAX_DIG_PER_LIMB 19 +# define MAX_FAC_PER_LIMB 10000000000000000000ULL +#else +# error "mp_limb_t size " BITS_PER_MP_LIMB "not accounted for" +#endif + + +/* Local data structure. */ +const mp_limb_t _tens_in_limb[MAX_DIG_PER_LIMB + 1] = +{ 0, 10, 100, + 1000, 10000, 100000L, + 1000000L, 10000000L, 100000000L, + 1000000000L +#if BITS_PER_MP_LIMB > 32 + , 10000000000ULL, 100000000000ULL, + 1000000000000ULL, 10000000000000ULL, 100000000000000ULL, + 1000000000000000ULL, 10000000000000000ULL, 100000000000000000ULL, + 1000000000000000000ULL, 10000000000000000000ULL +#endif +#if BITS_PER_MP_LIMB > 64 + #error "Need to expand tens_in_limb table to" MAX_DIG_PER_LIMB +#endif +}; diff --git a/stdlib/tst-strtod6.c b/stdlib/tst-strtod6.c new file mode 100644 index 0000000000..fdb104f9ca --- /dev/null +++ b/stdlib/tst-strtod6.c @@ -0,0 +1,53 @@ +#include <math.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +static int +do_test (void) +{ + static const char str[] = "NaN(blabla)something"; + char *endp; + int result = 0; + + double d = strtod (str, &endp); + if (!isnan (d)) + { + puts ("strtod did not return NAN"); + result = 1; + } + if (strcmp (endp, "something") != 0) + { + puts ("strtod set incorrect end pointer"); + result = 1; + } + + float f = strtof (str, &endp); + if (!isnanf (f)) + { + puts ("strtof did not return NAN"); + result = 1; + } + if (strcmp (endp, "something") != 0) + { + puts ("strtof set incorrect end pointer"); + result = 1; + } + + long double ld = strtold (str, &endp); + if (!isnan (ld)) + { + puts ("strtold did not return NAN"); + result = 1; + } + if (strcmp (endp, "something") != 0) + { + puts ("strtold set incorrect end pointer"); + result = 1; + } + + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" |