diff --git a/ChangeLog b/ChangeLog index 9d9cf3b54f..10cb7876f9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2008-03-07 Ulrich Drepper + * stdlib/Makefile (aux): Add tens_in_limb. + * stdlib/strtod_l.c: Move _tens_in_limb definition to... + * stdlib/tens_in_limb.c: ...here. New file. + [BZ #5778] * sysdeps/unix/sysv/linux/pathconf.h: Declare __statfs_chown_restricted. diff --git a/stdlib/Makefile b/stdlib/Makefile index 736c562374..63917812d0 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 diff --git a/stdlib/strtod_l.c b/stdlib/strtod_l.c index 86b408e1fe..d1c2b62852 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 , 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)) 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 + + +/* 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 +};