1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // <codecvt>
10 
11 // template <class Elem, unsigned long Maxcode = 0x10ffff,
12 //           codecvt_mode Mode = (codecvt_mode)0>
13 // class codecvt_utf8
14 //     : public codecvt<Elem, char, mbstate_t>
15 // {
16 //     // unspecified
17 // };
18 
19 // int length(stateT& state, const externT* from, const externT* from_end,
20 //            size_t max) const;
21 
22 #include <codecvt>
23 #include <cassert>
24 
25 int main(int, char**)
26 {
27     {
28         typedef std::codecvt_utf8<wchar_t> C;
29         C c;
30         char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
31         std::mbstate_t m;
32         int r = c.length(m, n, n+4, 1);
33         assert(r == 4);
34 
35         n[0] = char(0xE1);
36         n[1] = char(0x80);
37         n[2] = char(0x85);
38         r = c.length(m, n, n+3, 2);
39         assert(r == 3);
40 
41         n[0] = char(0xD1);
42         n[1] = char(0x93);
43         r = c.length(m, n, n+2, 3);
44         assert(r == 2);
45 
46         n[0] = char(0x56);
47         r = c.length(m, n, n+1, 3);
48         assert(r == 1);
49     }
50     {
51         typedef std::codecvt_utf8<wchar_t, 0x1000> C;
52         C c;
53         char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
54         std::mbstate_t m;
55         int r = c.length(m, n, n+4, 1);
56         assert(r == 0);
57 
58         n[0] = char(0xE1);
59         n[1] = char(0x80);
60         n[2] = char(0x85);
61         r = c.length(m, n, n+3, 2);
62         assert(r == 0);
63 
64         n[0] = char(0xD1);
65         n[1] = char(0x93);
66         r = c.length(m, n, n+2, 3);
67         assert(r == 2);
68 
69         n[0] = char(0x56);
70         r = c.length(m, n, n+1, 3);
71         assert(r == 1);
72     }
73     {
74         typedef std::codecvt_utf8<wchar_t, 0xFFFFFFFF, std::consume_header> C;
75         C c;
76         char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};
77         std::mbstate_t m;
78         int r = c.length(m, n, n+7, 1);
79         assert(r == 7);
80 
81         n[0] = char(0xE1);
82         n[1] = char(0x80);
83         n[2] = char(0x85);
84         r = c.length(m, n, n+3, 2);
85         assert(r == 3);
86 
87         n[0] = char(0xEF);
88         n[1] = char(0xBB);
89         n[2] = char(0xBF);
90         n[3] = char(0xD1);
91         n[4] = char(0x93);
92         r = c.length(m, n, n+5, 3);
93         assert(r == 5);
94 
95         n[0] = char(0x56);
96         r = c.length(m, n, n+1, 3);
97         assert(r == 1);
98     }
99     {
100         typedef std::codecvt_utf8<char32_t> C;
101         C c;
102         char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
103         std::mbstate_t m;
104         int r = c.length(m, n, n+4, 1);
105         assert(r == 4);
106 
107         n[0] = char(0xE1);
108         n[1] = char(0x80);
109         n[2] = char(0x85);
110         r = c.length(m, n, n+3, 2);
111         assert(r == 3);
112 
113         n[0] = char(0xD1);
114         n[1] = char(0x93);
115         r = c.length(m, n, n+2, 3);
116         assert(r == 2);
117 
118         n[0] = char(0x56);
119         r = c.length(m, n, n+1, 3);
120         assert(r == 1);
121     }
122     {
123         typedef std::codecvt_utf8<char32_t, 0x1000> C;
124         C c;
125         char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
126         std::mbstate_t m;
127         int r = c.length(m, n, n+4, 1);
128         assert(r == 0);
129 
130         n[0] = char(0xE1);
131         n[1] = char(0x80);
132         n[2] = char(0x85);
133         r = c.length(m, n, n+3, 2);
134         assert(r == 0);
135 
136         n[0] = char(0xD1);
137         n[1] = char(0x93);
138         r = c.length(m, n, n+2, 3);
139         assert(r == 2);
140 
141         n[0] = char(0x56);
142         r = c.length(m, n, n+1, 3);
143         assert(r == 1);
144     }
145     {
146         typedef std::codecvt_utf8<char32_t, 0xFFFFFFFF, std::consume_header> C;
147         C c;
148         char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};
149         std::mbstate_t m;
150         int r = c.length(m, n, n+7, 1);
151         assert(r == 7);
152 
153         n[0] = char(0xE1);
154         n[1] = char(0x80);
155         n[2] = char(0x85);
156         r = c.length(m, n, n+3, 2);
157         assert(r == 3);
158 
159         n[0] = char(0xEF);
160         n[1] = char(0xBB);
161         n[2] = char(0xBF);
162         n[3] = char(0xD1);
163         n[4] = char(0x93);
164         r = c.length(m, n, n+5, 3);
165         assert(r == 5);
166 
167         n[0] = char(0x56);
168         r = c.length(m, n, n+1, 3);
169         assert(r == 1);
170     }
171     {
172         typedef std::codecvt_utf8<char16_t> C;
173         C c;
174         char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
175         std::mbstate_t m;
176         int r = c.length(m, n, n+4, 1);
177         assert(r == 0);
178 
179         n[0] = char(0xE1);
180         n[1] = char(0x80);
181         n[2] = char(0x85);
182         r = c.length(m, n, n+3, 2);
183         assert(r == 3);
184 
185         n[0] = char(0xD1);
186         n[1] = char(0x93);
187         r = c.length(m, n, n+2, 3);
188         assert(r == 2);
189 
190         n[0] = char(0x56);
191         r = c.length(m, n, n+1, 3);
192         assert(r == 1);
193     }
194     {
195         typedef std::codecvt_utf8<char16_t, 0x1000> C;
196         C c;
197         char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
198         std::mbstate_t m;
199         int r = c.length(m, n, n+4, 1);
200         assert(r == 0);
201 
202         n[0] = char(0xE1);
203         n[1] = char(0x80);
204         n[2] = char(0x85);
205         r = c.length(m, n, n+3, 2);
206         assert(r == 0);
207 
208         n[0] = char(0xD1);
209         n[1] = char(0x93);
210         r = c.length(m, n, n+2, 3);
211         assert(r == 2);
212 
213         n[0] = char(0x56);
214         r = c.length(m, n, n+1, 3);
215         assert(r == 1);
216     }
217     {
218         typedef std::codecvt_utf8<char16_t, 0xFFFFFFFF, std::consume_header> C;
219         C c;
220         char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};
221         std::mbstate_t m;
222         int r = c.length(m, n, n+7, 1);
223         assert(r == 3);
224 
225         n[0] = char(0xE1);
226         n[1] = char(0x80);
227         n[2] = char(0x85);
228         r = c.length(m, n, n+3, 2);
229         assert(r == 3);
230 
231         n[0] = char(0xEF);
232         n[1] = char(0xBB);
233         n[2] = char(0xBF);
234         n[3] = char(0xD1);
235         n[4] = char(0x93);
236         r = c.length(m, n, n+5, 3);
237         assert(r == 5);
238 
239         n[0] = char(0x56);
240         r = c.length(m, n, n+1, 3);
241         assert(r == 1);
242     }
243 
244   return 0;
245 }
246