| #include "synthesize.h" | #include "synthesize.h" | ||||
| #include "translate.h" | #include "translate.h" | ||||
| #define LEADING_2_BITS 0xC0 // 0b11000000 | |||||
| #define UTF8_TAIL_BITS 0x80 // 0b10000000 | |||||
| int utf8_out(unsigned int c, char *buf) | |||||
| { | |||||
| // write a unicode character into a buffer as utf8 | |||||
| // returns the number of bytes written | |||||
| int n_bytes; | |||||
| int j; | |||||
| int shift; | |||||
| static char unsigned code[4] = { 0, 0xc0, 0xe0, 0xf0 }; | |||||
| if (c < 0x80) { | |||||
| buf[0] = c; | |||||
| return 1; | |||||
| } | |||||
| if (c >= 0x110000) { | |||||
| buf[0] = ' '; // out of range character code | |||||
| return 1; | |||||
| } | |||||
| if (c < 0x0800) | |||||
| n_bytes = 1; | |||||
| else if (c < 0x10000) | |||||
| n_bytes = 2; | |||||
| else | |||||
| n_bytes = 3; | |||||
| shift = 6*n_bytes; | |||||
| buf[0] = code[n_bytes] | (c >> shift); | |||||
| for (j = 0; j < n_bytes; j++) { | |||||
| shift -= 6; | |||||
| buf[j+1] = 0x80 + ((c >> shift) & 0x3f); | |||||
| } | |||||
| return n_bytes+1; | |||||
| } | |||||
| // http://www.iana.org/assignments/character-sets/character-sets.xhtml | // http://www.iana.org/assignments/character-sets/character-sets.xhtml | ||||
| MNEM_TAB mnem_encoding[] = { | MNEM_TAB mnem_encoding[] = { | ||||
| { "ANSI_X3.4-1968", ESPEAKNG_ENCODING_US_ASCII }, | { "ANSI_X3.4-1968", ESPEAKNG_ENCODING_US_ASCII }, |
| } | } | ||||
| #pragma GCC visibility pop | #pragma GCC visibility pop | ||||
| int utf8_out(unsigned int c, char *buf) | |||||
| { | |||||
| // write a unicode character into a buffer as utf8 | |||||
| // returns the number of bytes written | |||||
| int n_bytes; | |||||
| int j; | |||||
| int shift; | |||||
| static char unsigned code[4] = { 0, 0xc0, 0xe0, 0xf0 }; | |||||
| if (c < 0x80) { | |||||
| buf[0] = c; | |||||
| return 1; | |||||
| } | |||||
| if (c >= 0x110000) { | |||||
| buf[0] = ' '; // out of range character code | |||||
| return 1; | |||||
| } | |||||
| if (c < 0x0800) | |||||
| n_bytes = 1; | |||||
| else if (c < 0x10000) | |||||
| n_bytes = 2; | |||||
| else | |||||
| n_bytes = 3; | |||||
| shift = 6*n_bytes; | |||||
| buf[0] = code[n_bytes] | (c >> shift); | |||||
| for (j = 0; j < n_bytes; j++) { | |||||
| shift -= 6; | |||||
| buf[j+1] = 0x80 + ((c >> shift) & 0x3f); | |||||
| } | |||||
| return n_bytes+1; | |||||
| } | |||||
| char *strchr_w(const char *s, int c) | char *strchr_w(const char *s, int c) | ||||
| { | { | ||||
| // return NULL for any non-ascii character | // return NULL for any non-ascii character |
| void LoadConfig(void); | void LoadConfig(void); | ||||
| int TransposeAlphabet(Translator *tr, char *text); | int TransposeAlphabet(Translator *tr, char *text); | ||||
| #define LEADING_2_BITS 0xC0 // 0b11000000 | |||||
| #define UTF8_TAIL_BITS 0x80 // 0b10000000 | |||||
| ESPEAK_NG_API int utf8_in(int *c, const char *buf); | ESPEAK_NG_API int utf8_in(int *c, const char *buf); | ||||
| int utf8_in2(int *c, const char *buf, int backwards); | int utf8_in2(int *c, const char *buf, int backwards); | ||||
| int utf8_out(unsigned int c, char *buf); | int utf8_out(unsigned int c, char *buf); | ||||
| int utf8_nbytes(const char *buf); | int utf8_nbytes(const char *buf); | ||||
| int lookupwchar(const unsigned short *list, int c); | int lookupwchar(const unsigned short *list, int c); | ||||
| int lookupwchar2(const unsigned short *list, int c); | int lookupwchar2(const unsigned short *list, int c); | ||||
| int Eof(void); | int Eof(void); |