Re: Should libc/locale/lnumeric.c be in GENERAL_SOURCES (EL/IX level 1)?

Corinna Vinschen <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
On Aug 19 17:26, Roger Sayle wrote:
>  
> 
> I believe that newlib/libc/locale/Makefile.am should place lnumeric.c
> 
> in GENERAL_SOURCES [EL/IX level 1].  The motivation for doing this is
> 
> that both stdlib/strtod.c and stdlib/gdtoa-gethex.c unconditionally
> 
> call __get_numeric_locale, and they themselves are in GENERAL_SOURCES
> 
> (i.e. EL/IX level 1).

Hmm, I wonder if we shouldn't rather fix this in strtod.c and
gdtoa-gethex.c.  If the target doesn't define __HAVE_LOCALE_INFO__,
there's not much of a point to call __get_numeric_locale(loc).
Rather, decimal_point could just be set to the dot, i.e.

diff --git a/newlib/libc/stdlib/gdtoa-gethex.c b/newlib/libc/stdlib/gdtoa-gethex.c
index 1d3da2889ea1..74f30e69013d 100644
--- a/newlib/libc/stdlib/gdtoa-gethex.c
+++ b/newlib/libc/stdlib/gdtoa-gethex.c
@@ -149,10 +149,16 @@ gethex (struct _reent *ptr, const char **sp, const FPI *fpi,
 	int esign, havedig, irv, k, n, nbits, up, zret;
 	__ULong L, lostbits, *x;
 	Long e, e1;
-	const unsigned char *decimalpoint = (unsigned char *)
+#ifdef __HAVE_LOCALE_INFO__
+	const unsigned char *decimalpoint = (const unsigned char *)
 				      __get_numeric_locale(loc)->decimal_point;
-	size_t decp_len = strlen ((const char *) decimalpoint);
-	unsigned char decp_end = decimalpoint[decp_len - 1];
+	const size_t decp_len = strlen ((const char *) decimalpoint);
+	const unsigned char decp_end = decimalpoint[decp_len - 1];
+#else
+	const unsigned char *decimalpoint = (const unsigned char *) ".";
+	const size_t decp_len = 1;
+	const unsigned char decp_end = (unsigned char) '.';
+#endif
 
 	havedig = 0;
 	s0 = *(const unsigned char **)sp + 2;
diff --git a/newlib/libc/stdlib/strtod.c b/newlib/libc/stdlib/strtod.c
index 019416ca7026..ca6d79040224 100644
--- a/newlib/libc/stdlib/strtod.c
+++ b/newlib/libc/stdlib/strtod.c
@@ -263,7 +263,11 @@ _strtod_l (struct _reent *ptr, const char *__restrict s00, char **__restrict se,
 #ifdef Honor_FLT_ROUNDS
 	int rounding;
 #endif
+#ifdef __HAVE_LOCALE_INFO__
 	const char *decimal_point = __get_numeric_locale(loc)->decimal_point;
+#else
+	const char *decimal_point = ".";
+#endif
 	int dec_len = strlen (decimal_point);
 
 	delta = bs = bd = NULL;

This would also avoid to pull in a readonly struct which is never used.


Thoughts?


Corinna
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.