Locale Build Failure #2

Corinna Vinschen vinschen@redhat.com
Tue Aug 16 18:18:00 GMT 2016


On Aug 16 12:43, Joel Sherrill wrote:
> On 8/16/2016 12:35 PM, Craig Howland wrote:
> > Yes, char *foo() == char *foo(), but const char *__locale_ctype_ptr(void) !=
> > char *__locale_ctype_ptr(void), which can happen if _MB_CAPABLE is not defined.
> > Could this perhaps be it?
> 
> ctype.h has an ifdef for _MB_CAPABLE missing in locale.c. I am trying
> this now. What do you all think?
> 
> diff --git a/newlib/libc/locale/locale.c b/newlib/libc/locale/locale.c
> index 795e163..4de4cce 100644
> --- a/newlib/libc/locale/locale.c
> +++ b/newlib/libc/locale/locale.c
> @@ -992,6 +992,9 @@ _DEFUN_VOID (__locale_ctype_ptr)
>                                  : __ctype_ptr__;
>  }
> +#ifndef _MB_CAPABLE
> +_CONST
> +#endif
>  char *
>  __locale_ctype_ptr_l (struct __locale_t *locale)
>  {

Wrong function, __locale_ctype_ptr_l vs. __locale_ctype_ptr.  But, on
second thought, maybe both functions should always return const char *.
After all we don't want values to be changed via the pointers returned
by these functions.

So what about the following patch instead of the other one?  I checked
that it builds cleanly on Cygwin.

diff --git a/newlib/libc/include/ctype.h b/newlib/libc/include/ctype.h
index d34b8e5..31577d1 100644
--- a/newlib/libc/include/ctype.h
+++ b/newlib/libc/include/ctype.h
@@ -66,10 +66,7 @@ extern int toascii_l (int __c, locale_t __l);
 #define _X	0100
 #define	_B	0200
 
-#ifndef _MB_CAPABLE
-_CONST
-#endif
-char *__locale_ctype_ptr (void);
+const char *__locale_ctype_ptr (void);
 # define __CTYPE_PTR	(__locale_ctype_ptr ())
 
 #ifndef __cplusplus
@@ -103,7 +100,7 @@ char *__locale_ctype_ptr (void);
 #endif
 
 #if __POSIX_VISIBLE >= 200809
-char *__locale_ctype_ptr_l (locale_t);
+const char *__locale_ctype_ptr_l (locale_t);
 #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 795e163..18c7be0 100644
--- a/newlib/libc/locale/locale.c
+++ b/newlib/libc/locale/locale.c
@@ -982,7 +982,7 @@ _DEFUN_VOID (__locale_mb_cur_max)
 #endif
 }
 
-char *
+const char *
 _DEFUN_VOID (__locale_ctype_ptr)
 {
   /* Only check if the current thread/reent has a locale.  ctype_ptr is unused
@@ -992,7 +992,7 @@ _DEFUN_VOID (__locale_ctype_ptr)
 				 : __ctype_ptr__;
 }
 
-char *
+const char *
 __locale_ctype_ptr_l (struct __locale_t *locale)
 {
   extern char *__ctype_ptr__;


Thanks,
Corinna

-- 
Corinna Vinschen
Cygwin Maintainer
Red Hat
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/newlib/attachments/20160816/cb179bdd/attachment.sig>


More information about the Newlib mailing list