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