/* Illustration of incorrect behavior related to locale specific grouping, decimal point, and outdigits. It seems to be a locale initialization bug because it doesn't happen if any other locale but C is set first. $ diff -u glibc uClibc --- glibc 2003-08-13 18:08:20.000000000 -0500 +++ uClibc 2003-08-13 18:08:31.000000000 -0500 @@ -9,10 +9,10 @@ n=17 buf="1234567890.000000" locale: fa_IR.UTF-8 n=26 buf="??????????????????????????" - n=26 buf="?????????????" + n=26 buf="??????????????????????????" + n=13 buf="??????????????????????????" n=13 buf="??????????????????????????" - n=13 buf="?????????????" n=24 buf="1??234??567??890??000000" - n=24 buf="1?234?567?890?000000" + n=24 buf="1??234??567??890??000000" + n=20 buf="1??234??567??890??000000" n=20 buf="1??234??567??890??000000" - n=20 buf="1?234?567?890?000000" */ #define _ISOC99_SOURCE #include #include #include #include #include int main(void) { int n; static const char *loc[] = { #if 1 "C", #else "en_US", #endif "fa_IR.UTF-8", NULL }; const char **pl; #define NBUF 128 char buf[NBUF]; wchar_t wbuf[NBUF]; for ( pl=loc ; *pl ; pl++) { if (!setlocale(LC_ALL, *pl)) { wprintf(L"setlocale for %s failed!\n", *pl); return EXIT_FAILURE; } fprintf(stderr, "locale: %s\n", *pl); n = snprintf(buf, NBUF, "%I'ld", 1234567890L); fprintf(stderr, " n=%d buf=\"%s\"\n", n, buf); wprintf(L" n=%d buf=\"%s\"\n", n, buf); fflush(stdout); n = swprintf(wbuf, NBUF, L"%I'ld", 1234567890L); fprintf(stderr, " n=%d buf=\"%ls\"\n", n, wbuf); wprintf(L" n=%d buf=\"%ls\"\n", n, wbuf); fflush(stdout); n = snprintf(buf, NBUF, "%'f", 1234567890.); fprintf(stderr, " n=%d buf=\"%s\"\n", n, buf); wprintf(L" n=%d buf=\"%s\"\n", n, buf); fflush(stdout); n = swprintf(wbuf, NBUF, L"%'f", 1234567890.); fprintf(stderr, " n=%d buf=\"%ls\"\n", n, wbuf); wprintf(L" n=%d buf=\"%ls\"\n", n, wbuf); fflush(stdout); } return EXIT_SUCCESS; }