///////////////////////////////////////////////////////////////////////////// // // Copyright (C) 1997, Microsoft Corporation. All Rights Reserved. // // COMPOSE.CPP // These funtions is to compose the word with stem and ending. // If you want to understand more details, get the flow chart. // made by dhyu 1996. 2 // ///////////////////////////////////////////////////////////////////////////// #include #include "basedef.hpp" #include "basedict.hpp" #include "basegbl.hpp" #include "ReadHeosaDict.h" /* extern char far _IA_BP, // a3+ : PIEUP irregular light adjective far _RA_B, // a3r : PIEUP regular light adjective far _IA_HP, // a5+ : HIEUH irregular light adjective far _IA_HM, // a5- : HIEUH irregular dark adjective far _IA_RmP, // a6+ : REU irregular light adjective far _IA_RmM, // a6- : REU irregular dark adjective far _IA_Rj, // a7 : REO irregular adjective far _IA_OmP, // a8+ : EU irregular light adjective far _IA_OmM, // a8- : EU irregular dark adjective far _IV_DP, // v2+ : TIEUT irregular light verb far _IV_DM, // v2- : TIEUT irregular dark verb far _IV_Gj, // v0 : GEORA irregular verb far _IV_Nj, // v1 : NEORA irregular verb far _RV_D, // v2r : TIEUT regular verb far _IV_BP, // v3+ : PIEUP irregular light verb far _IV_BM, // v3- : PIEUP irregular dark verb far _IV_SP, // v4+ : SIOS irregular light verb far _IV_SM, // v4- : SIOS irregular dark verb far _IV_RmP, // v6+ : REU irregular light verb far _IV_RmM, // v6- : REU irregular dark verb far _IV_Rj, // v7 : REO irregular verb far _IV_OmP, // v8+ : EU irregular light verb far _IV_OmM; // v8- : EU irregular dark verb */ // check wether right most vowel of stem is light vowel, or not // stem should be reverse order BOOL CheckRightMostStemVowel (char *stem) { char vowel; if (stem [0] < __V_k) vowel = stem [1]; else vowel = stem [0]; switch (vowel) { case __V_k : case __V_i : case __V_h : return TRUE; } return FALSE; } int Compose_RIEUL_Irregular (char *stem, char *ending) { int i, len; char *inheosa; if (stem [0] == __K_R) { switch (ending [0]) { case __K_I : switch (ending [1]) { case __V_j : if (CheckRightMostStemVowel (stem)) // vowel harmony ending [1] = __V_k; return COMPOSED; case __V_m : if (ending [2] != __K_M) memmove (stem, stem + 1, lstrlen (stem)); // remove "RIEUL" memmove (ending, ending + 2, lstrlen (ending+1)); // remove "IEUNG, EU" return COMPOSED; default : return COMPOSE_ERROR; } case __K_S : memmove (stem, stem + 1, lstrlen (stem)); // remove "RIEUL" if (ending [1] == __V_m) memmove (ending, ending + 2, lstrlen (ending+1)); // remove "SIOS, EU" return COMPOSED; case __K_N : memmove (stem, stem + 1, lstrlen (stem)); // remove "RIEUL" len = lstrlen(ending); inheosa = new char [len+1]; for (i = 0; i < len; i++) inheosa [i] = ending [len-1-i]; inheosa [i] = '\0'; BYTE action; FindHeosaWord (inheosa, _ENDING, &action); if ((action & 0x80) && !(action & 0x40)) // if CV = 10 memmove (ending, ending + 2, lstrlen (ending+1)); // remove "NIEUN, EU" return COMPOSED; case __K_G : case __K_D : case __K_J : return COMPOSED; default : return COMPOSE_ERROR; } } return NOT_COMPOSED; } int Compose_HIEUH_Irregular (char *stem, char *ending) { if (stem [0] == __K_H) { int len = lstrlen(stem); char * inheosa = new char [len+1]; for (int i = 0; i < len; i++) inheosa [i] = stem [len-1-i]; inheosa [i] = '\0'; switch (ending [0]) { case __K_I : if (FindIrrWord(inheosa, _IA_HP) & FINAL || // HIEUH irregular light adjective (A5+) FindIrrWord(inheosa, _IA_HM) & FINAL) // HIEUH irregular dark adjective (A5-) { switch (ending [1]) { case __V_j : // "IEUNG, EO" memmove (stem, stem+1, lstrlen(stem)); // remove "HIEUH" memmove (ending, ending + 2, lstrlen (ending+1)); // remove "IEUNG, EO" switch (stem [0]) { case __V_k : stem [0] = __V_o; return COMPOSED; case __V_j : stem [0] = __V_p; return COMPOSED; case __V_i : stem [0] = __V_O; return COMPOSED; case __V_u : stem [0] = __V_P; return COMPOSED; default : return COMPOSE_ERROR; } case __V_m : // "IEUNG, EU" memmove (stem, stem+1, lstrlen(stem)); // remove "HIEUH" memmove (ending, ending + 2, lstrlen (ending+1)); // remove "IEUNG, EU" return COMPOSED; default : return COMPOSE_ERROR; } } switch (ending [1]) { case __V_j : if (CheckRightMostStemVowel (stem)) // vowel harmony ending [1] = __V_k; return COMPOSED; case __V_m : return COMPOSED; default : return COMPOSE_ERROR; } case __K_N : // "NIEUN" if (FindIrrWord(inheosa, _IA_HP) & FINAL || // HIEUH irregular light adjective (A5+) FindIrrWord(inheosa, _IA_HM) & FINAL) // HIEUH irregular dark adjective (A5-) memmove (stem, stem+1, lstrlen(stem)); // remove "HIEUH" return COMPOSED; case __K_G : case __K_S : case __K_J : return COMPOSED; default : return COMPOSE_ERROR; } } return NOT_COMPOSED; } int Compose_PIEUP_Irregular (char *stem, char *ending) { if (stem [0] == __K_B) { int len = lstrlen(stem); char * inheosa = new char [len+1]; for (int i = 0; i < len; i++) inheosa [i] = stem [len-1-i]; inheosa [i] = '\0'; if (FindIrrWord(inheosa, _IV_BP) & FINAL || // PIEUP irregular light verb (V3+) FindIrrWord(inheosa, _IA_BP) & FINAL) // PIEUP irregular light adjective (A3+) { if (ending [0] == __K_I) { if (ending [1] == __V_j) { // "PIEUP, IEUNG, EO" --> "IEUNG, WA" memmove (stem, stem+1, lstrlen(stem)); ending [1] = __V_hk; return COMPOSED; } if (ending [1] == __V_m) // "IEUNG, EU" { // "PIEUP, IEUNG, EU" --> "IEUNG, U" memmove (stem, stem+1, lstrlen(stem)); // remove "PIEUP" ending [1] = __V_n; return COMPOSED; } } return COMPOSED; } char Temp [] = { __K_G_D, __V_h, __K_B, 0, 0, 1, __K_B, __V_k, __K_R, __K_B, 0, 2, __K_B_D, __V_h, __K_B, 0, 0, 1, __K_S_D, __V_l, __K_B, 0, 0, 1, __K_I, __V_j, __K_B, 0, 0, 1, __K_I, __V_l, __K_B, 0, 0, 1, __K_J, __V_k, __K_B, 0, 0, 1, __K_J, __V_j, __K_B, 0, 0, 1, __K_J, __V_l, __K_B, 0, 0, 1 }; LenDict RV_B (Temp, 6, 9); int eulpos = lstrlen (inheosa) - 1; if (FindIrrWord(inheosa, _RA_B) & FINAL || // PIEUP regular adjective (a3r) RV_B.FindWord(inheosa, eulpos) != -1) // PIEUP regular verb { if (ending [0] == __K_I && ending [1] == __V_j) // "IEUNG, EO" { if (CheckRightMostStemVowel (stem)) // vowel harmony ending [1] = __V_k; } return COMPOSED; } if (ending [0] == __K_I) { if (ending [1] == __V_j) { // "PIEUP, IEUNG, EO" --> "IEUNG, WA" memmove (stem, stem+1, lstrlen(stem)); ending [1] = __V_hk; return COMPOSED; } if (ending [0] == __K_I && ending [1] == __V_m) // "IEUNG, EU" { memmove (stem, stem+1, lstrlen(stem)); // remove "HIEUH" memmove (ending, ending + 2, lstrlen (ending+1)); // "IEUNG, EU" --> "IEUNG" return COMPOSED; } } return COMPOSED; } return NOT_COMPOSED; } int Compose_TIEUT_Irregular (char *stem, char *ending) { int i, len; char *inheosa; if (stem [0] == __K_D) { if (ending [0] == __K_I) { switch (ending [1]) { case __V_j : // "EO" if (CheckRightMostStemVowel (stem)) // vowel harmony ending [1] = __V_k; case __V_m : // "EU" len = lstrlen(stem); inheosa = new char [len+1]; for (i = 0; i < len; i++) inheosa [i] = stem [len-1-i]; inheosa [i] = '\0'; if (FindIrrWord(inheosa, _IV_DP) & FINAL || // TIEUT irregular light verb (V2+) FindIrrWord(inheosa, _IV_DM) & FINAL) // TIEUT irregular dark verb (V2-) { stem [0] = __K_R; } return COMPOSED; default : return COMPOSE_ERROR; } } return COMPOSED; } return NOT_COMPOSED; } int Compose_SIOS_Irregular (char *stem, char *ending) { int len, i; char *inheosa; if (stem [0] == __K_S) { if (ending [0] == __K_I) { switch (ending [1]) { case __V_j : // "EO" if (CheckRightMostStemVowel (stem)) // vowel harmony ending [1] = __V_k; case __V_m : // "EU" len = lstrlen(stem); inheosa = new char [len+1]; for (i = 0; i < len; i++) inheosa [i] = stem [len-1-i]; inheosa [i] = '\0'; if (FindIrrWord(inheosa, _IV_SP) & FINAL || // SIOS irregular light verb (V2+) FindIrrWord(inheosa, _IV_SM) & FINAL) // SIOS irregular dark verb (V2-) { memmove (stem, stem+1, lstrlen(stem)); // remove SIOS } return COMPOSED; default : return COMPOSE_ERROR; } } return COMPOSED; } return NOT_COMPOSED; } BOOL Compose_YEO_Irregular (char *stem, char *ending) { if (stem [0] == __K_H && stem [1] == __V_k) // The last of stem is "HA" { if (ending [0] == __K_I && ending [1] == __V_m) // The first of ending is "EU" memmove (ending, ending + 2, lstrlen (ending+1)); // remove "IEUNG, EU" if (ending [0] == __K_I && ending [1] == __V_j) { memmove (stem, stem+1, lstrlen (stem)); // remove "A" : the last letter of stem // "IEUNG, EO" --> "AE" memmove (ending, ending+1, lstrlen (ending)); ending [0] = __V_o; } return TRUE; } return FALSE; } void Compose_EU_Irregular (char *stem, char *ending) { int len = lstrlen(stem); char * inheosa = new char [len+1]; for (int i = 0; i < len; i++) inheosa [i] = stem [len-1-i]; inheosa [i] = '\0'; if (FindIrrWord(inheosa, _IV_OmP) & FINAL || // EU irregular light verb (V8+) FindIrrWord(inheosa, _IA_OmP) & FINAL || // EU irregular light adjective (A8+) FindIrrWord(inheosa, _IV_OmM) & FINAL || // EU irregular dark verb (V8-) FindIrrWord(inheosa, _IA_OmM) & FINAL) // EU irregular dark adjective (A8-) { if (ending [0] == __K_I && ending [1] == __V_j) { if (CheckRightMostStemVowel (stem)) // vowel harmony ending [1] = __V_k; memmove (stem, stem+1, lstrlen(stem)); memmove (ending, ending+1, lstrlen(ending)); } } } BOOL Compose_REO_REU_Irregular (char *stem, char *ending) { if (stem [0] == __V_m) // The last letter of stem is "EU" { int len = lstrlen(stem); char * inheosa = new char [len+1]; for (int i = 0; i < len; i++) inheosa [i] = stem [len-1-i]; inheosa [i] = '\0'; if (stem [1] == __K_R) { if (FindIrrWord(inheosa, _IV_Rj) & FINAL || // REO irregular verb (V7) FindIrrWord(inheosa, _IA_Rj) & FINAL) // REO irregular adjective (A7) { if (ending [0] == __K_I) { switch (ending [1]) { case __V_j : ending [0] = __K_R; break; case __V_m : memmove (ending, ending+2, lstrlen(ending+1)); break; } } return TRUE; } if (FindIrrWord(inheosa, _IV_RmP) & FINAL || // REU irregular light verb (V6+) FindIrrWord(inheosa, _IA_RmP) & FINAL || // REU irregular light adjective (A6+) FindIrrWord(inheosa, _IV_RmM) & FINAL || // REU irregular dark verb (V6-) FindIrrWord(inheosa, _IA_RmM) & FINAL) // REU irregular dark adjective (A6-) { if (ending [0] == __K_I) { switch (ending [1]) { case __V_j : if (CheckRightMostStemVowel (stem)) // vowel harmony ending [1] = __V_k; ending [0] = __K_R; break; case __V_m : memmove (ending, ending+2, lstrlen(ending+1)); break; } } return TRUE; } return TRUE; } Compose_EU_Irregular (stem, ending); return TRUE; } return FALSE; } BOOL Compose_U_Irregular (char *stem, char *ending) { if (stem [0] == __K_P && stem [1] == __V_n) // The last of stem is "PU" { if (ending [0] == __K_I && ending [1] == __V_m) // The first of ending is "EU" memmove (ending, ending + 2, lstrlen (ending+1)); // remove "IEUNG, EU" if (ending [0] == __K_I && ending [1] == __V_j) { memmove (stem, stem+1, lstrlen (stem)); // remove "U" : the last letter of stem memmove (ending, ending+1, lstrlen (ending)); // remove "IEUNG" } return TRUE; } return FALSE; } BOOL Compose_GEORA_Irregular (char *stem, char *ending) { if (ending [0] == __K_I && ending [1] == __V_j && ending [2] == __K_R && ending [3] == __V_k) // The last of stem is "GEORA" { int len = lstrlen(stem); char * inheosa = new char [len+1]; for (int i = 0; i < len; i++) inheosa [i] = stem [len-1-i]; inheosa [i] = '\0'; if (FindIrrWord(inheosa, _IV_Gj) & FINAL) // GEORA irregular verb (V0) { ending [0] = __K_G; return TRUE; } if (FindIrrWord(inheosa, _IV_Nj) & FINAL) // NEORA irregular verb (V1) { ending [0] = __K_N; return TRUE; } if (CheckRightMostStemVowel (stem)) // vowel harmony ending [1] = __V_k; return TRUE; } return FALSE; } void Contraction (char *stem, char *ending) { if (CheckRightMostStemVowel (stem)) // vowel harmony ending [1] = __V_k; switch (stem [0]) { case __V_k : // the last letter of stem is "A" memmove (ending, ending+2, lstrlen(ending+2)); return; case __V_j : // the last letter of stem is "EO" memmove (ending, ending+2, lstrlen(ending+2)); return; case __V_h : if (stem [1] == __K_I) // the last character of stem is "O" { stem [0] = __V_hk; memmove (ending, ending+2, lstrlen(ending+1)); } return; case __V_n : stem [0] = __V_nj; memmove (ending, ending+2, lstrlen(ending+1)); return; case __V_hl : if (stem [1] == __K_D) // the last character of stem is "DOE" { stem [0] = __V_hl; memmove (ending, ending+2, lstrlen(ending+1)); } return; case __V_l : if (stem [1] == __K_I) { } } } BOOL Compose_Regular (char * stem, char *ending) { if (stem [0] < __V_k) // if the last letter of stem is consonant { if (ending [0] == __K_I && ending [1] == __V_j) // the first character of ending is "EO" { if (CheckRightMostStemVowel (stem)) // vowel harmony ending [1] = __V_k; } return TRUE; } if (ending [0] == __K_I && ending [1] == __V_j) { if (CheckRightMostStemVowel (stem)) // vowel harmony ending [1] = __V_k; Contraction (stem, ending); return TRUE; } if (ending [0] == __K_I && ending [1] == __V_m) memmove (ending, ending + 2, lstrlen (ending+1)); return TRUE; }