From a621ad46e723860fad40f0a353a7c3dcb4db01ba Mon Sep 17 00:00:00 2001 From: Valdis Vitolins Date: Mon, 9 Jan 2017 19:05:54 +0200 Subject: [PATCH] Implementation for issue #155 --- src/libespeak-ng/dictionary.c | 46 +++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/src/libespeak-ng/dictionary.c b/src/libespeak-ng/dictionary.c index 39119249..97c6bebd 100644 --- a/src/libespeak-ng/dictionary.c +++ b/src/libespeak-ng/dictionary.c @@ -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; }