# HG changeset patch # User Bruno Haible # Date 1548455184 -3600 # Node ID 06c22cab90980c58e04b8fa440a69ba7b07343c7 # Parent f03dfb30b48c5c644d28ae73449725e041564a26 setlocale: Work around bug on Android 4.3. * m4/setlocale.m4 (gl_FUNC_SETLOCALE): Test whether setlocale supports the "C" locale. * lib/setlocale.c (setlocale_unixlike): New wrapper for Android. * doc/posix-functions/setlocale.texi: Mention the Android bug. diff -r f03dfb30b48c -r 06c22cab9098 ChangeLog --- a/ChangeLog Fri Jan 25 03:54:09 2019 +0100 +++ b/ChangeLog Fri Jan 25 23:26:24 2019 +0100 @@ -1,3 +1,11 @@ +2019-01-25 Bruno Haible + + setlocale: Work around bug on Android 4.3. + * m4/setlocale.m4 (gl_FUNC_SETLOCALE): Test whether setlocale supports + the "C" locale. + * lib/setlocale.c (setlocale_unixlike): New wrapper for Android. + * doc/posix-functions/setlocale.texi: Mention the Android bug. + 2019-01-24 Bruno Haible memchr: Work around bug on Android <= 5.0. diff -r f03dfb30b48c -r 06c22cab9098 doc/posix-functions/setlocale.texi --- a/doc/posix-functions/setlocale.texi Fri Jan 25 03:54:09 2019 +0100 +++ b/doc/posix-functions/setlocale.texi Fri Jan 25 23:26:24 2019 +0100 @@ -20,6 +20,10 @@ On Windows platforms (excluding Cygwin), @code{setlocale} understands different locale names, that are not based on ISO 639 language names and ISO 3166 country names. +@item +On Android 4.3, which which doesn't have locales, the @code{setlocale} function +always fails. The replacement, however, supports only the locale names +@code{"C"} and @code{"POSIX"}. @end itemize Portability problems not fixed by Gnulib: diff -r f03dfb30b48c -r 06c22cab9098 lib/setlocale.c --- a/lib/setlocale.c Fri Jan 25 03:54:09 2019 +0100 +++ b/lib/setlocale.c Fri Jan 25 23:26:24 2019 +0100 @@ -794,6 +794,39 @@ return NULL; } +# elif defined __ANDROID__ + +/* Like setlocale, but accept also the locale names "C" and "POSIX". */ +static char * +setlocale_unixlike (int category, const char *locale) +{ + char *result = setlocale (category, locale); + if (result == NULL) + switch (category) + { + case LC_CTYPE: + case LC_NUMERIC: + case LC_TIME: + case LC_COLLATE: + case LC_MONETARY: + case LC_MESSAGES: + case LC_ALL: + case LC_PAPER: + case LC_NAME: + case LC_ADDRESS: + case LC_TELEPHONE: + case LC_MEASUREMENT: + if (locale == NULL + || strcmp (locale, "C") == 0 || strcmp (locale, "POSIX") == 0) + result = (char *) "C"; + break; + default: + break; + } + return result; +} +# define setlocale setlocale_unixlike + # else # define setlocale_unixlike setlocale # endif diff -r f03dfb30b48c -r 06c22cab9098 m4/setlocale.m4 --- a/m4/setlocale.m4 Fri Jan 25 03:54:09 2019 +0100 +++ b/m4/setlocale.m4 Fri Jan 25 23:26:24 2019 +0100 @@ -1,4 +1,4 @@ -# setlocale.m4 serial 5 +# setlocale.m4 serial 6 dnl Copyright (C) 2011-2019 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -19,6 +19,32 @@ 1.5.*) REPLACE_SETLOCALE=1 ;; esac ;; + dnl On Android 4.3, setlocale(category,"C") always fails. + *) + AC_CACHE_CHECK([whether setlocale supports the C locale], + [gl_cv_func_setlocale_works], + [AC_RUN_IFELSE( + [AC_LANG_SOURCE([[ +#include +int main () +{ + return setlocale (LC_ALL, "C") == NULL; +}]])], + [gl_cv_func_setlocale_works=yes], + [gl_cv_func_setlocale_works=no], + [case "$host_os" in + # Guess no on Android. + linux*-android*) gl_cv_func_setlocale_works="guessing no";; + # Guess yes otherwise. + *) gl_cv_func_setlocale_works="guessing yes";; + esac + ]) + ]) + case "$gl_cv_func_setlocale_works" in + *yes) ;; + *) REPLACE_SETLOCALE=1 ;; + esac + ;; esac ])