return 0; | return 0; | ||||
} | } | ||||
static int GetVowelStress(Translator *tr, unsigned char *phonemes, signed char *vowel_stress, int *vowel_count, int *stressed_syllable, int control) | |||||
int GetVowelStress(Translator *tr, unsigned char *phonemes, signed char *vowel_stress, int *vowel_count, int *stressed_syllable, int control) | |||||
{ | { | ||||
// control = 1, set stress to 1 for forced unstressed vowels | // control = 1, set stress to 1 for forced unstressed vowels | ||||
unsigned char phcode; | unsigned char phcode; | ||||
return max_stress; | return max_stress; | ||||
} | } | ||||
static char stress_phonemes[] = { | |||||
const char stress_phonemes[] = { | |||||
phonSTRESS_D, phonSTRESS_U, phonSTRESS_2, phonSTRESS_3, | phonSTRESS_D, phonSTRESS_U, phonSTRESS_2, phonSTRESS_3, | ||||
phonSTRESS_P, phonSTRESS_P2, phonSTRESS_TONIC | phonSTRESS_P, phonSTRESS_P2, phonSTRESS_TONIC | ||||
}; | }; | ||||
void ChangeWordStress(Translator *tr, char *word, int new_stress) | |||||
{ | |||||
int ix; | |||||
unsigned char *p; | |||||
int max_stress; | |||||
int vowel_count; // num of vowels + 1 | |||||
int stressed_syllable = 0; // position of stressed syllable | |||||
unsigned char phonetic[N_WORD_PHONEMES]; | |||||
signed char vowel_stress[N_WORD_PHONEMES/2]; | |||||
strcpy((char *)phonetic, word); | |||||
max_stress = GetVowelStress(tr, phonetic, vowel_stress, &vowel_count, &stressed_syllable, 0); | |||||
if (new_stress >= STRESS_IS_PRIMARY) { | |||||
// promote to primary stress | |||||
for (ix = 1; ix < vowel_count; ix++) { | |||||
if (vowel_stress[ix] >= max_stress) { | |||||
vowel_stress[ix] = new_stress; | |||||
break; | |||||
} | |||||
} | |||||
} else { | |||||
// remove primary stress | |||||
for (ix = 1; ix < vowel_count; ix++) { | |||||
if (vowel_stress[ix] > new_stress) // >= allows for diminished stress (=1) | |||||
vowel_stress[ix] = new_stress; | |||||
} | |||||
} | |||||
// write out phonemes | |||||
ix = 1; | |||||
p = phonetic; | |||||
while (*p != 0) { | |||||
if ((phoneme_tab[*p]->type == phVOWEL) && !(phoneme_tab[*p]->phflags & phNONSYLLABIC)) { | |||||
if ((vowel_stress[ix] == STRESS_IS_DIMINISHED) || (vowel_stress[ix] > STRESS_IS_UNSTRESSED)) | |||||
*word++ = stress_phonemes[(unsigned char)vowel_stress[ix]]; | |||||
ix++; | |||||
} | |||||
*word++ = *p++; | |||||
} | |||||
*word = 0; | |||||
} | |||||
void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, int tonic, int control) | void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, int tonic, int control) | ||||
{ | { | ||||
/* Guess stress pattern of word. This is language specific | /* Guess stress pattern of word. This is language specific |
{ | { | ||||
#endif | #endif | ||||
extern const char stress_phonemes[]; | |||||
int LoadDictionary(Translator *tr, const char *name, int no_error); | int LoadDictionary(Translator *tr, const char *name, int no_error); | ||||
int HashDictionary(const char *string); | int HashDictionary(const char *string); | ||||
const char *EncodePhonemes(const char *p, char *outptr, int *bad_phoneme); | const char *EncodePhonemes(const char *p, char *outptr, int *bad_phoneme); | ||||
void DecodePhonemes(const char *inptr, char *outptr); | void DecodePhonemes(const char *inptr, char *outptr); | ||||
char *WritePhMnemonic(char *phon_out, PHONEME_TAB *ph, PHONEME_LIST *plist, int use_ipa, int *flags); | char *WritePhMnemonic(char *phon_out, PHONEME_TAB *ph, PHONEME_LIST *plist, int use_ipa, int *flags); | ||||
const char *GetTranslatedPhonemeString(int phoneme_mode); | const char *GetTranslatedPhonemeString(int phoneme_mode); | ||||
int GetVowelStress(Translator *tr, unsigned char *phonemes, signed char *vowel_stress, int *vowel_count, int *stressed_syllable, int control); | |||||
int IsVowel(Translator *tr, int letter); | int IsVowel(Translator *tr, int letter); | ||||
int Unpronouncable(Translator *tr, char *word, int posn); | int Unpronouncable(Translator *tr, char *word, int posn); | ||||
void ChangeWordStress(Translator *tr, char *word, int new_stress); | |||||
void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, int tonic, int control); | void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, int tonic, int control); | ||||
void AppendPhonemes(Translator *tr, char *string, int size, const char *ph); | void AppendPhonemes(Translator *tr, char *string, int size, const char *ph); | ||||
int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, char *end_phonemes, int word_flags, unsigned int *dict_flags); | int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, char *end_phonemes, int word_flags, unsigned int *dict_flags); |
#include "translate.h" | #include "translate.h" | ||||
#include "translateword.h" | #include "translateword.h" | ||||
#include "common.h" // for strncpy0 | #include "common.h" // for strncpy0 | ||||
#include "dictionary.h" // for TranslateRules, LookupDictList, Cha... | |||||
#include "dictionary.h" // for TranslateRules, LookupDictList | |||||
#include "numbers.h" // for SetSpellingStress, ... | #include "numbers.h" // for SetSpellingStress, ... | ||||
#include "phoneme.h" // for phonSWITCH, PHONEME_TAB, phonPAUSE_... | #include "phoneme.h" // for phonSWITCH, PHONEME_TAB, phonPAUSE_... | ||||
#include "readclause.h" // for towlower2 | #include "readclause.h" // for towlower2 | ||||
static void addPluralSuffixes(int flags, Translator *tr, char last_char, char *word_phonemes); | static void addPluralSuffixes(int flags, Translator *tr, char last_char, char *word_phonemes); | ||||
static void ChangeWordStress(Translator *tr, char *word, int new_stress); | |||||
static int CheckDottedAbbrev(char *word1); | static int CheckDottedAbbrev(char *word1); | ||||
static int NonAsciiNumber(int letter); | static int NonAsciiNumber(int letter); | ||||
static char *SpeakIndividualLetters(Translator *tr, char *word, char *phonemes, int spell_word, ALPHABET *current_alphabet, char word_phonemes[]); | static char *SpeakIndividualLetters(Translator *tr, char *word, char *phonemes, int spell_word, ALPHABET *current_alphabet, char word_phonemes[]); | ||||
} | } | ||||
static void ChangeWordStress(Translator *tr, char *word, int new_stress) | |||||
{ | |||||
int ix; | |||||
unsigned char *p; | |||||
int max_stress; | |||||
int vowel_count; // num of vowels + 1 | |||||
int stressed_syllable = 0; // position of stressed syllable | |||||
unsigned char phonetic[N_WORD_PHONEMES]; | |||||
signed char vowel_stress[N_WORD_PHONEMES/2]; | |||||
strcpy((char *)phonetic, word); | |||||
max_stress = GetVowelStress(tr, phonetic, vowel_stress, &vowel_count, &stressed_syllable, 0); | |||||
if (new_stress >= STRESS_IS_PRIMARY) { | |||||
// promote to primary stress | |||||
for (ix = 1; ix < vowel_count; ix++) { | |||||
if (vowel_stress[ix] >= max_stress) { | |||||
vowel_stress[ix] = new_stress; | |||||
break; | |||||
} | |||||
} | |||||
} else { | |||||
// remove primary stress | |||||
for (ix = 1; ix < vowel_count; ix++) { | |||||
if (vowel_stress[ix] > new_stress) // >= allows for diminished stress (=1) | |||||
vowel_stress[ix] = new_stress; | |||||
} | |||||
} | |||||
// write out phonemes | |||||
ix = 1; | |||||
p = phonetic; | |||||
while (*p != 0) { | |||||
if ((phoneme_tab[*p]->type == phVOWEL) && !(phoneme_tab[*p]->phflags & phNONSYLLABIC)) { | |||||
if ((vowel_stress[ix] == STRESS_IS_DIMINISHED) || (vowel_stress[ix] > STRESS_IS_UNSTRESSED)) | |||||
*word++ = stress_phonemes[(unsigned char)vowel_stress[ix]]; | |||||
ix++; | |||||
} | |||||
*word++ = *p++; | |||||
} | |||||
*word = 0; | |||||
} | |||||
static char *SpeakIndividualLetters(Translator *tr, char *word, char *phonemes, int spell_word, ALPHABET *current_alphabet, char word_phonemes[]) | static char *SpeakIndividualLetters(Translator *tr, char *word, char *phonemes, int spell_word, ALPHABET *current_alphabet, char word_phonemes[]) | ||||
{ | { | ||||
int posn = 0; | int posn = 0; |