|
|
@@ -362,6 +362,16 @@ char *DecodeRule(const char *group_chars, int group_length, char *rule, int cont |
|
|
|
return output; |
|
|
|
} |
|
|
|
|
|
|
|
typedef enum |
|
|
|
{ |
|
|
|
LINE_PARSER_WORD = 0, |
|
|
|
LINE_PARSER_END_OF_WORD = 1, |
|
|
|
LINE_PARSER_MULTIPLE_WORDS = 2, |
|
|
|
LINE_PARSER_END_OF_WORDS = 3, |
|
|
|
LINE_PARSER_PRONUNCIATION = 4, |
|
|
|
LINE_PARSER_END = 5, |
|
|
|
} LINE_PARSER_STATES; |
|
|
|
|
|
|
|
static int compile_line(char *linebuf, char *dict_line, int *hash) |
|
|
|
{ |
|
|
|
// Compile a line in the language_list file |
|
|
@@ -370,7 +380,7 @@ static int compile_line(char *linebuf, char *dict_line, int *hash) |
|
|
|
char *word; |
|
|
|
char *phonetic; |
|
|
|
unsigned int ix; |
|
|
|
int step; |
|
|
|
LINE_PARSER_STATES step; |
|
|
|
unsigned int n_flag_codes = 0; |
|
|
|
int flagnum; |
|
|
|
int flag_offset; |
|
|
@@ -398,7 +408,7 @@ static int compile_line(char *linebuf, char *dict_line, int *hash) |
|
|
|
|
|
|
|
p = linebuf; |
|
|
|
|
|
|
|
step = 0; |
|
|
|
step = LINE_PARSER_WORD; |
|
|
|
|
|
|
|
c = 0; |
|
|
|
while (c != '\n') { |
|
|
@@ -455,17 +465,17 @@ static int compile_line(char *linebuf, char *dict_line, int *hash) |
|
|
|
|
|
|
|
switch (step) |
|
|
|
{ |
|
|
|
case 0: |
|
|
|
case LINE_PARSER_WORD: |
|
|
|
if (c == '(') { |
|
|
|
multiple_words = 1; |
|
|
|
word = p+1; |
|
|
|
step = 1; |
|
|
|
step = LINE_PARSER_END_OF_WORD; |
|
|
|
} else if (!isspace2(c)) { |
|
|
|
word = p; |
|
|
|
step = 1; |
|
|
|
step = LINE_PARSER_END_OF_WORD; |
|
|
|
} |
|
|
|
break; |
|
|
|
case 1: |
|
|
|
case LINE_PARSER_END_OF_WORD: |
|
|
|
if ((c == '-') && multiple_words) { |
|
|
|
if (IsDigit09(word[0])) |
|
|
|
multiple_numeric_hyphen = 1; |
|
|
@@ -477,43 +487,43 @@ static int compile_line(char *linebuf, char *dict_line, int *hash) |
|
|
|
|
|
|
|
if (multiple_words) { |
|
|
|
multiple_string = multiple_string_end = p+1; |
|
|
|
step = 2; |
|
|
|
step = LINE_PARSER_MULTIPLE_WORDS; |
|
|
|
} else |
|
|
|
step = 3; |
|
|
|
step = LINE_PARSER_END_OF_WORDS; |
|
|
|
} else if (c == ')') { |
|
|
|
if (multiple_words) { |
|
|
|
p[0] = 0; |
|
|
|
multiple_words = 0; |
|
|
|
step = 3; |
|
|
|
step = LINE_PARSER_END_OF_WORDS; |
|
|
|
} else if (word[0] != '_') { |
|
|
|
fprintf(f_log, "%5d: Missing '('\n", linenum); |
|
|
|
error_count++; |
|
|
|
step = 3; |
|
|
|
step = LINE_PARSER_END_OF_WORDS; |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
case 2: |
|
|
|
case LINE_PARSER_MULTIPLE_WORDS: |
|
|
|
if (isspace2(c)) |
|
|
|
multiple_words++; |
|
|
|
else if (c == ')') { |
|
|
|
p[0] = ' '; // terminate extra string |
|
|
|
multiple_string_end = p+1; |
|
|
|
step = 3; |
|
|
|
step = LINE_PARSER_END_OF_WORDS; |
|
|
|
} |
|
|
|
break; |
|
|
|
case 3: |
|
|
|
case LINE_PARSER_END_OF_WORDS: |
|
|
|
if (!isspace2(c)) { |
|
|
|
phonetic = p; |
|
|
|
step = 4; |
|
|
|
step = LINE_PARSER_PRONUNCIATION; |
|
|
|
} |
|
|
|
break; |
|
|
|
case 4: |
|
|
|
case LINE_PARSER_PRONUNCIATION: |
|
|
|
if (isspace2(c)) { |
|
|
|
p[0] = 0; // terminate phonetic |
|
|
|
step = 5; |
|
|
|
step = LINE_PARSER_END; |
|
|
|
} |
|
|
|
break; |
|
|
|
case 5: |
|
|
|
case LINE_PARSER_END: |
|
|
|
break; |
|
|
|
} |
|
|
|
p++; |