codecvt_utf8_length.pass.cpp revision 87d1a8a4d81892ccfaf1319d056880e89a17528e
1//===----------------------------------------------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. 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 26int main() 27{ 28 { 29 typedef std::codecvt_utf8<wchar_t> C; 30 C c; 31 char n[4] = {0xF1, 0x80, 0x80, 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] = {0xF1, 0x80, 0x80, 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] = {0xEF, 0xBB, 0xBF, 0xF1, 0x80, 0x80, 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] = {0xF1, 0x80, 0x80, 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] = {0xF1, 0x80, 0x80, 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] = {0xEF, 0xBB, 0xBF, 0xF1, 0x80, 0x80, 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] = {0xF1, 0x80, 0x80, 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] = {0xF1, 0x80, 0x80, 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] = {0xEF, 0xBB, 0xBF, 0xF1, 0x80, 0x80, 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