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