void njd_set_pronunciation(NJD * njd) { NJDNode *node; const char *str; int i, j = 0; int pos; int len; for (node = njd->head; node != NULL; node = node->next) { if (NJDNode_get_mora_size(node) == 0) { NJDNode_set_read(node, NULL); NJDNode_set_pron(node, NULL); if (strcmp(NJDNode_get_pos(node), NJD_SET_PRONUNCIATION_KIGOU) == 0 || strcmp(NJDNode_get_pos_group1(node), NJD_SET_PRONUNCIATION_KAZU) == 0) { /* for symbol */ for (i = 0; njd_set_pronunciation_symbol_list[i] != NULL; i += 2) if (strcmp(NJDNode_get_string(node), njd_set_pronunciation_symbol_list[i]) == 0) { NJDNode_set_read(node, (char *) njd_set_pronunciation_symbol_list[i + 1]); NJDNode_set_pron(node, (char *) njd_set_pronunciation_symbol_list[i + 1]); break; } } else if (strcmp(NJDNode_get_pron(node), "*") == 0) { /* for others */ str = NJDNode_get_string(node); len = strlen(str); for (pos = 0; pos < len;) { for (i = 0, j = 0; njd_set_pronunciation_list[i] != NULL; i += 3) { j = strtopcmp(&str[pos], njd_set_pronunciation_list[i]); if (j > 0) break; } if (j > 0) { pos += j; NJDNode_add_read(node, (char *) njd_set_pronunciation_list[i + 1]); NJDNode_add_pron(node, (char *) njd_set_pronunciation_list[i + 1]); NJDNode_add_mora_size(node, atoi(njd_set_pronunciation_list[i + 2])); } else { pos++; } } } } } NJD_remove_silent_node(njd); for (node = njd->head; node != NULL; node = node->next) { if (node->next != NULL && strcmp(NJDNode_get_pron(node->next), NJD_SET_PRONUNCIATION_U) == 0 && strcmp(NJDNode_get_pos(node->next), NJD_SET_PRONUNCIATION_JODOUSHI) == 0 && (strcmp(NJDNode_get_pos(node), NJD_SET_PRONUNCIATION_DOUSHI) == 0 || strcmp(NJDNode_get_pos(node), NJD_SET_PRONUNCIATION_JODOUSHI) == 0) && NJDNode_get_mora_size(node) > 0) { NJDNode_set_pron(node->next, NJD_SET_PRONUNCIATION_CHOUON); } if (node->next != NULL && strcmp(NJDNode_get_pos(node), NJD_SET_PRONUNCIATION_JODOUSHI) == 0 && strcmp(NJDNode_get_string(node->next), NJD_SET_PRONUNCIATION_QUESTION) == 0) { if (strcmp(NJDNode_get_string(node), NJD_SET_PRONUNCIATION_DESU_STR) == 0) NJDNode_set_pron(node, NJD_SET_PRONUNCIATION_DESU_PRON); else if (strcmp(NJDNode_get_string(node), NJD_SET_PRONUNCIATION_MASU_STR) == 0) NJDNode_set_pron(node, NJD_SET_PRONUNCIATION_MASU_PRON); } } }
void njd_set_digit(NJD * njd) { int i, j; NJDNode *s = NULL; NJDNode *e = NULL; NJDNode *node; int find = 0; /* convert digit sequence */ for (node = njd->head; node != NULL; node = node->next) { if (find == 0 && strcmp(NJDNode_get_pos_group1(node), NJD_SET_DIGIT_KAZU) == 0) find = 1; if (get_digit(node, 1) >= 0) { if (s == NULL) s = node; if (node == njd->tail) e = node; } else { if (s != NULL) e = node->prev; } if (s != NULL && e != NULL) { convert_digit_sequence(s, e); s = e = NULL; } } if (find == 0) return; NJD_remove_silent_node(njd); if (njd->head == NULL) return; for (node = njd->head->next; node != NULL && node->next != NULL; node = node->next) { if (strcmp(NJDNode_get_string(node), "*") != 0 && strcmp(NJDNode_get_string(node->prev), "*") != 0 && (strcmp(NJDNode_get_string(node), NJD_SET_DIGIT_TEN1) == 0 || strcmp(NJDNode_get_string(node), NJD_SET_DIGIT_TEN2) == 0) && strcmp(NJDNode_get_pos_group1(node->prev), NJD_SET_DIGIT_KAZU) == 0 && strcmp(NJDNode_get_pos_group1(node->next), NJD_SET_DIGIT_KAZU) == 0) { NJDNode_load(node, NJD_SET_DIGIT_TEN_FEATURE); NJDNode_set_chain_flag(node, 1); if (strcmp(NJDNode_get_string(node->prev), NJD_SET_DIGIT_ZERO1) == 0 || strcmp(NJDNode_get_string(node->prev), NJD_SET_DIGIT_ZERO2) == 0) { NJDNode_set_pron(node->prev, NJD_SET_DIGIT_ZERO_BEFORE_DP); NJDNode_set_mora_size(node->prev, 2); } else if (strcmp(NJDNode_get_string(node->prev), NJD_SET_DIGIT_TWO) == 0) { NJDNode_set_pron(node->prev, NJD_SET_DIGIT_TWO_BEFORE_DP); NJDNode_set_mora_size(node->prev, 2); } else if (strcmp(NJDNode_get_string(node->prev), NJD_SET_DIGIT_FIVE) == 0) { NJDNode_set_pron(node->prev, NJD_SET_DIGIT_FIVE_BEFORE_DP); NJDNode_set_mora_size(node->prev, 2); } } } for (node = njd->head->next; node != NULL; node = node->next) { if (strcmp(NJDNode_get_pos_group1(node->prev), NJD_SET_DIGIT_KAZU) == 0) { if (strcmp(NJDNode_get_pos_group2(node), NJD_SET_DIGIT_JOSUUSHI) == 0 || strcmp(NJDNode_get_pos_group1(node), NJD_SET_DIGIT_FUKUSHIKANOU) == 0) { /* convert digit pron */ if (search_numerative_class(njd_set_digit_rule_numerative_class1b, node) == 1) convert_digit_pron(njd_set_digit_rule_conv_table1b, node->prev); else if (search_numerative_class(njd_set_digit_rule_numerative_class1c1, node) == 1) convert_digit_pron(njd_set_digit_rule_conv_table1c1, node->prev); else if (search_numerative_class(njd_set_digit_rule_numerative_class1c2, node) == 1) convert_digit_pron(njd_set_digit_rule_conv_table1c2, node->prev); else if (search_numerative_class(njd_set_digit_rule_numerative_class1d, node) == 1) convert_digit_pron(njd_set_digit_rule_conv_table1d, node->prev); else if (search_numerative_class(njd_set_digit_rule_numerative_class1e, node) == 1) convert_digit_pron(njd_set_digit_rule_conv_table1e, node->prev); else if (search_numerative_class(njd_set_digit_rule_numerative_class1f, node) == 1) convert_digit_pron(njd_set_digit_rule_conv_table1f, node->prev); else if (search_numerative_class(njd_set_digit_rule_numerative_class1g, node) == 1) convert_digit_pron(njd_set_digit_rule_conv_table1g, node->prev); else if (search_numerative_class(njd_set_digit_rule_numerative_class1h, node) == 1) convert_digit_pron(njd_set_digit_rule_conv_table1h, node->prev); else if (search_numerative_class(njd_set_digit_rule_numerative_class1i, node) == 1) convert_digit_pron(njd_set_digit_rule_conv_table1i, node->prev); else if (search_numerative_class(njd_set_digit_rule_numerative_class1j, node) == 1) convert_digit_pron(njd_set_digit_rule_conv_table1j, node->prev); else if (search_numerative_class(njd_set_digit_rule_numerative_class1k, node) == 1) convert_digit_pron(njd_set_digit_rule_conv_table1k, node->prev); /* convert numerative pron */ if (search_numerative_class(njd_set_digit_rule_numerative_class2b, node) == 1) convert_numerative_pron(njd_set_digit_rule_conv_table2b, node->prev, node); else if (search_numerative_class(njd_set_digit_rule_numerative_class2c, node) == 1) convert_numerative_pron(njd_set_digit_rule_conv_table2c, node->prev, node); else if (search_numerative_class(njd_set_digit_rule_numerative_class2d, node) == 1) convert_numerative_pron(njd_set_digit_rule_conv_table2d, node->prev, node); else if (search_numerative_class(njd_set_digit_rule_numerative_class2e, node) == 1) convert_numerative_pron(njd_set_digit_rule_conv_table2e, node->prev, node); else if (search_numerative_class(njd_set_digit_rule_numerative_class2f, node) == 1) convert_numerative_pron(njd_set_digit_rule_conv_table2f, node->prev, node); /* modify accent phrase */ NJDNode_set_chain_flag(node->prev, 0); NJDNode_set_chain_flag(node, 1); } } } for (node = njd->head->next; node != NULL; node = node->next) { if (strcmp(NJDNode_get_pos_group1(node->prev), NJD_SET_DIGIT_KAZU) == 0) { if (strcmp(NJDNode_get_pos_group1(node), NJD_SET_DIGIT_KAZU) == 0 && NJDNode_get_string(node->prev) != NULL && NJDNode_get_string(node) != NULL) { /* modify accent phrase */ find = 0; for (i = 0; njd_set_digit_rule_numeral_list4[i] != NULL; i++) { if (strcmp(NJDNode_get_string(node->prev), njd_set_digit_rule_numeral_list4[i]) == 0) { for (j = 0; njd_set_digit_rule_numeral_list5[j] != NULL; j++) { if (strcmp(NJDNode_get_string(node), njd_set_digit_rule_numeral_list5[j]) == 0) { NJDNode_set_chain_flag(node->prev, 0); NJDNode_set_chain_flag(node, 1); find = 1; break; } } break; } } if (find == 0) { for (i = 0; njd_set_digit_rule_numeral_list5[i] != NULL; i++) { if (strcmp(NJDNode_get_string(node->prev), njd_set_digit_rule_numeral_list5[i]) == 0) { for (j = 0; njd_set_digit_rule_numeral_list4[j] != NULL; j++) { if (strcmp(NJDNode_get_string(node), njd_set_digit_rule_numeral_list4[j]) == 0) { NJDNode_set_chain_flag(node, 0); break; } } break; } } } } if (search_numerative_class(njd_set_digit_rule_numeral_list8, node) == 1) convert_digit_pron(njd_set_digit_rule_numeral_list9, node->prev); if (search_numerative_class(njd_set_digit_rule_numeral_list10, node) == 1) convert_digit_pron(njd_set_digit_rule_numeral_list11, node->prev); if (search_numerative_class(njd_set_digit_rule_numeral_list6, node) == 1) convert_numerative_pron(njd_set_digit_rule_numeral_list7, node->prev, node); } } for (node = njd->head; node != NULL; node = node->next) { if (node->next != NULL && strcmp(NJDNode_get_string(node->next), "*") != 0 && strcmp(NJDNode_get_pos_group1(node), NJD_SET_DIGIT_KAZU) == 0 && (node->prev == NULL || strcmp(NJDNode_get_pos_group1(node->prev), NJD_SET_DIGIT_KAZU) != 0) && (strcmp(NJDNode_get_pos_group2(node->next), NJD_SET_DIGIT_JOSUUSHI) == 0 || strcmp(NJDNode_get_pos_group1(node->next), NJD_SET_DIGIT_FUKUSHIKANOU) == 0)) { /* convert class3 */ for (i = 0; njd_set_digit_rule_numerative_class3[i] != NULL; i += 2) { if (strcmp(NJDNode_get_string(node->next), njd_set_digit_rule_numerative_class3[i]) == 0 && strcmp(NJDNode_get_read(node->next), njd_set_digit_rule_numerative_class3[i + 1]) == 0) { for (j = 0; njd_set_digit_rule_conv_table3[j] != NULL; j += 4) { if (strcmp(NJDNode_get_string(node), njd_set_digit_rule_conv_table3[j]) == 0) { NJDNode_set_read(node, (char *) njd_set_digit_rule_conv_table3[j + 1]); NJDNode_set_pron(node, (char *) njd_set_digit_rule_conv_table3[j + 1]); NJDNode_set_acc(node, atoi(njd_set_digit_rule_conv_table3[j + 2])); NJDNode_set_mora_size(node, atoi(njd_set_digit_rule_conv_table3[j + 3])); break; } } break; } } /* person */ if (strcmp(NJDNode_get_string(node->next), NJD_SET_DIGIT_NIN) == 0) { for (i = 0; njd_set_digit_rule_conv_table4[i] != NULL; i += 2) { if (strcmp(NJDNode_get_string(node), njd_set_digit_rule_conv_table4[i]) == 0) { NJDNode_load(node, (char *) njd_set_digit_rule_conv_table4[i + 1]); NJDNode_set_pron(node->next, NULL); break; } } } /* the day of month */ if (strcmp(NJDNode_get_string(node->next), NJD_SET_DIGIT_NICHI) == 0 && strcmp(NJDNode_get_string(node), "*") != 0) { if (node->prev != NULL && strstr(NJDNode_get_string(node->prev), NJD_SET_DIGIT_GATSU) != NULL && strcmp(NJDNode_get_string(node), NJD_SET_DIGIT_ONE) == 0) { NJDNode_load(node, NJD_SET_DIGIT_TSUITACHI); NJDNode_set_pron(node->next, NULL); } else { for (i = 0; njd_set_digit_rule_conv_table5[i] != NULL; i += 2) { if (strcmp(NJDNode_get_string(node), njd_set_digit_rule_conv_table5[i]) == 0) { NJDNode_load(node, (char *) njd_set_digit_rule_conv_table5[i + 1]); NJDNode_set_pron(node->next, NULL); break; } } } } else if (strcmp(NJDNode_get_string(node->next), NJD_SET_DIGIT_NICHIKAN) == 0) { for (i = 0; njd_set_digit_rule_conv_table6[i] != NULL; i += 2) { if (strcmp(NJDNode_get_string(node), njd_set_digit_rule_conv_table6[i]) == 0) { NJDNode_load(node, (char *) njd_set_digit_rule_conv_table6[i + 1]); NJDNode_set_pron(node->next, NULL); break; } } } } } for (node = njd->head; node != NULL; node = node->next) { if ((node->prev == NULL || strcmp(NJDNode_get_pos_group1(node->prev), NJD_SET_DIGIT_KAZU) != 0) && node->next != NULL && node->next->next != NULL) { if (strcmp(NJDNode_get_string(node), NJD_SET_DIGIT_TEN) == 0 && strcmp(NJDNode_get_string(node->next), NJD_SET_DIGIT_FOUR) == 0) { if (strcmp(NJDNode_get_string(node->next->next), NJD_SET_DIGIT_NICHI) == 0) { NJDNode_load(node, NJD_SET_DIGIT_JUYOKKA); NJDNode_set_pron(node->next, NULL); NJDNode_set_pron(node->next->next, NULL); } else if (strcmp(NJDNode_get_string(node->next->next), NJD_SET_DIGIT_NICHIKAN) == 0) { NJDNode_load(node, NJD_SET_DIGIT_JUYOKKAKAN); NJDNode_set_pron(node->next, NULL); NJDNode_set_pron(node->next->next, NULL); } } else if (strcmp(NJDNode_get_string(node), NJD_SET_DIGIT_TWO) == 0 && strcmp(NJDNode_get_string(node->next), NJD_SET_DIGIT_TEN) == 0) { if (strcmp(NJDNode_get_string(node->next->next), NJD_SET_DIGIT_NICHI) == 0) { NJDNode_load(node, NJD_SET_DITIT_HATSUKA); NJDNode_set_pron(node->next, NULL); NJDNode_set_pron(node->next->next, NULL); } else if (strcmp(NJDNode_get_string(node->next->next), NJD_SET_DIGIT_NICHIKAN) == 0) { NJDNode_load(node, NJD_SET_DIGIT_HATSUKAKAN); NJDNode_set_pron(node->next, NULL); NJDNode_set_pron(node->next->next, NULL); } else if (strcmp(NJDNode_get_string(node->next->next), NJD_SET_DIGIT_FOUR) == 0 && node->next->next->next != NULL) { if (strcmp(NJDNode_get_string(node->next->next->next), NJD_SET_DIGIT_NICHI) == 0) { NJDNode_load(node, NJD_SET_DIGIT_NIJU); NJDNode_load(node->next, NJD_SET_DITIT_YOKKA); NJDNode_set_pron(node->next->next, NULL); NJDNode_set_pron(node->next->next->next, NULL); } else if (strcmp(NJDNode_get_string(node->next->next->next), NJD_SET_DIGIT_NICHIKAN) == 0) { NJDNode_load(node, NJD_SET_DIGIT_NIJU); NJDNode_load(node->next, NJD_SET_DIGIT_YOKKAKAN); NJDNode_set_pron(node->next->next, NULL); NJDNode_set_pron(node->next->next->next, NULL); } } } } } NJD_remove_silent_node(njd); if (njd->head == NULL) return; }