| @@ -850,7 +850,7 @@ int Unpronouncable(Translator *tr, char *word, int posn) | |||
| 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 | |||
| unsigned char phcode; | |||
| @@ -962,55 +962,11 @@ static int GetVowelStress(Translator *tr, unsigned char *phonemes, signed char * | |||
| return max_stress; | |||
| } | |||
| static char stress_phonemes[] = { | |||
| const char stress_phonemes[] = { | |||
| phonSTRESS_D, phonSTRESS_U, phonSTRESS_2, phonSTRESS_3, | |||
| 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) | |||
| { | |||
| /* Guess stress pattern of word. This is language specific | |||
| @@ -31,15 +31,17 @@ extern "C" | |||
| { | |||
| #endif | |||
| extern const char stress_phonemes[]; | |||
| int LoadDictionary(Translator *tr, const char *name, int no_error); | |||
| int HashDictionary(const char *string); | |||
| const char *EncodePhonemes(const char *p, char *outptr, int *bad_phoneme); | |||
| void DecodePhonemes(const char *inptr, char *outptr); | |||
| char *WritePhMnemonic(char *phon_out, PHONEME_TAB *ph, PHONEME_LIST *plist, int use_ipa, int *flags); | |||
| 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 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 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); | |||
| @@ -36,7 +36,7 @@ | |||
| #include "translate.h" | |||
| #include "translateword.h" | |||
| #include "common.h" // for strncpy0 | |||
| #include "dictionary.h" // for TranslateRules, LookupDictList, Cha... | |||
| #include "dictionary.h" // for TranslateRules, LookupDictList | |||
| #include "numbers.h" // for SetSpellingStress, ... | |||
| #include "phoneme.h" // for phonSWITCH, PHONEME_TAB, phonPAUSE_... | |||
| #include "readclause.h" // for towlower2 | |||
| @@ -46,6 +46,7 @@ | |||
| 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 NonAsciiNumber(int letter); | |||
| static char *SpeakIndividualLetters(Translator *tr, char *word, char *phonemes, int spell_word, ALPHABET *current_alphabet, char word_phonemes[]); | |||
| @@ -667,6 +668,50 @@ int TranslateWord3(Translator *tr, char *word_start, WORD_TAB *wtab, char *word_ | |||
| } | |||
| 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[]) | |||
| { | |||
| int posn = 0; | |||