@@ -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; |