Exemple #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;
    }
Exemple #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;
    }