diff --git a/libc/Android.mk b/libc/Android.mk index 9610c14..d3dbe81 100644 --- a/libc/Android.mk +++ b/libc/Android.mk @@ -214,6 +215,7 @@ libc_bionic_src_:= \ bionic/libc_init_common.cpp \ bionic/libc_logging.cpp \ bionic/libgen.cpp \ + bionic/locale.cpp \ bionic/mmap.cpp \ bionic/pthread_attr.cpp \ bionic/pthread_detach.cpp \ @@ -232,7 +232,6 @@ libc_bionic_src_files := \ bionic/scandir.cpp \ bionic/sched_getaffinity.cpp \ bionic/__set_errno.cpp \ - bionic/setlocale.cpp \ bionic/signalfd.cpp \ bionic/sigwait.cpp \ bionic/statvfs.cpp \ diff --git a/libc/bionic/wchar.cpp b/libc/bionic/wchar.cpp index 50a3875..cc830b7 100644 --- a/libc/bionic/wchar.cpp +++ b/libc/bionic/wchar.cpp @@ -96,6 +96,7 @@ int swscanf(const wchar_t* /*s*/, const wchar_t* /*format*/, ... ) { int iswalnum(wint_t wc) { return isalnum(wc); } int iswalpha(wint_t wc) { return isalpha(wc); } +int iswblank(wint_t wc) { return isblank(wc); } int iswcntrl(wint_t wc) { return iscntrl(wc); } int iswdigit(wint_t wc) { return isdigit(wc); } int iswgraph(wint_t wc) { return isgraph(wc); } diff --git a/libc/include/assert.h b/libc/include/assert.h index 62470f5..361a5ff 100644 --- a/libc/include/assert.h +++ b/libc/include/assert.h @@ -60,6 +60,6 @@ #endif __BEGIN_DECLS -__dead void __assert(const char *, int, const char *); -__dead void __assert2(const char *, int, const char *, const char *); +__dead void __assert(const char *, int, const char *) __noreturn; +__dead void __assert2(const char *, int, const char *, const char *) __noreturn; __END_DECLS diff --git a/libc/include/ctype.h b/libc/include/ctype.h index 5557e31..a66df12 100644 --- a/libc/include/ctype.h +++ b/libc/include/ctype.h @@ -45,11 +45,14 @@ #define _CTYPE_U 0x01 #define _CTYPE_L 0x02 #define _CTYPE_N 0x04 +#define _CTYPE_D 0x04 #define _CTYPE_S 0x08 #define _CTYPE_P 0x10 #define _CTYPE_C 0x20 #define _CTYPE_X 0x40 #define _CTYPE_B 0x80 +#define _CTYPE_R (_CTYPE_P|_CTYPE_U|_CTYPE_L|_CTYPE_D|_CTYPE_B) +#define _CTYPE_A (_CTYPE_L|_CTYPE_U) __BEGIN_DECLS diff --git a/libc/include/locale.h b/libc/include/locale.h index 65b5c7d..6989851 100644 --- a/libc/include/locale.h +++ b/libc/include/locale.h @@ -29,6 +29,7 @@ #define _LOCALE_H_ #include +#include __BEGIN_DECLS @@ -43,17 +44,65 @@ enum { LC_PAPER = 7, LC_NAME = 8, LC_ADDRESS = 9, - LC_TELEPHONE = 10, LC_MEASUREMENT = 11, LC_IDENTIFICATION = 12 }; -extern char *setlocale(int category, const char *locale); +#define LC_CTYPE_MASK (1 << LC_CTYPE) +#define LC_NUMERIC_MASK (1 << LC_NUMERIC) +#define LC_TIME_MASK (1 << LC_TIME) +#define LC_COLLATE_MASK (1 << LC_COLLATE) +#define LC_MONETARY_MASK (1 << LC_MONETARY) +#define LC_MESSAGES_MASK (1 << LC_MESSAGES) +#define LC_PAPER_MASK (1 << LC_PAPER) +#define LC_NAME_MASK (1 << LC_NAME) +#define LC_ADDRESS_MASK (1 << LC_ADDRESS) +#define LC_TELEPHONE_MASK (1 << LC_TELEPHONE) +#define LC_MEASUREMENT_MASK (1 << LC_MEASUREMENT) +#define LC_IDENTIFICATION_MASK (1 << LC_IDENTIFICATION) + +#define LC_ALL_MASK (LC_CTYPE_MASK | LC_NUMERIC_MASK | LC_TIME_MASK | LC_COLLATE_MASK | \ + LC_MONETARY_MASK | LC_MESSAGES_MASK | LC_PAPER_MASK | LC_NAME_MASK | \ + LC_ADDRESS_MASK | LC_TELEPHONE_MASK | LC_MEASUREMENT_MASK | \ + LC_IDENTIFICATION_MASK) + +struct lconv { + char* decimal_point; + char* thousands_sep; + char* grouping; + char* int_curr_symbol; + char* currency_symbol; + char* mon_decimal_point; + char* mon_thousands_sep; + char* mon_grouping; + char* positive_sign; + char* negative_sign; + char int_frac_digits; + char frac_digits; + char p_cs_precedes; + char p_sep_by_space; + char n_cs_precedes; + char n_sep_by_space; + char p_sign_posn; + char n_sign_posn; + char int_p_cs_precedes; + char int_p_sep_by_space; + char int_n_cs_precedes; + char int_n_sep_by_space; + char int_p_sign_posn; + char int_n_sign_posn; +}; + +struct lconv* localeconv(void); + +locale_t duplocale(locale_t); +void freelocale(locale_t); +locale_t newlocale(int, const char*, locale_t); +char* setlocale(int, const char*); +locale_t uselocale(locale_t); -/* Make libstdc++-v3 happy. */ -struct lconv { }; -struct lconv *localeconv(void); +#define LC_GLOBAL_LOCALE ((locale_t) -1L) __END_DECLS diff --git a/libc/include/stdio.h b/libc/include/stdio.h index 23fc944..28685c7 100644 --- a/libc/include/stdio.h +++ b/libc/include/stdio.h @@ -469,7 +469,10 @@ int vsprintf(char *dest, const char *format, __va_list ap) } #if defined(__clang__) -#define snprintf(dest, size, ...) __builtin___snprintf_chk(dest, size, 0, __bos(dest), __VA_ARGS__) + #if !defined(snprintf) + #define __wrap_snprintf(dest, size, ...) __builtin___snprintf_chk(dest, size, 0, __bos(dest), __VA_ARGS__) + #define snprintf(...) __wrap_snprintf(__VA_ARGS__) + #endif #else __BIONIC_FORTIFY_INLINE __printflike(3, 4) @@ -481,7 +484,10 @@ int snprintf(char *dest, size_t size, const char *format, ...) #endif #if defined(__clang__) -#define sprintf(dest, ...) __builtin___sprintf_chk(dest, 0, __bos(dest), __VA_ARGS__) + #if !defined(sprintf) + #define __wrap_sprintf(dest, ...) __builtin___sprintf_chk(dest, 0, __bos(dest), __VA_ARGS__) + #define sprintf(...) __wrap_sprintf(__VA_ARGS__) + #endif #else __BIONIC_FORTIFY_INLINE __printflike(2, 3) diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h index 9fa84c1..188da69 100644 --- a/libc/include/stdlib.h +++ b/libc/include/stdlib.h @@ -68,6 +68,10 @@ static __inline__ float strtof(const char *nptr, char **endptr) return (float)strtod(nptr, endptr); } +static __inline__ long double strtold(const char* s, char** end_ptr) { + return (long double)strtod(s, end_ptr); +} + extern int atoi(const char *) __purefunc; extern long atol(const char *) __purefunc; extern long long atoll(const char *) __purefunc; diff --git a/libc/include/wchar.h b/libc/include/wchar.h index 76ac02c..c413806 100644 --- a/libc/include/wchar.h +++ b/libc/include/wchar.h @@ -77,6 +77,7 @@ extern int fwprintf(FILE *, const wchar_t *, ...); extern int fwscanf(FILE *, const wchar_t *, ...); extern int iswalnum(wint_t); extern int iswalpha(wint_t); +extern int iswblank(wint_t); extern int iswcntrl(wint_t); extern int iswdigit(wint_t); extern int iswgraph(wint_t);