49 const std::locale global;
51 typedef std::codecvt<wchar_t, char, std::mbstate_t>
CodeCvt;
54 const CodeCvt &
cvt = std::use_facet<CodeCvt>(global);
64 const char* from = src;
65 const char*
const from_end = from + std::strlen (from);
66 const char* from_next = from;
70 wchar_t*
const to_end = to +
size;
74 std::size_t nconv = 0;
77 std::mbstate_t state = std::mbstate_t ();
81 for ( ; from_next != from_end && to != to_end;
82 from = from_next, to = dst ==
buf ? dst : to_next) {
86 const std::codecvt_base::result
res =
88 from, from_end, from_next,
92 assert (from <= from_next && from_next <= from_end);
93 assert (to <= to_next && to_next <= to_end);
98 case std::codecvt_base::error:
101 return std::size_t (-1);
103 case std::codecvt_base::noconv:
108 return std::size_t (-1);
110 case std::codecvt_base::partial:
114 if (dst !=
buf || std::size_t (to_next - to) <
size) {
116 return std::size_t (-1);
119 nconv += to_next - to;
122 case std::codecvt_base::ok:
125 nconv += to_next - to;
127 if (dst ==
buf && from_next == from_end)
140 static const char*
const mbs [] = {
147 "\xce\x91\xce\x92\xce\x93",
151 "\xe0\xa5\xa7\xe0\xa5\xa6",
153 "\xe0\xa5\xa8\xe0\xa5\xa7\xe0\xa5\xa6"
156 typedef std::codecvt_byname<wchar_t, char, std::mbstate_t>
CodeCvt;
159 const std::locale utf (std::locale (
""),
new CodeCvt (
"UTF-8@UCS"));
162 std::locale::global (utf);
166 for (std::size_t
i = 0;
i !=
sizeof mbs /
sizeof *mbs; ++
i) {
171 std::mbstate_t state = std::mbstate_t ();
176 const std::size_t length =
179 if (std::size_t (-1) == length) {
180 std::cerr <<
"Error computing length of destination sequence.\n";
186 dst =
new wchar_t [length + 1];
189 state = std::mbstate_t ();
193 const std::size_t nconv =
196 if (length != nconv) {
197 std::cerr <<
"Error converting source sequence.\n";
205 std::cout <<
"UCS-2 (" << std::dec << length <<
"): " << std::hex;
207 for (
const wchar_t *pwc = dst; *pwc !=
L'\0'; ++pwc)
208 std::cout <<
"U+" <<
unsigned (*pwc) <<
' ';
210 std::cout <<
" ==> UTF-8: ";
212 typedef unsigned char UChar;
214 for (
const char *pc = mbs [
i]; *pc; ++pc)
215 std::cout <<
"\\x" <<
int (
UChar (*pc));
std::size_t my_mbsrtowcs(std::mbstate_t *pstate, wchar_t *dst, const char *src, std::size_t size)