System_File; ! alempana "TTKOODI" saattaa tarivta...

! if (tv(,,) && pv(,,)) return x;

! Constant VIRHE = 0;
Constant JAUHOT = 1;
Constant ANANAKSET = 39;
Constant KISSAT = 9;
Constant CHEDDARIT= 5;
Constant KOLMANNET = 45;
Constant ERAKOT = 4;
Constant KOLMIOT = 3;
!Constant PERUNAT = 12;
Constant MEDUUSAT = 13;
Constant MEHUSTEET = 48;


! Constant FAUNIT = 205;
! Constant PADAT = 209;
! Constant VUOAT = 210;
! Constant ILTASET = 238;
! ! Constant VELHOUDET = 240; ! kalleus
! Constant MUREKKEET = 248;


! tee versiot tv() ja pv() jotka erottaa 'A':n 'a':sta 'O':n 'o':sta
! jolloin 'A':lle kelpaa 'a' ja 'ä', ja 'O':lle 'o' ja 'ö'...
! lisäksi 'V':lle kelpaisi mikä tahansa vokaali?

[ ttnro_ v;
    return (v / 100);
]; ! hae ttnro

[ av_ v;
    return v - (ttnro_(v) * 100);
]; ! hae av

[ luku_ v;
    return ttnro_(v) / 100;
]; ! onko monikko?

 
[ tee_ttkoodi mon ttnro av jakaja jaettava;
    
    if (mon) ttnro = 200+ttnro;
    else ttnro = 100+ttnro;
    
    jakaja = 100;
    
    jaettava = ttnro * jakaja + av;
    
    return jaettava;
    
];



[ tt_monikko tt;

    ! tt = VIRHE;
    
    if (pv(0,0,'j')) tt = JAUHOT;
    if (tv(0,0,'o') && pv(0,'i','t')) tt = KOLMIOT;
    if (tv(0,'k','o') && pv(0,'i','t')) tt = ERAKOT;
    if (tv('n','n','e') && pv('n','s','i')) tt = KOLMANNET;
    if (tv(0,0,'i') && pv(0,'e','j')) tt = CHEDDARIT;
    if (tv(0,0,'a') && pv(0,'o','j')) tt = KISSAT;
    if (tv(0,0,'a') && pv('o','i','t')) tt = MEDUUSAT; ! pv +Oj
    if (tv('k','s','e') && pv('k','s','i')) tt = ANANAKSET;
    
    return tt;
];

[ tt_yksikko tt;

    !if (pv(0,0,'j')) tt = JAUHOT;
    if (tv(0,0,'o') && nv('i','o')) tt = KOLMIOT;
    if (tv(0,'k','o') && nv('k','o')) tt = ERAKOT;
    if (tv('n','n','e') && nv(0,'s')) tt = KOLMANNET;
    if (tv(0,0,'i')) tt = CHEDDARIT;
    if (tv(0,0,'a') && nv(0,'a')) tt = KISSAT;
    if (tv(0,0,'a') && nv(0,'a')) tt = MEDUUSAT;
    if (tv('k','s','e') && nv(0,'s')) tt = ANANAKSET;

    return tt;
    
    
];

! ks. riisuttu r. 2212
!* 026
!*** ept LanguageRefers()
! tämä on esiparsi() uusi versio
[ erittele mon tvtyyppi vk char_at char_at_gen_vs_nom av ttnro ttkoodi nom_pit;

    
    
    ! oli: hae_char_at_mon() -- varianttien takia char at voi siirtyä
    nom_pit = WORDSIZE+nom_temp_arr-->0;
 	
    ! ** mon
    mon = onko_monikko();
    
    if (DP>3 && mon) print "Monikko "; else if (DP>3) print "Yksikkö ";
    
    if (mon)
	tee_tv_arr(nom_temp_arr);
    else
	tee_tv_arr(gen_temp_arr);
    

    if (mon) ttnro = tt_monikko();
    else ttnro = tt_yksikko();
       
    ! "murusia?"

    	if (mon)
    	{
	    ! ...entä variantit?
	    ! erakot 4 (laatikko), mehusteet 48 (hame)
	    if (ttnro == ERAKOT) char_at = nom_pit-2;
	    if (ttnro == MEHUSTEET) char_at = nom_pit-3;
	    	    
	    if (char_at == 0)
	    	char_at = vrt_tauluja_dif_at(nom_temp_arr,
	    				     par_temp_arr);
	    ! jos sekään ei anna, char_at on pituus...
	    !print " >>>", char_at, "<<< ";    
	    if (char_at == 0)
	    	char_at = nom_temp_arr-->0;
	    
    	}

    	else ! yksikkö huom
    	{
	    ! ** char_at (yks) -- myös nom.?: -nen (ks. yllä)?
	    char_at = vrt_tauluja_dif_at(gen_temp_arr, par_temp_arr);
	    ! kumpi on pienempi? huom! huom!
	    char_at_gen_vs_nom = vrt_tauluja_dif_at(gen_temp_arr, nom_temp_arr);

	    !print " >>>", char_at, "<<< ";    
	    if (char_at_gen_vs_nom < char_at)
	    	char_at = char_at_gen_vs_nom;
	    
	    ! hetkinen...
	    ! vert antoi 0 -- ei av? - voiko tämä olla oikein!? -
	    if (char_at == 0) char_at = nom_temp_arr-->0;

	    
	    
    	}
    
    	!! jos parsitaan suoraan, pannaan tämä ttyyppiin väliaikaisesti...
    	!! toisaalta kaikki ttyyppi.* on väliaik mutta...
    	!! muistutuksena että ne pitää tyhjentää...
    	!! tarkoittaa ettei voi käyttää esiparsan ulkopuolella tai ollenkaan.
    	!ttyyppi.char_at_temp = char_at;
	
 	
    	! ** av
    	! varianttien takia monikko saattaa tarvia ttnro
    ! [oli "arvaa_av_tyyppi()"]
    
    	if (mon)
	    av = erittele_arvaa_av(mon, char_at, ttnro);
    	else
	    av = erittele_arvaa_av(mon, char_at);
	
 	
    
    
    ! ** 
    ttkoodi = tee_ttkoodi(mon, ttnro, av);
    !print " >>>", ttkoodi, "<<< ";
    
    return ttkoodi;
];


!* 035 ! korvataan esiparsi_arvaa_av()?
! tvtyyppi vk voidaan tarvita monikossa esim laatikot laatikoiden laatikoita?
[ erittele_arvaa_av mon char_at ttnro arr1 arr2;

    !return kk_k; ! tämä kun saadaan -> tulee parsi risti
    
    ! lomaKKee(n t)
    if (mon) arr1 = nom_temp_arr;
    else arr1 = gen_temp_arr;

    arr2 = par_temp_arr;


    if (dp > 3) {
	print "** erittele_arvaa_av char_at ", char_at, " (arr 1: ";
    	print_arr(arr1); print " 2: "; print_arr(arr2); print ") ";
    }
    

    
    !return kk_k;
    

    ! arvataan käänteinen ensin
    ! jos mon, ei löydy välttämättä oikea
    ! lomaKKee[t/n] (ei naKin/naKit)

    ! vastiKKeen
    if (hae_k(arr1, char_at) == 'k' && hae_k(arr1, char_at+1) == 'k')
    return k_kk;

    if (hae_k(arr1, char_at) == 't' && hae_k(arr1, char_at+1) == 't')
    return t_tt;

    ! 
    ! naKKeja, laatiKKoja (mutta ks myös alla koska variantti...)
    if (hae_k(arr2, char_at-1) == 'k' && hae_k(arr2, char_at) == 'k')
     	return kk_k;
    

        if (hae_k(arr1, char_at-1) == 'p' && hae_k(arr1, char_at) == 'p')
	return p_pp;


        if (hae_k(arr2, char_at-1) == 'p' && hae_k(arr2, char_at) == 'p')
	return pp_p;

            if (hae_k(arr1, char_at-1) == 't' && hae_k(arr1, char_at) == 't')
	return t_tt;


        if (hae_k(arr2, char_at-1) == 't' && hae_k(arr2, char_at) == 't')
	return tt_t;

    ! k_ (reikä) vuoKa vuoAn (?) tai: vuo$n ($ ~= k) tjsp.
    if (hae_k(arr1, char_at) == 'a' or 'ä' &&
	hae_k(arr2, char_at) == 'k' or 'ä') 
	return k_;

    ! _k (aie) rae raKeen pyyhe pyyhKeen (riittääkö?) 
    if (hae_k(arr2, char_at) == 'k')
	return _k;

    
    ! p_v (sopu)
        if (hae_k(arr1, char_at) == 'p' &&
	hae_k(arr2, char_at) == 'v') 
	return p_v;

    ! v_p (taive)
    if (hae_k(arr1, char_at) == 'v' &&
	hae_k(arr2, char_at) == 'p') 
	return v_p;
    
    ! t_d (satu) 
        if (hae_k(arr1, char_at) == 'd' && hae_k(arr2, char_at) == 't') 
	return t_d;

    ! d_t (keidas) 
        if (hae_k(arr1, char_at) == 't' && hae_k(arr2, char_at) == 'd') 
	return d_t;

    
    ! tjsp. jne...

    ! viimeinen tsäänssi? variantti.. laatiKoita
    ! vain monikolla olisi tvtyyppi ja vk.
    ! koska koska tiedetään että tämä taivutustyyppi on aina kk_k:
    
    !if (tvtyyppi == TT_laatikon && vk == 'o' or 'ö') return kk_k;
    
	
return 0;     

];


!* 027
! --------

! onko_monikko?
! -------------
! jos nominatiivi loppuu 't'
!    ...ja partitiivi loppuu tiA, ttA, t'tA se on yksikkö: rfalse,
!    muuten se on monikko: rtrue
! jos nominatiivi ei lopu 't', se on yksikkö: rfalse
! 
! gen_t: haetaan gen-taulun 3. viimeinen merkki
! tarot tarotia tarotin (monikko?)
! rotat rottia rottien rottain rottein (yksikkö)?                                

[ onko_monikko nom_vk nom_len gen_len gen_t;
    
    nom_len = nom_temp_arr-->0;
    nom_vk = hae_k(nom_temp_arr, nom_len+1);

    gen_len = gen_temp_arr-->0;
    gen_t = hae_k(gen_temp_arr, nom_len-1);
     
    if (nom_vk == 't')
    {
	if ((pv(0,'t','i') && gen_t == 't')) return false; ! yksikkö? 
	if (pv(0,'t','t') || pv('t',''','t') || pv(0,'t','t'))
	    return false; ! yksikkö?
	else return true; ! monikko?
    }
    else return false; ! yksikkö?
    
    
];


! hae_k
! esim: n1 = hae_k(nom_arr, g_dif-1);
[ hae_k arr at ;
    
    if (at>0) return arr->at;
    else rfalse;
    
    
];

!* 028
!Array tv_arr-->8;

Constant tv_arr_len = 3;
Array tv_arr-->tv_arr_len;

[ tee_tv_arr arr len k1 k2 k3 a1 a2 a3;

    len = arr-->0;

    k1 = hae_k(arr, len-2);
    k2 = hae_k(arr, len-1);
    k3 = hae_k(arr, len);

    tv_arr->0 = k1;
    tv_arr->1 = k2;
    tv_arr->2 = k3;
    
    !print ">>täs>>", (char) k1, (char) k2, (char) k3, " "; 
    !print tv_arr_len, " ";

    a1 = tv_arr->0;
    a2 = tv_arr->1;
    a3 = tv_arr->2;
    
    !print ">>vai täs>>", (char) a1, (char) a2, (char) a3, " ";

    !print_arr(tv_arr);
    
    
];

!* 029


!* 030
! vk_apu() korvaa tämän?
[ arvaa_yks_vk_mon_partitiivista tvtyyppi;
    
    switch (tvtyyppi)
    {
     'ime': if (pv('i','m','i')) return 'n'; !33
     'oma': if (pv('o','m','i')) return 'n'; !34	
     'ömä': if (pv('ö','m','i')) return 'n'; !34	
     'kse': if (pv('k','s','i')) return 's'; !39 
     'yde': if (pv('k','s','i')) return 's'; !40
     'ude': if (pv('k','s','i')) return 's'; !40
     'hde': if (pv('k','s','i')) return 'i'; !31
    	! 48 hameita... rakeita voiteita pyyhkeitä
     'ee': if (pv('e','i','t')) return 'e'; !48
	! ...
     'ko': if (pv('k','o','j') || pv('o','i','t')) return 'o';
	!** Virhe! Ei voi olla monta peräkkäin koska palaa 0.
     	!** 'ko': if (pv('o','i','t')) return 'o'; ! laatikot, männiköt!
     'kö': if (pv('ö','i','t')) return 'ö';

	! naiset naisia
     'se': if (pv('s','i',0)) return 'n';
 	
     	!** 'kö': if (pv('k','ö','j')) return 'ö';
	! nakkeja, hämähäkkejä
     'i//': if (pv(0,'e','j')) return 'i';
	
	! kaloja 9, koiria 10
     'a//': if (pv(0,0,'j') || pv(0,0,'i')) return 'a'; 
	
	! elehdintöjä 9, tynkiä 10
     'ä//': if (pv(0,0,'j') || pv(0,0,'i')) return 'ä'; 
      	 
	 
	 ! if (pv('','','')) return '';
	 ! if (pv('','','')) return '';
	 ! if (pv('','','')) return '';
	 ! if (pv('','','')) return '';
	 ! if (pv('','','')) return '';
	 ! if (pv('','','')) return '';
	 ! if (pv('','','')) return '';
	 ! if (pv('','','')) return '';
	 ! if (pv('','','')) return '';
	 ! if (pv('','','')) return '';
	 ! if (pv('','','')) return '';
	 ! if (pv('','','')) return '';
	 ! if (pv('','','')) return '';
	 ! if (pv('','','')) return '';
	 ! if (pv('','','')) return '';
	 ! if (pv('','','')) return '';
    	 }
    
];


!* 031
! yks vk nom taulusta, jos mon, se ei ole taulussa jolloin arvataan...	

! arr =
! nom_arr (kun parsitaan)
! nom_tulostus_arr (kun tulostetaan)
! jos to_lowercase on tosi merkki muunnetaan pieneksi kirjaimeksi
[ taulun_viimeinen_k arr to_lowercase len vk;

    len = arr-->0;
    len = len+WORDSIZE;

    vk = hae_k(arr, len-1);
    ! print "^*** taulun_viimeinen_k: ", (char) vk;
    if (to_lowercase == false)
	return vk;
    else
    vk = LowerCase(vk);
    !print " -> ", (char) vk, "^";
    return vk;
        
];


!* 032


! muuten kuin pv() paitsi vertaa vain 2 merkkiä sanan lopusta
! ja käyttää nom_arr (ei par_arr)
[ nv h2 h3 t2 t3 len;
    
    len = nom_temp_arr-->0;

    t2 = nom_temp_arr->(len);
    t3 = nom_temp_arr->(len+1);

    if (h2 && h2 ~= t2) h2 = false;
    else h2 = true; ! 0 on tosi

    if (h3 && h3 ~= t3) h3 = false;
    else h3 = true; ! 0 on tosi

    if (h2 && h3) return true;
    else rfalse;
    
    
];

! partitiivi par arr
[ pv h1 h2 h3 t1 t2 t3 len;
    
    len = par_temp_arr-->0;

    t1 = par_temp_arr->(len-2);
    t2 = par_temp_arr->(len-1);
    t3 = par_temp_arr->(len);

    
    if (h1 && h1 ~= t1) h1 = false;
    else h1 = true; ! 0 on tosi

    if (h2 && h2 ~= t2) h2 = false;
    else h2 = true; ! 0 on tosi

    if (h3 && h3 ~= t3) h3 = false;
    else h3 = true; ! 0 on tosi

    if (h1 && h2 && h3) return true;
    else rfalse;
    
    
];


! tv(0,'k',0) hakisi *, k, *
[ tv h1 h2 h3 tv1 tv2 tv3 len;
    
    len = tv_arr-->0;

    tv1 = tv_arr->0;
    tv2 = tv_arr->1;
    tv3 = tv_arr->2;


    !print "^ ** TV # len ", len, " # h: "; 

    !if (h1) print (char) h1; else print 0;
    !if (h2) print (char) h2; else print 0;
    !if (h3) print (char) h3; else print 0;

    !print " # tv:";
      
    !print (char) tv1;
    !print (char) tv2;
    !print (char) tv3;

    !print " # ";
    
    
    if (h1 && h1 ~= tv1) h1 = false;
    else h1 = true; ! 0 on tosi

    if (h2 && h2 ~= tv2) h2 = false;
    else h2 = true; ! 0 on tosi

    if (h3 && h3 ~= tv3) h3 = false;
    else h3 = true; ! 0 on tosi

    if (h1 && h2 && h3) return true;
    else rfalse;
    
    
];


!* 033
! jos kumpi tahansa arr loppuu ennen kuin merkkien välillä eroa...
[ vrt_tauluja_dif_at arrA arrB len dif_at;
    
    len = WORDSIZE+arrB-->0;

    ! esim. A: muusin B: muusia niistetään viimeinen k pois
    ! muuten tulee väärä char at. tässä esimerkissä (no dif, ret 0)
    ! muusi... nom, gen vai par lopusta? entä monikossa?

     len = len-1; 
    
    if (dp>3) 
    { 
        print "# vrt_tauluja A: "; print_arr(arrA);  
        print " B: "; print_arr(arrB); print " (B len ", len, "): ";
    }
    
    if(dp>3) print "^ A:["; 
    for (dif_at=WORDSIZE:dif_at<len:dif_at++)
    if (dp>3) print (char) arrA->dif_at;
    if(dp>3) print "]";
    
    if(dp>3) print " B:[";
    for (dif_at=WORDSIZE:dif_at<len:dif_at++)
    if (dp>3) print (char) arrB->dif_at;
    if(dp>3) print "] ";
    
    for (dif_at=WORDSIZE:dif_at<len:dif_at++)
    {
	
	if (arrA->dif_at == arrB->dif_at) 
	    if (dp>3) print (char) arrB->dif_at;
        !else 
        if (arrA->dif_at ~= arrB->dif_at) {
	    if (dp>3) print "[", (char)arrA->dif_at, "!", (char)arrB->dif_at, "] (return ", dif_at, ")^";
	    return dif_at;   
	}
	
    }
    if (dp>3) print "(no dif, ret 0)^"; 
    return 0; !no dif?
    
];


!* 034

