better
This commit is contained in:
parent
c16539ae02
commit
5b351d20ee
1 changed files with 283 additions and 160 deletions
443
src/phon.c
443
src/phon.c
|
|
@ -33,7 +33,277 @@ static int p_match(const char* buffer, const char* target, long buffer_length) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define FLAT
|
#define M(X) p_match(buffer + i, (X), length - i)
|
||||||
|
#define DEF(X) static int X(unsigned char* ph, int i, const char* buffer, long length, int first, int last, char b_c)
|
||||||
|
|
||||||
|
DEF(p_gen_4) {
|
||||||
|
if(M("tion")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_SH;
|
||||||
|
ph[i * MAX_PPL + 1] = P_AH;
|
||||||
|
ph[i * MAX_PPL + 2] = P_N;
|
||||||
|
return 3;
|
||||||
|
} else if(M("sion")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_ZH;
|
||||||
|
ph[i * MAX_PPL + 1] = P_AH;
|
||||||
|
ph[i * MAX_PPL + 2] = P_N;
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEF(p_silent_e) {
|
||||||
|
if(M("a_e")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_EY;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} else if(M("i_e")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_AY;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} else if(M("o_e")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_OW;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} else if(M("u_e")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_Y;
|
||||||
|
ph[i * MAX_PPL + 1] = P_UW;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEF(p_special_2) {
|
||||||
|
if(M("ly") && last) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_L;
|
||||||
|
ph[i * MAX_PPL + 1] = P_IY;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
} else if(M("le") && last) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_L;
|
||||||
|
ph[i * MAX_PPL + 1] = P_EH;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEF(p_gen_2) {
|
||||||
|
if(M("ll")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_L;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
} else if(M("sh")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_SH;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
} else if(M("ch")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_CH;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
} else if(M("th")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_TH;
|
||||||
|
i++;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
} else if(M("ph")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_F;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
} else if(M("ng")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_NG;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
} else if(M("wr")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_R;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
} else if(M("kn") || M("gn")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_N;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
} else if(M("ck")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_K;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
} else if(M("wa")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_W;
|
||||||
|
ph[i * MAX_PPL + 1] = P_AE;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
} else if(M("te")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_T;
|
||||||
|
ph[i * MAX_PPL + 1] = P_EH;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
} else if(M("tt")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_T;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEF(p_vowel_2) {
|
||||||
|
if(M("ee") || M("ea")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_EY;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
} else if(M("oo")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_UW; /* FIXME: could be P_UH */
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
} else if(M("ou")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_AW;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
} else if(M("ow")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_OW;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
} else if(M("oi") || M("oy")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_OY;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
} else if(M("ar")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_AA;
|
||||||
|
ph[i * MAX_PPL + 1] = P_R;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
} else if(M("er") || M("ir") || M("ur")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_ER;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
} else if(M("or")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_AO;
|
||||||
|
ph[i * MAX_PPL + 1] = P_R;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEF(p_soft) {
|
||||||
|
if(M("c")) {
|
||||||
|
if(b_c == 'e' || b_c == 'i' || b_c == 'y') {
|
||||||
|
ph[i * MAX_PPL + 0] = P_S;
|
||||||
|
} else {
|
||||||
|
ph[i * MAX_PPL + 0] = P_K;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} else if(M("g")) {
|
||||||
|
if(b_c == 'e' || b_c == 'i' || b_c == 'y') {
|
||||||
|
ph[i * MAX_PPL + 0] = P_JH;
|
||||||
|
} else {
|
||||||
|
ph[i * MAX_PPL + 0] = P_G;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEF(p_special_1) {
|
||||||
|
if(M("e") && last) {
|
||||||
|
return 0;
|
||||||
|
} else if(M("y") && first) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_Y;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} else if(M("y") && last) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_IY;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} else if(M("n") && last) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_N;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} else if(M("k") && last) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_K;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEF(p_gen_1) {
|
||||||
|
if(M("s")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_S;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} else if(M("f")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_F;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} else if(M("t")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_T;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} else if(M("p")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_P;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} else if(M("l")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_L;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} else if(M("m")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_M;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} else if(M("n")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_N;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} else if(M("d")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_D;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} else if(M("h")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_HH;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEF(p_vowel_1) {
|
||||||
|
if(M("a")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_AE;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} else if(M("e")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_EH;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} else if(M("i")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_IH;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} else if(M("o")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_AA;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} else if(M("u")) {
|
||||||
|
ph[i * MAX_PPL + 0] = P_AH;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef DEF
|
||||||
|
#undef M
|
||||||
|
|
||||||
void ft_phon_main(FT_HANDLE handle, const char* buffer, long length) {
|
void ft_phon_main(FT_HANDLE handle, const char* buffer, long length) {
|
||||||
unsigned char* ph = malloc(length * MAX_PPL);
|
unsigned char* ph = malloc(length * MAX_PPL);
|
||||||
|
|
@ -45,6 +315,7 @@ void ft_phon_main(FT_HANDLE handle, const char* buffer, long length) {
|
||||||
int first = 0;
|
int first = 0;
|
||||||
int last = 0;
|
int last = 0;
|
||||||
char b_c = (i > 0) ? buffer[i - 1] : 0;
|
char b_c = (i > 0) ? buffer[i - 1] : 0;
|
||||||
|
int n;
|
||||||
|
|
||||||
b_c = tolower(b_c);
|
b_c = tolower(b_c);
|
||||||
|
|
||||||
|
|
@ -53,168 +324,20 @@ void ft_phon_main(FT_HANDLE handle, const char* buffer, long length) {
|
||||||
|
|
||||||
if(ph[i * MAX_PPL]) continue;
|
if(ph[i * MAX_PPL]) continue;
|
||||||
|
|
||||||
#define M(X) p_match(buffer + i, (X), length - i)
|
|
||||||
if(FT_IS_SKIPPABLE(buffer[i])) {
|
if(FT_IS_SKIPPABLE(buffer[i])) {
|
||||||
ph[i * MAX_PPL + 0] = P_DOT;
|
ph[i * MAX_PPL + 0] = P_DOT;
|
||||||
} else if(M("tion")) {
|
} else if((n = p_gen_4(ph, i, buffer, length, first, last, b_c)) != -1) {
|
||||||
/*** 4 letters ***/
|
} else if((n = p_silent_e(ph, i, buffer, length, first, last, b_c)) != -1) {
|
||||||
ph[i * MAX_PPL + 0] = P_SH;
|
} else if((n = p_special_2(ph, i, buffer, length, first, last, b_c)) != -1) {
|
||||||
ph[i * MAX_PPL + 1] = P_AH;
|
} else if((n = p_gen_2(ph, i, buffer, length, first, last, b_c)) != -1) {
|
||||||
ph[i * MAX_PPL + 2] = P_N;
|
} else if((n = p_vowel_2(ph, i, buffer, length, first, last, b_c)) != -1) {
|
||||||
i += 3;
|
} else if((n = p_soft(ph, i, buffer, length, first, last, b_c)) != -1) {
|
||||||
} else if(M("sion")) {
|
} else if((n = p_special_1(ph, i, buffer, length, first, last, b_c)) != -1) {
|
||||||
ph[i * MAX_PPL + 0] = P_ZH;
|
} else if((n = p_gen_1(ph, i, buffer, length, first, last, b_c)) != -1) {
|
||||||
ph[i * MAX_PPL + 1] = P_AH;
|
} else if((n = p_vowel_1(ph, i, buffer, length, first, last, b_c)) != -1) {
|
||||||
ph[i * MAX_PPL + 2] = P_N;
|
|
||||||
i += 3;
|
|
||||||
/*** Silent-E ***/
|
|
||||||
} else if(M("a_e")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_EY;
|
|
||||||
} else if(M("i_e")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_AY;
|
|
||||||
} else if(M("o_e")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_OW;
|
|
||||||
} else if(M("u_e")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_Y;
|
|
||||||
ph[i * MAX_PPL + 1] = P_UW;
|
|
||||||
/*** SH / CH / TH / PH / NG ***/
|
|
||||||
} else if(M("sh")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_SH;
|
|
||||||
i++;
|
|
||||||
} else if(M("ch")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_CH;
|
|
||||||
i++;
|
|
||||||
} else if(M("th")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_TH;
|
|
||||||
i++;
|
|
||||||
} else if(M("ph")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_F;
|
|
||||||
i++;
|
|
||||||
} else if(M("ng")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_NG;
|
|
||||||
i++;
|
|
||||||
/*** WR / KN / GN ***/
|
|
||||||
} else if(M("wr")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_R;
|
|
||||||
i++;
|
|
||||||
} else if(M("kn") || M("gn")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_N;
|
|
||||||
i++;
|
|
||||||
/*** CK ***/
|
|
||||||
} else if(M("ck")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_K;
|
|
||||||
i++;
|
|
||||||
/*** EE/EA ***/
|
|
||||||
} else if(M("ee") || M("ea")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_EY;
|
|
||||||
i++;
|
|
||||||
/*** OO ***/
|
|
||||||
} else if(M("oo")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_UW; /* FIXME: could be P_UH */
|
|
||||||
i++;
|
|
||||||
/*** OU/OW ***/
|
|
||||||
} else if(M("ou")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_AW;
|
|
||||||
i++;
|
|
||||||
} else if(M("ow")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_OW;
|
|
||||||
i++;
|
|
||||||
/*** OI/OY ***/
|
|
||||||
} else if(M("oi") || M("oy")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_OY;
|
|
||||||
i++;
|
|
||||||
/*** R-controlled vowels ***/
|
|
||||||
} else if(M("ar")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_AA;
|
|
||||||
ph[i * MAX_PPL + 1] = P_R;
|
|
||||||
i++;
|
|
||||||
} else if(M("er") || M("ir") || M("ur")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_ER;
|
|
||||||
i++;
|
|
||||||
} else if(M("or")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_AO;
|
|
||||||
ph[i * MAX_PPL + 1] = P_R;
|
|
||||||
i++;
|
|
||||||
/*** Misc ***/
|
|
||||||
} else if(M("wa")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_W;
|
|
||||||
ph[i * MAX_PPL + 1] = P_AE;
|
|
||||||
i++;
|
|
||||||
} else if(M("te")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_T;
|
|
||||||
ph[i * MAX_PPL + 1] = P_EH;
|
|
||||||
i++;
|
|
||||||
} else if(M("tt")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_T;
|
|
||||||
i++;
|
|
||||||
/*** Soft C ***/
|
|
||||||
} else if(M("c")) {
|
|
||||||
if(b_c == 'e' || b_c == 'i' || b_c == 'y') {
|
|
||||||
ph[i * MAX_PPL + 0] = P_S;
|
|
||||||
} else {
|
|
||||||
ph[i * MAX_PPL + 0] = P_K;
|
|
||||||
}
|
|
||||||
/*** Soft G ***/
|
|
||||||
} else if(M("g")) {
|
|
||||||
if(b_c == 'e' || b_c == 'i' || b_c == 'y') {
|
|
||||||
ph[i * MAX_PPL + 0] = P_JH;
|
|
||||||
} else {
|
|
||||||
ph[i * MAX_PPL + 0] = P_G;
|
|
||||||
}
|
|
||||||
/*** Misc ***/
|
|
||||||
} else if(M("ly") && last) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_L;
|
|
||||||
ph[i * MAX_PPL + 1] = P_IY;
|
|
||||||
i++;
|
|
||||||
} else if(M("le") && last) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_L;
|
|
||||||
ph[i * MAX_PPL + 1] = P_EH;
|
|
||||||
i++;
|
|
||||||
/*** Final silent E ***/
|
|
||||||
} else if(M("e") && last) {
|
|
||||||
/*** Y ***/
|
|
||||||
} else if(M("y") && first) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_Y;
|
|
||||||
} else if(M("y") && last) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_IY;
|
|
||||||
/*** Misc ***/
|
|
||||||
} else if(M("n") && last) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_N;
|
|
||||||
} else if(M("k") && last) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_K;
|
|
||||||
/*** Short vowels ***/
|
|
||||||
} else if(M("a")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_AE;
|
|
||||||
} else if(M("e")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_EH;
|
|
||||||
} else if(M("i")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_IH;
|
|
||||||
} else if(M("o")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_AA;
|
|
||||||
} else if(M("u")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_AH;
|
|
||||||
/*** S voicing ***/
|
|
||||||
} else if(M("s")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_S;
|
|
||||||
/*** Misc ***/
|
|
||||||
} else if(M("f")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_F;
|
|
||||||
} else if(M("t")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_T;
|
|
||||||
} else if(M("p")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_P;
|
|
||||||
} else if(M("l")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_L;
|
|
||||||
} else if(M("m")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_M;
|
|
||||||
} else if(M("n")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_N;
|
|
||||||
} else if(M("d")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_D;
|
|
||||||
} else if(M("h")) {
|
|
||||||
ph[i * MAX_PPL + 0] = P_HH;
|
|
||||||
}
|
}
|
||||||
#undef M
|
|
||||||
|
if(n != -1) i += n;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stderr, "phoneme of \"");
|
fprintf(stderr, "phoneme of \"");
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue