Browse Source

encoding.c: Support using wchar_t strings with the text decoder API.

master
Reece H. Dunn 8 years ago
parent
commit
6a0b5e4ae1
3 changed files with 48 additions and 0 deletions
  1. 20
    0
      src/libespeak-ng/encoding.c
  2. 5
    0
      src/libespeak-ng/encoding.h
  3. 23
    0
      tests/encoding.c

+ 20
- 0
src/libespeak-ng/encoding.c View File

return c1 + (c2 << 8); 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 typedef struct
{ {
uint32_t (*get)(espeak_ng_TEXT_DECODER *decoder); uint32_t (*get)(espeak_ng_TEXT_DECODER *decoder);
return ENS_OK; 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 int
text_decoder_eof(espeak_ng_TEXT_DECODER *decoder) text_decoder_eof(espeak_ng_TEXT_DECODER *decoder)
{ {

+ 5
- 0
src/libespeak-ng/encoding.h View File

int length, int length,
espeak_ng_ENCODING encoding); espeak_ng_ENCODING encoding);


espeak_ng_STATUS
text_decoder_decode_wstring(espeak_ng_TEXT_DECODER *decoder,
const wchar_t *string,
int length);

int int
text_decoder_eof(espeak_ng_TEXT_DECODER *decoder); text_decoder_eof(espeak_ng_TEXT_DECODER *decoder);



+ 23
- 0
tests/encoding.c View File

destroy_text_decoder(decoder); 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 int
main(int argc, char **argv) main(int argc, char **argv)
{ {
test_utf_8_encoding(); test_utf_8_encoding();
test_iso_10646_ucs_2_encoding(); test_iso_10646_ucs_2_encoding();


test_wchar_decoder();

printf("done\n"); printf("done\n");


return EXIT_SUCCESS; return EXIT_SUCCESS;

Loading…
Cancel
Save