!* 006 -
!
Array vokaalit table
    'a' 'e' 'i' 'o' 'u' 'y' 'ä' 'ö' 'å';

!Array konsonantit table
!    'b' 'c' 'd' 'f' 'g' 'h' 'j' 'k' 'l' 'm' 'n' 'p' 'q' 'r' 's' 't'! 'v' 'x' 'z';

!* 007 -
! [ Print_adr adr len at;
!     for (at=0:at<len:at++)
!  	print (char) adr->at;
! ];

! [ PrinttaaChars wnum adr len at;
    
!     adr = WordAddress(wnum); len = WordLength(wnum);
!     print "#  PrinttaaChars: ";
!     for (at=0:at<len:at++)
!     	print (char) adr->at;
!     print "^";
    
! ];


! [ tulosta_taulut_ja_sija mon cs;
!     print "^>> tulosta_taulut_ja_sija: "; if (mon) print "monikko"; 
!     else print "yksikkö"; print "^";
!     print "  temp match: "; print_arr(temp_match_arr);
!     print " (", temp_match_arr-->0, ")^";
    
   
!     print "  nom: "; print_arr(nom_temp_arr); print " (", nom_temp_arr-->0, ")^";
!     print "  gen: "; print_arr(gen_temp_arr); print " (", gen_temp_arr-->0, ")^";
!     print "  par: "; print_arr(par_temp_arr); print " (", par_temp_arr-->0, ")^";
!     !print "  av1: "; print_arr(av1_arr); print " (", av1_arr-->0, ")^";
!     !print "  av2: "; print_arr(av2_arr); print " (", av2_arr-->0, ")^";
!     print " >> cs: "; 
!     switch (cs) {
!      csNom : print "csNom";! 1;
!      csGen : print "csGen";! 2;
!      csPar : print "csPar";! 3;
!      csIne : print "csIne";! 4;
!      csEla : print "csEla";! 5;
!      csIll : print "csIll";! 6;
!      csAde : print "csAde";! 7;
!      csAbl : print "csAbl";! 8;
!      csAll : print "csAll";! 9;
!      csEss : print "csEss";! 10;
!      csTra : print "csTra";! 11;
!     }
!     print " (?)^";
! ];
! !* 009 -

! [ parsi_pato av1 av2 adr len char_at av1_pit av2_pit s1 s2;
    

!     if (av1 || av2) av1_pit = anna_av_pit(av1, adr+char_at);
!     if (av1 || av2) av2_pit = anna_av_pit(av2, adr+char_at);

!     s1 = DL(adr+char_at+av1_pit, len-char_at+av1_pit);
!     s2 = DL(adr+char_at+av2_pit, len-char_at+av2_pit); 

!     print "%%%%%%%% av1: ", (address) av1, "%%%";
    
!         switch (s1) ! patoon
!     {
!      'oon': print "]]]]]] patoon "; return csIll; ! kk & k
!      }
!     switch (s2) ! padon
!     {
!      'on': print "]]]]]] padon "; return csGen; 
!      }
!     return false;

!     ];


! [ parsi_laatikot av1 av2 adr len char_at av1_pit av2_pit s1 s2;

!     char_at = nom_arr-->0;
!     print "######## ", char_at;
!     char_at = char_at-3;
!     print " ##### ", char_at;


!     if (av1 || av2) av1_pit = anna_av_pit(av1, adr+char_at);
!     if (av1 || av2) av2_pit = anna_av_pit(av2, adr+char_at);
 
!     if (av1_pit>-1) s1 = DL(adr+char_at+av1_pit, len-char_at+av1_pit);
!     if (av2_pit>-1) s2 = DL(adr+char_at+av2_pit, len-char_at+av2_pit); 

!     !ttyyppi.av1 = 'GGGGGGGGG';
    
!     print "#### av1 ", (address) av1;

    
	
!     switch (s1) ! kk
!     {
!      'oihin': print ")))))) oihin "; return csIll; ! kk & k
!      'ojen': return csGen;
!      'oja': return csPar;
!     }
!     switch (s2) ! k
!     {
!      'oihin': return csIll; ! kk & k
!      'oitten': return csGen;
!      !'ita': return csPar;
!      'oita': return csPar;	
!     }
!     return false;


! ];

	    



! [ anna_s av adr char_at av_pit;
    
!     if (av) av_pit = anna_av_pit(av, adr+char_at);
!     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! len-char_at ????
!     if (av_pit>-1) return DL(adr+char_at+av_pit, char_at+av_pit);

! ];

!* 010 -
! [ LR_vahva_aste obj;
    
!     if (obj has pluralname && csLR == 0 or csGen or csPar or csEss or csIll ) rtrue; 
!     else if (csLR == 0 or csNom or csPar or csEss or csIll)  
! 	rtrue; 
!     rfalse;
! ];


! [ WordInPropertyHack wd obj prop k l m;
!     k = obj.&prop; l = (obj.#prop)/WORDSIZE-1;
!     for (m=0 : m<=l : m++)
!         if (wd == k-->m) rtrue;
!     rfalse;
! ];

! !* 011 -

! ei käytetä
! [ vart_jatke_match end adr len at;
    
!     print "# vart_jatke_match: ";
    
!     for (at=WORDSIZE:at<len:at++)
!     {
!         if (NomGenPar_temp->(at+1)=='|' && NomGenPar_temp->(at) == adr->(end+at-WORDSIZE)) 
!         {print " jatke annettu, syöte täsmää (osan pituus +1)^"; return end+at;}
! 	else
! 	    if (NomGenPar_temp->(at+1)=='|' && NomGenPar_temp->(at) ~= adr->(end+at-WORDSIZE)) 
! 	    {print " jatke annettu, syöte ei täsmää (0)^"; rfalse;}
	
! 	!   if (DP>1) print "^** end+at ", end+at, "^"; }
	
!     }
    
!     print " jatketta ei ole (1)^";
!     return true;
    
    
! ];

!! av_match on kierrätetty vart_jatke...
!
!    at = dif-1; !(??)
!
!    v_len = v_arr-->0;
!    h_len = h_arr-->0;
!
!! onko av?
!
!    if ((v_len || h_len) > 0) av = true;
!
!! jos match v/h, at ++ ja "siirrytään eteenpäin" tai luovutaan?
!    
!    if (av) ? = av_match(v_arr, end, adr, len, at) at++++?; rfalse?
!    if (av) ? = av_match(h_arr, end, adr, len, at) at++++?; rfalse?
!
!! astev voi esiintyä myös tyhjänä
! 
!! arr--adr match? 


! av_match
! palauttaa arr pituuden joka voi olla 0
! siksi katso ensin onko astevaihtelua av
! täältä ei nähdä onko suora vai käänt. av
! av1 on astevaihtelun esiintyminen perusmuodossa
! tarkoitus käyttää siten että sopivien päätteiden
! (arr pit jälkeen) jne. kanssa voidaan
! palauttaa sija csNom csGen mitä lie

! [ av_match arr dif adr w_at av_at av_pit match_len ret;
    
!     w_at = dif-WORDSIZE;
!     ret = dif-WORDSIZE;
    
!     av_pit = arr-->0;

!     av_at = WORDSIZE;

!     if (DP) print "^# av_match: av_pit ", av_pit, " "; 
    
!     if (av_pit == 1)
!     {
! 	if (DP) print " av_at ", av_at, ": ", (char)arr->av_at;
	
! 	if (arr->av_at == adr->w_at)
! 	{
! 	    print "=", (char)adr->w_at;
! 	    ret = ret+av_pit;
	   	    
! 	}
! 	else
! 	{
! 	    print "!", (char)adr->w_at;
! 	    ret = false;
	    
! 	}
	
! 	!    if (arr->i == adr->(at)) ret = ret+1;
!         !    else ret = false;
	
!     }
    
!     if (av_pit == 2)
!     {
!         ! debug
!     	if (DP) print "^w_at (-1,0): ", w_at-1, ",", w_at, ": ",
!     	    (char)adr->(w_at-1), ",", (char)adr->(w_at),
!             " av_at: ", av_at, ",", av_at+1, ": ",
!             (char)arr->av_at, ",", (char)arr->(av_at+1); 
!     ! onko adr ja av sama?  
!     ! katsotaan dif -1,0
! 	if (arr->av_at == adr->(w_at-1) && arr->(av_at+1) == adr->w_at)
! 	{
! 	    if (DP) print "=", (char)adr->(w_at-1),",",(char)adr->w_at;
!         ! at dif -1,0 on
! 	    ret = ret+av_pit;
! 	    !ret = ret+1;
! 	}
!     else
!     	if (DP) print "^w_at (+0,1): ", w_at, ",", (w_at+1), ": ",
!     	    (char)adr->(w_at), ",", (char)adr->(w_at+1),
!             " av_at: ", av_at, ",", (av_at+1), ": ",
!             (char)arr->av_at, ",", (char)arr->(av_at+1); 
!     ! onko adr ja av sama?  
!     ! katsotaan dif 0,+1
! 	if (arr->av_at == adr->(w_at) && arr->(av_at+1) == adr->(w_at+1))
! 	{
! 	    if (DP) print "=", (char)adr->(w_at),",",(char)adr->(w_at+1);
!         ! at dif -1,0 on
! 	    ret = ret+av_pit;
	    
! 	   !ret = ret+1; 
! 	}

! 	!else
! 	!if (arr->(i-1) == adr->(at-1) && arr->i == adr->at)
! 	!{
! 	!    ret = ret;   
! 	!
! 	!	}
! 	else
! 	{
! 	    print "!", (char)adr->(w_at-1),",",(char)adr->w_at;
! 	    ret = false;
! 	}	
!     }
    
!     if (DP) print " ret ", ret; 

!     return ret; ! esim return ret+av_pit+1 (??)
	
     
    
!     !if (arr->i-1 == adr->at) print " * ", (char) arr->i, " * ";
!     !if (arr->i == adr->at) print " -> ", (char) arr->i; 
!     !if (arr->i ~= adr->(at)) 
    
    
!     !if (arr->i ~= adr->(at)) rfalse;  
    
     
     
! ];


! [ onko_suffiksi_nomgenpar end wnum adr len at i x;
    
!     adr = WordAddress(wnum); len = WordLength(wnum);
!     ! syöte, sen pituus
!     ! missä loppuu jatke jos sellainen on
!     ! jos ei jatketta, sanakirjasanan pituus?
!     ! [pilko palauttaa gen_at se antaa ne?]
!     if (DP>1) print "# onko_suffiksi_nomgenpar[?]^";
    
    
!     if (DP>1) print " end: ", end, " ";
!     !if (input_suffiksi_len == nom_arr-->0) !? miksi nom?
!     if (DP>1)
! 	for (at=2, i=end : i<len : at++, i++)
!     	{       
!             if (nom_temp_arr->at == adr->i) print (char) adr->i; 
!     	}
    
!     x = WORDSIZE;
    
!     if (DP>1) print "inp (from ", end, "):";
!     !if (input_suffiksi_len == nom_arr-->0) !? miksi nom?
!     for (i=end:i<len:i++, x++)
!     {     
	
!         !! Nominatiivi -- huom. WORDSIZE (syy jatkeen sekavassa säätämisessä yllä?) 
!         !if (len-end == nom_arr-->0 && adr->i == nom_arr->x && end==len+WORDSIZE) 
!         if (len-end == nom_temp_arr-->0 && adr->i == nom_temp_arr->x && i+1 == len) 
!             return csNom;
!         !! Genetiivi
!         if (len-end == gen_temp_arr-->0 && adr->i == gen_temp_arr->x && i+1 == len) 
!             return csGen;
!         !! Partitiivi
!         if (len-end == par_temp_arr-->0 && adr->i == par_temp_arr->x && i+1==len)
!             return csPar;
        
!     }
!     return 0;
    
! ];

!* 013 -

! päällekkäisyyttä ks. NomGenPar

! yks. & monikko



! monikko
!Constant ill_arr_len = 12;
!Array ill_arr-->ill_arr_len;

! w - syöte
! str - tätä analysoidaan
! len end - en tiedä tarvitaanko
!
!                        0 = nom, 1 = gen, 2 = par
!                        |  0 = ensimmäinen char jne.
!                        |  |    
! check_string_prop(str, 0, 0), "^"; 
! [ erittele_yks_vart adr len end n g p g1 n1 char_at_end av_temp;
    
!     if (DP>1) print "# Erittele_yks_vart^ ", " len ", len, " end ", end, "^";  
    
!     ! merkkijonon osien pituudet
    
!     n = check_string_prop_len(0);
!     g = check_string_prop_len(1);
!     p = check_string_prop_len(2);
    
!     ! gen 1. kirjain
!     g1 = check_string_prop(1,0);
!     ! nom 1. kirjain
!     n1 = check_string_prop(0,0);
    
!     if (DP>1) print "^nom ", n, " gen ", g, (char) g1, " par ", p, "^";
!     ! tulostaa 2x  n
!     !            nin
!     print "* gen_temp_arr: ";
!     print (char) gen_temp_arr->(0+WORDSIZE);
!     print (char) gen_temp_arr->(1+WORDSIZE);
!     print (char) gen_temp_arr->(2+WORDSIZE);
    
    
!     print " *^";
    
!     ! viimeinen kirjain sanakirjasanassa joka täsmää syötteeseen. otetaan syötteestä
!     char_at_end = DL (adr+end-1, 1);
!     !if (DP>1) print "^last char of dict word:", char_at_end, "^";
    
!     if (adr-->3 == 'a' or 's' or 'k') print "a A^";
    
!     ! onko vartalonvaihtelu, astevaihtelu?
!     if (DP>1) print "# vart vaihtelu ";
!     switch (char_at_end) {
        
!      'k//': if (n1 == 'k') av_temp = 1; ! A kk:k
! 	if (onko_taulussa(n1, vokaalit)) print "^K+vok: hake?^";
!      'p//': if (n1 == 'p') av_temp = 3;
! 	if (onko_taulussa(n1, vokaalit)) print "^P+vok: opas?^";
!      't//': if (n1 == 't') av_temp = 5;
! 	if (onko_taulussa(n1, vokaalit)) print "^T+vok: kate?^";
	
        
    	
!     }
    
!     if (n == 0 && g == 1 && p == 1 && hae_yks_suffiksi(adr, len, end)) return true;
!     !else rfalse;
    
!     ! hahmottelua
!     if (n == 2 && g == 2)
!     {
!         if (g1 == 'e') print "^** tod näk astev 7A ~kaikki~ **^";
!     }
    
    
! ];

! TODO tässä sitten toistetaan kaikki _yks_vart suunnitteluvirheet?
! [ erittele_mon_vart len end;
!     if (DP>1) print "# Erittele_mon_vart^ ", " len ", len, " end ", end, "^";
!     !skannaus(1, self.&vart-->1, 1);
!     check_string_prop(1, 1);
!     ! default olisi esim pituus se-ja-se jne
    
! ];

!* 014 -

!  ! vv hakee syötteestä kirjaimen ennen ja jälkeen vaihtelua
!  ! esim. 'vari' 's' >variSTa 
!  ! (siitä 2 kirjaimen sanahaku: onko astevaihtelua tai muuta vaihtelua) 
! [ onko_vahva_astevaihtelu w obj adr end vartprop vv;
    
!     ! tark: 0 = sanav alku 1 = nominatiivi vart loppu, 2 = gen vastaava
!     !tark = 2;
!     vartprop = WordInPropNumVart(w, obj, vart, 0);
    
!     if (vartprop)
!     {
! 	vartprop = WordInPropNumVart(w, obj, vart, 2);
	
! 	vv = DL (adr+end-1, 2);
	
	
!     	if (vv && onko_taulussa(vv, astevaihtelu))  
!     	    rtrue;
!     }
!     rfalse;
    
! ];


! [ LR_hae_vaihtelu_ja_suffiksi w obj adr len end onko_string;
    
!     ! testataan onko string
!     onko_string = WordInPropNumVart(w, obj, vart, 1);
!     !if (onko_string ofclass string) print "STRING!"; else print "EI-STRING!";
    
!     hae_suffiksi(adr, len, end, obj);
    
    
!     if (onko_vahva_astevaihtelu(w, obj, adr, len, end) && hae_suffiksi(adr, len, end, obj)) 
!     	rtrue;
    
    
!     rfalse;
    
! ];




! [ check_string_prop_len osa p length limit full_length start stop i ff; 
    
    
!     limit = (NomGenPar_temp-->0) + WORDSIZE;
    
!     for (i = WORDSIZE: i ~= limit: i++)
!         if (NomGenPar_temp->i == '|') ff = i-1;
    
    
!     for (i = ff + WORDSIZE : i ~= limit : i++)
!     { 
	
!         if (NomGenPar_temp->i ~= 0) full_length++;
	
!         if (NomGenPar_temp->i == '/') p++;
	
! 	if (NomGenPar_temp->i ~= '/' or 0 && osa == p)
! 	{
! 	    length++;
! 	    if (NomGenPar_temp->(i+1)=='/' || NomGenPar_temp->(i+1)==0) 
!         	stop = full_length;
	    
! 	}
!     }
    
!     start = (stop - length); 
    
!     return length;
    
! ];


! [ check_string_prop osa at limit i p length full_length
!     start stop x ff;
    
!     limit = (nomgenpar_temp-->0) + WORDSIZE;
    
!     if (DP>1) print "# check_string_prop ";    
    
!     for (i = WORDSIZE: i ~= limit: i++)
!         if (nomgenpar_temp->i == '|') ff = i-1;
    
    
!     for (i = ff + WORDSIZE: i ~= limit: ++ i)
!     {
	
! 	if (nomgenpar_temp->i ~= 0) full_length++;
	
! 	if (nomgenpar_temp->i == '/') p++;
	
! 	if (nomgenpar_temp->i ~= '/' or 0 && osa == p)
! 	{
! 	    length++;
! 	    if (nomgenpar_temp->(i+1)=='/' || nomgenpar_temp->(i+1)==0) stop
! 		= full_length;
	    
! 	}
        
!     }
    
!     start = (stop - length); 
    
    
!     if (length > 0)
!     {
	
! 	if (osa == 1) {
! 	    @output_stream 3 gen_temp_arr;
! 	    for (x=start : x<stop : x++)
! 	    {          
!         	print (char) nomgenpar_temp->(x+WORDSIZE+ff);
!         	!@output_stream 3 gen_arr;
!         	!print (char) nomgenpar_temp->(x+WORDSIZE+ff);
!         	!@output_stream -3;
     	    	
! 	    }
! 	    @output_stream -3;
! 	}
!     	if (DP>1) 
! 	{
	    
!      	    print " : osa ", osa, ", length ", length, ", full length ",
!      	 full_length, ", start at ", start, ", stop at ", stop, " ff ", ff, "^";
! 	}
	
!     }
!     return nomgenpar_temp->(start+at+WORDSIZE+ff);
    
! ];

!* 015 -

! [ plaep adr len end obj;
!     print "## plaep ^ ";
!     print "csLR ", csLR, ", char ~";
!     print (char) adr->(len-1);
!     print "~ adr ", adr, " len ", len, " end ", end, " ", (name) obj;
!     if (obj has pluralname) print " has pluralname";
!     else print " hasnt pluralname"; 
!     print "^ ";
! ];

! [ hae_yks_suffiksi adr len end sijap offset;
    
!     offset = len-end;
    
!     sijap = DL (adr+len-offset, len);
!     if (DP>1) print "  # hae_yks_suffiksi: len ", len, " end ", end, "
!     	offset ", offset, "^ ";
!     if (suffiksit_yks(sijap) == csLR) { 
!         if (DP>1) print "# suffiksi == csLR^ ";
!         rtrue;
!     }
!     else rfalse;
! ];

! [ hae_suffiksi adr len end obj sijap offset;
    
!     !offset = 1;
!     offset = 0;
    
!     if (DP>1) print "# hae suffiksi^ "; 
!     if (DP>1) plaep(adr,len,end,obj);
    
!     sijap = DL (adr+len-offset, len);
    
!     if (sijap == false) rfalse;
    
!     ! ei päätettä? (tämä ei voi olla oikein vai voiko?)
!     ! tätä ei edes lueta. ks LanguageRefers onko se oikein (csNom) 
!     if (len == end && csLR == csNom) return true;
!     else
!     	if (DP>1 && obj has pluralname) print "# Monikko^ ";
!     ! yksikkö 
!     if (obj hasnt pluralname && suffiksit_yks(sijap))
!     {
! 	if (DP>1) print "# Yksikkö^ ";
	
! 	if (suffiksit_yks(sijap) == csLR) { 
!             if (DP>1) print "# suffiksi == csLR^ ";
!             rtrue;
!         }
! 	! yks. sijapääte löytyy mutta eri asiayhteys
! 	muu_sija = true;
! 	rfalse;
!     }
!     ! monikko
!     else
!     	if (obj has pluralname && suffiksit_mon(sijap))
!     	{
! 	    if (suffiksit_mon(sijap) == csLR) rtrue;
! 	    ! mon. sijapääte löytyy mutta eri asiayhteys
! 	    muu_sija = true;
! 	    rfalse;
!     	}
!     rfalse;
    
! ];

! vokaaliharmonia a/ä tänne?    
! [ suffiksit_yks s;
!     !print s;
    
!     switch (s) {
!      'n//': return csGen;
!      'a//': return csPar; ! if (a) return csPar; jne tjsp
!      'ä//': return csPar;
!      'ssa': return csIne;
!      'ssä': return csIne;
!      'sta': return csEla;
!      'stä': return csEla;
!      'lla': return csAde;
!      'llä': return csAde;
!      'lle': return csAll;
!      'aan': return csIll;
!      'een': return csIll;
!      'iin': return csIll;
!      'oon': return csIll;
!      'uun': return csIll;
!      'yyn': return csIll;
!      'ään': return csIll;
!      'öön': return csIll;
!      'han': return csIll;
!      'hun': return csIll;
!      default: rfalse;
	
!     }
!     rfalse;
    
! ];

! ! TODO
! [ suffiksit_mon s;
    
!     switch (s) {
!      'ja': return csPar;	
 	
!     }
!     rfalse;
! ];

! ! ao. siirretty vartalot-tiedostosta joka poistettu
! ! -------------------------------------------------
! ! halpa!
! ! yleisyysjärjestys (kotus sanalista) 
! ! nai/nen vastau/s kalleu/s
! Array yks_gen_vaihtelu table
!     'sen' 'ksen' 'den';
! ! risti/t nais/et vastauks/et kalleu/det valo/t
! Array mon_gen_vaihtelu table
!     'en' 'ten' 'ien' 'ksien' 'jen';

! Array yks_astev_vahva_nom table
!     'tö' 'ki' 'to' 'kä' 'pi' 'tu' 'ko';

! ! astevaihtelu (vahva) tulee syötteestä ja nom / nom ja gen vart
! ! tyt/tö tak/ki hen/to rei/kä kaap/pi sa/tu aurin/ko
! ! tyt/öt tak/it hen/not rei/ät kaap/it sa/dut aurin/got
! Array astevaihtelu table
!     'tt' 'kk' 'nt' 'k//' 'pp' 't//' 'nk';

! Array vok table
!     'a//' 'e//' 'i//' 'o//' 'u//' 'y//' 'ä//' 'ö//' 'å//';

! 5 valo, risti
! monikossa risti t en / par: ristejä
![ tt5valo mon genvart;
!    if (mon && genvart == 'en') rtrue;
!    rfalse;
!];

! 38 nainen
![ tt38nainen mon genvart;
!    if (mon && genvart == 'ien' or 'ten') rtrue;
!    else if (~mon && genvart) == 'sen') rtrue;
!    rfalse;    
!]; 

!==> arvelu.h <==
!!! arvelu.h !!!

! tähän tapaan?
!     laatikot !   2 4A
!     if (c1 == 'i' && c2 == 'k' && c3 == 'o' or 'ö') return 'av1.arvelu';

!System_file;



!     if (tv(0,'k','ö')) return tv_laatikon; ! lammikot lätäköt
!     if (tv(0,0,'i')) return 5; ! ristin tunnin
!     if (tv(0,0,'e')) return 7; ! kiven loven
!     if (tv(0,0,'a')) return 9; ! kalan
!     if (tv(0,0,'ä')) return 9; ! kalan
!     if (tv(0,0,'e')) return 26; ! kielen pienen 24: huulen 23: tiilen vuohen 
!     if (tv(0,'d','e')) return 27; ! veden suden käden paaden reiden
!     if (tv('ö','m','ä')) return 33; ! työttömän onnettoman t:tt (kpt!)
!     if (tv('o','m','a')) return 33; ! työttömän onnettoman t:tt (kpt!)
!     if (tv('s','e','n')) return 38; ! naisen kineettisen aapisen eläkeläisen
!     if (tv('k','s','e')) return 39; ! vastauksen
!     if (tv('y','d','e')) return 40; ! hyvyydet tulevaisuudet
!     if (tv('u','d','e')) return 40; ! hyvyydet tulevaisuudet
!     if (tv(0,'a','a')) return 41; ! taivaat vieraat räystäät
!     if (tv(0,'ä','ä')) return 41; ! taivaat vieraat räystäät
!     if (tv(0,'u','e')) return 43; ! ohuet lyhyet oluet
!     if (tv(0,'y','e')) return 43; ! ohuet lyhyet oluet
!     if (tv(0,'e','e')) return 48; ! hameet kahleet ehosteet
!     if (tv(0,'l','e')) return 49; ! askelet huhmaret
!     if (tv(0,'r','e')) return 49; ! askelet huhmaret
    
    
!     ! ao. oli arvaa_tvt()
    
!     if (k1 == 'e')
!      	switch (k2)
! 	{
	    
!       	 'r': if (k3 == 'i') return 6; ! paperin 6
!      	 'l': if (k3 == 'e') return 49; ! askelen 49
	    
!     	}
!     if (onko_taulussa(k1, vokaalit))
! 	switch (k2)
! 	{
!       	 'k': if (k3 == 'o' or 'ö') return 4; ! laatikon 4
!     	}
!     ! lopuksi
!     if (k3 == 'a') return 9; ! kalan 9 
!     if (k3 == 'i') return 5; ! ristin 5
!     if (k3 == 'e') return 7; ! speden 8 oven 7     
!     if (onko_taulussa(k3, vokaalit)) return 1; ! valon 1
    
! ];    


    !if (t_arr(par_temp_arr,'e','t','t')) print "kastike*ETT*a!";

! Tai: return self.kse

! Tai:
! 'k' on yksikön nom. viimeinen kirjain
! tv hakee ns genetiivivartalosta (yks ja mon), pv partitiivi taulusta (mon)
! syy olisi esim. parsiminen / tulostaminen
! monikko
! if (tv('','','') && pv('','','')) mon.tyyppi('k', syy);
! yksikkö
! if (tv('','','') && vk=='k') yks.tyyppi('k', syy);        

!* 019 -

! nominien taivutuksen tulostusta
!  - apumerkit poistetaan
!
! '>/' tulostaa '/'
! '>>' tulostaa '>'
! tulostettu "/" tarkoittaa sanan vaihtumista kuten " ".
! Esim. "komero/>/putka/" tulostuu esim. "komerossa/putkassa"

Constant SutLen = 102;
Array Suttu --> SutLen;

[ CCase obj csID ucase i dlm limit at vart;
    
    sija = csID;
    
    if (csID ~= 0) { 
	
	at = 0;
	
	Suttu-->0 = SutLen-1;
	
 	if (obj provides short_name)
	    !  printshortname(obj);
	    !PrintToBuffer(Suttu, 102, printshortname(obj));
	    PrintToBuffer(Suttu, 102, obj);
	
	else
	    !??? jos vain tämä, olion nimi ei tulostu oikein
	    ! print (object) obj;
	    
	    PrintToBuffer(Suttu, 102, obj);   
	!@output_stream -3;
	
	if (ucase) Suttu-->2 = LtoU (Suttu-->2);
	
	dlm = 0;
	limit = (Suttu-->0) + WORDSIZE;
	
	sija = 0;
	
	vart = 0;
	
	if (csID == csIne) vart = 1;
	
	if (csID < 2 || csID == 0)
	    for (i = WORDSIZE: i ~= limit: ++ i) {
		if (Suttu-->i ~= '/' or '>') print (char) (Suttu-->i);
 	        if (Suttu-->i == '>' && Suttu-->(i+1) == '/') print "/";
	        if (Suttu-->i == '>' && Suttu-->(i+1) == '>') print ">";}
	
	!??? nomini ei nominatiivi tai 0 (csDflt)
	if (csID > 1 && csID ~= 0)
	    for (i = WORDSIZE: i ~= limit: ++ i)
	    {
 		if (Suttu-->i == '/' && Suttu-->(i-1) ~= '>')
	    	{
		    if (dlm == 0) dlm = Suttu+i;
	    	    else
	    	    { at++; CaseEnd (obj, csID, at);
			dlm = 0;
	    	    }
	    	}
		
	    	else
	    	{
		    if (dlm ~= 0 && Suttu-->i == ' ' or '/')
	    	    { at++;
		    	CaseEnd(obj, csID, at);
		    	dlm = 0;
	    	    }
		    if (dlm == 0 && Suttu-->i ~= '>') print (char) (Suttu-->i);
	    	}
	    } ! for
	
	if (dlm ~= 0)
	{ at++;
	    CaseEnd(obj, csID, at);
	}
    }
    
    else
	print (object) obj;
    
];


!??? 

Constant ParLen = 50;
Array ParArr --> ParLen;

Constant JutLen = 100;
Array Juttu --> JutLen;

! tämä "juttu" pitäisi kirjoittaa uudelleen
! -----------------------------------------
! ps = printtaussääntö, onko yksikkö, monikko vai monikko ja "ine"-ohje.
! 0 on yksikkö
! 1 jos monikko
! 2 jos monikko ja ine tulostusohje.
!
!??? 's' ei tulostu ine-tulostusohjeen takia
!??? ps on 1 jos (monikko)objektilla *ei* ole ine-ohjetta (esim. "susilla")
!??? ps on 2 jos (monikko)objektilla on ine-ohje (esim. "pöydillä")

[ CaseEnd obj csID at num limit i ps a paate_isolla sufstr;
    
    paate_isolla = 0; 
    
    ps = 0; 
    if (obj has pluralname) (ps = 1); 
    if ((obj has pluralname) &&
	(obj provides ine)) (ps = 2); 
    
    Juttu-->0 = JutLen-1;
    
    !@output_stream 3 Juttu;
    
    
    
    if (csID == csIll)
     	
    	!@{ if (obj provides ill) print (string) obj.ill;
    	!@else print (string) obj.ess; };
    { if (obj provides ill) sufstr = obj.ill;
    else sufstr = obj.ess; };
    
    if (obj hasnt pluralname)
	switch (csID) {
	 csGen: sufstr =  obj.gen;
	 csPar: sufstr =  obj.par;
	 csEss: sufstr =  obj.ess;
	 csIne: sufstr =  obj.gen;
	 csEla: sufstr =  obj.gen;
	 csAde: sufstr =  obj.gen;
	 csAbl: sufstr =  obj.gen;
	 csTra: sufstr =  obj.gen;
	 csAll: sufstr =  obj.gen;
	};
    
    !??? monikon astevaihtelu esim. "reikien"
    !??? oliolle on annettu ine "jissä"
    
    if ((obj provides ine) && (obj has pluralname) &&
	(csID ~= csNom or csPar or csGen or csEss or csIll))
	sufstr = obj.ine;
    else if ((obj has pluralname) && (csID ~= csIll))
    {
	if (csID == csGen) sufstr =  obj.gen;
	if (csID == csPar) sufstr =  obj.par;
	if (csID ~= csGen or csPar) sufstr =  obj.ess;
    };
    
    !@output_stream 3 Juttu;
    !if (sufstr ofclass string)
    !	print(string)sufstr;
    !juttuun?
    PrintToBuffer(Juttu, 66, sufstr);
    
    !@output_stream -3;
    
    num = 0;
    limit = (Juttu-->0) + WORDSIZE;
    
    if ((csID == csIll) && (obj provides Ill))
    {
	for (i = WORDSIZE: i ~= limit: ++ i) 	{
	    if ((num == at-1) && (Juttu-->i ~= '/')) print (char) (Juttu-->i);
	    if (juttu-->i == '/') num++;
	}
    }
    
    if (csID == csGen or csPar or csEss)
    {
	for (i = WORDSIZE: i ~= limit: ++ i) 	{
	    if ((num == at-1) && (Juttu-->i ~= '/')) print (char) (Juttu-->i);
	    if (juttu-->i == '/') num++;
	}
    }
    
    if (csID ~= csIll or csGen or csPar or csEss)
    {
	!??? 's' ei tulostu ine-tulostusohjeen takia
	!??? ps on 1 jos (monikko)objektilla *ei* ole ine (esim. "susilla")
	!??? ps on 2 jos (monikko)objektilla on ine-ohje (esim. "pöydillä")
	
  	if (ps == 2) !??? monikko ja ine-ohje
	    for (i = WORDSIZE: i ~= limit: ++ i) {
		if ((num == at-1)
		    &&
		    (Juttu-->i ~= 's' or 'a' or 'ä' or '/' or 'S' or 'A' or 'Ä'))
		    print (char) (Juttu-->i);
		
		if (Juttu-->i == 'S' or 'A' or 'Ä' ) paate_isolla = 1; 
		if (Juttu-->i == '/') num++;
	    };
	
   	if (ps == 1) !??? monikko
 	    for (i = WORDSIZE: i ~= limit: ++ i) {
		
 	  	if ((num == at-1)
		    &&
		    (Juttu-->i ~= 'n' or 'a' or 'ä' or '/' or 'N' or 'A' or 'Ä'))
		    print (char) (Juttu-->i);
		
		if (Juttu-->i == 'N' or 'A' or 'Ä') paate_isolla = 1; 
		if (Juttu-->i == '/') num++;
		
 	    };
	
	!??? olio ei ole monikollinen
    	if (obj hasnt pluralname) 
	    for (i = WORDSIZE: i ~= limit: ++ i) {
		
		!??? (gen-päätteestä) jos kirjain on 'n' tai 'N',
	     	!??? eikä sitä seuraa '/' tai jonon loppu, se tulostetaan.
		!??? Esim.: "ont/to kan/to"  gen "on/non"
		!??? genetiivin "non" ensimmäinen "n" tulostetaan.
		!??? <limit ~= (i+1) or (i+2)> (?) eli merkkijonon
		!??? loppu ei tule heti '/' jälkeenkään?
		
		if ((num == at-1) && (Juttu-->i == 'n' or 'N')
		    && (Juttu-->(i+1) ~= '/'))
		    ! 2 = WORDSIZE?
		{ if (limit ~= (i+1) or (i+2)) print (char) (Juttu-->i);};
		
		!??? tulosta kaikki kirjaimet paitsi '/', 'n' tai 'N'.
		if  ((num == at-1) && (Juttu-->i ~= '/' or 'n' or 'N'))
		    print (char) (Juttu-->i);
		
	    	if (Juttu-->i == 'N') paate_isolla = 1; 
	    	if (Juttu-->i == '/') num++;
		
	    };
	
	if (paate_isolla == 0)
	    switch (csID) {
	     csIne: print "ss";
		
	     csEla: print "st";
	     csAde: print "ll";
	     csAbl: print "lt";
		
	     csTra: print "ksi";
	     csAll: print "lle"; 
	    }
	
	else switch (csID) {
	 csIne: print "SS";
	    
	 csEla: print "ST";
	 csAde: print "LL";
	 csAbl: print "LT";
	    
	 csTra: print "KSI";
	 csAll: print "LLE"; 
	}
	if (csID ~= csTra or csAll) {
	    ParArr-->0 = ParLen-1;
	    !@output_stream 3 ParArr;
	    !print (string) obj.par;
	    !@output_stream -3;
	    PrintToBuffer(ParArr, 66, obj.par);
	    
	    
	    num = 0;
	    limit = (ParArr-->0) + WORDSIZE;
	    a = 0;
	    
	    for (i = WORDSIZE: i ~= limit: i++)
		
	    {
		if ((ParArr-->(i+1) == '/') || (i == limit-1))
	    	{a++;
 	 	    if (a == at) print (char) (ParArr-->i);} }
	}
    }
    
];

!* 026 -

! [ esiparsi_char_at mon tvt vk char_at;
    
    
!     return char_at;
    
    
! ];



! ! jos av 0 ret 0
! ! jos vahva aste esiintyy perusmuodossa se on suora av: ret 1
! ! jos toisinpäin, se on käänteinen: ret 2.  
! [ av_tyyppi av;
    
!     if (av == 0) return 0; ! ei astev.
!     if (av == 'kk.k' or 'pp.p' or 'tt.t' or 'nt.nn' or 't.d' or
!     	'nk.ng') ! jne...
	
!   	return 1; ! suora
!     else return 2; ! käänteinen
    
! ];

! ! v1 v2 on av mutta hakusanana
! Global v1 = 0;
! Global v2 = 0;


! [ tee_av_taulut av;

!     print "-------------------";
    
!     switch (av) 
!     {
!      'kk.k'  : v1 = 'kk'; v2 = 'k//'; !kirjoita_av1_av2_arr("kk","k");
!      'k.kk'   : v1 = 'k//'; v2 = 'kk'; !kirjoita_av1_av2_arr("k","kk");
!      	!+p
!      'tt.t' : v1 = 'tt'; v2 = 't//'; !kirjoita_av1_av2_arr("tt","t");
!      't.tt'  : v1 = 't//'; v2 = 'tt'; !kirjoita_av1_av2_arr("t","tt");
!      'nk.ng' : v1 = 'nk'; v2 = 'ng'; !kirjoita_av1_av2_arr("nk","ng");
!      'ng.nk' : v1 = 'ng'; v2 = 'nk'; !kirjoita_av1_av2_arr("ng","nk");
!      't.d' : v1 = 't//'; v2 = 'd//'; !kirjoita_av1_av2_arr("t","d");
!      'd.t': v1 = 'd//'; v2 = 't//'; !kirjoita_av1_av2_arr("d","t");
!      default: v1 = 0; v2 = 0; !kirjoita_av1_av2_arr("","");
!     }
    
    
! ];

! Array Oo table
!     'o' 'ö';

! ! visk: etuvok i e ovat neutraaleja vokaalisoinn...
! Array etuvok table
!     'ä' 'ö' 'y';

! Array takavok table
!     'a' 'o' 'u';

! [ arvaa_gen_vart mon arr last_c c1 c2 c3;
    
!     if (mon) arr = nom_temp_arr;
!     else arr = gen_temp_arr;
    
!     last_c = arr-->0+1;
    
!     c1 = hae_k(arr, last_c-3);
!     c2 = hae_k(arr, last_c-2);
!     c3 = hae_k(arr, last_c-1);

!     ! ESIM ääniraidat -> 9 F
!     if (c3 == 'a' or 'ä')
! 	return 9;
!     ! ESIM voiteet -> 48 F
!     if (c2 == 'e' && c3 == 'e')
! 	return 48;	
!     ! ESIM silpsälpyt, himphamput -> 1 B
!     if (onko_taulussa(c3, vokaalit))
! 	return 1;
        
!     !38 mon naiset, naisten/naisien, naisia
!     if (c2 == 's' && c3 == 'e') return 38;
!     !48 mon lomakkeet, lomakkeiden/lomakkeitten, lomakkeita
!     if (c2 == 'e' && c3 == 'e') return 48;
    
!     !4 mon laatikot, laatikoiden/laatikkojen/laatikoitten,
!     !laatikoita/laatikkoja
!     if (c1 == 'i' && c2 == 'k' && c3 == 'o' or 'ö') return 4;

!     !if (onko_taulussa(c1, vokaalit) && c2 == 'k' && onko_taulussa(c3, Oo) ) return 4; 
    
!     !! 5 ristit agenssit ahmatit C 
!     !if (c3 == 'i' && av && av == 'kk.k' or 'pp.p' or 'tt.t') 
!     !	return 5;
!     if (c3 == 'i') return 5;! TEMP
       
!     !! 41 vieraat: ganymedeet (ei varis, joka on 39)
!     if (c3 == c2 && c2 == 'a' or 'e')
!  	return 41;
    
!     !! 1 valot sadut
!     if (c3 == 'o' or 'ö' or 'u') return 1; 
    
!     return 0;
    
    
! ];
  


! ! arvataan char_at_dif perusteella gen vart vs par.
! ! ei tehoa kun on esim. 
! ! toimii vain yksikössä, esim. monikossa ei toimi
! ! "laatikot" variantteineen, eikä esimerkiksi d.t:
! ! y: voiTeen voiDetta
! ! m: voiTeet voiTeita (monikossa ei dif)

! [ arvaa_av char_at_dif arr arr_b;

!     !! jos monikko arr = gen_temp_arr?

!     if (arr == 0) arr = nom_temp_arr;
!     if (arr_b == 0) arr_b = par_temp_arr;
    
    
!     if (hae_k(arr, char_at_dif-1) == 'k' && hae_k(arr, char_at_dif) == 'k')
! 	return 'kk.k'; ! suora av
    
!     ! lomaKKee[t/n]
!     if (hae_k(arr, char_at_dif-1) == 'k' && hae_k(arr, char_at_dif) == 'k')
!         return 'k.kk'; ! käänteinen av
    
!     if (hae_k(arr, char_at_dif-1) == 'p' && hae_k(arr, char_at_dif) == 'p')    
!         return 'pp.p'; ! suora av
!     else if (hae_k(arr, char_at_dif) == 'p' && hae_k(arr, char_at_dif) == 'p')
!      	return 'p.pp'; ! käänteinen av
    
!     if (hae_k(arr_b, char_at_dif-1) == 't' && hae_k(arr_b, char_at_dif) == 't')
! 	return 'tt.t'; ! suora av
!     else if (hae_k(arr, char_at_dif-1) == 't' && hae_k(arr, char_at_dif) == 't')
! 	return 't.tt'; ! käänteinen av
    
!     if (hae_k(arr_b, char_at_dif-1) == 'n' && hae_k(arr_b, char_at_dif) == 'k')
! 	return 'nk.ng'; ! suora av
!     else if (hae_k(arr, char_at_dif-1) == 'n' && hae_k(arr, char_at_dif) == 'k')
! 	return 'ng.nk'; ! käänteinen av
    
!     ! t.d
!     ! saDut saTuja saTua 
!     if (hae_k(arr_b, char_at_dif) == 't' && hae_k(arr, char_at_dif) == 'd')
! 	return 't.d'; ! suora av
!     ! d.t
!     else if (hae_k(arr_b, char_at_dif) == 'd' && hae_k(arr, char_at_dif) == 't')
!     	return 'd.t'; ! käänteinen av
    
!     return 0;
    
! ];


! [ kirjoita_av1_av2_arr arr1 arr2;
    
!     if (arr1 ofclass string)
!     	arr1.print_to_array(av1_arr);
!     else ("").print_to_array(av1_arr);
!     if (arr2 ofclass string)
!     	arr2.print_to_array(av2_arr);
!     else ("").print_to_array(av2_arr);
    
! ];

! Array av1_arr-->8;
! Array av2_arr-->8;


! tn 1-49 laskeva esiintyvyysjärjestys 
!
! wikisanakirjan ja kotus-sanalistan perusteella
! erittäin sinnepäin varsinkin loppu
! ei 50 (isoäiti) eikä 51 (nuoripari)

! nainen
! ~ if (mon) {if (n3 == 's' && n2 == 'e') tt = 38;}! n4 vokaali (vrt 39)
! ~ else if (n3 == 'n' && n2 == 'e' && n1 == 'n') tn = 38;

! [ hae_tyyppi_yksikko;
!     ! 38 nai:nen sen sta
!     ! 5 risti: n ä
!     ! 10 koira: n a
!     ! 1 valo: n a - tyt:tö ön töä - so:pu vun pua
    
!     ! 40 kalleu:s den tta
!     ! 9 kala: n a
!     ! 12 kulkija: n a 
!     ! 39 vastau:s ksen sta
!     ! 6 paperi: n a > in 
!     ! 7 ov:i en ea > een 
!     ! 8 nalle: n a > en 
!     ! 48 hame: en tta 
!     ! 3 valtio: n ta
!     ! 34 onnet:on toman onta
!     ! 2 palvelu: n a
!     ! 18 maa: n ta
!     ! 41 viera:s an sta 
!     ! 26 pien:i en tä
!     ! 25 toim:i en ea
!     ! 33 kytki:n men ntä
!     ! 14 solak:ka an kaa
!     ! 4 laatik:ko on koa
!     !     if nom dif == k && nom dif-1 == k tjsp!
!     ! 13 katiska: n a > an
!     ! 19 suo: n ta
!     ! 15 korkea: n aa/ta
!     ! 42 mie:s hen stä 
!     ! 27 kä:si den ttä
!     ! 32 sisar: en ta
!     ! 11 omena: n a
!     ! 24 un:i en ta
!     ! 49 askel:/askele: en/n ta/tta > (een)/eseen
!     ! 16 vanhem:pi man paa
!     ! 47 kuoll:ut een utta > eeseen
!     ! 20 filee: n tä
!     ! 17 vapaa: n ta
!     ! 36 sisi:n män
!     ! 21 ros^e: n ta > ihin 
!     ! 28 kyn:si nen ttä
!     ! 22 parfait: 'n 'ta > 'ihin
!     ! 43 ohu:t en tta > een 
!     ! 44 kevä:t än ttä > äseen 
!     ! 45 kahdeksa:s nnen tta > nteen
!     ! 23 tiil:i en tä
!     ! 29 la:psi psen sta > pseen 
!     ! 30 vei:tsi tsen stä > tseen
!     ! 35 läm:min pimän mintä
!     ! 31 ka:ksi hden hta > hteen
!     ! 46 tuha:t nnen tta > nteen
!     ! 37 vase:n mman nta, (mpaa) > mpaan
    
! ];

! [ hae_tyyppi_monikko nom_end gen_end par_end;
    
!     nom_end = nom_temp_arr-->0+1;
!     gen_end = gen_temp_arr-->0+1;
!     par_end = par_temp_arr-->0+1;
    
!     ! 38 naiset sten sia
!     ! 5 ristit tien tejä - tak/it kien keja  
!     if (hae_k(nom_temp_arr, nom_end-1) == 'i' && hae_k(gen_temp_arr, gen_end-1) == 'e' && hae_k(par_temp_arr, par_end-1) == 'j')
!     	return '.risti';
    
!     ! 10 koirat rien ria 
!     ! 1 valot lojen ja
!     ! 40 kalleudet ksien
!     ! 9 kalat lojen loja
!     ! 12 kulkijat joiden joita
!     ! 39 vastaukset vastausten vastauksia
!     ! 6 paperit paperien papereitten papereita
!     ! 7 ovet ovien ovia
!     ! 8 nallet nallejen nalleja
!     ! 48 hameet hameiden hameita
!     ! 3 valtiot valtoiden valtioita
!     ! 34 onnettomat onnettomien onnettomia
!     ! 2 palvelut palvelujen palveluitten palveluja palveluita
!     ! 18 maat maiden maita 
!     ! 41 vieraat vieraiden vieraita
!     ! 26 pienet pienten pienien pieniä
!     ! 25 toimet toimien toimia
!     ! 33 kytkimet kytkimien kytkinten kytkimiä
!     ! 14 solakat solakkojen solakoiden solakoita
!     ! 4 laatikot laatikkojen laatikoitten laatikkoja laatikoita
    
!     ! 13 katiskat katiskojen katiskoita
!     ! 19 s:uot oiden oita
!     ! 15 korkeat korkeiden tten korkeita
!     ! 42 miehet miesten miehien miehiä
!     ! 27 kädet käsien kätten käsiä
!     ! 32 sisaret sisarten sisarien sisaria
!     ! 11 omenat omenien omenoitten omenoiden omenia omenoita
!     ! 24 unet unien unia
!     ! 49 askel:et/askele:et ien,ten/iden,itten > iin/isiin,ihin
!     ! 16 vanhemmat mpien mpia
!     ! 47 kuolleet kuolleiden kuolleita
!     ! 20 fileet fileiden fileitä
!     ! 17 vapaat vapaiden vapaita
!     ! 36 sisimmät sisimpien sisimpiä
!     ! 21 ros^e:t iden ita > ihin
!     ! 28 kynnet kynsien kynsiä
!     ! 22 parfait':t iden ita > ihin
!     ! 43 ohuet ohuiden ohuita
!     ! 44 keväät keväiden keväitä
!     ! 45 kahdeksat kahdeksien (kahdeksain) kahdeksia kahdeksiin
!     ! 23 tiilet tiilien tiiliä > tiiliin
!     ! 29 lapset lasten lapsien lapsia
!     ! 30 veitset veitsien (veisten) veitsiä > veitsiin
!     ! 35 lämpimät lämpimien lämpimiä > lämpimiin
!     ! 31 kahdet kaksien kaksia
!     ! 46 tuhannet tuhansien (tuhanten) tuhansia > tuhansiin
!     ! 37 vasemmat vasempien,vasenten,vasempain vasempia
! ];

!* 028 -
! [ t_arr arr h1 h2 h3 t1 t2 t3 len;
    
!     len = arr-->0;

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


!     !print "^ ** T # 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 " # t:";
      
!     !print (char) t1;
!     !print (char) t2;
!     !print (char) t3;

!     !print " # ";
    
    
!     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;
    
    
! ];

!* 030 -

Object 	arvaa
 with	
tnro [tvt mon vk;

    if (mon == false)
    	vk = taulun_viimeinen_k(nom_temp_arr, 1); ! true koska lower case
    ! jos monikko, vk 0 ja se arvataan alla 
    else
    	vk = arvaa_yks_vk_mon_partitiivista(tvt);
    print "^^^***** ", (char) vk, " *****^^^^";
    
    switch (tvt)
    {
     'ime': return self.ime(vk); !33	
     'öma', 'oma': return self.oma(vk); !34	
     'kse': return self.kse(vk); !39 
     'yde', 'ude': return self.yde(vk); !40	
    }
],
	 
	! 33 ydin ytimen F, sädetin sädettimen C, valaisin valaisimen
	ime [;
	    
	   return 33;  
	 ],
    	oma [;
	    return 34;  
    	],

    	kse [;
	    return 39;
	    
    	],
    	yde [;
	    return 40;
    	];


! [ arvaa_mon_vk tv1 tv2 tv3 vv1 vv2 vv3;

! ! - ja 
! ! - ksia
! ! solako - ita
! ! vanhempi - a
! ! kynsi - a

! ! "vastaus" tn 39 vai "kaksi"? tn 31 (niitä on vain pari)
! ! vastaukset vv 1,2 == tv 1,2  
! ! vastauksia vv 1,2 == tv 1,2  
! ! kahdet
! ! kaksia
! !   if (vv1 == 'k' && vv2 == 's' && vv3 == 'i') 

! if (vv1 == 'k' && vv2 == 's' && vv3 == 'i' && vv2 == tv2) 
! return 's'; ! vastaus?
! if (vv1 == 'k' && vv2 == 's' && vv3 == 'i') 
! return 'i'; ! kaksi?


! ];

! [ arvaa_tn mon tv_len vv_len tv1 tv2 tv3 vv1 vv2 vv3 vk;

! ! yksiköstä tarvitaan vika kirjain nom, ao ei anna sitä vielä

!     if (mon == false)
!     {
!     tv_len = gen_temp_arr-->0;
!     tv_len = tv_len+WORDSIZE;
    
!     tv1 = hae_k(gen_temp_arr, tv_len-4);
!     tv2 = hae_k(gen_temp_arr, tv_len-3);
!     tv3 = hae_k(gen_temp_arr, tv_len-2);

!     vv_len = nom_temp_arr-->0;
!     vv_len = vv_len+WORDSIZE;

!     vv1 = hae_k(nom_temp_arr, vv_len-3);
!     vv2 = hae_k(nom_temp_arr, vv_len-2);
!     vv3 = hae_k(nom_temp_arr, vv_len-1);
    
!     ! y nom viimeinen k
!     vk = vv3; 

    
!     }
!     else !mon
!     {
!     tv_len = nom_temp_arr-->0;
!     tv_len = tv_len+WORDSIZE;
    
!     tv1 = hae_k(nom_temp_arr, tv_len-4);
!     tv2 = hae_k(nom_temp_arr, tv_len-3);
!     tv3 = hae_k(nom_temp_arr, tv_len-2);

!     vv_len = par_temp_arr-->0;
!     vv_len = vv_len+WORDSIZE;

!     vv1 = hae_k(par_temp_arr, vv_len-4);
!     vv2 = hae_k(par_temp_arr, vv_len-3);
!     vv3 = hae_k(par_temp_arr, vv_len-2);

!     ! monikko viimeinen (par) kirjain ei paljon auta parsassa
!     vk = arvaa_mon_vk(tv1, tv2, tv3, vv1, vv2, vv3); 
!     }

!     print "^***** "; if (mon) print "m ***** tv: "; else print "y ***** tv: ";
!     print (char) tv1, (char) tv2, (char) tv3, " *** vv: ", (char) vv1, (char) vv2, (char) vv3; print " * vk: ", (char) vk, "^";
!     ! if (tv('ö','m','ä')) return 'ömä'; ! 33; ! työttömän onnettoman t:tt
!     ! if (tv('o','m','a')) return 'oma'; ! 33; ! työttömän onnettoman t:tt
!     if (tv1 == 'o' && tv2 == 'm' && tv3 == 'a' or 'ä') return 33; 
!     ! if (tv('k','s','e')) return 'kse'; ! 39; ! vastauksen
!     if (tv1 == 'k' && tv2 == 's' && tv3 == 'e') return 39;
!     ! if (tv('y','d','e')) return 'yde'; ! 40; ! hyvyydet tulevaisuudet
!     ! if (tv('u','d','e')) return 'ude'; ! 40; ! hyvyydet
!     ! tulevaisuudet
!     if (tv1 == 'y' or 'u'  && tv2 == 'd' && tv3 == 'e') return 40;
!     ! if (tv(0,'a','a')) return 'aa'; ! 41; ! taivaat vieraat räystäät
!     ! if (tv(0,'ä','ä')) return 'ää'; ! 41; ! taivaat vieraat räystäät
!     if (tv2 == 'a' && tv3 == 'a') return 41;
!     if (tv2 == 'ä' && tv3 == 'ä') return 41;
!     ! if (tv(0,'u','e')) return 'ue'; ! 43; ! ohuet lyhyet oluet
!     ! if (tv(0,'y','e')) return 'ye'; ! 43; ! ohuet lyhyet oluet
!     if (tv2 == 'y' or 'u'&& tv3 == 'e') return 43;
!     ! if (tv(0,'e','e')) return 'ee'; ! 48; ! hameet kahleet ehosteet
!     if (tv2 == 'e' && tv3 == 'e') return 48;
!     ! if (tv(0,'l','e')) return 'le'; ! 49; ! askelet huhmaret
!     ! if (tv(0,'r','e')) return 're'; ! 49; ! askelet huhmaret
!     if (tv2 == 'l' && tv3 == 'e') return 49;
!     if (tv2 == 'r' && tv3 == 'e') return 49;
!     ! if (tv(0,'d','e')) return 'de'; ! 27; ! veden suden käden paaden
!     ! reiden
!     if (tv2 == 'd' && tv3 == 'e') return 27;
!     ! if (tv(0,'s','e')) return 'se'; ! 38; ! naisen kineettisen aapisen
!     ! ! eläkeläisen
!     if (tv2 == 's' && tv3 == 'e') return 38;
!     ! if (tv(0,'k','o')) return 'ko'; ! laatikot
!     ! if (tv(0,'k','ö')) return 'kö'; ! laatikot
!     if (tv2 == 'k' && tv3 == 'o' or 'ö') return 4;

!     ! if (tv(0,0,'o')) return 'o//'; ! o ö u y -loppuiset
!     ! if (tv(0,0,'ö')) return 'ö//'; ! o ö u y -loppuiset
!     ! if (tv(0,0,'u')) return 'u//'; ! o ö u y -loppuiset
!     ! if (tv(0,0,'y')) return 'y//'; ! o ö u y -loppuiset
!     if (tv3 == 'o' or 'ö' or 'u' or 'y') return 1;
!     ! if (tv(0,0,'i')) return 'i//'; ! 5; ! ristin tunnin
!     ! if (tv(0,0,'e')) return 'e//'; ! 7; ! kiven loven
!     ! if (tv(0,0,'a')) return 'a//'; ! 9; ! kalan
!     ! if (tv(0,0,'ä')) return 'ä//'; ! 9; ! kalan
!     ! if (tv(0,0,'e')) return 'e//'; ! 26; ! kielen pienen 24: huulen  23: tiilen vuohen      
!     if (tv3 == 'i' && tv3 == vk) return 5; ! i-loppuiset, i-genet
!     if (tv3 == 'e') return 7;
!     if (tv3 == 'a') return 9;
!     if (tv3 == 'ä') return 9;
!     if (tv3 == 'e') return 26;


! ];


! [ arvaa_tn_y tvt arr len k1 k2 k3;

! ! yksiköstä tarvitaan vika kirjain nom, ao ei anna sitä vielä
!     arr = par_temp_arr;
    
!     len = arr-->0;
!     len = len+WORDSIZE;
    
!     k1 = hae_k(arr, len-3);
!     k2 = hae_k(arr, len-2);
!     k3 = hae_k(arr, len-1);
!     !k3 = hae_k(arr, len);

!     print "^******************* ", (char) k1, (char) k2, (char) k3, "^";

! if (tvt == 'o//' or 'ö//' or 'u//' or 'y//') return 1;
! if (tvt == 'ko' or 'kö') return 4;
! if (tvt == 'a//' or 'ä//') return 9; ! ei tuplavok
! if (tvt == 'e//') return 8;  

! ];

! [ arvaa_tn_m tvt len k1 k2 k3;

! ! monikko: viimeistä par_temp_arr merkkiä ei tarvita
!     len = par_temp_arr-->0;

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

!     ! print (char) k1; print "^";

! if (tvt == 'o//' or 'ö//' or 'u//' or 'y//') return 1;
! if (tvt == 'ko' or 'kö') return 4;
! if (tvt == 'a//' or 'ä//') return 9; ! ei tuplavok
! if (tvt == 'e//') return 8;  

! ];

! c: 123      123 
! kielen / kielet
!
! esim klassikko laatikko
!if (k1 == 'i' && k2 == 'k' && k3 == 'o' or 'ö') tvt = 4;

!* 031 -

! monikko -- arvataan viimeinen kirjain
! taivutustyyppiä ei arvata täällä (numerot) 		
! esim. 9 ja 10 (kaloJa, koirIa...) ei erotella
! täällä vielä.
! ks. 'a//', 'ä//' alla.

!* 032 -
! jotenkin näin? ei... ei näin?
! [ hae_char_at_pp pp monikko ttnro av pit char_at;

!     ! puretaan vähän pp koska...
!     monikko = luku_(pp);
!     ttnro = ttnro_(pp);
!     av = av_(pp);
 
!     ! mon ja gen? (ei esim gen_arr yksikössä?)
!     pit = WORDSIZE+nom_temp_arr-->0;


!     if (monikko)
!      	switch (ttnro)
!     {
!      	 48: return pit-3; ! lomakkeet
! 	    default: return vrt_tauluja_dif_at(nom_temp_arr, par_temp_arr);
! 	    ! tai ret pit?
!     	}
    
!     ! tämä on myös -> esiparsi_char_at()
!     ! mutta tämä on ehkä helpompi/nopeampi?
!     else
! 	char_at = vrt_tauluja_dif_at(gen_temp_arr, par_temp_arr);

! 	if (char_at == 0) char_at = nom_temp_arr-->0;
	
! 	if (dp) print "** char_at (pp) ", char_at, " ";

!     return char_at;
    
! ];

!* 032 -
    
    ! ! ! TVT s.63+ "i-loppuistet nominit"  

    ! ! ! tunti
    ! ! !tun	ti/nin/tia 	!5J tiin	* risti-av1

    ! !if (k3 == 'i') return 5; 
    ! if (k3 == 'i') tvt = 'i//';
    
    ! ! ! kivi
    ! ! !kiv 	i/en/eä		!7 een

    ! ! ! kieli
    ! ! !kiel 	i/en/tä		!26 een ! *huuli
    ! ! c3 = kiel(e)n/t
    ! if (k3 == 'e') 
    ! 	switch (k2) 
    ! 	{
    ! 	 'l' : tvt = 'le'; ! kielen
    ! 	 'v': tvt = 've'; ! kiven
    ! 	 'd': tvt = 'de'; ! veden hyvyyden	    
    ! 	 'n' : tvt = 'ne';
    ! 	 'r': tvt = 're';
    ! 	 'h': tvt = 'he'; ! vuohen
    ! 	 's': if (k1 == 'k') tvt = 'kse'; ! vuoksen
    ! 	 's': tvt = 'se'; ! kusen kuusen ihmisen
    ! 	 'y': tvt = 'ye'; ! lyhyen kevyen
    ! 	 'e': tvt = 'ee'; ! perheen perseen
	     
    ! 	 default: tvt = 'e//';
	    
    ! 	}
    

    ! ! Object 	-> merkki "merkki 5J" with vart 'mer' "kki/kin/kkiä";
    ! ! Object 	-> merkit "merkit 5J" with vart 'merk' "it/kien/kejä" has pluralname;
    

    ! ! !kaik	ki/en/kia 	!7A keen
    ! ! !leh	ti/den/teä	!7F teen	!ks. mon
    ! ! !!talv	i/en/ea		!7 een
    ! ! !jäl	ki/jen/keä	!7L keen
    ! ! !ov	i/en/ea		!7 een
    
    ! ! ! vesi
    ! ! !ve	si/den/ttä	!27 teen	!vaihtelua
    
    ! ! !kä	si/den/ttä	!27 teen
    
    ! ! ! e-loppuiset
    ! ! !perhe	/en/etta	!48 eseen

    ! ! !joukkue	/en/tta		!48 eseen
    ! ! !kone	/en/tta		!48 eseen
    ! ! !sa	de/teen/detta	!48F teeseen
    ! ! !ot	e/teen/etta	!48B teeseen
   
    ! ! ! a-, ä-loppuiset
    ! ! !kala	/n/a		!9 an
    ! if (k3 == 'a' or 'ä') tvt = 'a//'; 
    ! ! !kaup	pa/an/paa	!9B paan
    ! ! !suk	ka/an/kaa	!10A kaan
    ! ! !piha	/n/a		!9 an
    ! ! !po	ika/jan/ikaa	!10D kaan
   
    ! ! ! ihminen
    ! ! !ihmi	nen/sen/stä	!38 seen
    
    ! ! !hevo	nen/sen/sta	!38 seen
   
    ! ! ajatus
    ! if (k1 == 'k' && k2 == 's' && k3 == 'e') tvt = 'kse';

    ! ! ! taivas
    ! ! !taiva	s/an/sta	!41 aseen
    ! if (k2 == 'a' or 'i' && k2 == k3) tvt = 'aa';

    ! ! !por	ras/taan/rasta	!41K taaseen
    ! ! !rik	as/kaan/asta	!41A kaaseen

     
    ! ! ! hyvyys
    ! ! !hyvyy	s/den/ttä	!40 teen
    ! ! !korkeu	s/den/tta	!40 teen
    ! if (k2 == 'd' && k3 == 'e') tvt = 'de';

    ! ! ! avain
    ! ! !avai	n/men/nta	!33 meen
    ! if (k2 == 'm' && k3 == 'e') tvt = 'me';

    ! ! !läm	min/pimän/mintä	!35H pimään
    ! ! !hap	an/paman/anta	!33B pamaan
    ! ! !kirjai	n/men/nta	!33 meen
   
    ! ! ! työtön
    ! ! !työt	ön/tömän/öntä	!34C tömään
    ! if (k1 == 'o' && k2 == 'm' && k3 == 'a') tvt = 'ttoma';
    ! if (k1 == 'ö' && k2 == 'm' && k3 == 'ä') tvt = 'ttömä';

    ! ! ! askel
    ! ! !askel	/en/ta		!49 eeseen
    ! if (k2 == 'l' && k3 == 'e') tvt = 'le';
   
    ! ! ! lyhyt
    ! if (k3 == 'e') tvt = 'e//'; ! lyhyt

    ! ! laatikon
    ! if (k3 == 'o' or 'ö')
    ! {
    ! 	if (k1 == 'i' && k2 == 'k' && k3 == 'ö')
    ! 	    tvt = 'ikö';
    ! 	if (k1 == 'i' && k2 == 'k' && k3 == 'o')
    ! 	    tvt = 'iko';
	
    ! }
    

    ! return tvt;



! mukaillaan Fred Karlssonia...

    ! ! TVT s.63+ "i-loppuistet nominit"  

    ! ! tunti
    ! !tun	ti/nin/tia 	!5J tiin	* risti-av1
    ! Object 	-> tunti "tunti 5J" with vart 'tun' "ti/nin/tia"; 
    ! Object 	-> tunnit "tunnit 5J" with vart 'tun' "nit/tien/teja" has pluralname;
    
    ! ! kivi
    ! !kiv 	i/en/eä		!7 een
    ! Object 	-> kivi "kivi 7" with vart 'kiv' "i/en/eä";

    ! ! kieli
    ! !kiel 	i/en/tä		!26 een ! *huuli
    ! Object 	-> kieli "kieli 26" with vart 'kiel' "i/en/tä";
    ! Object 	-> kielet "kielet 26" with vart 'kiel' "et/ien/iä";
    ! c3 = kiel(e)n/t
    
    ! Object 	-> merkki "merkki 5J" with vart 'mer' "kki/kin/kkiä";
    ! Object 	-> merkit "merkit 5J" with vart 'merk' "it/kien/kejä" has pluralname;
    

    ! !kaik	ki/en/kia 	!7A keen
    ! Object 	-> kaikki "kaikki 7A" with vart 'kaik' "ki/en/kea";
    ! !leh	ti/den/teä	!7F teen	!ks. mon
    ! Object 	-> lehti "lehti 7F" with vart 'leh' "ti/den/teä";
    ! !!talv	i/en/ea		!7 een
    ! Object 	-> talvi "talvi 7" with vart 'talv' "i/en/ea";
    ! !jäl	ki/jen/keä	!7L keen
    ! Object 	-> jalki "jälki 7L" with vart 'jäl' "ki/jen/keä";
    ! !ov	i/en/ea		!7 een
    ! Object 	-> ovi "ovi 7" with vart 'ov' "i/en/ea";
    
    ! ! vesi
    ! !ve	si/den/ttä	!27 teen	!vaihtelua
    ! Object 	-> vesi "vesi 27" with vart 've' "si/den/ttä";
    
    ! !kä	si/den/ttä	!27 teen
    ! Object 	-> kasi "käsi 27" with vart 'kä' "si/den/ttä";
    
    ! ! e-loppuiset
    ! !perhe	/en/etta	!48 eseen
    ! Object 	-> perhe "perhe 48" with vart 'perhe' "/en/ttä";

    ! !joukkue	/en/tta		!48 eseen
    ! Object 	-> joukkue "joukkue 48" with vart 'joukkue' "/en/etta";
    ! !kone	/en/tta		!48 eseen
    ! Object 	-> kone "kone 48" with vart 'kone' "/en/etta";
    ! !sa	de/teen/detta	!48F teeseen
    ! Object 	-> sade "sade 48F" with vart 'sa' "de/teen/detta";
    ! !ot	e/teen/etta	!48B teeseen
    ! Object 	-> ote "ote 48B" with vart 'ot' "e/teen/etta";
   
    ! ! a-, ä-loppuiset
    ! !kala	/n/a		!9 an
    ! Object 	-> kala "kala 9" with vart 'kala' "/n/a";

    ! !kaup	pa/an/paa	!9B paan
    ! Object 	-> kauppa "kauppa 9B" with vart 'kaup' "pa/an/paa";
    ! !suk	ka/an/kaa	!10A kaan
    ! Object 	-> sukka "sukka 10A" with vart 'suk' "ka/an/kaa";
    ! !piha	/n/a		!9 an
    ! Object 	-> piha "piha 9" with vart 'piha' "/n/a";
    ! !po	ika/jan/ikaa	!10D kaan
    ! Object 	-> poika "poika 10D" with vart 'po' "ika/jan/ikaa";
   
    ! ! ihminen
    ! !ihmi	nen/sen/stä	!38 seen
    ! Object 	-> ihminen "ihminen 38" with vart 'ihmi' "nen/sen/stä";
    
    ! !hevo	nen/sen/sta	!38 seen
    ! Object 	-> hevonen "hevonen 38" with vart 'hevo' "nen/sen/sta";
   
    ! ajatus

    ! ! taivas
    ! !taiva	s/an/sta	!41 aseen
    ! Object 	-> taivas "taivas 41" with vart 'taiva' "s/an/sta";

    ! !por	ras/taan/rasta	!41K taaseen
    ! Object 	-> porras "porras 41K" with vart 'por' "ras/taan/rasta";
    ! !rik	as/kaan/asta	!41A kaaseen
    ! Object 	-> rikas "rikas 41A" with vart 'rik' "as/kaan/asta";
     
    ! ! hyvyys
    ! !hyvyy	s/den/ttä	!40 teen
    ! Object 	-> hyvyys "hyvyys 30" with vart 'hyvyy' "s/den/ttä";
    ! !korkeu	s/den/tta	!40 teen
    ! Object 	-> korkeus "korkeus 40" with vart 'korkeu' "s/den/tta";

    ! ! avain
    ! !avai	n/men/nta	!33 meen
    ! Object 	-> avain "avain 33" with vart 'avai' "n/men/nta";

    ! !läm	min/pimän/mintä	!35H pimään
    ! Object 	-> lammin "lämmin 35H" with vart 'läm' "min/pimän/mintä";
    ! !hap	an/paman/anta	!33B pamaan
    ! Object 	-> hapan "hapan 33B" with vart 'hap' "an/paman/anta";
    ! !kirjai	n/men/nta	!33 meen
    ! Object 	-> kirjain "kirjain 33" with vart 'kirjai' "n/men/nta";
   
    ! ! työtön
    ! !työt	ön/tömän/öntä	!34C tömään
    ! Object 	-> tyoton "työtön 34C" with vart 'työt' "ön/tömän/öntä";

    ! ! askel
    ! !askel	/en/ta		!49 eeseen
    ! Object 	-> askel "askel 49" with vart 'askel' "/en/ta";

    ! !tyt	är/tären/ärtä	!32C täreen
    ! Object 	-> tytar "tytär 32C" with vart 'tyt' "är/tären/ärtä";
    ! !sisar	/en/ta		!32 een
    ! Object 	-> sisar "sisar 32" with vart 'sisar' "/en/ta";
   
    ! ! lyhyt
    ! !lyhy	t/en/ttä	!43 een
    ! Object 	-> lyhyt "lyhyt 43" with vart 'lyhy' "t/en/ttä";

    ! !olu	t/en/tta	!43 een
    ! Object 	-> olut "olut 43" with vart 'olu' "t/en/tta";
    ! !mie	s/hen/stä	!42 heen
    ! Object 	-> mies "mies 42" with vart 'mie' "s/hen/stä";
    ! !kevä	t/än/ttä	!44 äseen
    ! Object 	-> kevat "kevät 44" with vart 'kevä' "t/än/ttä";


    
! kotus astevaihtelut
! ------------------- 

! Object 	-> takki "takki 5A" with vart 'tak' "ki/in/kia";
! Object 	-> takit "takit 5A" with vart 'tak' "it/kien/keja", has pluralname;

! Object 	-> hake "hake 48A" with vart 'hak' "e/keen/etta"; 
! Object 	-> hakkeet "hakkeet 48A" with vart 'hakk' "eet/eiden/eita", has pluralname; 
! !  Object 	-> hakkeet "hakkeet 48A" with vart 'hakk' "eet/eiden/eisiin", has pluralname; 

! Object 	-> kaappi "kaappi 5B" with vart 'kaap' "pi/in/pia";

! Object 	-> opas  "opas 41B" with vart 'op' "as/paan/asta";

! Object 	-> tytto "tyttö 1C" with vart 'tyt' "tö/ön/töä";
! Object 	-> tytot "tytöt 1C" with vart 'tyt' "öt/töjen/töjä", has pluralname;

! Object 	-> kate "kate 48C" with vart 'kat' "e/teen/etta";
! Object 	-> katteet "katteet 48C" with vart 'kat' "teet/teiden/teita", has pluralname; 

! Object 	-> reika "reikä 10D" with vart 'rei' "kä/än/kää";
! Object 	-> reiat "reiät 10D" with vart 'rei' "ät/kien/kiä", has pluralname; !   +rei'istä jne.

! Object 	-> aie "aie 48D" with vart 'ai' "e/keen/etta";
! Object 	-> aikeet "aikeet 48D" with vart 'aik' "eet/eiden/eita", has pluralname;

! Object 	-> sopu "sopu 1E" with vart 'so' "pu/vun/pua";

! Object 	-> taive "taive 48E" with vart 'tai' "ve/peen/vetta";

! Object 	-> keidas "keidas 41F" with vart 'kei' "das/taan/dasta";

! Object 	-> aurinko "aurinko 1G" with vart 'aurin' "ko/gon/koa";

! Object 	-> rengas "rengas 41G" with vart 'ren' "gas/kaan/gasta";

! Object 	-> kumpi "kumpi 16H" with vart 'kum' "pi/man/paa";

! Object 	-> lumme "lumme 48H" with vart 'lum' "me/peen/metta";

! Object 	-> ilta "ilta 9I" with vart 'il' "ta/lan/taa";

! Object 	-> sivellin "sivellin 33I" with vart 'sivel' "lin/ltimen/lintä";

! Object 	-> hento "hento 1J" with vart 'hen' "to/non/toa";
! Object 	-> hennot "hento" with vart 'hen' "not/tojen/toja", has pluralname;

! Object 	-> vanne "vanne 48J" with vart 'van' "ne/teen/netta";
! Object 	-> vanteet "vanne" with vart 'vant' "eet/eiden/eisiin", has pluralname;

! Object 	-> virta "virta 9K" with vart 'vir' "ta/ran/taa";

! Object 	-> arki "arki 7L" with vart 'ar' "ki/jen/kea";

! Object 	-> hylje "hylje 48L" with vart 'hyl' "je/keen/jettä";

! Object 	-> suku "suku 1M" with name 'su' "ku/vun/kua";

! kotus taivutustyypit
! --------------------

! !  Object -> valo	  "valo 1" with vart '/n/a' "";
! !  Object -> valot	  "valo 1" with vart '' "";
! !  Object -> palvelu	  "palvelu 2" with vart 'palvelu' "/n/a";
! !  Object -> palvelu	  "palvelut 2" with vart '' "";
! !  Object -> valtio	  "valtio 3" with vart 'valtio' "/n/ta";
! !  Object -> valtiot	  "valtio 3" with vart '' "";
! Object 	-> laatikko   "laatikko 4" with vart 'laatik' "ko/on/koa",
! 	lname "laatik|ko/on/koa";
! Object 	-> laatikot   "laatikot 4" with vart 'laatik' "ot/oiden/oita", has pluralname;
! !  Object 	-> laatikot   "laatikot 4" with vart 'laatik' "ot/oiden/oihin", has pluralname; !   Huom. Ill!  
! !  Object -> risti 	  "risti 5" with vart 'risti' "/n/ä";
! !  Object -> ristit 	  "risti 5" with vart '' "";
! !  Object -> paperi	  "paperi 6" with vart '' "";
! !  Object -> paperit	  "paperi 6" with vart '' "";
! !  Object 	-> ovi   "ovi 7" with vart 'ov' "i/en";
! !  Object 	-> ovet   "ovi 7" with vart 'ov' "i/en";
! !  Object -> nalle	  "nalle 8" with vart '' "";
! !  Object -> nallet	  "nalle 8" with vart '' "";
! !  Object -> kala	  "kala 9" with vart '' "";
! !  Object -> kalat	  "kala 9" with vart '' "";
! !  Object -> koira	  "koira 10" with vart '' "";
! !  Object -> koirat	  "koira 10" with vart '' "";
! !  Object -> omena	  "omena 11" with vart '' "";
! !  Object -> omenat	  "omena 11" with vart '' "";
! !  Object -> kulkija	  "kulkija 12" with vart '' "";
! !  Object -> kulkijat	  "kulkija 12" with vart '' "";
! !  Object -> katiska	  "katiska 13" with vart '' "";
! !  Object ->  katiskat	  "katiska 13" with vart '' "";
! Object 	-> solakka   "solakka 14" with vart 'solak' "ka/an/kaa";
! !  Object 	-> solakat   "solakka 14" with vart 'solak' "ka/an";
! !  Object -> korkea	  "korkea 15" with vart '' "";
! !  Object -> korkeat	  "korkea 15" with vart '' "";
! Object 	-> vanhempi   "vanhempi 16" with vart 'vanhem' "pi/man/paa";
! !  Object 	-> vanhemmat   "vanhempi 16" with vart 'vanhem' "pi/man";
! !  Object -> vapaa 	  "vapaa 17" with vart '' "";
! !  Object -> vapaat 	  "vapaa 17" with vart '' "";
! !  Object -> maa	  "maa 18" with vart '' "";
! !  Object -> maat	  "maa 18" with vart '' "";
! !  Object -> suo	  "suo 19" with vart '' "";
! !  Object -> suot	  "suo 19" with vart '' "";
! !  Object -> filee	  "filee 20" with vart '' "";
! !  Object -> fileet	  "filee 20" with vart '' "";
! !  Object -> rosee	  "rose 21" with vart '' "/";
! !  Object -> roseet	  "rose 21" with vart '' "/";
! !  Object -> parfait	  "parfait 22" with vart '' "";
! !  Object -> parfaitit	  "parfait 22" with vart '' "";
! Object 	-> tiili	  "tiili 23" with vart 'tiil' "i/en/tä";
! !  Object 	-> tiilit	  "tiili 23" with vart 'tiil' "i/en";
! Object 	-> uni	  "uni 24" with vart 'un' "i/en/ta";
! !  Object 	-> unet	  "uni 24" with vart 'un' "i/en";
! Object 	-> toimi	  "toimi 25" with vart 'toim' "i/en/ea";
! !  Object 	-> toimet	  "toimi 25" with vart 'toim' "i/en";
! Object 	-> pieni   "pieni 26" with vart 'pien' "i/en/tä";
! !  Object 	-> pienet   "pieni 26" with vart 'pien' "i/en";
! !  Object 	-> kasi	  "käsi 27" with vart 'kä' "si/den";
! Object 	-> kadet	  "käsi 27" with vart 'kä' "si/den/ttä";
! Object 	-> kynsi   "kynsi 28" with vart 'kyn' "si/nen/ttä";
! !  Object 	-> kynnet   "kynsi 28" with vart 'kyn' "si/nen";
! !  Object ->  lapsi 	  "lapsi 29" with vart '' "";
! !  Object ->  lapset 	  "lapsi 29" with vart '' "";
! Object 	-> veitsi	  "veitsi 30" with vart 'vei' "tsi/tsen/stä"; !  !   vei / stä
! !  Object 	-> veitset	  "veitsi 30" with vart 'veits' "i/en"; !  !   vei / stä
! Object 	-> kaksi	  "kaksi 31" with vart 'ka' "ksi/hden/hta";
! !  Object 	-> kahdet	  "kaksi 31" with vart 'ka' "ksi/hden";
! !  Object ->  sisar	  "sisar 32" with vart 'sisar' ""; !  !   gen vok pid e
! !  Object ->  sisaret	  "sisar 32" with vart 'sisar' ""; !  !   gen vok pid e
! Object 	-> kytkin   "kytkin 33" with vart 'kytki' "n/men/ntä";
! !  Object 	-> kytkimet   "kytkin 33" with vart 'kytki' "n/men";
! Object 	-> onneton	  "onneton 34" with vart 'onnet' "on/toman/tonta";
! !  Object 	-> onnettomat	  "onneton 34" with vart 'onnet' "on/toman";
! !  Object 	-> lammin	  "lämmin 35" with vart 'läm' "min/pimän";
! !  Object 	-> lampimat	  "lämmin 35" with vart 'läm' "min/pimän";
! Object 	-> sisin	  "sisin 36" with vart 'sisi' "n/mmän/ntä";
! !  Object 	-> sisimmat	  "sisin 36" with vart 'sisi' "n/mmän";
! Object 	-> vasen	  "vasen 37" with vart 'vase' "n/mman/nta";
! !  Object 	-> vasemmat	  "vasen 37" with vart 'vase' "n/mman";
! Object 	-> nainen	  "nainen 38" with vart 'nai' "nen/sen/sta"; 
! Object 	-> naiset	  "naiset 38" with vart 'nai' "set/sten/sia", has pluralname; !  tai: 'nais' "et/ten/ia"
! !  Object 	-> naiset	  "naiset 38" with vart 'nai' "set/sten/siin", has pluralname; !   Huom. Ill!  
! Object 	-> vastaus	  "vastaus 39" with vart 'vastau' "s/ksen/sta";
! Object 	-> vastaukset "vastaukset 39" with vart 'vastau' "kset/sten/ksia", has pluralname; !  tai...?
! !  Object 	-> vastaukset "vastaukset 39" with vart 'vastau' "kset/sten/ksiin", has pluralname; !   Huom. Ill!  
! Object 	-> kalleus	  "kalleus 40" with vart 'kalleu' "s/den/tta";
! !  Object 	-> kalleudet	  "kalleus 40" with vart 'kalleu' "s/den";
! Object 	-> vieras	  "vieras 41" with vart 'viera' "s/an/sta";
! !  Object 	-> vieraat	  "vieras 41" with vart 'viera' "s/an";
! !  Object 	-> mies	  "mies 42" with vart 'mie' "s/hen";
! Object 	-> miehet	  "mies 42" with vart 'mie' "s/hen/stä";
! Object 	-> ohut	  "ohut 43" with vart 'ohu' "t/en/tta";
! !  Object 	-> ohuet	  "ohut 43" with vart 'ohu' "t/en";
! !  Object 	-> kevat	  "kevät 44" with vart 'kevä' "t/än";
! !  Object 	-> kevaat	  "kevät 44" with vart 'kevä' "t/än";
! Object 	-> kahdeksas	  "kahdeksas 45" with vart 'kahdeks' "as/annen/atta";
! !  Object 	-> kahdeksannet	  "kahdeksas 45" with vart 'kahdeks' "as/annen";
! Object 	-> tuhat	  "tuhat 46" with vart 'tuha' "t/nnen/tta";
! !  Object 	-> tuhannet	  "tuhat 46" with vart 'tuha' "t/nnen";
! Object 	-> kuollut	  "kuollut 47" with vart 'kuoll' "ut/een/utta";
! !  Object 	-> kuolleet	  "kuollut 47" with vart 'kuoll' "ut/een";
! !  Object ->  hame	  "hame" with vart '' ""; !  !   vok pidentymä hameen
! !  Object ->  hameet	  "hame" with vart '' ""; !  !   vok pidentymä hameen
! !  Object ->  askel	  "askel" with vart '' ""; !  !   vok pidentymä askeleen
! !  Object ->  askelet	  "askel" with vart '' ""; !  !   vok pidentymä askeleen

! !  50
! !  isoäiti
! !  isoäidin
! !  isoäitiä
! !  isoäitiin
! !  isoäidit
! !  isoäitien
! !  isoäitejä
! !  isoäiteihin
! !  
! !  51
! !  nuoripari
! !  nuorenparin
! !  nuortaparia
! !  nuoreenpariin
! !  nuoretparit
! !  nuortenparien nuorienparien
! !  nuoriapareja
! !  nuoriinpareihin


!==> luonnos.h <==
!!! luonnos.h !!!

! ! a-
! a_ala

! ! si- ?: si_ede
! i_ede

! ! e-
! e_kee

! ! i:i, i:e > pahvi pahvin pahvia, helmi helmin helmiÃ¤
! i_hvi
! i_lme

! ! l- , e-
! l_ale ! sammalen
! e_lee ! sammaleen

! ! n-

! n_ame_ama

! n_ima

! n_ene

! n_mma

! n_se

! n_oma ! tahattoman

! ! o-
! ! lyhyet o-
! o_ato ! matto

! ! pitkÃ¤t o-

! o_ko ! maljakko

! ! diftongiin pÃ¤Ã¤ttyvÃ¤t o-

! o_kao


! ! yksitavuiset o-

! o_suo
! o_duo

! ! r- / e-

! r_are
! e_ree

! r_are

! ! tAr-

! r_are


! ! s-loppuiset

! s__nne

! s__vv

! esim. -sÃ¤detys- (luku yks.), jos syy parsiminen
! ratkaistaan se esim. rutiinissa s__ks_e()
! tai parsi.s__ks_e() ...?
! ts. muuttujat sinne ja palautetaan csID 
! - muuttujat
!   * syy -- parsiminen, tulostaminen, tn (tn jos halutaan taivutustyypin nro?)
!   * syÃ¶te -- adr, len
!   * luku? (mon?) -- jos ei tehdÃ¤ eri rutiiniin esim s__ks_e_mon()
!   * tvt -- apusana on genetiivitaulusta
!   * onko astevaihtelua? jos on, astevaihtelun tyyppi arvataan
!     -- esim. mon -laatikot- ei vÃ¤lttÃ¤mÃ¤ttÃ¤ nÃ¤y (joten av tÃ¤Ã¤llÃ¤?)
!   * astevaihtelu kun parsitaan
!     -- sopivatko syÃ¶tetty astevaihtelu ja sijapÃ¤Ã¤te yhteen?
!     -- astevaihtelu toteutettu merkeillÃ¤ taulussa.
!        Jos sen tekisi hakusanoina, tulostettaessa
!        isot kirjaimet eivÃ¤t toistuisi, joten jos ei tee erikseen
!        hakusanoihin perustuvaa ratkaisua parsimiseen,
!        tÃ¤mÃ¤ on ehkÃ¤ ok.
!	 (To-do: Parsittaessa isot kirjaimet pieniksi? Ei.)
!   * char_at_var -- mistÃ¤ luetaan loppusuffiksi (av pituus vaikuttaa)
!   * vok vaihtelu a Ã¤ / Ã¤ Ã¶ (tulostus)
!   * paluuarvo (syy): csID, tulostus... (tai taivutustyypin nro tn ?)

! ! s__ks_e

! ! syy parsiminen... (ei kÃ¤ytetÃ¤ vok vaihtelua vielÃ¤)
! ! yksikkÃ¶: 'vastaus', 'sÃ¤detys, ...' 39 ei astevaihtelua!
! [ s_ks adr len av char_at_var;
!  print "!!!!!!!!!!!!!", adr, " ", len, " ", av, " ", char_at_var;
    
! ];
! monikko: 'laatikot', 'maljakot', 'mÃ¤nnikÃ¶t' 4 A
! [ o_ko_mon mon adr len av char_at;
! print "^o_ko_mon: ", mon, " ", adr, " ", len, " ", av, " ", char_at, " ";    
!     return 0;
    
! ];


! s__de

! ! t-loppuiset 
! ut_yt__ue_ye

! ! nUt:-nee
! nut_nyt__nee

! ! u-loppuiset
! kaksitavuiset_u
! pitkat_u
! pitkaan_vok_loppuvat_u

! ! y-loppuiset
! lyhyet_y
! pitkat_y
! pitkaan_vok_loppuvat_y

! pitkaan_vok_op_
! ! Ã¤-loppuiset
! lyhyet_ae
! pitkat_ae
! pitkaan_vok_lop_ae

! ! Ã¶-loppuiset
! lyhyet_oe
! pitkat_oe
! pitkaan_vok_lop_oe






!==> ttyypit.h <==
!!! ttyypit.h !!!

! taivutustyypit
! jos (sija > 0) tulostetaan
! kotus nro 1


[ anna_av_pit v_ adr;

    if (DL(adr, 2) == v_) return 2;
    if (DL(adr, 1) == v_) return 1;
    return 0;
    
];


! tvt vk mon adr len char_at

! tämä vanhentunut ks ttyyppi: hakkyra.h, parsi.h
Object	ttyyppi_vanhentunut
 with	 nro [tvt vk;
	     print " * .nro() * ";
	     
    	     switch (vk)
    	     {
     	      'o', 'ö': return self.o_loppuiset(tvt);
    	     }
	 ],
	 o_loppuiset [tvt;
	     print " * .o_loppuiset() * ";
	     
	     switch (tvt) 
	     {		 
	      'ko', 'kö': return 4; ! laatikko?
	     }	     
	 ];

! ei käytetä
Object 	 listat
 with 	 yksikko [tn;
	     switch (tn) 
	     {
	      4: return laatikko_();	
	     }
	 ],
	 ! char_at joudutaaan asettamaan alla
	 monikko [tn adr len; 
	     	     
	     switch (tn)
	     {
	      4: return laatikot_(adr, len);
	     }
    	 ];

! ei
[ laatikko_;
    print " LAATIKKO o_ko ";
];

! ei
[ laatikot_ adr len av1_pit av2_pit av1 av2 s1 s2 char_at;
    print " LAATIKOT o_ko ";

    char_at = nom_temp_arr-->0;
    print "(((((((((((( ", char_at;
    char_at = char_at-3;
    print " (((( ", char_at;

    !av = 'kk.k';
    
    ! aiemmin ei voitu tehdä av joten
    !tee_av_taulut('kk.k');

    av1 = 'kk';
    av2 = 'k//';
    

  
    
    if (av1 || av2) av1_pit = anna_av_pit(av1, adr+char_at);
    if (av1 || av2) av2_pit = anna_av_pit(av2, adr+char_at);
    
  print ".... ", (address) av1, " ", (address) av2, " ....";
 print " &&&& ",  av1_pit, " &&& ", av2_pit, " &&&&^";
    
    
    !if (v_pit) s = DL(adr+v_pit, paate);
    !if (av1_pit) s1 = DL(adr+av1_pit, paate);
 
    !s2 = DL(alku_pit+av2_pit-1, paate_pit+1); ! 'oita'
    !if (av2_pit) s2 = DL(adr+av2_pit, paate); !???? 'oita'


    if (av1_pit>-1) s1 = DL(adr+char_at+av1_pit, len-char_at+av1_pit);
    if (av2_pit>-1) s2 = DL(adr+char_at+av2_pit, len-char_at+av2_pit); 


    !if (DP) debugprintadr(s, s1, s2);
    
	
    ! molemmat av ok esim: laatiKKoihin laatiKoihin
    ! esim end-1+av hakisi 'oihin' or 'öihin'
    
    !if (s == 'ihin') print "^*return csIll*^";
    !else print "^*return jotain muuta kuin csIll*^";

    !switch (s) 
    !{
    ! 'oihin': return csIll;
    !}

    
    switch (s1) ! kk
    {
     'oihin': print "##### oihin "; return csIll; ! kk & k
     'ojen': return csGen;
     'oja': return csPar;
    }
    switch (s2) ! k
    {
     'oihin': return csIll; ! kk & k
     'oitten': return csGen;
     !'ita': return csPar;
     'oita': return csPar;	
    }
    return false;


];


! [ ttyyppi_parsi_v3 mon adr len char_at av tvt vk;

!     switch (vk)
!     {
!      'o', 'ö': if (mon && tvt == 'ko' or 'kö') return o_ko_mon(mon,adr,len,av,char_at);
		
!     }
    
    
! ];


! [ ttyyppi_parsi_v2 mon av tn tvt adr len at_var av1_pit av2_pit;

!     !v1 = 'kk';
!     !v2 = 'k//';
     
!     ! jos v1 tai v2
!     ! if (v1 || v2) av = true;

!     !av1_pit = -1;
!     !av2_pit = -1;

!     if (v1 || v2) av1_pit = anna_av_pit(v1, adr+at_var);
!     if (v1 || v2) av2_pit = anna_av_pit(v2, adr+at_var);

!     print "^### ", (address) v1, "^";

!     if (mon == false)
!     	parsi_v2_yks(tn, adr, len, at_var, av1_pit, av2_pit);
!     else
!     	parsi_v2_mon(tn, adr, len, at_var, av1_pit, av2_pit);
    
! !    switch (tn)
! !    {
! !    4: if (mon) retval = mon_4_parsi_v2(av, adr, paate_pit, v_pit,	       		      av1_pit, av2_pit);   
! !    }
    
    
! ];

! [ parsi_v2_yks tn adr len at_var av1_pit av2_pit s1 s2;

    
!     ! at_var -- onko se "dif" siten että av:n "keskellä" vai ennen av?
    
!     ! jos av1_pit > -1 tjsp
!     if (av1_pit) s1 = DL(adr+at_var+av1_pit, len-at_var+av1_pit);
!     if (av2_pit) s2 = DL(adr+at_var+av2_pit, len-at_var+av2_pit); !???? 'oita'


!     print "^### ", len, " ", at_var, " ", av1_pit, " ^";
!     print "^### ", len, " ", at_var, " ", av2_pit, " ^";

!     ! +tn +luku
!     switch (s1)
!     {
!      'oa': print "^### s1 oa ! ^";
!      'ua': print "^### s1 ua ! ^";
	
!     }
!     switch (s2)
!     {
!      'on': print "^### s2 on ! ^";
	
!     }
!     	];

! [ parsi_v2_mon tn adr len at_var av1_pit av2_pit s1 s2;
    
    
!     ! at_var -- onko se "dif" siten että av:n "keskellä" vai ennen av?
    
!     ! jos av1_pit > -1 tjsp
!     if (av1_pit>-1) s1 = DL(adr+at_var+av1_pit, len-at_var+av1_pit);
!     if (av2_pit>-1) s2 = DL(adr+at_var+av2_pit, len-at_var+av2_pit); 
    
!     print "^### ", len, " ", at_var, " ", av1_pit, " ^";
!     print "^### ", len, " ", at_var, " ", av2_pit, " ^";
    

!     ];


! [ mon_4_parsi_v2 av adr paate v_pit av1_pit av2_pit s s1 s2;
    
!     if (v_pit) s = DL(adr+v_pit, paate);
!     if (av1_pit) s1 = DL(adr+av1_pit, paate);
 
!     !s2 = DL(alku_pit+av2_pit-1, paate_pit+1); ! 'oita'
!     if (av2_pit) s2 = DL(adr+av2_pit, paate); !???? 'oita'


!     if (DP) debugprintadr(s, s1, s2);
    
	
!     ! molemmat av ok esim: laatiKKoihin laatiKoihin
!     ! esim end-1+av hakisi 'oihin' or 'öihin'
    
!     !if (s == 'ihin') print "^*return csIll*^";
!     !else print "^*return jotain muuta kuin csIll*^";

!     !switch (s) 
!     !{
!     ! 'oihin': return csIll;
!     !}
!     switch (s1) ! kk
!     {
!      'oihin': return csIll; ! kk & k
!      'ojen': return csGen;
!      'oja': return csPar;
!     }
!     switch (s2) ! k
!     {
!      'oihin': return csIll; ! kk & k
!      'oitten': return csGen;
!      !'ita': return csPar;
!      'oita': return csPar;	
!     }
!     return false;
        
! ];


! [ ttyyppi_parsi tn adr len end mon char_at_dif av v_pit av1_pit av2_pit
!      retval paate_pit av_pit;

!     retval = 0;

!     !paate_pit = len-dif;
!     !alku_pit = adr+dif; 



!     if (av)
!     {

! 	!av1_pit = av_match(av1_arr, end-1, adr);
! 	!av2_pit = av_match(av2_arr, end-1, adr);

! 	!if (av=='kk.k') dif = dif-1;	
! 	av1_pit = av_match(av1_arr, char_at_dif, adr);
! 	av2_pit = av_match(av2_arr, char_at_dif, adr);


! 	! (?) kvantitatiivinen: jos pidempi esiintyy, lyhyempi 0
! 	if (av1_pit > av2_pit) av2_pit = 0;
! 	else if (av1_pit < av2_pit) av1_pit = 0;

! 	!
! 	!    else v_pit = av2_pit; ! se on v_pit (pituus jos match)


! 	!if (v_pit) v_pit = v_pit+2; ! WORDSIZE
! 	!if (av1_pit) av1_pit = av1_pit+2;
! 	!if (av2_pit) av2_pit = av2_pit+2;

! 	!if (v_pit) v_pit = v_pit; ! WORDSIZE
! 	if (av1_pit) av_pit = av1_pit;
! 	else av_pit = av2_pit;

    	
	
!     	!paate_pit = paate_pit-av1_pit;
! 		!alku_pit = alku_pit-v_pit;

! 	!if (DL(alku_pit+av1_pit, paate_pit) == 'ua') print " UA"; print "^";
!     ! on sama kuin
!    ! if (DL(adr+dif+av1_pit, len-dif-av1_pit) == 'ua') print " UA"; print "^";

! 	paate_pit = len-av_pit; 

! 	if (DP) print "^>> len ", len, " char_at_dif ", char_at_dif, " av ", av1_pit,
! 	" ", av2_pit, " v ", v_pit, " adr:", adr, " paate pit: ", paate_pit, " ";


! 	! +1 alla leikisti v_pit
! 	if (DL(adr+av1_pit, paate_pit+1) == 'ua') print "** UA ** ^";
	
!      print  "!!!", adr, " ", paate_pit, " --> "; print_arr(inp_arr); print "^";
	
! 	!paate_pit = paate_pit+1;
! 	!alku_pit = alku_pit-1;
! 	!!!
	
!     }
!     ! ei astevaihtelua (av)
!     ! esim 'valo' tn 1 erittäin temp!
!     else
!     {

!     v_pit = char_at_dif-WORDSIZE;
 
!     ! 'valo' temp_paate kuin satu mutta ei 1+
!     paate_pit = len-v_pit;

! 	if (DP) print "^>> len ", len, " char_at_dif ", char_at_dif, " av ", av1_pit,
! 	" ", av2_pit, " v ", v_pit, " adr:", adr, " paate pit: ", paate_pit, " ";


        
!     }
!     !!! START hae_paate_haku_pit
    
!     switch(tn)
!     {

!      1: if (mon) retval = mon_1_parsi();
!      else
! 	retval = yks_1_parsi(av, adr, paate_pit, v_pit, av1_pit, av2_pit);
	
!      4: if (mon) retval = mon_4_parsi(av, adr, paate_pit, v_pit,
! 				      av1_pit, av2_pit);
!      	else retval = yks_4_parsi(adr, len, end, char_at_dif, av);
!      5: if (mon) retval = mon_5_parsi();
! 	else retval = yks_5_parsi(av, adr+char_at_dif, len-char_at_dif, v_pit,
! 				  av1_pit, av2_pit);
!      	! lomakkeet
!      48: if (mon) retval = mon_48_parsi(av, adr, paate_pit, v_pit,
! 				      	av1_pit, av2_pit);	
! 	else retval = yks_48_parsi(av, adr+char_at_dif, len-char_at_dif, v_pit,
! 				  av1_pit, av2_pit);
!      100: if (mon) retval = mon_100_parsi(adr, len, end, mon, char_at_dif, av);
! 	else retval = yks_100_parsi(adr, len, end, mon, char_at_dif, av);
!     }

!     if (DP>0)
!     {
	
! 	print "^# tn ", tn, " av: ";
! 	if (av > 0) print (address) av; else print "-";
! 	print " sija: ";
! 	!print " [s: ";
! 	!if (s) print (address) s;
! 	!else print s;
! 	!print " s1: ";
! 	!if (s1) print (address) s1;
! 	!else print s1;	
! 	!print " s2: ";
! 	!if (s2) print (address) s2;
!  	!else print s2;
! 	!print "] ";
! 	switch (retval)
! 	{
! 	 csGen: print "* csGen * ";
! 	 csPar: print "* csPar *";
! 	 csIll: print "* csIll *";
! 	 default: print "* ", retval, " *";
	    
! 	}
! 	print "^";	
!     }
!     return retval;
    
! ];


! [ debugprintadr s s1 s2;

!      print "^# s: ";
!      if (s) print (address) s; else print s;
!      print " "; if (s1) print (address) s1; else print s1;
!      print " "; if (s2) print (address) s2; else print s2;
    
!      ];

! [ mon_1_parsi;
! ];


! [ yks_1_parsi av adr paate v_pit av1_pit av2_pit s s1 s2 k1 k2 at vok viim_k;

!     av = av;
    
!     ! ks. ensin onko av ylipäänsä. muista että on myös 0 pit av!
!     if (v_pit) s = DL(adr+v_pit, paate);
!     if (av1_pit) s1 = DL(adr+av1_pit, paate);
!     if (av2_pit) s2 = DL(adr+av2_pit, paate);

!     k1 = hae_k(inp_temp_arr, WORDSIZE+v_pit); ! eka kirjain jälkeen av 
!     k2 = hae_k(inp_temp_arr, WORDSIZE+v_pit+1); ! toka

!     ! kun tiedetään että taulut vastaavat taivutustyyppiä 1 (yksikkö),
!     ! nominatiivin taulun viimeisestä kirjaimesta tulee
!     ! vokaalinpidennys illatiiviin
!     ! esim nom_arr 'satu', at on viimeisen merkin sijainti siinä
!     at = 1+nom_temp_arr-->0;
    
!     ! esim vok == 'u'   
!     vok = hae_k(nom_temp_arr, at);

!     ! jos syötteen viimeinen kirjain on 'n'... 
!     at = 1+inp_temp_arr-->0;
!     viim_k = hae_k(inp_temp_arr,at);

!     print (char) vok, " ", (char) k1, (char) k2, (char) viim_k;

!     ! ... ja vokaalinpidennys vastaa vokaalia, se on illatiivi, 
!     ! jos lyhyt vokaali ja 'n' se on genetiivi...
!     ! jotenkin näin
!     if (s1 && viim_k == 'n' && k1 == k2 && k1 == vok)
! 	print " -- se on illatiivi.";
!     if (s2 && viim_k == 'n' && k1 == vok && k2 == viim_k)
! 	print " -- se on genetiivi.";
    
    
!     ! ! esim. vokaalinpidennys esim. 
!     ! !  if (DL(adr+av1_pit,2) == 'uu')   
!     ! ! katsotaan ensin vokaali 'u' (?) sanan gen-taulusta
!     ! ! ja haetaan sopivasta päätelistasta illatiivipääte
!     ! ! 'uu'+'n' tai samantien 'uun'

!     ! ! tai esim etsitään viimeinen kirjain, pituus 1
!     ! kokeilu = DL(adr+v_pit+paate-1, 1);
!     ! ! ja 
!     ! switch (kokeilu)
!     ! {
	
!     !  	! >satua: partitiiviin kelpaa vain av1 ja 'u//' 
!     !  	!   'a//', 'ä//': if (DL(adr+av1_pit, paate-1) == 'u//') return csPar;
!     !  	! mutta ks ed. kommentit
	
!     ! 	! tietysti äidinkielen opettajien liitossa tykättäisiin
!     ! 	! jos a ja ä eriteltäisiin: loppuvokaali tms.
!     ! 	! pituudellakin voi edullisesti vähän erotella
!     ! 	! mutta: ei voi olla samoja ehtoja switch peräkkäin...
!     !  'a//', 'ä//': if (paate==2) return csPar;
!     !  'n//': if (paate==3) return  csIll;
!     !   	! 'n//': if (paate==2) return csGen;	 
	
!     ! }
    
!     ! 'valo' ei av, temp temp 
!     switch (s)
!     {
!      'a//', 'ä//': return csPar; ! 'valoa' temp
!      'n//': return csGen; ! 'valon' temp
	

!     }
!     ! ei voi toimia
!     switch (s1)
!     {
!      'ua', 'uä': return csPar;
!      'uun': return csIll;
!     }
!     switch (s2) 
!     {
!      'un': return csGen; 
!     }
!     return false;
    
    
! ];


! ! 4 laatikko -- av aina kk:k (A)
! [ mon_4_parsi av adr paate v_pit av1_pit av2_pit s s1 s2;
    
!     if (av ~= 'kk.k') print "^** Virhe! tn 4 av kk:k **^"; 


!     !alku_pit = alku_pit+1;
!     !print "^*** ", alku_pit;
!     !print " ", v_pit, " ", paate_pit, "^";

    
!     if (v_pit) s = DL(adr+v_pit, paate);
!     if (av1_pit) s1 = DL(adr+av1_pit, paate);
 
!     !s2 = DL(alku_pit+av2_pit-1, paate_pit+1); ! 'oita'
!     if (av2_pit) s2 = DL(adr+av2_pit, paate); !???? 'oita'


!     if (DP) debugprintadr(s, s1, s2);
    
	
!     ! molemmat av ok esim: laatiKKoihin laatiKoihin
!     ! esim end-1+av hakisi 'oihin' or 'öihin'
    
!     !if (s == 'ihin') print "^*return csIll*^";
!     !else print "^*return jotain muuta kuin csIll*^";

!     !switch (s) 
!     !{
!     ! 'oihin': return csIll;
!     !}
!     switch (s1) ! kk
!     {
!      'oihin': return csIll; ! kk & k
!      'ojen': return csGen;
!      'oja': return csPar;
!     }
!     switch (s2) ! k
!     {
!      'oihin': return csIll; ! kk & k
!      'oitten': return csGen;
!      !'ita': return csPar;
!      'oita': return csPar;	
!     }
!     return false;
        
! ];

! [ yks_4_parsi;
! ];

! [ mon_5_parsi;
! ];

! ! agenssi 5 ahmatti 5C
! [ yks_5_parsi av alku_pit paate_pit v_pit av1_pit av2_pit s s1 s2;

!       av = av;
    
!       s = DL(alku_pit+v_pit, paate_pit);
!       s1 = DL(alku_pit+av1_pit, paate_pit);
!       s2 = DL(alku_pit+av2_pit, paate_pit);

    
!       !if (DP) debugprintadr(s, s1, s2);

!       switch (s1)
!       {
!        'ia', 'iä': return csPar;
!       }
!       switch (s2) 
!       {
!        'in': return csGen;
!        'iin': return csIll;
!       }
!       return false;
    
    
! ];

! ! lomakkeet
! [ mon_48_parsi av adr paate v_pit av1_pit av2_pit s s1 s2;    
    
!     if (av1_pit) s1 = DL(adr+av1_pit, paate);

!     if (av2_pit) s2 = DL(adr+av2_pit, paate);


!     if (DP) debugprintadr(s, s1, s2);
    
!     switch (s1) ! k
!     {
!      'oihin': return csIll;
!      'oitten': return csGen;
!      !'ita': return csPar;
!      'oita': return csPar;	
!     }

!     switch (s2) ! kk
!     {
!      'eisiin': return csIll;
!      'eiden', 'eitten': return csGen;
!      'eita', 'eitä': return csPar;
!     }
!     return false;


! ];


! ! voide
! [ yks_48_parsi av alku_pit paate_pit v_pit av1_pit av2_pit s s1 s2;

!     av = av;
    
!     s = DL(alku_pit+v_pit, paate_pit);

!     s1 = DL(alku_pit+av1_pit, paate_pit);
!     s2 = DL(alku_pit+av2_pit, paate_pit); 

!     if (DP) debugprintadr(s, s1, s2);

!     switch (s1)
!     {
!      'etta', 'että': return csPar;
!     }
!     switch (s2) 
!     {
!      'een': return csGen;
!     }
!     return false;
    
    
! ];


! tähän tiputaan? ! käytä ao. nimeämistyyliä myös yllä jottei mene
! sekaisin -- esim. av vaihtuu sanasta pituudeksi yllä.
! muuta myös av1 -> av1_arr jne tms
! (tee tästä *_pit hausta oma)
! [ mon_100_parsi adr len end av v_pit av1_pit av2_pit paate_pit s s1
!     s2;

!     if (av > 0)
!     { 
! 	av1_pit = av_match(av1_arr, end-1, adr);
! 	av2_pit = av_match(av2_arr, end-1, adr);

!     if (av1_pit > av2_pit) v_pit = av1_pit; else v_pit = av2_pit; ! se on v_pit (pituus jos match)

!     paate_pit = len-end;
!     paate_pit = paate_pit-v_pit;
    
!     	s = DL(adr+end+v_pit, paate_pit-1);
! 	s1 = DL(adr+end+av1_pit, paate_pit-1); 
!     	s2 = DL(adr+end+av2_pit, paate_pit-1);
!     }

!     switch (s)
!     {
!      'ihi' : return csIll;
!     }
! !    switch (s2)
! !    {	
! !     'it': return csPar;
! !    }
!     return false;
   
    
! ];


! [ yks_100_parsi adr len end av a1 a2 s paate_pit;

!         if (a1 > a2) av = a1; else av = a2; ! se on v_pit (pituus jos match)
    
!     ! molemmat av ok

!     paate_pit = len-end;
!     paate_pit = paate_pit-av;

!     s = DL(adr+end+av, paate_pit-1);

    
! ];

! [ ttyyppi_tulosta tn sija adr len end mon char_at_dif av;

!     tn = tn;    
!     sija = sija;
!     mon = mon;
!     char_at_dif = char_at_dif;
!     av = av;


!     ! print sija;
    
!     if (DP>1) {
!     	print " * ttyyppi_tulosta *: "; print_arr(nom_temp_arr); print
! 	    " av: [oli tauluja, nyt jos av, se on hakusana]";
! 	! print_arr(av1_arr); print "/"; print_arr(av2_arr);
!     	print " len: ", len, " end: ", end, " char_at_dif: ", char_at_dif, " adr:"; print_merkkij_taulu(adr); 
!     	print " #", (char) hae_k(adr, end); 
!     	print " $", Print_adr(adr, len);
!     }
    
!     ! switch(tn)
!     ! {
!     ! 1: valo_tulosta(sija, adr, len, end, mon, dif, av);
!     !    ! laatikko ei tarvitse av?
!     ! 4: laatikko_tulosta(sija, adr, len, end, mon, dif);
!     ! 5: risti_tulosta(sija, adr, len, end, mon, dif, av);
!     ! 41: vieras_tulosta(sija, adr, len, end, mon, dif, av);
!     ! }
    
! ];



!==> tulosta.h <==
!!! tulosta.h !!!

! * Tulostamista
! --------------
!System_file;

!* 035 -
! [ arvaa_av1_av2 mon char_at arr arr_b;

!     !! jos monikko arr = gen_temp_arr?

!     ttyyppi.av1 = 'öö'; ttyyppi.av2 = 'ö//';
    
    
!     if (arr == 0) arr = nom_arr;
!     if (arr_b == 0) arr_b = par_temp_arr;
    
!     if (hae_k(arr, char_at-1) == 'k' && hae_k(arr, char_at) == 'k')
! 	{ ttyyppi.av1 = 'kk'; ttyyppi.av2 = 'k//';} ! suora av
    
!     ! lomaKKee[t/n]
!     if (hae_k(arr, char_at-1) == 'k' && hae_k(arr, char_at) == 'k')
!         { ttyyppi.av1 = 'k//'; ttyyppi.av2 = 'kk'; } ! käänteinen av

!     ! ...
    
!     if (hae_k(arr_b, char_at-1) == 'n' && hae_k(arr_b, char_at) == 'k')
! 	{ ttyyppi.av1 = 'nk'; ttyyppi.av2 = 'ng';} ! suora av
!     else if (hae_k(arr, char_at-1) == 'n' && hae_k(arr, char_at) == 'k')
! 	{ ttyyppi.av1 = 'ng'; ttyyppi.av2 = 'ng';} ! käänteinen av
    
!     ! t.d
!     ! saDut saTuja saTua 
!     if (hae_k(arr_b, char_at) == 't' && hae_k(arr, char_at) == 'd')
! 	{ ttyyppi.av1 = 'd//'; ttyyppi.av2 = 't//';}
!     ! d.t
!     else if (hae_k(arr_b, char_at) == 'd' && hae_k(arr, char_at) == 't')
!     	{ ttyyppi.av1 = 't//'; ttyyppi.av2 = 'd//';} ! käänteinen av
    
    
! ];

!* 038 -

! [ hae_s0 adr len char_at;

    
	
!     if (dp) print "^!!! hae_s0: ", char_at, " !!! ^";
   
            
!     ttyyppi.s0 = DL(adr+char_at, len-char_at+1);    
!     !ttyyppi.s1 = DL(adr+char_at+av1_pit, len-char_at+av1_pit+1);
!     !ttyyppi.s2 = DL(adr+char_at+av2_pit, len-char_at+av2_pit+1); 

      
! if (dp && ttyyppi.s0) print "== ! s0 : ", (address) ttyyppi.s0,
!     " ! == ^";

!     !!!!!! temp alku
!     print "^s0? len: ", len, " char_at: ", char_at, " adr+char_at: ", adr+char_at,
!     " len-char_at: ", len-char_at, " len-char_at+1: ",
!     len-char_at+1, "^";

!     if (ttyyppi.s0) print "== s0 on: ", (address) ttyyppi.s0, "^";

!     !!!!!! temp loppu
    
       
! ];

! ei astevaihtelua mutta muuta vartalon vaihtelua?
! kuinka niistetään? katsotaanko viimeinen kirjain?
! mv tarkoittaa mielivaltaista vaihtelua tai siirtelyä
! -- vaikka vartalonvaihtelu tapahtuu oikeasti (nainen)  
! ks. esiparsi() yksikkö:
! vrt_tauluja_dif_at(gen_temp_arr, nom_temp_arr)
!
! nainen 38: char_at-2 (siirtyy 2 vasemmalle...)
! default: char_at+1 (siirretään 1 oikealle...)

! [ mv pp char_at tt;

!     tt = ttnro_(pp);
!     !print pp, " ", tt, " ";
  
!     switch
! 	(tt)
! 	{
! 	 138: return char_at-2; ! nainen nai-nen nai-sen nai-sta
!    	 default: return char_at+1; ! älli älli- älli-n älli-ä 
! 	}
    
! ];

