Fix crash with -X option when spelling words (acronyms). Rules files: added special character X meaning "no vowel until the word boundary". Used for lang=no. git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@14 d46cf337-b52f-0410-862d-fd96e6ae7743master
| @@ -141,52 +141,53 @@ _dpt pOInt | |||
| // ABBREVIATIONS | |||
| //************** | |||
| abc eIbi:s'i: | |||
| ac eI'si: | |||
| adfs eIdi:Ef'Es | |||
| a.k.a aka2_! | |||
| agm eIdZi:'Em | |||
| ai eI;'aI | |||
| api apI2 | |||
| asap eIEseIpi: | |||
| awol eIw0l | |||
| cio si:aI'oU | |||
| ctrl k0ntr'oUl | |||
| dept dI2pA@tm@nt | |||
| diy di:aI'waI | |||
| eg fO@Egz'aamp@L | |||
| etc Et'sEtr@ | |||
| eur jU@ | |||
| hmm h@m | |||
| (http ://) eItSti:ti:'pi:_ | |||
| ibm aIbi:Em | |||
| ie aIi:_! $pause | |||
| i.e aIi:_! $pause | |||
| irc aI;A@s'i: | |||
| lbs paUndz | |||
| ltd lImItId | |||
| mc m@k | |||
| oem oUi:'Em | |||
| ok oU'keI | |||
| os oUEs | |||
| riscos rIskoUEs | |||
| sae EseI'i: | |||
| seac si:ak | |||
| st s@nt | |||
| th T | |||
| thu T3: // Thursday | |||
| ?5 thu TIR // Thursday | |||
| ufo ju:Ef'oU | |||
| ui ,ju:'aI | |||
| uk ju:k'eI | |||
| url ju:A@'El | |||
| usa ju:Es'eI | |||
| wwii dVb@Lju:dVb@Lju:t'u: | |||
| xy EkswaI | |||
| ii tu: $abbrev // roman numerals | |||
| iii Tri: $abbrev | |||
| iv fo@ $abbrev | |||
| abc $abbrev | |||
| ac $abbrev | |||
| adfs $abbrev | |||
| a.k.a aka2_! | |||
| agm $abbrev | |||
| ai $abbrev | |||
| api $abbrev | |||
| asap $abbrev | |||
| awol eIw0l | |||
| cio $abbrev | |||
| ctrl k0ntr'oUl | |||
| dept dI2pA@tm@nt | |||
| diy $abbrev | |||
| edt $abbrev | |||
| eg fO@Egz'aamp@L | |||
| est $abbrev | |||
| etc Et'sEtr@ | |||
| eur jU@ | |||
| hmm h@m | |||
| (http ://) eItSti:ti:'pi:_ | |||
| ibm $abbrev | |||
| ie aIi:_! $pause | |||
| i.e aIi:_! $pause | |||
| irc $abbrev | |||
| lbs paUndz | |||
| ltd lImItId | |||
| mc m@k | |||
| oem $abbrev | |||
| ok $abbrev | |||
| os $abbrev | |||
| riscos rIskoUEs | |||
| sae $abbrev | |||
| st s@nt | |||
| th T | |||
| thu T3: // Thursday | |||
| ?5 thu TIR // Thursday | |||
| ufo $abbrev | |||
| ui $abbrev | |||
| uk $abbrev | |||
| url $abbrev | |||
| usa $abbrev | |||
| wwii dVb@Lju:dVb@Lju:t'u: | |||
| xy $abbrev | |||
| ii tu: $abbrev // roman numerals | |||
| iii Tri: $abbrev | |||
| iv fo@ $abbrev | |||
| nd $only | |||
| @@ -194,14 +195,14 @@ rd $only | |||
| th $only | |||
| st $only | |||
| mr mIst3 $dot | |||
| mrs mIsIz $dot | |||
| mr mIst3 $dot | |||
| mrs mIsIz $dot | |||
| //ms mIz $dot | |||
| dr d0kt3 $dot $capital | |||
| lt $dot | |||
| prof $dot | |||
| rev $dot | |||
| st $dot | |||
| dr d0kt3 $dot $capital | |||
| lt $dot | |||
| prof $dot | |||
| rev $dot | |||
| st $dot | |||
| @@ -448,6 +449,7 @@ bastion basti@n | |||
| batman batman | |||
| belisha b@l'i:S@ | |||
| bely bI2laI | |||
| beryl bEr@L | |||
| basal beIs@L | |||
| best bEst | |||
| beta bi:t@ | |||
| @@ -866,7 +868,6 @@ foretell fo@t'El | |||
| forever $2 | |||
| forewarn $2 | |||
| formid fO@m'Id // formidable | |||
| forte fo@teI | |||
| foyer fOIeI | |||
| freelance fri:laans | |||
| frigate frIg@t | |||
| @@ -1327,6 +1328,7 @@ peculiar pI2kju:lI3 | |||
| pedalo pEd@loU | |||
| pejorative p@dZ0r@tIv | |||
| penal pi:n@L | |||
| ?4 penchant p0nS0n | |||
| peninsula p@n'InsjUl@ | |||
| penis pi:nI2s | |||
| perfectly p3:fEktlI2 | |||
| @@ -1672,6 +1674,7 @@ sundae sVndeI | |||
| sundial sVndaI@l | |||
| suite swi:t $onlys | |||
| superb su:p'3:b | |||
| superfluous su:p'3:flu:@s | |||
| superman su:p3man | |||
| supplier s@plaI3 | |||
| suppose $2 | |||
| @@ -317,6 +317,7 @@ | |||
| c) ad (enc eId | |||
| ad (eq ad | |||
| _) ad (i ad | |||
| gl) ad (i ad | |||
| adjec adZEk | |||
| ad (le eId | |||
| ad (junct_ ad | |||
| @@ -479,7 +480,7 @@ | |||
| _) al (i al | |||
| _) al (ig a2l | |||
| _) ali (Be a2laI | |||
| &) al (isC_ @l | |||
| &) ali (sC_ @li | |||
| &) al (isCic @l | |||
| _) al (k al | |||
| _) all (@ a2l | |||
| @@ -2677,6 +2678,7 @@ | |||
| pl) ia (nt 'aI@ | |||
| ill) ia (nt I2@ | |||
| al) ia (nt I2@ | |||
| _p) ia (nA i@ | |||
| iar aI@ | |||
| @l) iar (_ i@ | |||
| iara (_ I'A:r@ | |||
| @@ -3754,6 +3756,7 @@ | |||
| &) or (ous @ | |||
| orough Vr@ | |||
| eff) or (t 3 | |||
| f) orte (_ 'o@teI | |||
| w) or (t_ o@ | |||
| w) or (r V | |||
| w) or (n o@ | |||
| @@ -4473,6 +4476,7 @@ | |||
| _) tri (vi trI | |||
| tsch tS | |||
| _) two tu: | |||
| ttu (r t@ | |||
| @) tur (A tS@r | |||
| @) tur (al_ tS=@r | |||
| @) tur (y tS@r | |||
| @@ -4,6 +4,7 @@ | |||
| .group a | |||
| a a | |||
| aj (K aI | |||
| a (r A // don't reduce to [&] | |||
| .group b | |||
| b b | |||
| @@ -70,7 +71,7 @@ | |||
| o o | |||
| ou oU | |||
| oj (K oI | |||
| o (r 8 | |||
| &) o (r_ 8 | |||
| .group p | |||
| p p | |||
| @@ -65,7 +65,7 @@ _9X n'It:i: | |||
| _0C h'u-:nd@-*e:d@2 | |||
| _1C 'Et||h'u-:nd@-*e:d@2 | |||
| _0M1 t'u-:s@n | |||
| _0M1 'Et||t'u-:s@n | |||
| _1M1 'Et||t'u-:s@n | |||
| _0M2 m'Illi:;,u:n@r | |||
| _1M2 'e:n||m'Illi:;,u:n | |||
| @@ -84,13 +84,13 @@ ei $u | |||
| // pronouns | |||
| jeg $u+ | |||
| jeg jaI $u+ | |||
| du $u+ | |||
| han $u+ | |||
| hun $u+ | |||
| vi $u+ | |||
| dere $u+ | |||
| de $u+ | |||
| de di: $u+ | |||
| meg $u+ | |||
| deg $u+ | |||
| @@ -104,8 +104,7 @@ denne $u+ | |||
| dette $u+ | |||
| disse $u+ | |||
| den $u+ | |||
| det $u+ | |||
| de $u+ | |||
| det de: $u+ | |||
| // possessive adjectives | |||
| @@ -135,7 +134,7 @@ i $u $brk // in | |||
| av $u $brk // of, off, by | |||
| bak $pause // behind | |||
| etter $u $pause // after | |||
| for $u $pause // for | |||
| for fOr: $u $pause // for | |||
| foran $pause // in front of | |||
| fra $u $pause // from | |||
| in $u $brk // in | |||
| @@ -216,6 +215,9 @@ _å o: | |||
| _i i: | |||
| i i: $atend | |||
| // MAIN WORD DICTIONARY | |||
| //********************* | |||
| kom kOm | |||
| @@ -8,13 +8,17 @@ | |||
| a A: | |||
| a (C% A | |||
| a (_ A | |||
| X) a (CCX A // single syllable with >= 2 final consonants | |||
| ai AI | |||
| au aU | |||
| aa o: // å | |||
| aa (C% O | |||
| X) aa (CCX O | |||
| ae a: // æ | |||
| ae (C% a | |||
| X) ae (CCX a | |||
| .group b | |||
| b b | |||
| @@ -36,10 +40,12 @@ | |||
| d d | |||
| dd d: | |||
| r) d (_ | |||
| &) det (_ d@2 | |||
| .group e | |||
| e e: | |||
| e (C% E | |||
| X) e (CCX E | |||
| ei aI | |||
| e (rC a // ?? | |||
| &) e (_ @2 | |||
| @@ -70,6 +76,7 @@ | |||
| .group i | |||
| i i: | |||
| i (C% I | |||
| X) i (CCX I | |||
| &) ig (_ I | |||
| .group j | |||
| @@ -102,10 +109,12 @@ | |||
| .group o | |||
| o u: | |||
| o (C% O | |||
| X) o (CCX O | |||
| oi OI | |||
| oe Y: // ø | |||
| oe (C% W | |||
| X) oe (CCX W | |||
| oey Yy | |||
| o (nd U | |||
| @@ -155,6 +164,7 @@ | |||
| .group u | |||
| u u-: | |||
| u (C% u- | |||
| X) u (CCX u- | |||
| ui u-I | |||
| .group v | |||
| @@ -171,6 +181,7 @@ | |||
| .group y | |||
| y y: | |||
| y (C% y | |||
| X) y (CCX y | |||
| .group z | |||
| z s | |||
| @@ -180,24 +191,29 @@ | |||
| .group å | |||
| å o: | |||
| å (C% O | |||
| X) å (CCX O | |||
| .group æ | |||
| æ E: | |||
| æ (r a: | |||
| æ (C% a | |||
| X) æ (CCX a | |||
| .group ø | |||
| ø Y: | |||
| ø (C% W | |||
| X) ø (CCX W | |||
| øy Yy | |||
| .group ä | |||
| ä E: | |||
| ä (C% E | |||
| X) ä (CCX E | |||
| .group ö | |||
| ö Y: | |||
| ö (C% W | |||
| X) ö (CCX W | |||
| .group | |||
| é 'e: | |||
| @@ -14,13 +14,13 @@ | |||
| fi 40 123 | |||
| fr 33 115 | |||
| fr_ca 11 115 | |||
| hi 50 128 | |||
| hi 49 127 | |||
| hu 24 109 | |||
| nl 25 112 | |||
| pl 17 103 | |||
| sk 25 120 | |||
| cs 5 120 | |||
| hr 23 129 | |||
| hr 24 130 | |||
| ru 36 120 | |||
| it 28 112 | |||
| es 6 112 | |||
| @@ -233,7 +233,6 @@ | |||
| 2 ufric/x base vi | |||
| 4 ufric/x2 af nl pt | |||
| 1 ufric/x_hr hr | |||
| 1 ufric/xx hr | |||
| 1 ustop/c base | |||
| 5 ustop/k base en fr hi sw | |||
| 9 ustop/k_ base en fi fr hi hu it el sw | |||
| @@ -346,6 +345,7 @@ | |||
| 1 vdiph/u-i vi | |||
| 1 vdiph/ui_2 af | |||
| 2 vdiph/ui_3 cy | |||
| 1 vdiph/ui_4 hr | |||
| 1 vdiph/Vi vi | |||
| 1 vdiph/Vu af | |||
| 2 vdiph/Vu_2 en_us en_wm | |||
| @@ -411,9 +411,9 @@ | |||
| 1 vowel/3_3 en_rp | |||
| 3 vowel/3_en en en_wm af | |||
| 2 vowel/@_4 nl hr | |||
| 2 vowel/8_2 en_us sv | |||
| 3 vowel/8_2 en_us hr sv | |||
| 1 vowel/8_3 zh_yue | |||
| 10 vowel/a en_n cy de hu nl pl sk hr | |||
| 11 vowel/a en_n cy de hu nl pl sk hr | |||
| 4 vowel/a# en_sc it pt | |||
| 5 vowel/a_2 eo it pt_pt ro vi | |||
| 4 vowel/a#_2 hr sv is sw | |||
| @@ -463,7 +463,6 @@ | |||
| 6 vowel/ii_en en en_n | |||
| 5 vowel/@_low hi ro no | |||
| 8 vowel/o en en_wm de hi it pt_pt sv | |||
| 1 vowel/o- hr | |||
| 4 vowel/o_2 cy hi hu no | |||
| 2 vowel/o-_2 en_n en_wm | |||
| 2 vowel/o_3 en_sc | |||
| @@ -487,7 +486,7 @@ | |||
| 3 vowelr/r-voc hi sk | |||
| 2 vowelr/V3_r en en_sc | |||
| 1 vowelr/V_r en | |||
| 8 vowel/u en_n cy de eo fr hi cs | |||
| 7 vowel/u en_n cy de eo fr cs | |||
| 5 vowel/u# en en_sc | |||
| 3 vowel/u_2 fi sk ro | |||
| 1 vowel/u#_2 sv | |||
| @@ -25,6 +25,13 @@ phoneme a | |||
| endphoneme | |||
| phoneme A // 'a' before 'r', doesn't reduce to [&] | |||
| vowel starttype (a) endtype (a) | |||
| length 160 | |||
| formants vowel/a | |||
| endphoneme | |||
| phoneme & | |||
| vowel starttype (a) endtype (a) | |||
| length 140 | |||
| @@ -72,7 +79,7 @@ endphoneme | |||
| phoneme 8 | |||
| vowel starttype (o) endtype (o) | |||
| length 140 | |||
| formants vowel/o- | |||
| formants vowel/8_2 | |||
| endphoneme | |||
| @@ -92,14 +99,14 @@ endphoneme | |||
| phoneme aI | |||
| vowel starttype (a) endtype (i) | |||
| length 230 | |||
| length 250 | |||
| formants vdiph/ai | |||
| endphoneme | |||
| phoneme eI | |||
| vowel starttype (e) endtype (i) | |||
| length 220 | |||
| length 250 | |||
| formants vdiph/ei_2 | |||
| linkout ; | |||
| endphoneme | |||
| @@ -115,12 +122,19 @@ endphoneme | |||
| phoneme oI | |||
| vowel starttype (o) endtype (i) | |||
| length 220 | |||
| length 250 | |||
| formants vdiph/ooi_3 | |||
| linkout ; | |||
| endphoneme | |||
| phoneme uI | |||
| vowel starttype (u) endtype (i) | |||
| length 250 | |||
| formants vdiph/ui_4 | |||
| linkout ; | |||
| endphoneme | |||
| phoneme p | |||
| vls blb stop | |||
| @@ -170,14 +184,4 @@ phoneme x | |||
| switchvoicing Q | |||
| endphoneme | |||
| phoneme x2 // TEST | |||
| vls vel frc | |||
| vowelin f1=0 f2=2300 200 400 f3=-100 80 | |||
| vowelout f1=0 f2=2300 300 400 f3=-100 80 rms=20 | |||
| length 100 | |||
| lengthmod 3 | |||
| wave ufric/xx%120 | |||
| switchvoicing Q | |||
| endphoneme | |||
| @@ -5,7 +5,7 @@ | |||
| phoneme : // Lengthen the previous vowel by "length" | |||
| virtual | |||
| length 80 | |||
| length 100 | |||
| endphoneme | |||
| phoneme @ | |||
| @@ -13,7 +13,7 @@ phoneme @ | |||
| length 130 | |||
| formants vowel/@_bck | |||
| before H vowel/@_low | |||
| reduceto NULL 0 | |||
| reduceto @- 0 | |||
| endphoneme | |||
| phoneme V | |||
| @@ -48,14 +48,14 @@ endphoneme | |||
| phoneme i: | |||
| vowel long starttype (i) endtype (i) | |||
| length 220 | |||
| length 230 | |||
| formants vowel/i_fnt | |||
| linkout ; | |||
| endphoneme | |||
| phoneme i // as [i:] but not marked as 'long' | |||
| vowel starttype (i) endtype (i) | |||
| length 220 | |||
| length 230 | |||
| formants vowel/i_fnt | |||
| linkout ; | |||
| endphoneme | |||
| @@ -69,7 +69,7 @@ endphoneme | |||
| phoneme e: | |||
| vowel long starttype (e) endtype (e) | |||
| length 210 | |||
| length 220 | |||
| formants vowel/e_2 | |||
| endphoneme | |||
| @@ -81,7 +81,7 @@ endphoneme | |||
| phoneme E: | |||
| vowel long starttype (e) endtype (e) | |||
| length 210 | |||
| length 220 | |||
| formants vdiph/ee-e | |||
| endphoneme | |||
| @@ -100,7 +100,7 @@ endphoneme | |||
| phoneme &: | |||
| vowel long starttype (a) endtype (a) | |||
| length 210 | |||
| length 220 | |||
| formants vowel/& | |||
| endphoneme | |||
| @@ -120,7 +120,7 @@ endphoneme | |||
| phoneme o: | |||
| vowel long starttype (o) endtype (o) | |||
| length 210 | |||
| length 220 | |||
| formants vowel/o_2 | |||
| endphoneme | |||
| @@ -132,7 +132,7 @@ endphoneme | |||
| phoneme O: | |||
| vowel long starttype (o) endtype (o) | |||
| length 200 | |||
| length 210 | |||
| formants vowel/oo_4 | |||
| endphoneme | |||
| @@ -165,16 +165,10 @@ endphoneme | |||
| phoneme u: | |||
| vowel long starttype (u) endtype (u) | |||
| length 220 | |||
| length 230 | |||
| formants vowel/u_bck | |||
| endphoneme | |||
| phoneme u2: | |||
| vowel long starttype (u) endtype (u) | |||
| length 220 | |||
| formants vowel/u | |||
| endphoneme | |||
| phoneme r- | |||
| @@ -75,6 +75,7 @@ | |||
| extern void Write4Bytes(FILE *f, int value); | |||
| extern void MakeVowelLists(void); | |||
| extern void FindPhonemesUsed(void); | |||
| extern int CompileDictionary(const char *dsource, const char *dict_name, FILE *log, char *fname); | |||
| extern char voice_name[]; | |||
| @@ -1824,6 +1825,76 @@ void Compile::Report(void) | |||
| } | |||
| static int ph_sorter(char **a, char **b) | |||
| {//====================================== | |||
| int ix; | |||
| int t1, t2; | |||
| char mnem1[6]; | |||
| PHONEME_TAB *p1 = (PHONEME_TAB *)(*a); | |||
| PHONEME_TAB *p2 = (PHONEME_TAB *)(*b); | |||
| t1 = p1->type; | |||
| if(t1 > phVOWEL) t1 = phVOWEL+1; | |||
| t2 = p2->type; | |||
| if(t2 > phVOWEL) t2 = phVOWEL+1; | |||
| if((ix = t1 - t2) != 0) | |||
| return(ix); | |||
| strcpy(mnem1,WordToString(p1->mnemonic)); | |||
| return(strcasecmp(mnem1,WordToString(p2->mnemonic))); | |||
| } /* end of ph_sorter */ | |||
| void PrintPhonemesUsed(FILE *f, const char *dictname) | |||
| {//================================================== | |||
| int ix; | |||
| PHONEME_TAB *ph; | |||
| PHONEME_TAB *ph_tab[N_PHONEME_TAB]; | |||
| int count = 0; | |||
| int n_ph = 0; | |||
| int section = 0; | |||
| fprintf(f,"\n\nDictionary %s_dict\n",dictname); | |||
| fflush(f); | |||
| for(ix=0; (ix<N_PHONEME_TAB) && (phoneme_tab[ix] != NULL); ix++) | |||
| { | |||
| if(phoneme_tab_flags[ix] & 2) | |||
| { | |||
| ph_tab[n_ph++] = phoneme_tab[ix]; | |||
| } | |||
| } | |||
| qsort((void *)ph_tab,n_ph,sizeof(PHONEME_TAB *),(int (*)(const void *,const void *))ph_sorter); | |||
| for(ix=0; ix<n_ph; ix++) | |||
| { | |||
| ph = ph_tab[ix]; | |||
| if(ph->type > 1) | |||
| { | |||
| if((ph->type > phVOWEL) && (section == 0)) | |||
| { | |||
| section = 1; | |||
| count = 0; | |||
| fputc('\n',f); | |||
| } | |||
| if((count & 0x7) == 0) | |||
| fputc('\n',f); | |||
| fprintf(f,"%-4s ",WordToString(ph->mnemonic)); | |||
| count++; | |||
| } | |||
| } | |||
| fputc('\n',f); | |||
| } // end of PrintPhonemesUsed | |||
| wxString CompileAllDictionaries() | |||
| {//============================== | |||
| wxString filename; | |||
| @@ -1834,6 +1905,7 @@ wxString CompileAllDictionaries() | |||
| int errors = 0; | |||
| int dict_count = 0; | |||
| FILE *log; | |||
| FILE *f_phused; | |||
| char dictname[80]; | |||
| char fname_log[80]; | |||
| char save_voice_name[80]; | |||
| @@ -1866,6 +1938,13 @@ wxString CompileAllDictionaries() | |||
| sprintf(fname_log,"%s%s",path_dsource,"dict_log"); | |||
| log = fopen(fname_log,"w"); | |||
| sprintf(fname_log,"%s%s",path_dsource,"dict_phonemes"); | |||
| f_phused = fopen(fname_log,"w"); | |||
| if(f_phused) | |||
| { | |||
| fprintf(f_phused,"Phonemes which are used in the *_rules and *_list files\n"); | |||
| } | |||
| bool cont = dir.GetFirst(&filename, _T("*_rules"), wxDIR_FILES); | |||
| while ( cont ) | |||
| @@ -1883,10 +1962,19 @@ wxString CompileAllDictionaries() | |||
| errors += err; | |||
| } | |||
| if(f_phused != NULL) | |||
| { | |||
| memset(phoneme_tab_flags,0,sizeof(phoneme_tab_flags)); | |||
| FindPhonemesUsed(); | |||
| PrintPhonemesUsed(f_phused,dictname); | |||
| } | |||
| cont = dir.GetNext(&filename); | |||
| } | |||
| if(log != NULL) | |||
| fclose(log); | |||
| if(f_phused != NULL) | |||
| fclose(f_phused); | |||
| LoadVoice(save_voice_name,1); | |||
| @@ -657,6 +657,9 @@ void copy_rule_string(char *string, int &state) | |||
| case 'W': | |||
| c = RULE_SPELLING; | |||
| break; | |||
| case 'X': | |||
| c = RULE_NOVOWELS; | |||
| break; | |||
| case 'L': | |||
| // expect two digits | |||
| c = *p++ - '0'; | |||
| @@ -1261,7 +1261,11 @@ void Translator::SetWordStress(char *output, unsigned int dictionary_flags, int | |||
| else | |||
| { | |||
| // unstressed syllable within a word | |||
| v_stress = 1; /* change from 0 (unstressed) to 1 (diminished stress) */ | |||
| if((vowel_stress[v-1] != 1) || ((langopts.stress_flags & 0x10000) == 0)) | |||
| { | |||
| v_stress = 1; /* change from 0 (unstressed) to 1 (diminished stress) */ | |||
| vowel_stress[v] = v_stress; | |||
| } | |||
| } | |||
| } | |||
| @@ -1383,7 +1387,7 @@ char *Translator::DecodeRule(const char *group, char *rule) | |||
| static char output[60]; | |||
| static char symbols[] = {' ',' ',' ',' ',' ',' ',' ',' ',' ', | |||
| '@','&','%','+','#','S','D','Z','A','B','C','H','F','G','Y','N','K','V','L','T'}; | |||
| '@','&','%','+','#','S','D','Z','A','B','C','H','F','G','Y','N','K','V','L','T','X','?','W'}; | |||
| match_type = 0; | |||
| @@ -1805,6 +1809,23 @@ void Translator::MatchRule(char *word[], const char *group, char *rule, MatchRec | |||
| } | |||
| break; | |||
| case RULE_NOVOWELS: | |||
| { | |||
| char *p = post_ptr + letter_xbytes; | |||
| while(letter_w != RULE_SPACE) | |||
| { | |||
| if(IsLetter(letter_w,LETTERGP_VOWEL2)) | |||
| { | |||
| failed = 1; | |||
| break; | |||
| } | |||
| p += utf8_in(&letter_w,p,0); | |||
| } | |||
| if(!failed) | |||
| match.points += (19-distance_right); | |||
| } | |||
| break; | |||
| case RULE_INC_SCORE: | |||
| match.points += 20; // force an increase in points | |||
| break; | |||
| @@ -1932,6 +1953,13 @@ void Translator::MatchRule(char *word[], const char *group, char *rule, MatchRec | |||
| failed = 1; | |||
| break; | |||
| case RULE_NOVOWELS: | |||
| if(word_vowel_count== 0) | |||
| match.points += 19; | |||
| else | |||
| failed =1; | |||
| break; | |||
| case RULE_IFVERB: | |||
| if(expect_verb) | |||
| match.points += 1; | |||
| @@ -2710,7 +2738,8 @@ int Translator::LookupDictList(char *word1, char *ph_out, unsigned int *flags, i | |||
| int Translator::Lookup(char *word, char *ph_out) | |||
| {//============================================= | |||
| return(LookupDictList(word,ph_out,NULL,0)); | |||
| unsigned int flags; | |||
| return(LookupDictList(word,ph_out,&flags,0)); | |||
| } | |||
| @@ -35,7 +35,7 @@ | |||
| #include "translate.h" | |||
| #include "wave.h" | |||
| const char *version_string = "1.24.11 17.May.07"; | |||
| const char *version_string = "1.24.12 18.May.07"; | |||
| const int version_phdata = 0x012201; | |||
| int option_device_number = -1; | |||
| @@ -244,7 +244,7 @@ Translator *SelectTranslator(const char *name) | |||
| static const wchar_t replace_chars_hi[11] = {0x966,0x967,0x968,0x969,0x96a,0x96b,0x96c,0x96d,0x96e,0x96f,0}; // digits 0-9 | |||
| static const unsigned int replacement_chars_hi[11] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0}; | |||
| static int stress_lengths_hi[8] = {190, 190, 210, 210, 0, 0, 230, 250}; | |||
| static int stress_amps_hi[8] = {17,14, 20,20, 20,24, 24,22 }; | |||
| static int stress_amps_hi[8] = {17,14, 20,19, 20,24, 24,22 }; | |||
| tr = new Translator(); | |||
| SetupTranslator(tr,stress_lengths_hi,stress_amps_hi); | |||
| @@ -252,7 +252,7 @@ Translator *SelectTranslator(const char *name) | |||
| tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable | |||
| tr->langopts.stress_rule = 6; // stress on last heaviest syllable | |||
| tr->langopts.stress_flags = 0x4; // use 'diminished' for unstressed final syllable | |||
| tr->langopts.stress_flags = 0x10004; // use 'diminished' for unstressed final syllable | |||
| tr->langopts.numbers = 0x811 + 0x40000; | |||
| tr->letter_bits_offset = OFFSET_DEVANAGARI; | |||
| tr->langopts.replace_chars = replace_chars_hi; | |||
| @@ -392,7 +392,7 @@ Translator *SelectTranslator(const char *name) | |||
| case L('n','o'): // Norwegian | |||
| { | |||
| static int stress_amps_no[] = {16,16, 20,20, 20,24, 24,22 }; | |||
| static int stress_lengths_no[8] = {160,140, 200,200, 0,0, 250,270}; | |||
| static int stress_lengths_no[8] = {160,140, 200,190, 0,0, 220,240}; | |||
| tr = new Translator(); | |||
| SetupTranslator(tr,stress_lengths_no,stress_amps_no); | |||
| @@ -122,9 +122,10 @@ | |||
| #define RULE_NOTVOWEL 25 // K | |||
| #define RULE_IFVERB 26 // V | |||
| #define RULE_LETTERGP 27 // L + letter group number | |||
| #define RULE_ALT1 28 // word has $alt attribute | |||
| #define RULE_SPELLING 31 // while spelling letter-by-letter | |||
| #define RULE_LAST_RULE 28 | |||
| #define RULE_ALT1 28 // T word has $alt attribute | |||
| #define RULE_NOVOWELS 29 // X no vowels up to word boundary | |||
| #define RULE_SPELLING 31 // W while spelling letter-by-letter | |||
| #define RULE_LAST_RULE 31 | |||
| #define LETTERGP_A 0 | |||
| #define LETTERGP_B 1 | |||
| @@ -258,6 +259,7 @@ typedef struct { | |||
| // bit9=stress last syllable if it doesn't end in vowel or "s" or "n" LANG=Spanish | |||
| // bit12= In a 2-syllable word, if one has primary stress then give the other secondary stress | |||
| // bit13= If there is only one syllable before the primary stress, give it a secondary stress | |||
| // bit16= Don't diminish consecutive syllables within a word. | |||
| int stress_flags; | |||
| int unstressed_wd1; // stress for $u word of 1 syllable | |||
| @@ -373,10 +373,12 @@ void VowelChart(int control, char *fname) | |||
| static void FindPhonemesUsed(void) | |||
| {//=============================== | |||
| void FindPhonemesUsed(void) | |||
| {//======================== | |||
| int hash; | |||
| char *p; | |||
| char *start; | |||
| char *group; | |||
| char *next; | |||
| unsigned char c; | |||
| int count = 0; | |||
| @@ -386,15 +388,24 @@ static void FindPhonemesUsed(void) | |||
| p = translator->data_dictrules; | |||
| while(*p != 0) | |||
| { | |||
| if(*p == RULE_CONDITION) | |||
| p+=2; | |||
| if(*p == RULE_GROUP_END) | |||
| { | |||
| p++; | |||
| if(*p == 0) break; | |||
| } | |||
| if(*p == RULE_GROUP_START) | |||
| { | |||
| group = p; | |||
| p += (strlen(p)+1); | |||
| } | |||
| while((((c = *p) != RULE_PHONEMES)) && (c != 0)) p++; | |||
| count++; | |||
| if(c == RULE_PHONEMES) | |||
| { | |||
| start = p; | |||
| p++; | |||
| while(*p != 0) | |||
| { | |||