1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21: #include <stdio.h>
22: #include <string.h>
23: #include <wchar.h>
24: #include <locale.h>
25:
26: #define show(expr, nexp, bufexp) \
27: { \
28: size_t res = expr; \
29: printf (#expr " -> %Zd", res); \
30: dst += res; \
31: printf (", dst = buf+%td", dst - (char *) buf); \
32: if (res != nexp || dst != (char *) (bufexp)) \
33: { \
34: printf (", expected %Zd and buf+%td", nexp, \
35: (bufexp) - (unsigned char *) buf); \
36: result = 1; \
37: } \
38: putc ('\n', stdout); \
39: }
40:
41: int
42: main (void)
43: {
44: unsigned char buf[7] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
45: const unsigned char bufcheck[7] = { 0x25, 0xe2, 0x82, 0xac, 0xce, 0xbb, 0 };
46: const wchar_t srcbuf[4] = { 0x25, 0x20ac, 0x03bb, 0 };
47: mbstate_t state;
48: const wchar_t *src;
49: char *dst;
50: int result = 0;
51: const char *used_locale;
52:
53: setlocale (LC_CTYPE, "de_DE.UTF-8");
54:
55: used_locale = setlocale (LC_CTYPE, NULL);
56: printf ("used locale: \"%s\"\n", used_locale);
57: result = strcmp (used_locale, "de_DE.UTF-8");
58:
59: memset (&state, '\0', sizeof (state));
60:
61: src = srcbuf;
62: dst = (char *) buf;
63: show (wcrtomb (dst, *src++, &state), 1, buf + 1);
64: show (wcrtomb (dst, *src++, &state), 3, buf + 4);
65: show (wcrtomb (dst, *src++, &state), 2, buf + 6);
66: show (wcrtomb (dst, *src, &state), 1, buf + 7);
67:
68: if (memcmp (buf, bufcheck, 7))
69: {
70: puts ("wrong results");
71: result = 1;
72: }
73:
74: return result;
75: }