Browse Source

code cleanup: reduce duplication with new function DollarRule()

master
Juho Hiltunen 2 years ago
parent
commit
bbfef6a269
1 changed files with 22 additions and 31 deletions
  1. 22
    31
      src/libespeak-ng/dictionary.c

+ 22
- 31
src/libespeak-ng/dictionary.c View File

@@ -44,6 +44,7 @@
#include "translate.h" // for Translator, utf8_in, LANGU...

static int LookupFlags(Translator *tr, const char *word, unsigned int **flags_out);
static void DollarRule(char *word[], char *word_start, int consumed, int group_length, char *word_buf, Translator *tr, unsigned int *flags, int command, int *failed, int *add_points);

typedef struct {
int points;
@@ -1471,8 +1472,6 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_

char *rule_start; // start of current match template
char *p;
int ix;

int match_type; // left, right, or consume
int syllable_count;
int vowel;
@@ -1481,7 +1480,7 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_
int n_bytes;
int add_points;
int command;
unsigned int *flags;
unsigned int *flags = NULL;

MatchRecord match;
static MatchRecord best;
@@ -1700,21 +1699,9 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_
else
failed = 1;
} else if (((command & 0xf0) == 0x20) || (command == DOLLAR_LIST)) {
// $list or $p_alt
// make a copy of the word up to the post-match characters
ix = *word - word_start + consumed + group_length + 1;
memcpy(word_buf, word_start-1, ix);
word_buf[ix] = ' ';
word_buf[ix+1] = 0;
LookupFlags(tr, &word_buf[1], &flags);

if ((command == DOLLAR_LIST) && (flags[0] & FLAG_FOUND) && !(flags[1] & FLAG_ONLY))
add_points = 23;
else if (flags[0] & (1 << (BITNUM_FLAG_ALT + (command & 0xf))))
add_points = 23;
else
failed = 1;
DollarRule(word, word_start, consumed, group_length, word_buf, tr, flags, command, &failed, &add_points);
}

break;
case '-':
if ((letter == '-') || ((letter == ' ') && (word_flags & FLAG_HYPHEN_AFTER)))
@@ -1901,20 +1888,7 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_
pre_ptr++;
command = *rule++;
if ((command == DOLLAR_LIST) || ((command & 0xf0) == 0x20)) {
// $list or $p_alt
// make a copy of the word up to the current character
ix = *word - word_start + 1;
memcpy(word_buf, word_start-1, ix);
word_buf[ix] = ' ';
word_buf[ix+1] = 0;
LookupFlags(tr, &word_buf[1], &flags);

if ((command == DOLLAR_LIST) && (flags[0] & FLAG_FOUND) && !(flags[1] & FLAG_ONLY))
add_points = 23;
else if (flags[0] & (1 << (BITNUM_FLAG_ALT + (command & 0xf))))
add_points = 23;
else
failed = 1;
DollarRule(word, word_start, consumed, group_length, word_buf, tr, flags, command, &failed, &add_points);
}
break;
case RULE_SYLLABLE:
@@ -3004,3 +2978,20 @@ int RemoveEnding(Translator *tr, char *word, int end_type, char *word_copy)

return end_flags;
}

static void DollarRule(char *word[], char *word_start, int consumed, int group_length, char *word_buf, Translator *tr, unsigned int *flags, int command, int *failed, int *add_points) {
// $list or $p_alt
// make a copy of the word up to the post-match characters
int ix = *word - word_start + consumed + group_length + 1;
memcpy(word_buf, word_start-1, ix);
word_buf[ix] = ' ';
word_buf[ix+1] = 0;
LookupFlags(tr, &word_buf[1], &flags);

if ((command == DOLLAR_LIST) && (flags[0] & FLAG_FOUND) && !(flags[1] & FLAG_ONLY))
*add_points = 23;
else if (flags[0] & (1 << (BITNUM_FLAG_ALT + (command & 0xf))))
*add_points = 23;
else
*failed = 1;
}

Loading…
Cancel
Save