#include <ctype.h>
#include <errno.h>
+#include <limits.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
return 1;
}
-size_t mbrlen(const char* /*s*/, size_t n, mbstate_t* /*ps*/) {
- return (n != 0);
+size_t mbrlen(const char* s, size_t n, mbstate_t* /*ps*/) {
+ return (n == 0 || s[0] == 0) ? 0 : 1;
}
size_t mbrtowc(wchar_t* pwc, const char* s, size_t n, mbstate_t* /*ps*/) {
return ungetc(static_cast<char>(wc), stream);
}
-size_t wcrtomb(char* s, wchar_t /*wc*/, mbstate_t* /*ps*/) {
- if (s != NULL) {
- *s = 1;
+int wctomb(char* s, wchar_t wc) {
+ if (s == NULL) {
+ return 0;
+ }
+ if (wc <= 0xff) {
+ *s = static_cast<char>(wc);
+ } else {
+ *s = '?';
}
return 1;
}
+size_t wcrtomb(char* s, wchar_t wc, mbstate_t* /*ps*/) {
+ if (s == NULL) {
+ char buf[MB_LEN_MAX];
+ return wctomb(buf, L'\0');
+ }
+ return wctomb(s, wc);
+}
+
size_t wcsftime(wchar_t* wcs, size_t maxsize, const wchar_t* format, const struct tm* timptr) {
return strftime(reinterpret_cast<char*>(wcs), maxsize, reinterpret_cast<const char*>(format), timptr);
}
extern const char* getprogname(void);
extern void setprogname(const char*);
-#if 1 /* MISSING FROM BIONIC - ENABLED FOR STLPort and libstdc++-v3 */
/* make STLPort happy */
extern int mblen(const char *, size_t);
extern size_t mbstowcs(wchar_t *, const char *, size_t);
/* Likewise, make libstdc++-v3 happy. */
extern int wctomb(char *, wchar_t);
extern size_t wcstombs(char *, const wchar_t *, size_t);
-#endif /* MISSING */
#define MB_CUR_MAX 1
#include <time.h>
#include <malloc.h>
-/* IMPORTANT: Any code that relies on wide character support is essentially
- * non-portable and/or broken. the only reason this header exist
- * is because I'm really a nice guy. However, I'm not nice enough
- * to provide you with a real implementation. instead wchar_t == char
- * and all wc functions are stubs to their "normal" equivalent...
- */
-
__BEGIN_DECLS
typedef __WINT_TYPE__ wint_t;
extern size_t wcslcat(wchar_t*, const wchar_t*, size_t);
extern size_t wcslcpy(wchar_t*, const wchar_t*, size_t);
-/* No really supported. These are just for making libstdc++-v3 happy. */
typedef void *wctrans_t;
-extern wint_t towctrans(wint_t, wctrans_t);
-extern wctrans_t wctrans (const char *);
+extern wint_t towctrans(wint_t, wctrans_t);
+extern wctrans_t wctrans(const char*);
-#if _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
+#if __POSIX_VISIBLE >= 200809
wchar_t* wcsdup(const wchar_t*);
size_t wcsnlen(const wchar_t*, size_t);
#endif
--- /dev/null
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <gtest/gtest.h>
+
+#include <limits.h>
+#include <wchar.h>
+
+TEST(wchar, sizeof_wchar_t) {
+ EXPECT_EQ(4U, sizeof(wchar_t));
+ EXPECT_EQ(4U, sizeof(wint_t));
+}
+
+TEST(wchar, mbrlen) {
+ char bytes[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
+ EXPECT_EQ(0U, mbrlen(&bytes[0], 0, NULL));
+ EXPECT_EQ(1U, mbrlen(&bytes[0], 1, NULL));
+
+ EXPECT_EQ(1U, mbrlen(&bytes[4], 1, NULL));
+ EXPECT_EQ(0U, mbrlen(&bytes[5], 1, NULL));
+}
+
+TEST(wchar, wctomb_wcrtomb) {
+ // wctomb and wcrtomb behave differently when s == NULL.
+ EXPECT_EQ(0, wctomb(NULL, L'h'));
+ EXPECT_EQ(0, wctomb(NULL, L'\0'));
+ EXPECT_EQ(1U, wcrtomb(NULL, L'\0', NULL));
+ EXPECT_EQ(1U, wcrtomb(NULL, L'h', NULL));
+
+ char bytes[MB_LEN_MAX];
+
+ // wctomb and wcrtomb behave similarly for the null wide character.
+ EXPECT_EQ(1, wctomb(bytes, L'\0'));
+ EXPECT_EQ(1U, wcrtomb(bytes, L'\0', NULL));
+
+ // ...and for regular characters.
+ bytes[0] = 'x';
+ EXPECT_EQ(1, wctomb(bytes, L'h'));
+ EXPECT_EQ('h', bytes[0]);
+
+ bytes[0] = 'x';
+ EXPECT_EQ(1U, wcrtomb(bytes, L'h', NULL));
+ EXPECT_EQ('h', bytes[0]);
+}