blob: b86cedf93eeb85360f7b3d2d1316b4b526ab3658 [file] [log] [blame]
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 <sys/cdefs.h>
+#include <xlocale.h>
__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);