123456789101112131415161718192021222324252627282930313233343536 |
- /*
- * Decode a string of UTF-8 to a wchar_t string.
- */
- #include "misc.h"
- wchar_t *decode_utf8_to_wide_string(const char *s)
- {
- wchar_t *ws = NULL;
- size_t wlen = 0, wsize = 0;
- BinarySource src[1];
- BinarySource_BARE_INIT_PL(src, ptrlen_from_asciz(s));
- while (get_avail(src) > 0) {
- /*
- * decode_utf8_to_wchar might emit up to 2 wchar_t if wchar_t
- * is 16 bits (because of UTF-16 surrogates), but will emit at
- * most one if wchar_t is 32-bit
- */
- sgrowarrayn(ws, wsize, wlen, 1 + (sizeof(wchar_t) < 4));
- /* We ignore 'err': if it is set, then the character decode
- * function will have emitted U+FFFD REPLACEMENT CHARACTER,
- * which is what we'd have done in response anyway. */
- DecodeUTF8Failure err;
- wlen += decode_utf8_to_wchar(src, ws + wlen, &err);
- }
- /* Reallocate to the final size and append the trailing NUL */
- ws = sresize(ws, wlen + 1, wchar_t);
- ws[wlen] = L'\0';
- return ws;
- }
|