const FSxCHAR *OLETAJA_DCT::leia_analoog(FSXSTRING *tyvi, FSXSTRING *sonaliik, const FSxGOTAB *t) { int k; FSXSTRING tylp; FSXSTRING tmp1; // kas s�naliik on �ige? if (t->sonaliik != *sonaliik) return (NULL); // kas algv tyvele h��likuklassid sobivad? k = FSxSTRLEN(t->meta); if (k) { FSXSTRING tmp; int i; tmp = tyvi->Left(tyvi->GetLength() - FSxSTRLEN(t->a_tylp)); tmp = tmp.Right(k); if (tmp.GetLength() != k) // string liiga l�hike vms jama return (NULL); tmp.MakeLower(); for (i=0; i < k; i++) { if ((t->meta[i] == (FSxCHAR)'V' && TaheHulgad::OnTaishaalik(tmp[i])) || tmp[i] == (FSxCHAR)'y') continue; if (t->meta[i] == (FSxCHAR)'L' && TaheHulgad::OnLmnr(tmp[i])) continue; if (t->meta[i] == (FSxCHAR)'P' && TaheHulgad::OnKpt(tmp[i])) continue; if (t->meta[i] == (FSxCHAR)'D' && TaheHulgad::OnKaashaalik(tmp[i]) && (tmp[i]) != (FSxCHAR)'s') continue; if (t->meta[i] == (FSxCHAR)'C' && TaheHulgad::OnKaashaalik(tmp[i])) continue; if (t->meta[i] == (FSxCHAR)'B' && TaheHulgad::OnKaashaalik(tmp[i]) && !TaheHulgad::OnKpt(tmp[i])) continue; return NULL; } } // silbita tyvi SILP s; s.silbita(tyvi); if (s.silpe() == 0) // liiga l�hike t�vi vm jama return (NULL); s.silbivalted(); k = s.silpe() - s.viimane_rohuline_silp(); ASSERT(k > 0); // kas a_tyvi silbid sobivad? if (k < t->min_silpe || k > t->max_silpe) return (NULL); // vale silpide arv if (FSxSTRCMP(t->sonaliik, LIIK_VERB)==0) { if (TaheHulgad::OnLopus(tyvi, FSxSTR("ne")) && s.silpe() > 3) return (NULL); } if (FSxSTRCMP(t->sonaliik, LIIK_VERB)==0) if (*sonaliik != LIIK_VERB) return(NULL); // teatud juhtudel v�lte arvestamine if (!FSxSTRCMP(t->tyypsona, FSxSTR("ragin"))) { // sobivad ainult 2-silbilised 1. v�ltes s�nad if (s.silpe() == 2 && k == 2 && s.silbid[0]->valde == 1) ; // OK else return (NULL); } return (t->tyypsona); }
FSXSTRING *OLETAJA_DCT::konstrui_tyvi(FSXSTRING *tyvi, FSXSTRING *vorm, const FSxOTAB *t) { int k; FSXSTRING tmp1; tmp1 = t->vorm; if (tmp1 != *vorm) return (NULL); // otsitav vorm ei sobi if (!TaheHulgad::OnLopus(tyvi, t->u_tylp)) return (NULL); // algvormile lisatav t�vel�pp ei sobi a_tyvi = *tyvi; a_tyvi = a_tyvi.Left(a_tyvi.GetLength() - FSxSTRLEN(t->u_tylp)); tmp1 = t->a_tylp; tmp1 = tmp1.Right(t->n); a_tyvi += tmp1; // algvormi t�vi valmis if (!TaheHulgad::OnLopus(&a_tyvi,t->a_tylp)) return (NULL); // algvormile lisatav t�vel�pp ei sobi if (a_tyvi.GetLength() < 3) return (NULL); // liiga l�hike // kas algv tyvele h��likuklassid sobivad? k = FSxSTRLEN(t->meta); if (k) { FSXSTRING tmp; int i; tmp = a_tyvi.Left(a_tyvi.GetLength() - FSxSTRLEN(t->a_tylp)); tmp = tmp.Right(k); if (tmp.GetLength() != k) // string liiga l�hike vms jama return (NULL); tmp.MakeLower(); for (i=0; i < k; i++) { if ((t->meta[i] == (FSxCHAR)'V' && TaheHulgad::OnTaishaalik(tmp[i])) || tmp[i] == (FSxCHAR)'y') continue; if (t->meta[i] == (FSxCHAR)'L' && TaheHulgad::OnLmnr(tmp[i])) continue; if (t->meta[i] == (FSxCHAR)'P' && TaheHulgad::OnKpt(tmp[i])) continue; if (t->meta[i] == (FSxCHAR)'D' && TaheHulgad::OnKaashaalik(tmp[i]) && (tmp[i]) != (FSxCHAR)'s') continue; if (t->meta[i] == (FSxCHAR)'C' && TaheHulgad::OnKaashaalik(tmp[i])) continue; if (t->meta[i] == (FSxCHAR)'B' && TaheHulgad::OnKaashaalik(tmp[i]) && !TaheHulgad::OnKpt(tmp[i])) continue; return NULL; } } // silbita a_tyvi SILP s; s.silbita(&a_tyvi); if (s.silpe() == 0) // liiga l�hike t�vi vm jama return (NULL); s.silbivalted(); k = s.silpe() - s.viimane_rohuline_silp(); ASSERT(k > 0); // kas a_tyvi silbid sobivad? if (k < t->min_silpe || k > t->max_silpe) return (NULL); // vale silpide arv if (FSxSTRCMP(t->sonaliik, LIIK_VERB)==0) { if (TaheHulgad::OnLopus(&a_tyvi, FSxSTR("ne")) && s.silpe() > 3) return (NULL); } // teatud juhtudel v�lte arvestamine if (!FSxSTRCMP(t->tyypsona, FSxSTR("ragin"))) { // sobivad ainult 2-silbilised 1. v�ltes s�nad if (s.silpe() == 2 && k == 2 && s.silbid[0]->valde == 1) ; // OK else return (NULL); } // et v�ltida asju nagu ��vli -> ��vl if (k == 1 && TaheHulgad::OnLopus(&a_tyvi, FSxSTR("l")) && !TaheHulgad::OnLopus(&a_tyvi, FSxSTR("ll")) && !TaheHulgad::OnLopus(&a_tyvi, FSxSTR("rl")) && !TaheHulgad::OnLopus(&a_tyvi, FSxSTR("hl"))) { if (s.silbid[s.viimane_rohuline_silp()]->valde == 3 && TaheHulgad::OnKaashaalik(a_tyvi[a_tyvi.GetLength()-2])) return (NULL); } // itaalia nimed if (TaheHulgad::OnLopus(&a_tyvi, FSxSTR("cc")) && TaheHulgad::OnLopus(tyvi, FSxSTR("cci"))) return (NULL); return (&a_tyvi); }