1 | #include <inttypes.h> |
2 | #include <locale.h> |
3 | #include <stdio.h> |
4 | #include <uchar.h> |
5 | #include <stdint.h> |
6 | |
7 | static int |
8 | do_test (void) |
9 | { |
10 | if (setlocale (LC_ALL, "de_DE.UTF-8" ) == NULL) |
11 | { |
12 | puts (s: "cannot set locale" ); |
13 | return 1; |
14 | } |
15 | |
16 | int result = 0; |
17 | |
18 | char32_t c32 = 48; |
19 | do |
20 | { |
21 | if (c32 >= 0xd800 && c32 <= 0xe000) |
22 | continue; |
23 | |
24 | char buf[20]; |
25 | size_t n1 = c32rtomb (s: buf, c32: c32, NULL); |
26 | if (n1 <= 0) |
27 | { |
28 | printf (format: "c32rtomb for U'\\x%" PRIx32 "' failed\n" , (uint32_t) c32); |
29 | result = 1; |
30 | continue; |
31 | } |
32 | |
33 | char32_t c32out; |
34 | size_t n2 = mbrtoc32 (pc32: &c32out, s: buf, n: n1, NULL); |
35 | if ((ssize_t) n2 < 0) |
36 | { |
37 | printf (format: "mbrtoc32 for U'\\x%" PRIx32 "' failed\n" , (uint32_t) c32); |
38 | result = 1; |
39 | continue; |
40 | } |
41 | if (n2 != n1) |
42 | { |
43 | printf (format: "mbrtoc32 for U'\\x%" PRIx32 "' consumed %zu bytes, not %zu\n" , |
44 | (uint32_t) c32, n2, n1); |
45 | result = 1; |
46 | } |
47 | else if (c32out != c32) |
48 | { |
49 | printf (format: "mbrtoc32 for U'\\x%" PRIx32 "' produced U'\\x%" PRIx32 "\n" , |
50 | (uint32_t) c32, (uint32_t) c32out); |
51 | result = 1; |
52 | } |
53 | |
54 | char16_t c16; |
55 | size_t n3 = mbrtoc16 (pc16: &c16, s: buf, n: n1, NULL); |
56 | if (n3 != n1) |
57 | { |
58 | printf (format: "mbrtoc16 for U'\\x%" PRIx32 "' did not consume all bytes\n" , |
59 | (uint32_t) c32); |
60 | result = 1; |
61 | continue; |
62 | } |
63 | if (c32 < 0x10000) |
64 | { |
65 | if (c16 != c32) |
66 | { |
67 | printf (format: "mbrtoc16 for U'\\x%" PRIx32 "' produce u'\\x%" PRIx16 "'\n" , |
68 | (uint32_t) c32, (uint16_t) c16); |
69 | result = 1; |
70 | continue; |
71 | } |
72 | } |
73 | else |
74 | { |
75 | buf[0] = '1'; |
76 | char16_t c16_2; |
77 | size_t n4 = mbrtoc16 (pc16: &c16_2, s: buf, n: 1, NULL); |
78 | if (n4 != (size_t) -3) |
79 | { |
80 | printf (format: "second mbrtoc16 for U'\\x%" PRIx32 "' did not return -3\n" , |
81 | (uint32_t) c32); |
82 | result = 1; |
83 | continue; |
84 | } |
85 | |
86 | if (c32 != (((uint32_t) (c16 - 0xd7c0)) << 10) + (c16_2 - 0xdc00)) |
87 | { |
88 | printf (format: "mbrtoc16 for U'\\x%" PRIx32 "' returns U'\\x%" PRIx32 "\n" , |
89 | (uint32_t) c32, |
90 | (((uint32_t) (c16 - 0xd7c0)) << 10) + (c16_2 - 0xdc00)); |
91 | result = 1; |
92 | continue; |
93 | } |
94 | } |
95 | |
96 | buf[0] = '\0'; |
97 | char16_t c16_nul; |
98 | n3 = mbrtoc16 (pc16: &c16_nul, s: buf, n: n1, NULL); |
99 | if (n3 != 0) |
100 | { |
101 | printf (format: "mbrtoc16 for '\\0' returns %zd\n" , n3); |
102 | result = 1; |
103 | continue; |
104 | } |
105 | |
106 | if (c32 < 0x10000) |
107 | { |
108 | size_t n5 = c16rtomb (s: buf, c16: c16, NULL); |
109 | if ((ssize_t) n5 < 0) |
110 | { |
111 | printf (format: "c16rtomb for U'\\x%" PRIx32 "' failed with %zd\n" , |
112 | (uint32_t) c32, n5); |
113 | result = 1; |
114 | continue; |
115 | } |
116 | if (n5 != n1) |
117 | { |
118 | printf (format: "c16rtomb for U'\\x%" PRIx32 "' produced %zu bytes instead of %zu bytes\n" , |
119 | (uint32_t) c32, n5, n1); |
120 | result = 1; |
121 | continue; |
122 | } |
123 | } |
124 | } |
125 | while ((c32 += 0x1111) <= U'\x12000'); |
126 | |
127 | return result; |
128 | } |
129 | |
130 | #define TEST_FUNCTION do_test () |
131 | #include "../test-skeleton.c" |
132 | |