Beispiel #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;
    }
Beispiel #2
0
int MORF0::kchk1(
    VARIANTIDE_AHEL **variandid,
    FSXSTRING *word,
    int S6naPikkus,
    VARIANTIDE_AHEL **sobivad_variandid,
    char *paha_koht,
    const int paha_koha_suurus)
    {
    int i, tyvepik;
    int  res;
    int  algp;
    FSXSTRING sona, end;
    signed char lnr;
    VARIANTIDE_AHEL **mille_taha, *variant, *sobiv_variant, **sobiva_taha, *tmp; //ok
    CVARIANTIDE_AHEL cvahe_variant;
    KOMPONENT *tyvi, *lopp;
    sona = *word;
    mille_taha = variandid;  /* kuhu uus komponentide ahel paigutada */
    sobiva_taha = sobivad_variandid;
    if ( S6naPikkus > ENDLEN )
	    algp = ENDLEN - 1;    /* v�imalik max pikkusega l�pp */
    else
	    {
        if (sona[0] == (FSxCHAR)'e' || sona[0] == V_O_UML)
	        algp = S6naPikkus - 1;    /* tyvi v�ib olla 1 t�heline */
	    else
	        algp = S6naPikkus - 2;    /* tyvi olgu v�hemalt 2 t�heline */
	    }
    for (i = 0; i <= algp; i++)
	    {
	    if (i)
	        {
	        tyvepik = S6naPikkus - i;
            end = (const FSxCHAR *)(sona.Mid(tyvepik));
            if(mrfFlags.Chk(MF_GENE)) /* vt ainult algv. loppe */
                {
                if (loend.head_gene_lopud.Get((FSxCHAR *)(const FSxCHAR *)end))
	                lnr = lpnr( (const FSxCHAR *)end );
                else
		            continue;     /* vt 1 t�he v�rra l�hemat l�ppu */
                }
            else        /* vt. koiki loppe */
                {
	            lnr = lpnr( (const FSxCHAR *)end );
	            if (lnr == -1)    /* sellist l�ppu pole olemas */
		            continue;     /* vt 1 t�he v�rra l�hemat l�ppu */
                }
	        }
	    else         /* null-l�pp */
	        {
	        tyvepik = S6naPikkus;
	        lnr = null_lopp;
	        }
        /* mingi lopp leitud */
        variant = lisa_1ahel(mille_taha);
        mille_taha = &variant;
        tyvi = lisa_esimene(variant);
        if (!tyvi)
            {
            return CRASH;
            }
        lisa_min_info(tyvi, word, 0, tyvepik);
        lopp = lisa_1komp(&tyvi);
        if (!lopp)
            {
            return CRASH;
            }
        lisa_min_info(lopp, word, tyvepik, i);
        lisa_psl_info(lopp, K_LOPP, lnr);
        /* otsi ty ja kontrolli ta sobivust lopuga */
        res = ty_lp(lopp, 0, tyvepik, &cvahe_variant.ptr, paha_koht,paha_koha_suurus);
	    if (res > ALL_RIGHT)
            {
	        return res; /* viga! */
            }
        if (!cvahe_variant.ptr)
            continue;  /* tyve polnud */
        for (tmp=cvahe_variant.ptr; tmp; tmp=tmp->jargmine_variant)
            { /* kopeeri sobivate hulka koik tyved, mis selle lopuga sobivad */
            sobiv_variant = lisa_ahel(sobiva_taha, tmp);
            if (!sobiv_variant)
                {
                return CRASH;
                }
            if(mrfFlags.Chk(MF_SPELL)) // aitab 1 tyvest kyll
                break;
            sobiva_taha = &sobiv_variant;
            }
        ahelad_vabaks(&cvahe_variant.ptr);
        if(mrfFlags.Chk(MF_SPELL))
            {
            return ALL_RIGHT; /* rohkem variante ei vt. */
            }
        }
    return ALL_RIGHT;
    }
Beispiel #3
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;
    }
Beispiel #4
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;
    }
Beispiel #5
0
int MORF0::chkhy2(MRFTULEMUSED *tulemus, FSXSTRING *S6nna, int maxtasand, int *tagasi)
    {
    int i, j;
    int res=0;
    char rezz, rezz1;
    struct lisa {
        const FSxCHAR *lubatud_lopp;
        const FSxCHAR *lubatud_sl;
        const int mitu_eemaldada;
        const FSxCHAR *otsa_panna;
        } lisakatse[3] = {
    { FSxSTR("0"), FSxSTR("A"), 2, FSxSTR("ne") },  /* +ne */
    { FSxSTR("t"), FSxSTR("AS"), 0, FSxSTR("t") },  /* is+t */
    { FSxSTR("d"), FSxSTR("AS"), 0, FSxSTR("d") } }; /* +d */
    int katsenr;
    const FSxCHAR *lubatud_liik;
    int viimane, lopus_kriips;
    int tmp;
    int mitu;
    int sobiv_an;
    CVARIANTIDE_AHEL ctoo_variandid, csobivad_variandid;
    FSXSTRING S6na = *S6nna;
    int k;
    FSXSTRING algus;
    FSXSTRING kriips;
    FSXSTRING lopp;
    FSXSTRING pisialgus;
    MRFTULEMUSED ette;
    FSXSTRING ettestr;
    k = S6na.Find((FSxCHAR)'-');
    if (k == -1)
        k = S6na.Find((FSxCHAR)'/');
    if (k == -1)
	    return ALL_RIGHT;    // ei sisalda '-' ega '/'
    algus = S6na.Left(k);
    kriips = S6na.Mid(k, 1);
    lopp = S6na.Mid(k+1);
    if (k==0 && kriips == FSxSTR("-") ) // -sona
	    {
		if (lopp.GetLength()<1)
			return ALL_RIGHT;
	    res = chkwrd(tulemus, &lopp, lopp.GetLength(), maxtasand, tagasi, KOIK_LIIGID/*MITTE_VERB*/);
	    if (res > ALL_RIGHT)
	        return res; /* viga! */
	    if (!tulemus->on_tulem())    
            {
            FSXSTRING pisilopp;
            pisilopp = lopp;
            pisilopp.MakeLower();
	        res = chkwrd(tulemus, &pisilopp, pisilopp.GetLength(), maxtasand, tagasi, KOIK_LIIGID);
	        if (res > ALL_RIGHT)
	            return res; /* viga! */
            }
        if (maxtasand < 4)  // soovitaja pärast HJK 10.06.2005
            return ALL_RIGHT;
	    if (!tulemus->on_tulem())    /* polnud -sona */
	        {
            *tagasi = 4;
		    res = chklyh4(tulemus, &lopp, lopp.GetLength()); /* nt. -E */
		    if (res > ALL_RIGHT)
		       return res; /* viga! */
            }
	    return ALL_RIGHT;
	    }

    if (maxtasand < 4)  // soovitaja p�rast HJK 10.06.2005
        return ALL_RIGHT;
 
    if (S6na.GetLength() == 2 && k == 1 && kriips == FSxSTR("-") && TaheHulgad::eestitht.Find(S6na[0])!=-1) // a-
        {
        tulemus->Add( (const FSxCHAR *)algus, FSxSTR("0"), FSxSTR(""), FSxSTR("Y"), FSxSTR("?, ")); /* parema puudusel */
        *tagasi = 4;
        return ALL_RIGHT;
        }
      /* sona-sona-sona-sona... */
    viimane = 0;
    lopus_kriips = 0;
    lopp = S6na;
    rezz = mrfFlags.Chk(MF_ALGV);  /* algvormi rezhiimi lipp */
    rezz1 = mrfFlags.Chk(MF_GENE); /* gene rezhiimi lipp */
	for (mitu=0 ;; mitu++)
	    {
        MRFTULEMUSED ajutine_tulemus;
        MRFTUL t;
        sobiv_an = -1;
        k = lopp.Find(kriips);
	    if ( k==-1 )           /* viimane sonaosa */
            {
            algus = lopp;
            lopp = FSxSTR("");
            viimane = 1;
            }
        else
            {
            algus = lopp.Left(k);
            lopp = lopp.Mid(k+1);
            if (lopp.GetLength()==0) // viimane sonaosa; sona-
                {
                viimane = 1;
                lopus_kriips = 1;
                }
            }
        if (algus.GetLength() > STEMLEN || algus.GetLength() < 1)
			{
            mrfFlags.OnOff(MF_ALGV, rezz);  /* analyys nagu korgemalt ette antud */
            mrfFlags.OnOff(MF_GENE, rezz1); /* analyys nagu korgemalt ette antud */
	        return ALL_RIGHT; // tulemust pole vaja vabastada
			}
        pisialgus = algus;
        pisialgus.MakeLower();
        if (algus == FSxSTR("ist") 
            || algus == FSxSTR("lase")
            || algus == FSxSTR("lise")
            || algus == FSxSTR("na")
            || algus == FSxSTR("st")) // need ei sobi s�naks
            {
            mrfFlags.OnOff(MF_ALGV, rezz);  /* analyys nagu korgemalt ette antud */
            mrfFlags.OnOff(MF_GENE, rezz1); /* analyys nagu korgemalt ette antud */
	        return ALL_RIGHT; // tulemust pole vaja vabastada
            }
        lubatud_liik = KOIK_LIIGID;
        if (viimane) 
            {
            mrfFlags.OnOff(MF_ALGV, rezz);  /* analyys nagu korgemalt ette antud */
            mrfFlags.OnOff(MF_GENE, rezz1); /* analyys nagu korgemalt ette antud */
//            if ( ChIsUpper(*s) && !ChIsUpper(*(s+1))) /* viimane so'na suurta'heline */
            if (TaheHulgad::SuurAlgustaht(&algus))
                lubatud_liik = FSxSTR("SABCUNOPHGY");    /* juhuks, kui viimane algab suure ta'hega */
            if (lopus_kriips)  /* viimase lopus -, nt. nais- */
                {
                if (pisialgus == FSxSTR("kesk") || pisialgus == FSxSTR("puhke") || pisialgus == FSxSTR("inglis"))
                    {
                    ajutine_tulemus.Add((const FSxCHAR *)pisialgus, FSxSTR(""), FSxSTR(""), FSxSTR("S"), FSxSTR("?, ")); 
                    }
                lubatud_liik = FSxSTR("SABCUNOPHGDK"); 
                }
            }
        else
            { 
            mrfFlags.Off(MF_ALGV);    /* on vaja, et analu"u"siks nagu ilma algvormita */
            mrfFlags.Off(MF_GENE);    /* eemaldame GENE piirangud sonavormide valikule */
            }
        if (!ajutine_tulemus.on_tulem() 
             && nLopud.otsi_lyh_vorm((const FSxCHAR *)lopp) == NULL)
            {
            res = kchk1(&ctoo_variandid.ptr, &algus, algus.GetLength(), &csobivad_variandid.ptr, NULL,0); /* ty+lp */
		    if (res > ALL_RIGHT)
		       return res; /* viga! */
            ahelad_vabaks(&ctoo_variandid.ptr);
		    if (csobivad_variandid.ptr)
                {
                variandid_tulemuseks(&ajutine_tulemus, lubatud_liik, &csobivad_variandid.ptr);
                ahelad_vabaks(&csobivad_variandid.ptr);
                }
		    if (!ajutine_tulemus.on_tulem())
		        {
                if (TaheHulgad::AintSuured(&algus))
                    {
                    FSXSTRING suuralgus;
                    suuralgus = pisialgus;
                    TaheHulgad::AlgusSuureks(&suuralgus);
		            res = chkwrd(&ajutine_tulemus, &suuralgus, suuralgus.GetLength(), 1, tagasi, LIIK_PARISNIMI);
		            if (res > ALL_RIGHT)
		                return res; // viga! 
                    }
                }
		    if (!ajutine_tulemus.on_tulem())
		        {
		        res = chkwrd(&ajutine_tulemus, &pisialgus, pisialgus.GetLength(), 6, tagasi, lubatud_liik);
                if (res > ALL_RIGHT)
		            return res; /* viga! */
                }
            }
        if (viimane && ajutine_tulemus.on_tulem() && ette.on_tulem())
            {
            if (TaheHulgad::SuurAlgustaht(&algus))
                {
                ajutine_tulemus.TulemidNimeks(KOIK_LIIGID);
                }
            }

        if ( ( !ajutine_tulemus.on_tulem() && !viimane ) ||    /* ei saanud veel analyysitud */
              ( mitu==0 && ajutine_tulemus.Get_lopp(FSxSTR("0")) == -1 
                        && ajutine_tulemus.Get_vormid(FSxSTR("?, ")) == -1) )  /* v�i leia veel variante*/
		    {
            *tagasi = 1;
            if (pisialgus.GetLength() < PREFLEN)
                {
                i = preffnr((FSxCHAR *)(const FSxCHAR *)pisialgus);
	            if ( i != -1 )    // selline prefiks on olemas 
                    ajutine_tulemus.Add((const FSxCHAR *)pisialgus, FSxSTR(""), FSxSTR(""), FSxSTR("S"), FSxSTR("?, ")); // parema puudusel 
                }
            }
        if (ajutine_tulemus.on_tulem())
            {
            sobiv_an = ajutine_tulemus.Get_vormid(FSxSTR("sg g,")); /* eelistame sg g tyve */
            }
        if (!ajutine_tulemus.on_tulem()) /* ikka ei saanud veel analyysitud */
		    { /* kas on LYH-LYH... */
            if ( !viimane ) /*  */
                {
                mrfFlags.OnOff(MF_ALGV, rezz);  /* analyys nagu korgemalt ette antud */
                mrfFlags.OnOff(MF_GENE, rezz1); /* analyys nagu korgemalt ette antud */
                FSXSTRING pisilopp;
                pisilopp = algus;
                pisilopp += kriips;
                pisilopp += lopp;
		        res = chklyh2(&ajutine_tulemus, &pisilopp); /* nt. MM-il */
		        if (res > ALL_RIGHT)
		           return res; /* viga! */
                if (!ajutine_tulemus.on_tulem()) /* ikka ei saanud veel analyysitud */
                    {
		            res = chknr2(&ajutine_tulemus, &pisilopp); /* nt. uraan-253-s */
		            if (res > ALL_RIGHT)
		               return res; /* viga! */
                    }
                if (!ajutine_tulemus.on_tulem()) /* ikka ei saanud veel analyysitud */
                    {
		            res = chklyh3(&ajutine_tulemus, &pisilopp, 1, &tmp); 
		            if (res > ALL_RIGHT)
		               return res; /* viga! */
                    }
                if (ajutine_tulemus.on_tulem())
                    viimane = 1;
                else
                mrfFlags.Off(MF_ALGV);    /* on vaja, et analu"u"siks nagu ilma algvormita */
                mrfFlags.Off(MF_GENE);    /* eemaldame GENE piirangud sonavormide valikule */
                }
            }
        if (!ajutine_tulemus.on_tulem())
            {
		    res = chklyh3(&ajutine_tulemus, &algus, 1, &tmp); /* nt. MMil */
		    if (res > ALL_RIGHT)
		       return res; /* viga! */
            }
        if (!ajutine_tulemus.on_tulem())
            {
		    res = chklyh4(&ajutine_tulemus, &algus, algus.GetLength()); /* nt. MM */
		    if (res > ALL_RIGHT)
		       return res; /* viga! */
            }
        if (!ajutine_tulemus.on_tulem() && algus.GetLength()==1)
            {
		    res = chklyh0(&ajutine_tulemus, &algus, algus.GetLength()); // nt. b; teeb valesti DV-d
		    if (res > ALL_RIGHT)
		       return res; /* viga! */
            }
        if (!ajutine_tulemus.on_tulem()) /* ikka ei saanud veel analyysitud */
            {
            if (mitu > 0) // et v�ltida juhtumeid nagu 253-uraan
		        res = chknr2(&ajutine_tulemus, &algus); /* nt. uraan-253 */
		    if (res > ALL_RIGHT)
		       return res; /* viga! */
            }
        if (ajutine_tulemus.on_tulem() && !viimane)
            {
            if (sobiv_an == -1)
                sobiv_an = 0;      /* v�tame suvaliselt esimese tyve */
// parandada
//            if ( ajutine_tulemus.Get(tul_tyvi, tul_lopp, tul_sl, tul_vorm, &sobiv_an) == NULL )
//                return ILL_LINE_LEN;   // seda ei saa olla; suvaline veateade 
            t.Start(*(ajutine_tulemus[sobiv_an]));
            }
        if (!ajutine_tulemus.on_tulem() /* ikka ei saanud veel analyysitud */
              || (TaheHulgad::OnLopus(&pisialgus, FSxSTR("is")) /*(!strcmp(s1+s1_pik-2, "is")*/ && viimane && lopus_kriips)) /* voi on see nagu kahtlane */
            {
            mrfFlags.Off(MF_ALGV);    /* on vaja, et analu"u"siks nagu ilma algvormita */
            mrfFlags.Off(MF_GENE);    /* eemaldame GENE piirangud sonavormide valikule */
            if (sobiks_ne(&pisialgus, pisialgus.GetLength()))
                katsenr = 0;
            else if (pisialgus.GetLength() > 4 && 
                (TaheHulgad::OnLopus(&pisialgus, FSxSTR("is")) || TaheHulgad::OnLopus(&pisialgus, FSxSTR("las"))))
                katsenr = 1;
            else
                katsenr = 2;
            ///////////////////////////////// pooleli 
            MRFTULEMUSED ajutine_tulemus1;
            FSXSTRING katse;
            katse = pisialgus;
            katse += lisakatse[katsenr].otsa_panna;
            res = chkwrd(&ajutine_tulemus1, &katse, katse.GetLength(), 6, tagasi, lisakatse[katsenr].lubatud_sl);
	        if (res > ALL_RIGHT)
		        return res; /* viga! */
	        if (ajutine_tulemus1.on_tulem())   /* oli sona_ne, sona_is+t v sona+d */
                {
                j = ajutine_tulemus1.Get_lopp(lisakatse[katsenr].lubatud_lopp);
                if (j != -1 ) /* analyys sobis */
                    {
                    t.Start(*(ajutine_tulemus1[j]));
                    t.tyvi = (const FSxCHAR *)(t.tyvi.Left(t.tyvi.GetLength()-lisakatse[katsenr].mitu_eemaldada));
                    t.lopp = FSxSTR("0");
                    ajutine_tulemus.Add((t.tyvi), FSxSTR(""), FSxSTR(""), (const FSxCHAR *)t.sl, FSxSTR("?, "));
                    }
                }
            }
        if (!ajutine_tulemus.on_tulem())
            {
            mrfFlags.OnOff(MF_ALGV, rezz);  /* analyys nagu korgemalt ette antud */
            mrfFlags.OnOff(MF_GENE, rezz1); /* analyys nagu korgemalt ette antud */
            return ALL_RIGHT;
            }
        if (!viimane)
            {
            ette.AddClone(t);
            }
        else
            {
            tulemus->Move2Tail(&ajutine_tulemus);
            break;
            }
        }
    mrfFlags.OnOff(MF_ALGV, rezz);  /* analyys nagu korgemalt ette antud */
    mrfFlags.OnOff(MF_GENE, rezz1); /* analyys nagu korgemalt ette antud */
    if (tulemus->Get_sl( FSxSTR("H") ) != -1 
        && TaheHulgad::OnSuur(S6nna, 0)) /* vaja panna va'ljundisse suured ta'hed tagasi */
        {    
        ette.AlgusedSuureks();
        }
    if (ette.on_tulem())
        tulemus->PlakerdaKokku(&ette, (const FSxCHAR *)kriips, &mrfFlags);
    if (*tagasi < 4)
        *tagasi = 4;
    return ALL_RIGHT;
    }