From 6a0b5e4ae1aab3dc71d7b9d346ee4bbbe50060bf Mon Sep 17 00:00:00 2001 From: "Reece H. Dunn" Date: Thu, 30 Mar 2017 22:52:38 +0100 Subject: [PATCH] encoding.c: Support using wchar_t strings with the text decoder API. --- src/libespeak-ng/encoding.c | 20 ++++++++++++++++++++ src/libespeak-ng/encoding.h | 5 +++++ tests/encoding.c | 23 +++++++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/src/libespeak-ng/encoding.c b/src/libespeak-ng/encoding.c index 0e43c17e..f949aab0 100644 --- a/src/libespeak-ng/encoding.c +++ b/src/libespeak-ng/encoding.c @@ -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) { diff --git a/src/libespeak-ng/encoding.h b/src/libespeak-ng/encoding.h index 830344df..cfa57260 100644 --- a/src/libespeak-ng/encoding.h +++ b/src/libespeak-ng/encoding.h @@ -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); diff --git a/tests/encoding.c b/tests/encoding.c index b8140b05..a9199b81 100644 --- a/tests/encoding.c +++ b/tests/encoding.c @@ -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;