int ix; | int ix; | ||||
unsigned int digit_count = 0; | unsigned int digit_count = 0; | ||||
char *p; | char *p; | ||||
char word_buf[5]; | |||||
const ALPHABET *alphabet; | const ALPHABET *alphabet; | ||||
int dict_flags0 = 0; | int dict_flags0 = 0; | ||||
MatchRecord match1 = { 0 }; | MatchRecord match1 = { 0 }; | ||||
if (((alphabet = AlphabetFromChar(letter)) != NULL) && (alphabet->offset != tr->letter_bits_offset)) { | if (((alphabet = AlphabetFromChar(letter)) != NULL) && (alphabet->offset != tr->letter_bits_offset)) { | ||||
if (tr->langopts.alt_alphabet == alphabet->offset) { | if (tr->langopts.alt_alphabet == alphabet->offset) { | ||||
sprintf(phonemes, "%c%s", phonSWITCH, WordToString2(tr->langopts.alt_alphabet_lang)); | |||||
sprintf(phonemes, "%c%s", phonSWITCH, WordToString2(word_buf, tr->langopts.alt_alphabet_lang)); | |||||
return 0; | return 0; | ||||
} | } | ||||
if (alphabet->flags & AL_WORDS) { | if (alphabet->flags & AL_WORDS) { | ||||
// switch to the nominated language for this alphabet | // switch to the nominated language for this alphabet | ||||
sprintf(phonemes, "%c%s", phonSWITCH, WordToString2(alphabet->language)); | |||||
sprintf(phonemes, "%c%s", phonSWITCH, WordToString2(word_buf, alphabet->language)); | |||||
return 0; | return 0; | ||||
} | } | ||||
} | } |
ungot_char = c; | ungot_char = c; | ||||
} | } | ||||
const char *WordToString2(unsigned int word) | |||||
const char *WordToString2(char buf[5], unsigned int word) | |||||
{ | { | ||||
// Convert a language mnemonic word into a string | // Convert a language mnemonic word into a string | ||||
int ix; | int ix; | ||||
static char buf[5]; | |||||
char *p; | char *p; | ||||
MAKE_MEM_UNDEFINED(&buf, sizeof(buf)); | |||||
p = buf; | p = buf; | ||||
for (ix = 3; ix >= 0; ix--) { | for (ix = 3; ix >= 0; ix--) { | ||||
if ((*p = word >> (ix*8)) != 0) | if ((*p = word >> (ix*8)) != 0) | ||||
return NULL; | return NULL; | ||||
} | } | ||||
static const char *LookupCharName(Translator *tr, int c, bool only) | |||||
static const char *LookupCharName(char buf[60], Translator *tr, int c, bool only) | |||||
{ | { | ||||
// Find the phoneme string (in ascii) to speak the name of character c | // Find the phoneme string (in ascii) to speak the name of character c | ||||
// Used for punctuation characters and symbols | // Used for punctuation characters and symbols | ||||
char phonemes[60]; | char phonemes[60]; | ||||
const char *lang_name = NULL; | const char *lang_name = NULL; | ||||
char *string; | char *string; | ||||
static char buf[60]; | |||||
MAKE_MEM_UNDEFINED(&buf, sizeof(buf)); | |||||
buf[0] = 0; | buf[0] = 0; | ||||
flags[0] = 0; | flags[0] = 0; | ||||
int bufix1; | int bufix1; | ||||
char buf[200]; | char buf[200]; | ||||
char ph_buf[30]; | char ph_buf[30]; | ||||
char cn_buf[60]; | |||||
c2 = *c2_ptr; | c2 = *c2_ptr; | ||||
buf[0] = 0; | buf[0] = 0; | ||||
punctname = ph_buf; // use word for 'period' instead of 'dot' | punctname = ph_buf; // use word for 'period' instead of 'dot' | ||||
} | } | ||||
if (punctname == NULL) | if (punctname == NULL) | ||||
punctname = LookupCharName(tr, c1, false); | |||||
punctname = LookupCharName(cn_buf, tr, c1, false); | |||||
if (punctname == NULL) | if (punctname == NULL) | ||||
return -1; | return -1; | ||||
char *p2; | char *p2; | ||||
p2 = &buf[ix]; | p2 = &buf[ix]; | ||||
sprintf(p2, "%s", LookupCharName(tr, c1, true)); | |||||
char cn_buf[60]; | |||||
sprintf(p2, "%s", LookupCharName(cn_buf, tr, c1, true)); | |||||
if (p2[0] != 0) { | if (p2[0] != 0) { | ||||
ix += strlen(p2); | ix += strlen(p2); | ||||
announced_punctuation = c1; | announced_punctuation = c1; | ||||
} else { | } else { | ||||
SetWordStress(tr2, phonemes, flags, -1, 0); | SetWordStress(tr2, phonemes, flags, -1, 0); | ||||
DecodePhonemes(phonemes, phonemes2); | DecodePhonemes(phonemes, phonemes2); | ||||
sprintf(buf, "[\002_^_%s %s _^_%s]]", ESPEAKNG_DEFAULT_VOICE, phonemes2, WordToString2(tr->translator_name)); | |||||
char wbuf[5]; | |||||
sprintf(buf, "[\002_^_%s %s _^_%s]]", ESPEAKNG_DEFAULT_VOICE, phonemes2, WordToString2(wbuf, tr->translator_name)); | |||||
} | } | ||||
} | |||||
} |
int clause_type_from_codepoint(uint32_t c); | int clause_type_from_codepoint(uint32_t c); | ||||
int Eof(void); | int Eof(void); | ||||
const char *WordToString2(unsigned int word); | |||||
const char *WordToString2(char buf[5], unsigned int word); | |||||
int AddNameData(const char *name, | int AddNameData(const char *name, | ||||
int wide); | int wide); | ||||
int ReadClause(Translator *tr, | int ReadClause(Translator *tr, |
char hangul_buf[12]; | char hangul_buf[12]; | ||||
// speak in the language for this alphabet (or English) | // speak in the language for this alphabet (or English) | ||||
ph_buf[2] = SetTranslator3(WordToString2(language)); | |||||
char word_buf[5]; | |||||
ph_buf[2] = SetTranslator3(WordToString2(word_buf, language)); | |||||
if (translator3 != NULL) { | if (translator3 != NULL) { | ||||
int code; | int code; |
if ((voice_select2.languages == NULL) || (voice_select2.languages[0] == 0)) { | if ((voice_select2.languages == NULL) || (voice_select2.languages[0] == 0)) { | ||||
// no language is specified. Get language from the named voice | // no language is specified. Get language from the named voice | ||||
static char buf[60]; | |||||
MAKE_MEM_UNDEFINED(&buf, sizeof(buf)); | |||||
char buf[60]; | |||||
if (voice_select2.name == NULL) { | if (voice_select2.name == NULL) { | ||||
if ((voice_select2.name = voice_select2.identifier) == NULL) | if ((voice_select2.name = voice_select2.identifier) == NULL) |