diff options
author | Dan Albert <danalbert@google.com> | 2017-07-13 08:34:57 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2017-07-13 08:34:57 +0000 |
commit | 2d585e0070f33ec86a5d5decf9642ee9f2501324 (patch) | |
tree | c4a95ed3dde95f48b6141cc0c015ba1d8818f31c /libc/bionic | |
parent | ada33eb9b4ec9e9fe2a37c8dbe1aa68348aa66b1 (diff) | |
parent | 1a8b7f2d1ca7c605e8e0e6a707a8c4bc9839dcda (diff) | |
download | bionic-2d585e0070f33ec86a5d5decf9642ee9f2501324.tar.gz |
Merge changes from topic 'locale-android-support'
* changes:
Add a non-TLS slot implementation of locale.cpp.
Move non-locale.h APIs out of locale.cpp.
Diffstat (limited to 'libc/bionic')
-rw-r--r-- | libc/bionic/locale.cpp | 81 | ||||
-rw-r--r-- | libc/bionic/stdlib_l.cpp | 59 | ||||
-rw-r--r-- | libc/bionic/string_l.cpp | 42 | ||||
-rw-r--r-- | libc/bionic/strings_l.cpp | 38 | ||||
-rw-r--r-- | libc/bionic/wchar_l.cpp | 38 |
5 files changed, 199 insertions, 59 deletions
diff --git a/libc/bionic/locale.cpp b/libc/bionic/locale.cpp index 38e15b713..08c9401fd 100644 --- a/libc/bionic/locale.cpp +++ b/libc/bionic/locale.cpp @@ -37,7 +37,15 @@ #include "private/bionic_macros.h" +#if defined(__BIONIC_BUILD_FOR_ANDROID_SUPPORT) +#define USE_TLS_SLOT 0 +#else +#define USE_TLS_SLOT 1 +#endif + +#if USE_TLS_SLOT #include "bionic/pthread_internal.h" +#endif // We only support two locales, the "C" locale (also known as "POSIX"), // and the "C.UTF-8" locale (also known as "en_US.UTF-8"). @@ -70,6 +78,10 @@ size_t __ctype_get_mb_cur_max() { } } +#if !USE_TLS_SLOT +static thread_local locale_t g_current_locale; +#endif + static pthread_once_t g_locale_once = PTHREAD_ONCE_INIT; static lconv g_locale; @@ -163,9 +175,16 @@ char* setlocale(int category, const char* locale_name) { return const_cast<char*>(__bionic_current_locale_is_utf8 ? "C.UTF-8" : "C"); } +static locale_t* get_current_locale_ptr() { +#if USE_TLS_SLOT + return &__get_bionic_tls().locale; +#else + return &g_current_locale; +#endif +} + locale_t uselocale(locale_t new_locale) { - locale_t* locale_storage = &__get_bionic_tls().locale; - locale_t old_locale = *locale_storage; + locale_t old_locale = *get_current_locale_ptr(); // If this is the first call to uselocale(3) on this thread, we return LC_GLOBAL_LOCALE. if (old_locale == NULL) { @@ -173,64 +192,8 @@ locale_t uselocale(locale_t new_locale) { } if (new_locale != NULL) { - *locale_storage = new_locale; + *get_current_locale_ptr() = new_locale; } return old_locale; } - -int strcasecmp_l(const char* s1, const char* s2, locale_t) { - return strcasecmp(s1, s2); -} - -int strcoll_l(const char* s1, const char* s2, locale_t) { - return strcoll(s1, s2); -} - -char* strerror_l(int error, locale_t) { - return strerror(error); -} - -int strncasecmp_l(const char* s1, const char* s2, size_t n, locale_t) { - return strncasecmp(s1, s2, n); -} - -double strtod_l(const char* s, char** end_ptr, locale_t) { - return strtod(s, end_ptr); -} - -float strtof_l(const char* s, char** end_ptr, locale_t) { - return strtof(s, end_ptr); -} - -long strtol_l(const char* s, char** end_ptr, int base, locale_t) { - return strtol(s, end_ptr, base); -} - -long double strtold_l(const char* s, char** end_ptr, locale_t) { - return strtold(s, end_ptr); -} - -long long strtoll_l(const char* s, char** end_ptr, int base, locale_t) { - return strtoll(s, end_ptr, base); -} - -unsigned long strtoul_l(const char* s, char** end_ptr, int base, locale_t) { - return strtoul(s, end_ptr, base); -} - -unsigned long long strtoull_l(const char* s, char** end_ptr, int base, locale_t) { - return strtoull(s, end_ptr, base); -} - -size_t strxfrm_l(char* dst, const char* src, size_t n, locale_t) { - return strxfrm(dst, src, n); -} - -int wcscasecmp_l(const wchar_t* ws1, const wchar_t* ws2, locale_t) { - return wcscasecmp(ws1, ws2); -} - -int wcsncasecmp_l(const wchar_t* ws1, const wchar_t* ws2, size_t n, locale_t) { - return wcsncasecmp(ws1, ws2, n); -} diff --git a/libc/bionic/stdlib_l.cpp b/libc/bionic/stdlib_l.cpp new file mode 100644 index 000000000..18e9f86fa --- /dev/null +++ b/libc/bionic/stdlib_l.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <stdlib.h> +#include <xlocale.h> + +double strtod_l(const char* s, char** end_ptr, locale_t) { + return strtod(s, end_ptr); +} + +float strtof_l(const char* s, char** end_ptr, locale_t) { + return strtof(s, end_ptr); +} + +long strtol_l(const char* s, char** end_ptr, int base, locale_t) { + return strtol(s, end_ptr, base); +} + +long double strtold_l(const char* s, char** end_ptr, locale_t) { + return strtold(s, end_ptr); +} + +long long strtoll_l(const char* s, char** end_ptr, int base, locale_t) { + return strtoll(s, end_ptr, base); +} + +unsigned long strtoul_l(const char* s, char** end_ptr, int base, locale_t) { + return strtoul(s, end_ptr, base); +} + +unsigned long long strtoull_l(const char* s, char** end_ptr, int base, locale_t) { + return strtoull(s, end_ptr, base); +} + diff --git a/libc/bionic/string_l.cpp b/libc/bionic/string_l.cpp new file mode 100644 index 000000000..66bfb0e62 --- /dev/null +++ b/libc/bionic/string_l.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <string.h> +#include <xlocale.h> + +int strcoll_l(const char* s1, const char* s2, locale_t) { + return strcoll(s1, s2); +} + +char* strerror_l(int error, locale_t) { + return strerror(error); +} + +size_t strxfrm_l(char* dst, const char* src, size_t n, locale_t) { + return strxfrm(dst, src, n); +} diff --git a/libc/bionic/strings_l.cpp b/libc/bionic/strings_l.cpp new file mode 100644 index 000000000..0983ab1de --- /dev/null +++ b/libc/bionic/strings_l.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <strings.h> +#include <xlocale.h> + +int strcasecmp_l(const char* s1, const char* s2, locale_t) { + return strcasecmp(s1, s2); +} + +int strncasecmp_l(const char* s1, const char* s2, size_t n, locale_t) { + return strncasecmp(s1, s2, n); +} diff --git a/libc/bionic/wchar_l.cpp b/libc/bionic/wchar_l.cpp new file mode 100644 index 000000000..0a131e878 --- /dev/null +++ b/libc/bionic/wchar_l.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <wchar.h> +#include <xlocale.h> + +int wcscasecmp_l(const wchar_t* ws1, const wchar_t* ws2, locale_t) { + return wcscasecmp(ws1, ws2); +} + +int wcsncasecmp_l(const wchar_t* ws1, const wchar_t* ws2, size_t n, locale_t) { + return wcsncasecmp(ws1, ws2, n); +} |