[PATCH] Use !__HAVE_LOCALE_INFO__ define to use _ctype_ directly [v2]

Keith Packard <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
When __HAVE_LOCALE_INFO__ is not selected, directly access the
existing _ctype_ variable from __locale_ctype_ptr() and
__locale_ctype_ptr_l(), eliminating the need for any locale or reent
structure

Signed-off-by: Keith Packard <[email protected]>

v2:
	locale: fix conflict with __locale_ctype_ptr macro

	If we are building without __HAVE_LOCALE_INFO__, there is a
	macro providing __locale_ctype_ptr which in turn fouls up this
	declaration.

	Signed-off-by: Michael Lyle <[email protected]>
---

This is one of a set of patches designed to reduce the number of
functions which need reent and a locale structures in smaller
configurations. In this case, I want to make the ctype macros directly
access the existing _ctype_ global array instead of jumping through a
function to get a locale structure out of a reent structure.

However, I'm not sure __HAVE_LOCALE_INFO__ is the right flag to use
for this. If another existing configure flag is appropriate, I'd like
to know. Or perhaps I just need a new flag?

 newlib/libc/include/ctype.h    | 9 +++++++++
 newlib/libc/locale/locale.c    | 2 ++
 newlib/libc/locale/setlocale.h | 8 ++++++++
 3 files changed, 19 insertions(+)

diff --git a/newlib/libc/include/ctype.h b/newlib/libc/include/ctype.h
index f74b3499b..1cee6953b 100644
--- a/newlib/libc/include/ctype.h
+++ b/newlib/libc/include/ctype.h
@@ -66,7 +66,12 @@ extern int toascii_l (int __c, locale_t __l);
 #define _X	0100
 #define	_B	0200
 
+#ifdef __HAVE_LOCALE_INFO__
 const char *__locale_ctype_ptr (void);
+#else
+#define __locale_ctype_ptr()	_ctype_
+#endif
+
 # define __CTYPE_PTR	(__locale_ctype_ptr ())
 
 #ifndef __cplusplus
@@ -100,7 +105,11 @@ const char *__locale_ctype_ptr (void);
 #endif
 
 #if __POSIX_VISIBLE >= 200809
+#ifdef __HAVE_LOCALE_INFO__
 const char *__locale_ctype_ptr_l (locale_t);
+#else
+#define __locale_ctype_ptr_l(l)	_ctype_
+#endif
 #define __ctype_lookup_l(__c,__l) ((__locale_ctype_ptr_l(__l)+sizeof(""[__c]))[(int)(__c)])
 
 #define	isalpha_l(__c,__l)	(__ctype_lookup_l(__c,__l)&(_U|_L))
diff --git a/newlib/libc/locale/locale.c b/newlib/libc/locale/locale.c
index 557982d6e..791a77517 100644
--- a/newlib/libc/locale/locale.c
+++ b/newlib/libc/locale/locale.c
@@ -981,6 +981,7 @@ __locale_mb_cur_max (void)
 #endif
 }
 
+#ifdef __HAVE_LOCALE_INFO__
 const char *
 __locale_ctype_ptr_l (struct __locale_t *locale)
 {
@@ -992,6 +993,7 @@ __locale_ctype_ptr (void)
 {
   return __get_current_locale ()->ctype_ptr;
 }
+#endif /* __HAVE_LOCALE_INFO__ */
 
 #ifndef _REENT_ONLY
 
diff --git a/newlib/libc/locale/setlocale.h b/newlib/libc/locale/setlocale.h
index 85a38d586..25c27cfac 100644
--- a/newlib/libc/locale/setlocale.h
+++ b/newlib/libc/locale/setlocale.h
@@ -217,7 +217,11 @@ __get_global_locale ()
 _ELIDABLE_INLINE struct __locale_t *
 __get_locale_r (struct _reent *r)
 {
+#ifdef __HAVE_LOCALE_INFO__
   return r->_locale;
+#else
+  return __get_global_locale();
+#endif
 }
 
 /* In POSIX terms the current locale is the locale used by all functions
@@ -227,7 +231,11 @@ __get_locale_r (struct _reent *r)
 _ELIDABLE_INLINE struct __locale_t *
 __get_current_locale (void)
 {
+#ifdef __HAVE_LOCALE_INFO__
   return _REENT->_locale ?: __get_global_locale ();
+#else
+  return __get_global_locale();
+#endif
 }
 
 /* Only access fixed "C" locale using this function.  Fake for !_MB_CAPABLE
-- 
2.19.0.rc2
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.