From dfb5ce42bcc5a275af49211c0bbe64c5ec3d2668 Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Wed, 9 Jul 2014 22:51:34 +0000 Subject: [PATCH] Revert "Revert "Add locale aware APIs."" This reverts commit 063e20c26943ec82ef1d53a544545e79054e93d3. Change-Id: Ib8c9004efefe75a5346b3af50dfe37952d91eb21 --- libc/Android.mk | 7 +++ libc/bionic/ctype.cpp | 89 ++++++++++++++++++++++++++++++++++++++ libc/bionic/strcoll_l.cpp | 33 ++++++++++++++ libc/bionic/strftime_l.cpp | 34 +++++++++++++++ libc/bionic/strtold_l.cpp | 33 ++++++++++++++ libc/bionic/strtoll_l.cpp | 33 ++++++++++++++ libc/bionic/strtoull_l.cpp | 34 +++++++++++++++ libc/bionic/strxfrm_l.cpp | 33 ++++++++++++++ libc/bionic/wchar.cpp | 22 ++++++++++ libc/bionic/wctype.cpp | 25 +++++++++++ libc/include/ctype.h | 17 ++++++++ libc/include/stdlib.h | 4 ++ libc/include/string.h | 4 ++ libc/include/time.h | 2 + libc/include/wchar.h | 7 +++ libc/include/wctype.h | 55 +++++++++++++++++++++++ 16 files changed, 432 insertions(+) create mode 100644 libc/bionic/ctype.cpp create mode 100644 libc/bionic/strcoll_l.cpp create mode 100644 libc/bionic/strftime_l.cpp create mode 100644 libc/bionic/strtold_l.cpp create mode 100644 libc/bionic/strtoll_l.cpp create mode 100644 libc/bionic/strtoull_l.cpp create mode 100644 libc/bionic/strxfrm_l.cpp diff --git a/libc/Android.mk b/libc/Android.mk index b0a9fb1c3..a59db819b 100644 --- a/libc/Android.mk +++ b/libc/Android.mk @@ -109,6 +109,7 @@ libc_bionic_src_files := \ bionic/clone.cpp \ bionic/__cmsg_nxthdr.cpp \ bionic/connect.cpp \ + bionic/ctype.cpp \ bionic/__cxa_guard.cpp \ bionic/__cxa_pure_virtual.cpp \ bionic/dirent.cpp \ @@ -205,10 +206,16 @@ libc_bionic_src_files := \ bionic/socket.cpp \ bionic/stat.cpp \ bionic/statvfs.cpp \ + bionic/strcoll_l.cpp \ bionic/strerror.cpp \ bionic/strerror_r.cpp \ + bionic/strftime_l.cpp \ bionic/strsignal.cpp \ bionic/strtold.cpp \ + bionic/strtold_l.cpp \ + bionic/strtoll_l.cpp \ + bionic/strtoull_l.cpp \ + bionic/strxfrm_l.cpp \ bionic/stubs.cpp \ bionic/symlink.cpp \ bionic/sysconf.cpp \ diff --git a/libc/bionic/ctype.cpp b/libc/bionic/ctype.cpp new file mode 100644 index 000000000..3960d9d4c --- /dev/null +++ b/libc/bionic/ctype.cpp @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2014 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 + +int isalnum_l(int c, locale_t) { + return isalnum(c); +} + +int isalpha_l(int c, locale_t) { + return isalpha(c); +} + +int isascii_l(int c, locale_t) { + return isascii(c); +} + +int isblank_l(int c, locale_t) { + return isblank(c); +} + +int iscntrl_l(int c, locale_t) { + return iscntrl(c); +} + +int isdigit_l(int c, locale_t) { + return isdigit(c); +} + +int isgraph_l(int c, locale_t) { + return isgraph(c); +} + +int islower_l(int c, locale_t) { + return islower(c); +} + +int isprint_l(int c, locale_t) { + return isprint(c); +} + +int ispunct_l(int c, locale_t) { + return ispunct(c); +} + +int isspace_l(int c, locale_t) { + return isspace(c); +} + +int isupper_l(int c, locale_t) { + return isupper(c); +} + +int isxdigit_l(int c, locale_t) { + return isxdigit(c); +} + +int toupper_l(int c, locale_t) { + return toupper(c); +} + +int tolower_l(int c, locale_t) { + return tolower(c); +} diff --git a/libc/bionic/strcoll_l.cpp b/libc/bionic/strcoll_l.cpp new file mode 100644 index 000000000..7d7c28bef --- /dev/null +++ b/libc/bionic/strcoll_l.cpp @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2014 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 + +int strcoll_l(const char *s1, const char *s2, locale_t) { + return strcoll(s1, s2); +} diff --git a/libc/bionic/strftime_l.cpp b/libc/bionic/strftime_l.cpp new file mode 100644 index 000000000..fb01da5f2 --- /dev/null +++ b/libc/bionic/strftime_l.cpp @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2014 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 + +size_t strftime_l(char *s, size_t max, const char *format, const struct tm *tm, + locale_t) { + return strftime(s, max, format, tm); +} diff --git a/libc/bionic/strtold_l.cpp b/libc/bionic/strtold_l.cpp new file mode 100644 index 000000000..4b230b94a --- /dev/null +++ b/libc/bionic/strtold_l.cpp @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2014 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 + +long double strtold_l(const char *nptr, char **endptr, locale_t) { + return strtold(nptr, endptr); +} diff --git a/libc/bionic/strtoll_l.cpp b/libc/bionic/strtoll_l.cpp new file mode 100644 index 000000000..05fb76083 --- /dev/null +++ b/libc/bionic/strtoll_l.cpp @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2014 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 + +long long strtoll_l(const char *nptr, char **endptr, size_t base, locale_t) { + return strtoll(nptr, endptr, base); +} diff --git a/libc/bionic/strtoull_l.cpp b/libc/bionic/strtoull_l.cpp new file mode 100644 index 000000000..ba0bc6ad4 --- /dev/null +++ b/libc/bionic/strtoull_l.cpp @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2014 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 + +unsigned long long strtoull_l(const char *nptr, char **endptr, size_t base, + locale_t) { + return strtoull(nptr, endptr, base); +} diff --git a/libc/bionic/strxfrm_l.cpp b/libc/bionic/strxfrm_l.cpp new file mode 100644 index 000000000..afe3b965c --- /dev/null +++ b/libc/bionic/strxfrm_l.cpp @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2014 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 + +size_t strxfrm_l(char *dest, const char *src, size_t n, locale_t) { + return strxfrm(dest, src, n); +} diff --git a/libc/bionic/wchar.cpp b/libc/bionic/wchar.cpp index acb27617a..ecb8b3391 100644 --- a/libc/bionic/wchar.cpp +++ b/libc/bionic/wchar.cpp @@ -219,3 +219,25 @@ size_t wcsnrtombs(char* dst, const wchar_t** src, size_t nwc, size_t len, mbstat size_t wcsrtombs(char* dst, const wchar_t** src, size_t len, mbstate_t* ps) { return wcsnrtombs(dst, src, SIZE_MAX, len, ps); } + +int wcscoll_l(const wchar_t *ws1, const wchar_t *ws2, locale_t) { + return wcscoll(ws1, ws2); +} + +size_t wcsxfrm_l(wchar_t *dest, const wchar_t *src, size_t n, locale_t) { + return wcsxfrm(dest, src, n); +} + +long long wcstoll_l(const wchar_t *nptr, wchar_t **endptr, size_t base, + locale_t) { + return wcstoll(nptr, endptr, base); +} + +unsigned long long wcstoull_l(const wchar_t *nptr, wchar_t **endptr, + size_t base, locale_t) { + return wcstoull(nptr, endptr, base); +} + +long double wcstold_l(const wchar_t *nptr, wchar_t **endptr, locale_t) { + return wcstold(nptr, endptr); +} diff --git a/libc/bionic/wctype.cpp b/libc/bionic/wctype.cpp index 673402d6b..f2d7861c2 100644 --- a/libc/bionic/wctype.cpp +++ b/libc/bionic/wctype.cpp @@ -30,6 +30,7 @@ #include #include #include +#include // TODO: these only work for the ASCII range; rewrite to dlsym icu4c? http://b/14499654 @@ -46,6 +47,19 @@ int iswspace(wint_t wc) { return isspace(wc); } int iswupper(wint_t wc) { return isupper(wc); } int iswxdigit(wint_t wc) { return isxdigit(wc); } +int iswalnum_l(wint_t c, locale_t) { return iswalnum(c); } +int iswalpha_l(wint_t c, locale_t) { return iswalpha(c); } +int iswblank_l(wint_t c, locale_t) { return iswblank(c); } +int iswcntrl_l(wint_t c, locale_t) { return iswcntrl(c); } +int iswdigit_l(wint_t c, locale_t) { return iswdigit(c); } +int iswgraph_l(wint_t c, locale_t) { return iswgraph(c); } +int iswlower_l(wint_t c, locale_t) { return iswlower(c); } +int iswprint_l(wint_t c, locale_t) { return iswprint(c); } +int iswpunct_l(wint_t c, locale_t) { return iswpunct(c); } +int iswspace_l(wint_t c, locale_t) { return iswspace(c); } +int iswupper_l(wint_t c, locale_t) { return iswupper(c); } +int iswxdigit_l(wint_t c, locale_t) { return iswxdigit(c); } + int iswctype(wint_t wc, wctype_t char_class) { switch (char_class) { case WC_TYPE_ALNUM: return iswalnum(wc); @@ -64,9 +78,16 @@ int iswctype(wint_t wc, wctype_t char_class) { } } +int iswctype_l(wint_t wc, wctype_t char_class, locale_t) { + return iswctype(wc, char_class); +} + wint_t towlower(wint_t wc) { return tolower(wc); } wint_t towupper(wint_t wc) { return toupper(wc); } +int towupper_l(int c, locale_t) { return towupper(c); } +int towlower_l(int c, locale_t) { return towlower(c); } + wctype_t wctype(const char* property) { static const char* const properties[WC_TYPE_MAX] = { "", @@ -81,6 +102,10 @@ wctype_t wctype(const char* property) { return static_cast(0); } +wctype_t wctype_l(const char* property, locale_t) { + return wctype(property); +} + int wcwidth(wchar_t wc) { return (wc > 0); } diff --git a/libc/include/ctype.h b/libc/include/ctype.h index 6e973269c..19b1adfe3 100644 --- a/libc/include/ctype.h +++ b/libc/include/ctype.h @@ -41,6 +41,7 @@ #define _CTYPE_H_ #include +#include #define _CTYPE_U 0x01 #define _CTYPE_L 0x02 @@ -72,6 +73,22 @@ int isxdigit(int); int tolower(int); int toupper(int); +int isalnum_l(int, locale_t); +int isalpha_l(int, locale_t); +int isascii_l(int, locale_t); +int isblank_l(int, locale_t); +int iscntrl_l(int, locale_t); +int isdigit_l(int, locale_t); +int isgraph_l(int, locale_t); +int islower_l(int, locale_t); +int isprint_l(int, locale_t); +int ispunct_l(int, locale_t); +int isspace_l(int, locale_t); +int isupper_l(int, locale_t); +int isxdigit_l(int, locale_t); +int tolower_l(int, locale_t); +int toupper_l(int, locale_t); + #if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __POSIX_VISIBLE > 200112 \ || __XPG_VISIBLE > 600 int isblank(int); diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h index 62b7a67b8..0dac6506a 100644 --- a/libc/include/stdlib.h +++ b/libc/include/stdlib.h @@ -75,6 +75,10 @@ extern double strtod(const char*, char**) __LIBC_ABI_PUBLIC__; extern float strtof(const char*, char**) __LIBC_ABI_PUBLIC__; extern long double strtold(const char*, char**) __LIBC_ABI_PUBLIC__; +extern long double strtold_l(const char *, char **, locale_t) __LIBC_ABI_PUBLIC__; +extern long long strtoll_l(const char *, char **, size_t, locale_t) __LIBC_ABI_PUBLIC__; +extern unsigned long long strtoull_l(const char *, char **, size_t, locale_t) __LIBC_ABI_PUBLIC__; + extern int atoi(const char*) __purefunc; extern long atol(const char*) __purefunc; extern long long atoll(const char*) __purefunc; diff --git a/libc/include/string.h b/libc/include/string.h index 7727c0ec9..af1c0c100 100644 --- a/libc/include/string.h +++ b/libc/include/string.h @@ -31,6 +31,7 @@ #include #include #include +#include __BEGIN_DECLS @@ -88,6 +89,9 @@ extern char* strsignal(int sig); extern int strcoll(const char *, const char *) __purefunc; extern size_t strxfrm(char* __restrict, const char* __restrict, size_t); +extern int strcoll_l(const char *, const char *, locale_t) __purefunc; +extern size_t strxfrm_l(char* __restrict, const char* __restrict, size_t, locale_t); + #if defined(__BIONIC_FORTIFY) __errordecl(__memcpy_dest_size_error, "memcpy: prevented write past end of buffer"); diff --git a/libc/include/time.h b/libc/include/time.h index 0587a2d1b..34a53b27a 100644 --- a/libc/include/time.h +++ b/libc/include/time.h @@ -31,6 +31,7 @@ #include #include +#include __BEGIN_DECLS @@ -75,6 +76,7 @@ extern struct tm* gmtime_r(const time_t*, struct tm*) __LIBC_ABI_PUBLIC__; extern char* strptime(const char*, const char*, struct tm*) __LIBC_ABI_PUBLIC__; extern size_t strftime(char*, size_t, const char*, const struct tm*) __LIBC_ABI_PUBLIC__; +extern size_t strftime_l(char *, size_t, const char *, const struct tm *, locale_t) __LIBC_ABI_PUBLIC__; extern char* ctime(const time_t*) __LIBC_ABI_PUBLIC__; extern char* ctime_r(const time_t*, char*) __LIBC_ABI_PUBLIC__; diff --git a/libc/include/wchar.h b/libc/include/wchar.h index 014fed303..1898c7e93 100644 --- a/libc/include/wchar.h +++ b/libc/include/wchar.h @@ -151,6 +151,13 @@ extern wchar_t *wmemset(wchar_t *, wchar_t, size_t); extern int wprintf(const wchar_t *, ...); extern int wscanf(const wchar_t *, ...); +extern long long wcstoll_l(const wchar_t *, wchar_t **, size_t, locale_t); +extern unsigned long long wcstoull_l(const wchar_t *, wchar_t **, size_t, locale_t); +extern long double wcstold_l(const wchar_t *, wchar_t **, locale_t ); + +extern int wcscoll_l(const wchar_t *, const wchar_t *, locale_t); +extern size_t wcsxfrm_l(wchar_t *, const wchar_t *, size_t, locale_t); + extern size_t wcslcat(wchar_t*, const wchar_t*, size_t); extern size_t wcslcpy(wchar_t*, const wchar_t*, size_t); diff --git a/libc/include/wctype.h b/libc/include/wctype.h index b5f18a0e1..1a4a05e56 100644 --- a/libc/include/wctype.h +++ b/libc/include/wctype.h @@ -1 +1,56 @@ +/* + * Copyright (C) 2014 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. + */ + +#ifndef _WCTYPE_H_ +#define _WCTYPE_H_ + #include + +__BEGIN_DECLS + +extern int iswalnum_l(wint_t, locale_t); +extern int iswalpha_l(wint_t, locale_t); +extern int iswblank_l(wint_t, locale_t); +extern int iswcntrl_l(wint_t, locale_t); +extern int iswdigit_l(wint_t, locale_t); +extern int iswgraph_l(wint_t, locale_t); +extern int iswlower_l(wint_t, locale_t); +extern int iswprint_l(wint_t, locale_t); +extern int iswpunct_l(wint_t, locale_t); +extern int iswspace_l(wint_t, locale_t); +extern int iswupper_l(wint_t, locale_t); +extern int iswxdigit_l(wint_t, locale_t); +extern int towlower_l(int, locale_t); +extern int towupper_l(int, locale_t); + +extern int iswctype_l(wint_t, wctype_t, locale_t); +extern wctype_t wctype_l(const char*, locale_t); + +__END_DECLS + +#endif /* _WCTYPE_H_ */