summaryrefslogtreecommitdiff
path: root/stdlib
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2008-03-14 17:22:27 +0000
committerJakub Jelinek <jakub@redhat.com>2008-03-14 17:22:27 +0000
commitb87b7fc3e6e41cf8006fb2341c236a46f6d8bdd4 (patch)
tree8b042dd05d766dd46dfa953aec240207eae14208 /stdlib
parent5c25449dd9fd706f79ee6d92019f28044d9270fa (diff)
Updated to fedora-glibc-20080310T1651
Diffstat (limited to 'stdlib')
-rw-r--r--stdlib/Makefile4
-rw-r--r--stdlib/strtod_l.c23
-rw-r--r--stdlib/tens_in_limb.c31
-rw-r--r--stdlib/tst-strtod6.c53
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"