aboutsummaryrefslogtreecommitdiff
path: root/stdlib
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib')
-rw-r--r--stdlib/stdlib.h1
-rw-r--r--stdlib/strtod.c5
-rw-r--r--stdlib/strtof.c2
-rw-r--r--stdlib/strtold.c4
4 files changed, 10 insertions, 2 deletions
diff --git a/stdlib/stdlib.h b/stdlib/stdlib.h
index 6fad54e..cc86d38 100644
--- a/stdlib/stdlib.h
+++ b/stdlib/stdlib.h
@@ -437,6 +437,7 @@ extern void unsetenv __P ((__const char *__name));
/* The `clearenv' was planned to be added to POSIX.1 but probably
never made it. Nevertheless the POSIX.9 standard (POSIX bindings
for Fortran 77) requires this function. */
+extern int __clearenv __P ((void));
extern int clearenv __P ((void));
#endif
diff --git a/stdlib/strtod.c b/stdlib/strtod.c
index 760ecd2..e0c9b08 100644
--- a/stdlib/strtod.c
+++ b/stdlib/strtod.c
@@ -34,6 +34,8 @@
# define SET_MANTISSA(flt, mant) \
do { union ieee754_double u; \
u.d = (flt); \
+ if ((mant & 0xfffffffffffffULL) == 0) \
+ mant = 0x8000000000000ULL; \
u.ieee.mantissa0 = ((mant) >> 32) & 0xfffff; \
u.ieee.mantissa1 = (mant) & 0xffffffff; \
} while (0)
@@ -627,7 +629,8 @@ INTERNAL (STRTOF) (nptr, endptr, group)
expp = cp;
/* Read exponent. */
- if (TOLOWER (c) == (base == 16 ? L_('p') : L_('e')))
+ if ((base == 16 && TOLOWER (c) == L_('p'))
+ || (base != 16 && TOLOWER (c) == L_('e')))
{
int exp_negative = 0;
diff --git a/stdlib/strtof.c b/stdlib/strtof.c
index 0a0046d..026b5ee 100644
--- a/stdlib/strtof.c
+++ b/stdlib/strtof.c
@@ -9,6 +9,8 @@
#define SET_MANTISSA(flt, mant) \
do { union ieee754_float u; \
u.f = (flt); \
+ if ((mant & 0x7fffff) == 0) \
+ mant = 0x400000; \
u.ieee.mantissa = (mant) & 0x7fffff; \
(flt) = u.f; \
} while (0)
diff --git a/stdlib/strtold.c b/stdlib/strtold.c
index 1dc0ac3..9747232 100644
--- a/stdlib/strtold.c
+++ b/stdlib/strtold.c
@@ -9,7 +9,9 @@
#define SET_MANTISSA(flt, mant) \
do { union ieee854_long_double u; \
u.d = (flt); \
- u.ieee.mantissa0 = ((mant) >> 32) & 0x7fffffff; \
+ if ((mant & 0x7fffffffffffffffULL) == 0) \
+ mant = 0x4000000000000000ULL; \
+ u.ieee.mantissa0 = (((mant) >> 32) & 0x7fffffff) | 0x80000000; \
u.ieee.mantissa1 = (mant) & 0xffffffff; \
(flt) = u.d; \
} while (0)