am c3bdc792: Merge "Fix the printf family for non-ASCII."

* commit 'c3bdc792be78d788663ff9b5e019b4af852dc6f7':
  Fix the printf family for non-ASCII.
This commit is contained in:
Elliott Hughes 2014-06-06 18:23:12 +00:00 committed by Android Git Automerger
commit fd0de89e4c
4 changed files with 50 additions and 2 deletions

View File

@ -112,7 +112,7 @@
#define SSIZE_MAX LONG_MAX
#define MB_LEN_MAX 6
#define MB_LEN_MAX 4
/* New code should use sysconf(_SC_PAGE_SIZE) instead. */
#ifndef PAGE_SIZE

View File

@ -167,7 +167,7 @@ extern int mbtowc(wchar_t *, const char *, size_t);
extern int wctomb(char *, wchar_t);
extern size_t wcstombs(char *, const wchar_t *, size_t);
#define MB_CUR_MAX 1
#define MB_CUR_MAX 4U
#if 0 /* MISSING FROM BIONIC */
extern int on_exit(void (*)(int, void *), void *);

View File

@ -426,7 +426,26 @@ TEST(stdio, snprintf_negative_zero_5084292) {
EXPECT_STREQ("-0.000000", buf);
}
TEST(stdio, snprintf_utf8_15439554) {
// http://b/15439554
char buf[BUFSIZ];
// 1-byte character.
snprintf(buf, sizeof(buf), "%dx%d", 1, 2);
EXPECT_STREQ("1x2", buf);
// 2-byte character.
snprintf(buf, sizeof(buf), "%d\xc2\xa2%d", 1, 2);
EXPECT_STREQ("1¢2", buf);
// 3-byte character.
snprintf(buf, sizeof(buf), "%d\xe2\x82\xac%d", 1, 2);
EXPECT_STREQ("1€2", buf);
// 4-byte character.
snprintf(buf, sizeof(buf), "%d\xf0\xa4\xad\xa2%d", 1, 2);
EXPECT_STREQ("1𤭢2", buf);
}
TEST(stdio, fprintf_failures_7229520) {
// http://b/7229520
FILE* fp;
// Unbuffered case where the fprintf(3) itself fails.

View File

@ -449,3 +449,32 @@ TEST(wchar, wmemmove) {
wmemmove(wstr+5, wstr, sizeof(const_wstr)/sizeof(wchar_t) - 6);
EXPECT_STREQ(L"This This is a test of something or other", wstr);
}
TEST(wchar, mbrtowc_15439554) {
// http://b/15439554
ASSERT_STREQ("C.UTF-8", setlocale(LC_CTYPE, "C.UTF-8"));
uselocale(LC_GLOBAL_LOCALE);
ASSERT_GE(static_cast<size_t>(MB_LEN_MAX), MB_CUR_MAX);
ASSERT_GE(MB_CUR_MAX, 4U);
wchar_t wc;
size_t n;
// 1-byte character.
n = mbrtowc(&wc, "x", MB_CUR_MAX, NULL);
EXPECT_EQ(1U, n);
EXPECT_EQ(L'x', wc);
// 2-byte character.
n = mbrtowc(&wc, "\xc2\xa2", MB_CUR_MAX, NULL);
EXPECT_EQ(2U, n);
EXPECT_EQ(L'¢', wc);
// 3-byte character.
n = mbrtowc(&wc, "\xe2\x82\xac", MB_CUR_MAX, NULL);
EXPECT_EQ(3U, n);
EXPECT_EQ(L'', wc);
// 4-byte character.
n = mbrtowc(&wc, "\xf0\xa4\xad\xa2", MB_CUR_MAX, NULL);
EXPECT_EQ(4U, n);
EXPECT_EQ(L'𤭢', wc);
}