PATCH: Fix wcstold and wcstold_l
H. J. Lu
hjl@lucon.org
Wed Mar 10 21:44:00 GMT 2004
This patch tries to fix:
http://sources.redhat.com/bugzilla/show_bug.cgi?id=66
wcstold.c and wcstold_l.c should just include strtold.c/strtold_l.c
instead of doing things on their own.
H.J.
-------------- next part --------------
2004-03-10 H.J. Lu <hongjiu.lu@intel.com>
* include/wchar.h (____wcstoull_l_internal): New.
* stdlib/strtold_l.c: Simplified.
* wcsmbs/wcstold.c: Likewise.
* wcsmbs/wcstold_l.c: Likewise.
* sysdeps/generic/strtold.c: Support wcstold and __wcstold_l.
* sysdeps/ieee754/ldbl-128/strtold.c: Likewise.
* sysdeps/ieee754/ldbl-96/strtold.c: Likewise.
--- libc/include/wchar.h.128 2003-11-19 10:52:45.000000000 -0800
+++ libc/include/wchar.h 2004-03-10 13:14:39.000000000 -0800
@@ -114,6 +114,10 @@ extern int __vfwprintf (__FILE *__restri
extern size_t __mbsrtowcs_l (wchar_t *dst, const char **src, size_t len,
mbstate_t *ps, __locale_t l) attribute_hidden;
+extern unsigned long long int ____wcstoull_l_internal (const wchar_t *,
+ wchar_t **, int, int,
+ __locale_t);
+
/* Special version. We know that all uses of mbsinit inside the libc
have a non-NULL parameter. And certainly we can access the
internals of the data structure directly. */
--- libc/stdlib/strtold_l.c.128 2002-08-06 01:39:58.000000000 -0700
+++ libc/stdlib/strtold_l.c 2004-03-10 10:41:48.000000000 -0800
@@ -1,5 +1,5 @@
/* Convert string representing a number to float value, using given locale.
- Copyright (C) 1997,98,99,2002 Free Software Foundation, Inc.
+ Copyright (C) 1997,98,99,2002,2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@@ -18,36 +18,14 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
-#include <math.h>
-#include <xlocale.h>
-
-#ifndef __NO_LONG_DOUBLE_MATH
-
#define USE_IN_EXTENDED_LOCALE_MODEL 1
-extern long double ____strtold_l_internal (const char *, char **, int,
- __locale_t);
-extern unsigned long long int ____strtoull_l_internal (const char *, char **,
- int, int, __locale_t);
-
-# include <strtold.c>
+#include <strtold.c>
+#ifdef USE_WIDE_CHAR
+# define STRTOF_L wcstold_l
#else
-/* There is no `long double' type, use the `double' implementations. */
-extern double ____strtod_l_internal (const char *, char **, int,
- __locale_t);
-long double
-____strtold_l_internal (const char *nptr, char **endptr, int group,
- __locale_t loc)
-{
- return ____strtod_l_internal (nptr, endptr, group, loc);
-}
-
-long double
-__strtold_l (const char *nptr, char **endptr, __locale_t loc)
-{
- return ____strtod_l_internal (nptr, endptr, 0, loc);
-}
+# define STRTOF_L strtold_l
#endif
-weak_alias (__strtold_l, strtold_l)
+weak_alias (STRTOF, STRTOF_L)
--- libc/sysdeps/generic/strtold.c.128 2002-08-13 10:16:45.000000000 -0700
+++ libc/sysdeps/generic/strtold.c 2004-03-10 10:41:55.000000000 -0800
@@ -1,4 +1,4 @@
-/* Copyright (C) 1999, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1999, 2002, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -18,17 +18,48 @@
#include <math.h>
#include <stdlib.h>
+#ifdef USE_WIDE_CHAR
+# define STRING_TYPE wchar_t
+# include <wchar.h>
+#else
+# define STRING_TYPE char
+#endif
+
+#ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# include <xlocale.h>
+# define LOCALE_PARAM , loc
+# define LOCALE_PARAM_DECL , __locale_t loc
+# ifdef USE_WIDE_CHAR
+# define STRTOF __wcstold_l
+# define STRTOD __wcstod_l
+# else
+# define STRTOF __strtold_l
+# define STRTOD __strtod_l
+# endif
+#else
+# define LOCALE_PARAM
+# define LOCALE_PARAM_DECL
+# ifdef USE_WIDE_CHAR
+# define STRTOF wcstold
+# define STRTOD wcstod
+# else
+# define STRTOF strtold
+# define STRTOD strtod
+# endif
+#endif
/* There is no `long double' type, use the `double' implementations. */
long double
-__strtold_internal (const char *nptr, char **endptr, int group)
+INTERNAL (STRTOF) (const STRING_TYPE *nptr, STRING_TYPE **endptr,
+ int group LOCALE_PARAM_DECL)
{
- return __strtod_internal (nptr, endptr, group);
+ return INTERNAL (STRTOD) (nptr, endptr, group LOCALE_PARAM);
}
-libc_hidden_def (__strtold_internal)
+libc_hidden_def (INTERNAL (STRTOF))
long double
-strtold (const char *nptr, char **endptr)
+STRTOF (const STRING_TYPE *nptr, STRING_TYPE **endptr
+ LOCALE_PARAM_DECL)
{
- return __strtod_internal (nptr, endptr, 0);
+ return INTERNAL (STRTOD) (nptr, endptr, 0 LOCALE_PARAM);
}
--- libc/sysdeps/ieee754/ldbl-128/strtold.c.128 2001-07-05 21:55:55.000000000 -0700
+++ libc/sysdeps/ieee754/ldbl-128/strtold.c 2004-03-10 12:46:35.000000000 -0800
@@ -18,15 +18,31 @@
#include <math.h>
+#ifdef USE_WIDE_CHAR
+# define STRING_TYPE wchar_t
+# include <wchar.h>
+#else
+# define STRING_TYPE char
+#endif
+
/* The actual implementation for all floating point sizes is in strtod.c.
These macros tell it to produce the `long double' version, `strtold'. */
# define FLOAT long double
# define FLT LDBL
# ifdef USE_IN_EXTENDED_LOCALE_MODEL
-# define STRTOF __strtold_l
+# include <xlocale.h>
+# ifdef USE_WIDE_CHAR
+# define STRTOF __wcstold_l
+# else
+# define STRTOF __strtold_l
+# endif
# else
-# define STRTOF strtold
+# ifdef USE_WIDE_CHAR
+# define STRTOF wcstold
+# else
+# define STRTOF strtold
+# endif
# endif
# define MPN2FLOAT __mpn_construct_long_double
# define FLOAT_HUGE_VAL HUGE_VALL
--- libc/sysdeps/ieee754/ldbl-96/strtold.c.128 2001-07-05 21:55:55.000000000 -0700
+++ libc/sysdeps/ieee754/ldbl-96/strtold.c 2004-03-10 12:45:01.000000000 -0800
@@ -18,15 +18,31 @@
#include <math.h>
+#ifdef USE_WIDE_CHAR
+# define STRING_TYPE wchar_t
+# include <wchar.h>
+#else
+# define STRING_TYPE char
+#endif
+
/* The actual implementation for all floating point sizes is in strtod.c.
These macros tell it to produce the `long double' version, `strtold'. */
# define FLOAT long double
# define FLT LDBL
# ifdef USE_IN_EXTENDED_LOCALE_MODEL
-# define STRTOF __strtold_l
+# include <xlocale.h>
+# ifdef USE_WIDE_CHAR
+# define STRTOF __wcstold_l
+# else
+# define STRTOF __strtold_l
+# endif
# else
-# define STRTOF strtold
+# ifdef USE_WIDE_CHAR
+# define STRTOF wcstold
+# else
+# define STRTOF strtold
+# endif
# endif
# define MPN2FLOAT __mpn_construct_long_double
# define FLOAT_HUGE_VAL HUGE_VALL
--- libc/wcsmbs/wcstold.c.128 2002-08-13 10:16:45.000000000 -0700
+++ libc/wcsmbs/wcstold.c 2004-03-10 10:36:19.000000000 -0800
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1998, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
@@ -17,46 +17,5 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
-#include <math.h>
-#include <wchar.h>
-
-#ifndef __NO_LONG_DOUBLE_MATH
-/* The actual implementation for all floating point sizes is in strtod.c.
- These macros tell it to produce the `long double' version, `wcstold'. */
-
-# define FLOAT long double
-# define FLT LDBL
-# ifdef USE_IN_EXTENDED_LOCALE_MODEL
-# define STRTOF __wcstold_l
-# else
-# define STRTOF wcstold
-# endif
-# define MPN2FLOAT __mpn_construct_long_double
-# define FLOAT_HUGE_VAL HUGE_VALL
-# define USE_WIDE_CHAR 1
-# define SET_MANTISSA(flt, mant) \
- do { union ieee854_long_double u; \
- u.d = (flt); \
- if ((mant & 0x7fffffffffffffffULL) == 0) \
- mant = 0x4000000000000000ULL; \
- u.ieee.mantissa0 = (((mant) >> 32) & 0x7fffffff) | 0x80000000; \
- u.ieee.mantissa1 = (mant) & 0xffffffff; \
- (flt) = u.d; \
- } while (0)
-
-# include <stdlib/strtod.c>
-#else
-/* There is no `long double' type, use the `double' implementations. */
-long double
-__wcstold_internal (const wchar_t *nptr, wchar_t **endptr, int group)
-{
- return __wcstod_internal (nptr, endptr, group);
-}
-libc_hidden_def (__wcstold_internal)
-
-long double
-wcstold (const wchar_t *nptr, wchar_t **endptr)
-{
- return __wcstod_internal (nptr, endptr, 0);
-}
-#endif
+#define USE_WIDE_CHAR 1
+#include <strtold.c>
--- libc/wcsmbs/wcstold_l.c.128 2002-08-06 01:39:59.000000000 -0700
+++ libc/wcsmbs/wcstold_l.c 2004-03-10 10:40:00.000000000 -0800
@@ -1,5 +1,5 @@
/* Convert string representing a number to integer value, using given locale.
- Copyright (C) 1997,98,99,2002 Free Software Foundation, Inc.
+ Copyright (C) 1997,98,99,2002,2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@@ -18,39 +18,5 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
-#define __need_wchar_t
-#include <math.h>
-#include <stddef.h>
-#include <locale.h>
-#include <wchar.h>
-
-#define USE_IN_EXTENDED_LOCALE_MODEL 1
-
-#ifndef __NO_LONG_DOUBLE_MATH
-
-extern long double ____wcstold_l_internal (const wchar_t *, wchar_t **, int,
- __locale_t);
-extern unsigned long long int ____wcstoull_l_internal (const wchar_t *,
- wchar_t **, int, int,
- __locale_t);
-
-# include <wcstold.c>
-#else
-/* There is no `long double' type, use the `double' implementations. */
-extern double ____wcstod_l_internal (const wchar_t *, wchar_t **, int,
- __locale_t);
-long double
-____wcstold_l_internal (const wchar_t *nptr, wchar_t **endptr, int group,
- __locale_t loc)
-{
- return ____wcstod_l_internal (nptr, endptr, group, loc);
-}
-
-long double
-__wcstold_l (const wchar_t *nptr, wchar_t **endptr, __locale_t loc)
-{
- return ____wcstod_l_internal (nptr, endptr, 0, loc);
-}
-#endif
-
-weak_alias (__wcstold_l, wcstold_l)
+#define USE_WIDE_CHAR 1
+#include <strtold_l.c>
More information about the Libc-alpha
mailing list