Browse Source

Implementation for issue #155

master
Valdis Vitolins 8 years ago
parent
commit
a621ad46e7
1 changed files with 39 additions and 7 deletions
  1. 39
    7
      src/libespeak-ng/dictionary.c

+ 39
- 7
src/libespeak-ng/dictionary.c View File

@@ -660,9 +660,25 @@ const char *GetTranslatedPhonemeString(int phoneme_mode)

static int IsLetterGroup(Translator *tr, char *word, int group, int pre)
{
// match the word against a list of utf-8 strings
char *p;
char *w;
/* match the word against a list of utf-8 strings
* How this works:
* +-+
* |c|<-(tr->letterGroups[group])
* |0|
* *p->|c|<-len+ +-+
* |s|<----+ |a|<-(Actual word to be tested)
* |0| *word-> |t|<-*w=word-len+1 (for pre-rule)
* |~| |a|<-*w=word (for post-rule)
* |7| |s|
* +-+ +-+
*
* 7=RULE_GROUP_EN
* 0=null terminator
* pre==1 — pre-rule
* pre==0 — post-rule
*/
char *p; // group counter
char *w; // word counter
int len = 0;

p = tr->letterGroups[group];
@@ -675,18 +691,34 @@ static int IsLetterGroup(Translator *tr, char *word, int group, int pre)
w = word - len + 1;
} else
w = word;

// If no character is allowed in group
// at the start (for pre-rule) or end (post-rule)
// of the checked letter in the word, return OK
if (*p == '~' && *w == ' ') // word end checked because of comment below
return 1;
/* TODO need to investigate why word end mark _ doesn't work properly
* for post rule somewhere in MatchRule() function. or E.g.:
*
* .L01 ~ b c
* .group a
* _L01) a i // this works
* a (L01_ u // this doesn't work
*/

while ((*p == *w) && (*w != 0)) {
w++;
p++;
}
if (*p == 0) {
if (*p == 0) { // matched some of group strings
if (pre)
return len;
return w-word; // matched a complete string
else
return w - word;
}

while (*p++ != 0) // skip to end of string
;
while (*p++ != 0) // if string of current group didn't match
; // skip till to the end of string
}
return 0;
}

Loading…
Cancel
Save