mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-09 17:38:00 +00:00
36 lines
1019 B
C
36 lines
1019 B
C
|
/*
|
||
|
* 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;
|
||
|
}
|