@@ -615,6 +615,12 @@ string_decoder_getc_auto(espeak_ng_TEXT_DECODER *decoder) | |||
return c; | |||
} | |||
static uint32_t | |||
null_decoder_getc(espeak_ng_TEXT_DECODER *decoder) | |||
{ | |||
return 0; | |||
} | |||
typedef struct | |||
{ | |||
uint32_t (*get)(espeak_ng_TEXT_DECODER *decoder); | |||
@@ -678,10 +684,10 @@ text_decoder_decode_string(espeak_ng_TEXT_DECODER *decoder, | |||
if (enc->get == NULL) | |||
return ENS_UNKNOWN_TEXT_ENCODING; | |||
decoder->get = enc->get; | |||
decoder->get = string ? enc->get : null_decoder_getc; | |||
decoder->codepage = enc->codepage; | |||
decoder->current = (const uint8_t *)string; | |||
decoder->end = (const uint8_t *)(string + length); | |||
decoder->end = (const uint8_t *)(string ? string + length : string); | |||
return ENS_OK; | |||
} | |||
@@ -698,10 +704,10 @@ text_decoder_decode_string_auto(espeak_ng_TEXT_DECODER *decoder, | |||
if (enc->get == NULL) | |||
return ENS_UNKNOWN_TEXT_ENCODING; | |||
decoder->get = string_decoder_getc_auto; | |||
decoder->get = string ? string_decoder_getc_auto : null_decoder_getc; | |||
decoder->codepage = enc->codepage; | |||
decoder->current = (const uint8_t *)string; | |||
decoder->end = (const uint8_t *)(string + length); | |||
decoder->end = (const uint8_t *)(string ? string + length : string); | |||
return ENS_OK; | |||
} | |||
@@ -710,10 +716,10 @@ text_decoder_decode_wstring(espeak_ng_TEXT_DECODER *decoder, | |||
const wchar_t *string, | |||
int length) | |||
{ | |||
decoder->get = string_decoder_getc_wchar; | |||
decoder->get = string ? string_decoder_getc_wchar : null_decoder_getc; | |||
decoder->codepage = NULL; | |||
decoder->current = (const uint8_t *)string; | |||
decoder->end = (const uint8_t *)(string + length); | |||
decoder->end = (const uint8_t *)(string ? string + length : string); | |||
return ENS_OK; | |||
} | |||
@@ -728,6 +728,22 @@ test_iso_10646_ucs_2_encoding() | |||
destroy_text_decoder(decoder); | |||
} | |||
void | |||
test_char_decoder() | |||
{ | |||
printf("testing char decoder\n"); | |||
espeak_ng_TEXT_DECODER *decoder = create_text_decoder(); | |||
// null string | |||
assert(text_decoder_decode_string(decoder, NULL, 5, ESPEAKNG_ENCODING_ISO_8859_1) == ENS_OK); | |||
assert(text_decoder_eof(decoder) == 1); | |||
assert(text_decoder_getc(decoder) == 0); | |||
assert(text_decoder_eof(decoder) == 1); | |||
destroy_text_decoder(decoder); | |||
} | |||
void | |||
test_wchar_decoder() | |||
{ | |||
@@ -735,6 +751,12 @@ test_wchar_decoder() | |||
espeak_ng_TEXT_DECODER *decoder = create_text_decoder(); | |||
// null string | |||
assert(text_decoder_decode_wstring(decoder, NULL, 5) == ENS_OK); | |||
assert(text_decoder_eof(decoder) == 1); | |||
assert(text_decoder_getc(decoder) == 0); | |||
assert(text_decoder_eof(decoder) == 1); | |||
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'); | |||
@@ -756,6 +778,12 @@ test_auto_decoder() | |||
espeak_ng_TEXT_DECODER *decoder = create_text_decoder(); | |||
// null string | |||
assert(text_decoder_decode_string_auto(decoder, NULL, 5, ESPEAKNG_ENCODING_ISO_8859_1) == ENS_OK); | |||
assert(text_decoder_eof(decoder) == 1); | |||
assert(text_decoder_getc(decoder) == 0); | |||
assert(text_decoder_eof(decoder) == 1); | |||
// UTF-8 | |||
assert(text_decoder_decode_string_auto(decoder, "aG\xC2\xA0 ", 5, ESPEAKNG_ENCODING_ISO_8859_1) == ENS_OK); | |||
assert(text_decoder_eof(decoder) == 0); | |||
@@ -813,6 +841,7 @@ main(int argc, char **argv) | |||
test_utf_8_encoding(); | |||
test_iso_10646_ucs_2_encoding(); | |||
test_char_decoder(); | |||
test_wchar_decoder(); | |||
test_auto_decoder(); | |||