This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
clearer illustration of locale-related initialization bug
- From: mjn3 at codepoet dot org (Manuel Novoa III)
- To: libc-alpha at sources dot redhat dot com
- Date: Sat, 13 Sep 2003 13:24:54 -0600
- Subject: clearer illustration of locale-related initialization bug
Hello,
Hopefully this example will be a better illustration of a previously
reported problem involving wide output and locale initialization order.
Manuel
/* Illustration of a locale-related initialization bug (second try).
Annotated output for glibc -- cvs Sep 10 14:37 CDT
In the first run, we try (in order) "fa_IR.UTF-8" and "C".
$ ./a.out fa_IR.UTF-8 C 2>&1 | hexdump -C
00000000 20 db b0 0a 20 db b0 0a 20 30 0a 20 30 0a | ... ... 0. 0.|
0000000e
In the second run, we reverse the order of the locales and
try (in order) "C" and "fa_IR.UTF-8".
$ ./a.out C fa_IR.UTF-8 2>&1 | hexdump -C
00000000 20 30 0a 20 30 0a 20 db b0 0a 20 3f 0a | 0. 0. ... ?.|
0000000d
Note that the number of bytes output is different depending on the order
of locales specified. If the "C" locale is used first, then when in
the "fa_IR.UTF-8" locale, the bytes output to stdout by "wprintf(L"%s", buf);"
for buf with bytes { 0x20, 0xdb, 0xb0, 0x0a } are { 0x20, 0x3f, 0x0a }
instead of the expected { 0x20, 0xdb, 0xb0, 0x0a }.
*/
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>
int main(int argc, char **argv)
{
int n, nw;
#define NBUF 128
char buf[NBUF];
if (argc < 2) {
fprintf(stderr, "usage: %s [locale name]...\n", argv[0]);
return EXIT_FAILURE;
}
while (*++argv) {
if (!setlocale(LC_ALL, *argv)) {
fprintf(stderr, "setlocale for %s failed!\n", *argv);
return EXIT_FAILURE;
}
n = snprintf(buf, NBUF, " %I'ld\n", 0L);
if (n <= 0) {
fprintf(stderr, "snprintf failed!\n");
return EXIT_FAILURE;
}
if (fprintf(stderr, "%s", buf) != n) {
fprintf(stderr, "fprintf failed!\n");
return EXIT_FAILURE;
}
nw = wprintf(L"%s", buf);
if (nw <= 0) {
fprintf(stderr, "wprintf failed!\n");
return EXIT_FAILURE;
}
if (fflush(stdout)) {
fprintf(stderr, "fflush failed!\n");
return EXIT_FAILURE;
}
}
return EXIT_SUCCESS;
}