| @@ -581,6 +581,14 @@ string_decoder_getc_iso_10646_ucs_2(espeak_ng_TEXT_DECODER *decoder) | |||
| return c1 + (c2 << 8); | |||
| } | |||
| static uint32_t | |||
| string_decoder_getc_wchar(espeak_ng_TEXT_DECODER *decoder) | |||
| { | |||
| wchar_t c = *(const wchar_t *)decoder->current; | |||
| decoder->current += sizeof(wchar_t); | |||
| return c; | |||
| } | |||
| typedef struct | |||
| { | |||
| uint32_t (*get)(espeak_ng_TEXT_DECODER *decoder); | |||
| @@ -651,6 +659,18 @@ text_decoder_decode_string(espeak_ng_TEXT_DECODER *decoder, | |||
| return ENS_OK; | |||
| } | |||
| espeak_ng_STATUS | |||
| text_decoder_decode_wstring(espeak_ng_TEXT_DECODER *decoder, | |||
| const wchar_t *string, | |||
| int length) | |||
| { | |||
| decoder->get = string_decoder_getc_wchar; | |||
| decoder->codepage = NULL; | |||
| decoder->current = (const uint8_t *)string; | |||
| decoder->end = (const uint8_t *)(string + length); | |||
| return ENS_OK; | |||
| } | |||
| int | |||
| text_decoder_eof(espeak_ng_TEXT_DECODER *decoder) | |||
| { | |||
| @@ -36,6 +36,11 @@ text_decoder_decode_string(espeak_ng_TEXT_DECODER *decoder, | |||
| int length, | |||
| espeak_ng_ENCODING encoding); | |||
| espeak_ng_STATUS | |||
| text_decoder_decode_wstring(espeak_ng_TEXT_DECODER *decoder, | |||
| const wchar_t *string, | |||
| int length); | |||
| int | |||
| text_decoder_eof(espeak_ng_TEXT_DECODER *decoder); | |||
| @@ -728,6 +728,27 @@ test_iso_10646_ucs_2_encoding() | |||
| destroy_text_decoder(decoder); | |||
| } | |||
| void | |||
| test_wchar_decoder() | |||
| { | |||
| printf("testing wchar_t decoder\n"); | |||
| espeak_ng_TEXT_DECODER *decoder = create_text_decoder(); | |||
| assert(text_decoder_decode_wstring(decoder, L"aG\xA0\x2045", 4) == ENS_OK); | |||
| assert(text_decoder_eof(decoder) == 0); | |||
| assert(text_decoder_getc(decoder) == 'a'); | |||
| assert(text_decoder_eof(decoder) == 0); | |||
| assert(text_decoder_getc(decoder) == 'G'); | |||
| assert(text_decoder_eof(decoder) == 0); | |||
| assert(text_decoder_getc(decoder) == 0xA0); | |||
| assert(text_decoder_eof(decoder) == 0); | |||
| assert(text_decoder_getc(decoder) == 0x2045); | |||
| assert(text_decoder_eof(decoder) == 1); | |||
| destroy_text_decoder(decoder); | |||
| } | |||
| int | |||
| main(int argc, char **argv) | |||
| { | |||
| @@ -758,6 +779,8 @@ main(int argc, char **argv) | |||
| test_utf_8_encoding(); | |||
| test_iso_10646_ucs_2_encoding(); | |||
| test_wchar_decoder(); | |||
| printf("done\n"); | |||
| return EXIT_SUCCESS; | |||