Example #1
0
int MORF0::kchk33(
    VARIANTIDE_AHEL **variandid, 
    VARIANTIDE_AHEL **sobivad_variandid, 
    char *paha_koht,
    const int paha_koha_suurus)
    {
    int res;
    CVARIANTIDE_AHEL cvahe_variant;
    KOMPONENT *pref, *tyvi, *suff, *lopp, *essa;

    /* ts�kkel �le prefiksite, alates l�himast; 0-pref ja 0-suff pole lubat. */
    for (VARIANTIDE_AHEL *variant=*variandid; variant; variant=variant->jargmine_variant)
	    {
        essa = esimene_komp(variant);
        if (essa->k_tyyp != K_PREF) /* ei algagi prefiksiga */
            continue;
        pref = essa;
        tyvi = pref->komp_jargmine;
        suff = tyvi->komp_jargmine;
        if (suff->k_tyyp != K_SUFF)
            continue;
        lopp = suff->komp_jargmine;
        if (lopp->k_tyyp != K_LOPP)
            continue;
        res = ty_suf(suff, tyvi->nihe, tyvi->k_pikkus, &cvahe_variant.ptr, paha_koht, paha_koha_suurus);
	    if (res > ALL_RIGHT)
	        return res; /* viga! */
        if (!cvahe_variant.ptr)  
            continue;  /* tyve polnud */
        for (VARIANTIDE_AHEL *tmp=cvahe_variant.ptr; tmp; tmp=tmp->jargmine_variant) /* vt neid juhte, kus ty+suf juba sobivad */
            { /* kopeeri sobivate hulka koik tyved, mis selle pref-ga sobivad */
            if (sobib_p_t_s(pref, esimene_komp(tmp), suff))
                {
                kopeeri_komp(tyvi, esimene_komp(tmp));
                //VARIANTIDE_AHEL *sobiv_variant; //ok
                //sobiv_variant = lisa_ahel(sobivad_variandid, variant);
                //if (!sobiv_variant)
                if(lisa_ahel(sobivad_variandid, variant)==NULL)
                    return CRASH;
                if(mrfFlags.Chk(MF_SPELL))
                    {
                    ahelad_vabaks(&cvahe_variant.ptr);
			        return ALL_RIGHT; /* 1. sobiv variant k�lbab */
                    }
                }
            }
        ahelad_vabaks(&cvahe_variant.ptr);
	    }
    return ALL_RIGHT;
    }
Example #2
0
int MORF0::arvans1(MRFTULEMUSED *tulemus, FSXSTRING *S6na, int S6naPikkus, VARIANTIDE_AHEL **variandid)
    {
    int res;
    int  cnt, ty2pik;
    CVARIANTIDE_AHEL ctyvi2_variant, cvahe_variant, csobivad_variandid;
    KOMPONENT komp, *k_tyvi, *tyvi1;
    FSXSTRING ema = FSxSTR("ema");
    FSXSTRING tyvi2;
    //int tugevus;
    int maxty2, minty;

    // et saaks ty2lp() kasutada 
    tyvi1 = &komp;
	res = cXXfirst(ema, 3, &cnt);
    if (res == POLE_SEDA || res == POLE_YLDSE)  // sellist tyve pole olemas 
        return CRASH;  // sellist asja ei saa olla 
    nulli_1komp(tyvi1);
    lisa_min_info(tyvi1, &ema, 0, 3);
    lisa_psl_info(tyvi1, K_TYVI, 0);
    // leiame tyvi1 liitumis-liigid 
    res = juht1(tyvi1, dptr, cnt, &cvahe_variant.ptr);
	if (res > ALL_RIGHT)
	    return res; 
    
    maxty2 = S6naPikkus > 20 ? 20 : S6naPikkus-3;
    if (TaheHulgad::OnSuur(S6na, 0)) // oletatavatele nimedele luban �sna pikki j�relkomponente
        minty = 5;
    else
        minty = 2;
    // vt ko'iki v�imalikke l�ppe 
    for (VARIANTIDE_AHEL *variant=*variandid; variant; variant=variant->jargmine_variant)
	    {
        k_tyvi = esimene_komp(variant);
        if (k_tyvi->komp_jargmine->k_tyyp != K_LOPP)
            continue;
        maxty2 = k_tyvi->k_pikkus > 20 ? 20 : k_tyvi->k_pikkus-3;
        for (ty2pik=maxty2; ty2pik >= minty; ty2pik--)
            {
            tyvi2 = k_tyvi->k_algus.Right(ty2pik);
            if (ty2pik < 4)
                {
                if (!oletajaDct.sobivad_tyved2.Get((const FSxCHAR *)tyvi2))
                    continue; // pole lyhike kuid sobiv
                }
            else
                {
                if (oletajaDct.pahad_tyved2.Get((const FSxCHAR *)tyvi2))
                    continue; // on paha
                }
            // leiame tyvi2 
            res = ty_lp(k_tyvi->komp_jargmine, k_tyvi->k_pikkus - ty2pik, ty2pik, &ctyvi2_variant.ptr, NULL, 0);

	        if (res > ALL_RIGHT)
	            return res; 
            for (VARIANTIDE_AHEL *tmp=ctyvi2_variant.ptr; tmp; tmp=tmp->jargmine_variant) // leia tyvi2 tyybid 
                {
                juht2(esimene_komp(tmp));
                }
            for (VARIANTIDE_AHEL *tmp=cvahe_variant.ptr; tmp; tmp=tmp->jargmine_variant) // tyvi1 tyvepikkus paika 
                {
                lisa_min_info(esimene_komp(tmp), S6na, 0, k_tyvi->k_pikkus - ty2pik); // tyvele uus pikkus 
                esimene_komp(tmp)->sonastikust = 0; // tyvi1 pole s�nastikust HJK 17.05.2004 
                }
            // int tugevus = 
            tyvi1tyvi2(&cvahe_variant.ptr, &ctyvi2_variant.ptr, &csobivad_variandid.ptr);
            // siin vo'iks kunagi veel kontrollida tugevus va'a'rtust, et mitte liiga kahtlasi lubada ...
            ahelad_vabaks(&ctyvi2_variant.ptr);
            if (csobivad_variandid.ptr) // mingi ty1-ga leidub sobiv kombinatsioon 
                {
                ahelad_vabaks(&cvahe_variant.ptr);
                ahelad_vabaks(&ctyvi2_variant.ptr);
                break;   // lyhemaid tyvesid selle lopu puhul ei vt 
                }
            }
	    }
    //ahelad_vabaks(&cvahe_variant.ptr);    //destruktoris
    //ahelad_vabaks(&ctyvi2_variant.ptr);   //destruktoris
    if (csobivad_variandid.ptr)
        {
        if (TaheHulgad::OnSuur(S6na, 0))
            {
            variandid_tulemuseks(tulemus, LIIK_YLDNIMI, &csobivad_variandid.ptr);
            if (tulemus->on_tulem())
                tulemus->TulemidNimeks(LIIK_KAANDSONA);
            }
        else
            variandid_tulemuseks(tulemus, KOIK_LIIGID, &csobivad_variandid.ptr);
        //ahelad_vabaks(&csobivad_variandid.ptr);   //destruktoris
        }
    return ALL_RIGHT;
    }
Example #3
0
int MORF0::arvans2(MRFTULEMUSED *tulemus, FSXSTRING *sonna, int S6naPikkus, VARIANTIDE_AHEL **variandid, const FSxCHAR *lubatavad_sl)
    {
    FSxCHAR eel, yel, yyl;
    VARIANTIDE_AHEL *variant, *viimane; // ainult selleks, et ts�keldada �le etteantud ahela 'variandid'
    KOMPONENT *k_tyvi, *k_lopp;
    FSXSTRING S6na, tyvi, lopp, vorm, *algvorm, otsitav_vorm, otsitav_lopp, tmpsona, sl;
    const FSxC5I1 *t;
    bool sobiks_nimeks;
    int tyvepik;
    FSXSTRING lub_sl;
    int i;

    lub_sl = lubatavad_sl;
    sobiks_nimeks = oletajaDct.sobiks_nimeks(sonna);
    if (!sobiks_nimeks)
        {
        int tahtedeArvSonas, tahtedeProtsentSonas;
        for(tahtedeArvSonas=0, i=0; i<S6naPikkus; i++)
            {
            if(TaheHulgad::OnTaht(sonna, i))
                tahtedeArvSonas++;
            }
        tahtedeProtsentSonas=100*tahtedeArvSonas/S6naPikkus;
        if(tahtedeProtsentSonas < 80)
            return ALL_RIGHT; // s�nas liiga v�he t�hti

        if (TaheHulgad::protsendinumber.Find((*sonna)[S6naPikkus-1]) != -1)
            return ALL_RIGHT; // s�na l�ppeb numbriga
        if (TaheHulgad::OnSuur(sonna, 0))
            {
            S6na = sonna->Right(3);
            if (TaheHulgad::AintSuuredjaNrjaKriipsud(&S6na))
	            return ALL_RIGHT;   // pole midagi peale suurta'htede, nr ega kriipsude
            if (TaheHulgad::OnProtsendinumber(&S6na))
                return ALL_RIGHT; // sona lopus liiga va'he t�hti
            for (i=0; i < S6na.GetLength(); i++)
                {
                if (TaheHulgad::OnSuur(&S6na, i))
                    return ALL_RIGHT; // sona lopus liiga va'he va'iketa'hti
                }
            sobiks_nimeks = true;
            }
        }
    S6na = *sonna;
    S6na.MakeLower();
    if (sobiks_nimeks)
        TaheHulgad::AlgusSuureks(&S6na);    // ei tea milleks see hea on?

    for (viimane=*variandid; viimane->jargmine_variant; viimane=viimane->jargmine_variant);
    for (variant=viimane; variant; variant=variant->eelmine_variant)
        {
        k_tyvi = esimene_komp(variant);
        if (k_tyvi->komp_jargmine->k_tyyp != K_LOPP)
            continue;
        if (k_tyvi->k_pikkus < 3)
            continue;       // tyvi olgu va'hemalt 3 ta'hte 
        k_lopp = k_tyvi->komp_jargmine;
        tyvi = k_tyvi->k_algus;
        lopp = k_lopp->k_algus;
        tyvepik = k_tyvi->k_pikkus;

	    eel = tyvi[tyvepik-1];
        yel = tyvi[tyvepik-2];
        yyl = tyvi[tyvepik-3];
        if (tulemus->on_tulem() && tulemus->Get_sl(LIIK_VERB) != -1) // verbi anal��s juba oletatud
            {
            if (TaheHulgad::OnLopus(&(tyvi), FSxSTR("eeri")) ||
                TaheHulgad::OnLopus(&(tyvi), FSxSTR("eeru")) ||
                TaheHulgad::OnLopus(&(tyvi), FSxSTR("tse")))  
                return ALL_RIGHT; // vist pole nimisona
            if (tulemus->Get_vormid(FSxSTR("ma, ")) != -1 ||
                tulemus->Get_vormid(FSxSTR("da, ")) != -1 ||
                tulemus->Get_vormid(FSxSTR("b, ")) != -1)
                return ALL_RIGHT; // vist pole nimisona
            }
        if (!sobiks_nimeks)
            {
            if (TaheHulgad::OnLopus(&(tyvi), FSxSTR("ii")) && k_lopp->k_pikkus > 0)
                continue;  // vist pole tyve lp
            if (lopp == FSxSTR("t"))
                {
                if (TaheHulgad::OnLopus(&(tyvi), FSxSTR("is")))
                    continue;  // trombonis+t
//                if (TaheHulgad::OnLopus(&(tyvi), FSxSTR("las"))); // somaallas+t
//                else if (TaheHulgad::OnTaishaalik(yel))
//                    continue;  // trombonis+t 
                }
            if (lopp == FSxSTR("ni"))
                {
                if (eel==yel && TaheHulgad::OnTaishaalik(yel))
                    continue;  // vist pole tyve lp 
                }
            if (lopp == FSxSTR("i"))
                {
                if (TaheHulgad::OnAeiu(yel) && eel == (FSxCHAR)'s'); // ersalas+i
                else continue;  // ei sobi lopuks 
                }
            if (lopp == FSxSTR("e"))
                {
                if (TaheHulgad::OnTaishaalik(yyl) && TaheHulgad::OnTaishaalik(yel) && TaheHulgad::OnKaashaalik(eel)); // VVKe
                else if (TaheHulgad::OnKaashaalik(yel) && TaheHulgad::OnKaashaalik(eel) && eel != (FSxCHAR)'n') // KKe
                    {
                    if (tyvepik > 3 && tyvi[tyvepik-4] == yyl)
                        continue;    // ...aars+e ei sobi  
                    }
                else 
                    continue; // ei sobi lopuks 
                }
            }
        SILP s;
        s.silbita(&tyvi);
        if (s.silpe() == 0)          // liiga l�hike t�vi vm jama
            continue;
        //s.silbivalted();
        for (t=oletajaDct.pn_lopud_jm.Get((const FSxCHAR *)k_lopp->k_algus); t; 
                                                    t=oletajaDct.pn_lopud_jm.GetNext())
            {
            // m�ned s�nad ei saa olla muud kui sg n
            if (TaheHulgad::OnLopus(&(k_tyvi->algsona), FSxSTR("lane")))
                break;
            if (t->eeltahed->Find(eel) == -1) // l�pule eelnev t�ht ei sobinud
                continue;
            if (sobiks_nimeks && t->tyyp != 1)  // oletatavasti p�risnimi; siis see l�pp ei sobi
                continue;
            vorm = t->vorm;
            otsitav_lopp = t->tabeli_lopp;
            otsitav_vorm = t->tabeli_vorm;
            if (sobiks_nimeks)
                {
                // kas on soome p�risnimi?
                if (TaheHulgad::OnLopus(&(tyvi), FSxSTR("se")) && vorm.Find(FSxSTR("sg ")) != -1)
                    {
                    if (soome_pn_se(&tyvi, tyvepik, &s)) // se -> nen
                        {
                        tmpsona = tyvi.Left(tyvepik-2);
                        tmpsona += FSxSTR("nen");
                        if (k_lopp->k_pikkus == 0)
                            tulemus->Add((const FSxCHAR *)tmpsona, FSxSTR("0"), FSxSTR(""), LIIK_PARISNIMI, (const FSxCHAR *)vorm);
                        else
                            tulemus->Add((const FSxCHAR *)tmpsona, (const FSxCHAR *)lopp, FSxSTR(""), LIIK_PARISNIMI, (const FSxCHAR *)vorm);
                        //if (s.silpe() > 2) 
                        //    continue;  // siis tavalisi anal��se ei proovigi?
                        }
                    }
                else if (TaheHulgad::OnLopus(&(tyvi), FSxSTR("s")) && lopp == FSxSTR("t"))
                    {
                    if (soome_pn_s(&tyvi, tyvepik)) // s -> nen
                        {
                        tmpsona = tyvi.Left(tyvepik-1);
                        tmpsona += FSxSTR("nen");
                        tulemus->Add((const FSxCHAR *)tmpsona, (const FSxCHAR *)lopp, FSxSTR(""), LIIK_PARISNIMI, (const FSxCHAR *)vorm);
                        //continue;  proovi tavalisi anal��se ka?
                        }
                    }
                if (s.silpe() == 1 &&
                    oletajaDct.harvad_lopud_1.Get((FSxCHAR *)(const FSxCHAR *)lopp))
                    continue;             // mingi ad hoc filter
                }
            if (t->tyyp == 3) // verbi l�pp
                {
                if (lub_sl.Find(LIIK_VERB) == -1)
                    continue;  // ei sobi verbiks
                if (TaheHulgad::matemaatika.Find(k_tyvi->algsona[0]) != -1) // alguses nr vms matas�mbol
                    continue;  // ei sobi verbiks
                }
            for (algvorm=oletajaDct.sobiv_algv(&tyvi, &otsitav_lopp, &otsitav_vorm); algvorm; algvorm=oletajaDct.jargmine_sobiv_algv())
                {
                if (t->tyyp != 3) // vt ainult noomeneid
                    {
                    if (!oletajaDct.pn_sobiv_kirje())
                        continue;
                    //if (!sobiks_nimeks && FSxSTRCMP(oletajaDct.ot_viimane_kirje.sonaliik, LIIK_PARISNIMI)==0)
                    if (!sobiks_nimeks && FSxSTRCMP(oletajaDct.ot_viimane_kirje.sonaliik, LIIK_PARISNIMI)==0)
                        continue; // tabelist tuli mall, mis sobib ainult p�risnimele, aga siin on �ldnimi
                    }
                if (k_lopp->k_pikkus == 0)
                    lopp = FSxSTR("0");
                if (!mrfFlags.Chk(MF_ALGV))
                    algvorm = &tyvi;
                else
                    {
                    if (sobiks_nimeks) // p�risnimi
                        {
                        SILP ss;
                        ss.silbita(algvorm);
                        if (!sobiks_sg_n(algvorm, algvorm->GetLength(), &ss))
                            continue;
                        if (TaheHulgad::OnLopus(algvorm, FSxSTR("ne"))) // ne-l�pulisi p�risnimesid on tegelt v�he
                            {
                            if (TaheHulgad::OnLopus(&(tyvi), FSxSTR("se")) && !eesti_pn_se(&tyvi, tyvepik, &s))
                                continue;
                            if (TaheHulgad::OnLopus(&(tyvi), FSxSTR("s")) && !eesti_pn_s(&tyvi, tyvepik))
                                continue;
                            }
                        }
                    else if (t->tyyp != 3) // �ldnimi
                        if (!sobiks_sg_n_ns(algvorm, algvorm->GetLength()))
                            continue;
                    }
                if (sobiks_nimeks)
                    sl = LIIK_PARISNIMI;
                else
                    //sl = oletajaDct.ot_viimane_kirje.sonaliik;
                    sl = oletajaDct.ot_viimane_kirje.sonaliik;
                tulemus->Add((const FSxCHAR *)(*algvorm), (const FSxCHAR *)lopp, FSxSTR(""), (const FSxCHAR *)sl, (const FSxCHAR *)vorm); 
                if (t->tyyp == 3) // on verb...
                    {
                    continue;
                    }
                // nimis�na
                //tmpsona = oletajaDct.ot_viimane_kirje.tyypsona;
                tmpsona = oletajaDct.ot_viimane_kirje.tyypsona;
                if (TaheHulgad::OnLopus(&tmpsona, FSxSTR("lane"))) 
                    return ALL_RIGHT;      // muud variandid oleks sodi
                if (TaheHulgad::OnLopus(&tmpsona, FSxSTR("vere"))) 
                    return ALL_RIGHT;      // muud variandid oleks sodi
                if (lopp == FSxSTR("lt") && TaheHulgad::OnAeiu(eel) && sl != LIIK_PARISNIMI)
                    tulemus->Add((const FSxCHAR *)(*sonna), FSxSTR("0"), FSxSTR(""), FSxSTR("D"), FSxSTR("")); 
                }
            }
        if (tulemus->on_tulem())
            {
            if (TaheHulgad::OnLopus(&(tyvi), FSxSTR("se")))
                {
                if (lopp == FSxSTR("id") || 
                    lopp == FSxSTR("le") ||
                    lopp == FSxSTR("lt") ||
                    lopp == FSxSTR("sse") ||
                    lopp == FSxSTR("st") ||
                    lopp == FSxSTR("ks") ||
                    lopp == FSxSTR("ga")) 
                    return ALL_RIGHT;      // muud variandid oleks sodi
                }
            if (TaheHulgad::OnAlguses(&lopp, FSxSTR("de")) && lopp != FSxSTR("des") && lopp.GetLength() > 2)
                {
                return ALL_RIGHT;      // muud variandid oleks sodi
                }
            }
        if (k_lopp->k_pikkus == 0)    // 0-l�pp
            {
            if (sobiks_nimeks)
                {
                if (sobiks_sg_n(&tyvi, tyvepik, &s) || !tulemus->on_tulem())
                    tulemus->Add((const FSxCHAR *)tyvi, FSxSTR("0"), FSxSTR(""), LIIK_PARISNIMI, FSxSTR("sg n, ")); 
                }
            else
                {
                if (sobiks_sg_n_ns(&tyvi, tyvepik) || !tulemus->on_tulem())
                    {
                    if (TaheHulgad::OnLopus(&(tyvi), FSxSTR("line")) || 
                        (TaheHulgad::OnLopus(&(tyvi), FSxSTR("ne")) && TaheHulgad::OnKaashaalik(tyvi[tyvi.GetLength()-3])))
                        tulemus->Add((const FSxCHAR *)tyvi, FSxSTR("0"), FSxSTR(""), LIIK_A, FSxSTR("sg n, ")); 
                    else
                        tulemus->Add((const FSxCHAR *)tyvi, FSxSTR("0"), FSxSTR(""), LIIK_YLDNIMI, FSxSTR("sg n, ")); 
                    }
                }
            }
       }
//    tulemus->SortUniq();  // sest tabelist tuleb samu algvorme mitmest kirjest...
    return ALL_RIGHT;
    }
Example #4
0
int MORF0::kchk6(
    VARIANTIDE_AHEL **variandid, 
    FSXSTRING *S6na, 
    int S6naPikkus, 
    VARIANTIDE_AHEL **sobivad_variandid, 
    char *paha_koht,
    const int paha_koha_pikkus
    )
    {
    int res;

    int  pik;
    int kk;
    VARIANTIDE_AHEL *variant, *tmp, *sobiv_variant; //ok
    CVARIANTIDE_AHEL cvahe_variant, cls_variant;
    KOMPONENT *tyvi, *tyvi1, *sobivty, *sobivlp;
    KOMPONENT *tmpkomp1, *tmpkomp2;
    KOMPONENT *essa, **esi;
    int ty1_tyyp;
    //char *u_paha_koht=0; TV080723
    FSXSTRING u_S6na, vt_tyvi;
    int u_S6naPikkus;

    for (variant=*variandid; variant; variant=variant->jargmine_variant)
	    {
        char u_paha_koht[(STEMLEN+1)*(STEMLEN+1)];
        tyvi1 = esimene_komp(variant);
        ty1_tyyp = 0;
        if (tyvi1->k_tyyp == K_PREF) 
            {
            FSXSTRING tl;
            tl = taandliik[ prfix[tyvi1->jrk_nr].sl ];
            if ( tl.Find((FSxCHAR) 'V') !=-1 )  
                ty1_tyyp = 13;
            else if (tl.Find((FSxCHAR) 'S') != -1)  
                ty1_tyyp = 12;
            }
        else
            ty1_tyyp = ty11tyyp(tyvi1->liitumistyyp);
        if (!ty1_tyyp) /* ty1 ei sobi nii keerulise liitsona algusse */
            continue;
        tyvi = tyvi1->komp_jargmine;
        if (!(tyvi->komp_jargmine))
            continue;
        if (tyvi->k_tyyp == K_LOPP) 
            continue;
        if (tyvi->k_tyyp == K_SUFF) 
            continue;
        if (tyvi->k_pikkus < 5) /* ty2+ty3 ei mahu */
            continue;
        if (tyvi1->k_pikkus + tyvi->k_pikkus < 9) /* ty1+ty2+ty3 ei mahu */
            continue;

        /* keerulisemat struktuuri ei vt; ka mitut erin sufiksit ei luba, v.a. lt puhul; ??? */
        if (*sobivad_variandid &&  
                tyvi->komp_jargmine->k_tyyp == K_SUFF)
            {
            FSXSTRING sona;
            sona = (const FSxCHAR *)(S6na->Left(S6naPikkus));
            if (!TaheHulgad::OnLopus(&(sona), FSxSTR("lt")))
                break;
            }

        pik = minipik(&(tyvi->k_algus));
        if (tyvi->k_pikkus < pik + 2)
            continue;
        //int sty = tyvi->k_pikkus-2;
        /* otsi sellest kohast algavat liitsona ty1+ty2 */
        /* uue liitsona jaoks andmed paika */
        u_S6naPikkus = S6naPikkus - tyvi1->k_pikkus; 
        //TV080723 u_paha_koht = init_hjk_cxx(u_S6naPikkus, 
        //    u_paha_koht, sizeof(u_paha_koht));
        //if (!u_paha_koht)
        //    return CRASH;
        //TV080723 u_paha_koht = uus_paha(S6naPikkus,paha_koht,u_S6naPikkus,u_paha_koht);
        //if (!u_paha_koht)
        //    return CRASH;
        init_hjk_cxx(u_S6naPikkus, 
            u_paha_koht, sizeof(u_paha_koht));
        uus_paha(S6naPikkus,paha_koht,u_S6naPikkus,
                            u_paha_koht, sizeof(u_paha_koht));
        u_S6na = (const FSxCHAR *)(S6na->Mid(tyvi1->k_pikkus));
        cls_variant.ptr = lisa_1ahel(&cls_variant.ptr);
        if (!cls_variant.ptr)
            return CRASH;
        esi = &(cls_variant.ptr->variant);
        tmpkomp2 = kop_kompid(esi, tyvi);
        if (!tmpkomp2)
            return CRASH;
        for (tmpkomp1=*esi; tmpkomp1; tmpkomp1=tmpkomp1->komp_jargmine)
            {
            tmpkomp1->algsona = u_S6na;
            tmpkomp1->nihe -= tyvi1->k_pikkus;
            }
        if (ty1_tyyp == 12 && !TaheHulgad::OnAlguses(&u_S6na, FSxSTR("ise"))) /* prefiks; "ise" ei sobi */
            {
            res = kchk30(&cls_variant.ptr, &u_S6na, u_S6naPikkus, &cvahe_variant.ptr, u_paha_koht,sizeof(u_paha_koht));
            if (res > ALL_RIGHT)
	            return res; /* viga! */
            }
        if (!cvahe_variant.ptr) 
            {
            res = kchk4(&cls_variant.ptr, &u_S6na, u_S6naPikkus, &cvahe_variant.ptr, 
                u_paha_koht,sizeof(u_paha_koht));
            if (res > ALL_RIGHT)
	            return res; /* viga! */
            }
        if (!cvahe_variant.ptr) 
            {
            if (ty1_tyyp == 12 && !TaheHulgad::OnAlguses(&u_S6na, FSxSTR("ise"))) /* prefiks */
                {
                res = kchk33(&cls_variant.ptr, &cvahe_variant.ptr, u_paha_koht, sizeof(u_paha_koht));
                if (res > ALL_RIGHT)
	                return res; /* viga! */
                }
            }
        if (!cvahe_variant.ptr) 
            {
            res = kchk5(&cls_variant.ptr, &u_S6na, u_S6naPikkus, &cvahe_variant.ptr, u_paha_koht, sizeof(u_paha_koht));
            if (res > ALL_RIGHT)
	            return res; /* viga! */
            }
        if (cvahe_variant.ptr) /* ty1 taga v�ibki olla liits�na */
            {
            for (tmp=cvahe_variant.ptr; tmp; tmp=tmp->jargmine_variant) 
                { 
                esi = &(tmp->variant);
                if ((*esi)->liitumistyyp == L_TYVE_TYYP) /* liitsona on S suva-vorm */
                    if ((*esi)->komp_jargmine->liitumistyyp != L_TYVE_TYYP + 3) /* polegi S pl g */
                        continue;
                if ((*esi)->k_tyyp == K_PREF &&  /* ... + pref */
                    (ty1_tyyp == 12 || ty1_tyyp == 4)) /* ty1 on pref v�i S sg g */
                    ; /* pref + pref/S sg g sobivad alati */
                else
                    {
                    kk = ty11ty11(ty1_tyyp, ty11tyyp((*esi)->liitumistyyp));
                    if (!kk) /* liitsona ei sobi ty1-ga */
                        continue;
                    }
                // kontrolli s�nastikust saadud info abil, kas v�ib olla liits�na tagumine ots
                // HJK juuni 2006
                if (((*esi)->liitumisinfo).Find(L_MITTELIITUV_SL) != -1) // HJK 6.06.2006 et igasugu l�his�nad ei saaks osaleda
                    continue;
                vt_tyvi = tyvi1->k_algus;
                vt_tyvi += (*esi)->k_algus;
                if (viletsls(&vt_tyvi)) /* lubamatu liitsona */
                    continue;
                for (tmpkomp1=*esi; tmpkomp1; tmpkomp1=tmpkomp1->komp_jargmine)
                    { /* teisenda tagasi esialgse s�na taoliseks */
                    tmpkomp1->algsona = *S6na;
                    tmpkomp1->nihe += tyvi1->k_pikkus;
                    }
                /* vt et juba leitud analyysi ei lisataks uuesti */
                for (tmpkomp1=*esi; tmpkomp1->komp_jargmine; tmpkomp1=tmpkomp1->komp_jargmine);
                sobivlp = tmpkomp1;
                sobivty = tmpkomp1->komp_eelmine;
                if (on_tylopuga(*sobivad_variandid, sobivty, sobivlp)) /* selline tyvi/suf+lp juba sobivate hulgas */
                    continue;
                /* s�na anal��situd! */
                sobiv_variant = lisa_1ahel(sobivad_variandid);
                if (!sobiv_variant)
                    return CRASH;
                essa = lisa_esimene(sobiv_variant);
                kopeeri_komp(essa, tyvi1);
                tmpkomp2 = kop_kompid(&essa, *esi);
                if (!tmpkomp2)
                    return CRASH;
                }
            }
        ahelad_vabaks(&cvahe_variant.ptr);
        ahelad_vabaks(&cls_variant.ptr);
        /* s�nainfo tagasi �igeks */
        // TV080723 paha_koht = uus_paha(u_S6naPikkus, u_paha_koht, S6naPikkus, paha_koht);
        //if (!paha_koht)
        //    return CRASH;
        uus_paha(u_S6naPikkus, u_paha_koht, S6naPikkus, 
            paha_koht, paha_koha_pikkus);
        //close_hjk_cxx(u_paha_koht);
	    }
    return ALL_RIGHT;
    }