#!/usr/bin/perl

open(INPUT_FILE, "< /home/kurisuto/documents/linguistics/norse_class/schema_nouns") || die "Fatal error:$!\n";

while (<INPUT_FILE>) {

    chop;

    if (($_ ne "") && (substr($_, 0, 1) ne "#")) {
	($class, $pos, $soundchange, $suffix) = split(/\t/);
	$nounhash{$class . "," . $pos} = $soundchange . "," . $suffix;
    }
}

$class_hash{"ma"} = "+masc+a-stem";
$class_hash{"na"} = "+neut+a-stem";
$class_hash{"sh-mja"} = "+masc+ja-stem";
$class_hash{"l-mja"} = "+masc+ja-stem";
$class_hash{"sh-nja"} = "+neut+ja-stem";
$class_hash{"l-nja"} = "+neut+ja-stem";
$class_hash{"mwa"} = "+masc+wa-stem";
$class_hash{"nwa"} = "+neut+wa-stem";
$class_hash{"fo"} = "+fem+o-stem";
$class_hash{"sh-fjo"} = "+fem+jo-stem";
$class_hash{"l-fjo"} = "+fem+jo-stem";
$class_hash{"fwo"} = "+fem+wo-stem";
$class_hash{"sh-mi"} = "+masc+i-stem";
$class_hash{"fi"} = "+fem+i-stem";
$class_hash{"fi"} = "+fem+i-stem";
$class_hash{"mu"} = "+masc+u-stem";
$class_hash{"mc"} = "+masc+cons-stem";
$class_hash{"fc"} = "+fem+cons-stem";
$class_hash{"mnd"} = "+masc+nd-stem";
$class_hash{"wm"} = "+masc+weak";

$def_hash{"+masc+nom+sg"} = "inn";
$def_hash{"+masc+acc+sg"} = "inn";
$def_hash{"+masc+gen+sg"} = "ins";
$def_hash{"+masc+dat+sg"} = "inum";
$def_hash{"+masc+nom+pl"} = "inir";
$def_hash{"+masc+acc+pl"} = "ina";
$def_hash{"+masc+gen+pl"} = "inna";
$def_hash{"+masc+dat+pl"} = "inum";
$def_hash{"+fem+nom+sg"} = "in";
$def_hash{"+fem+acc+sg"} = "ina";
$def_hash{"+fem+gen+sg"} = "innar";
$def_hash{"+fem+dat+sg"} = "inni";
$def_hash{"+fem+nom+pl"} = "inar";
$def_hash{"+fem+acc+pl"} = "inar";
$def_hash{"+fem+gen+pl"} = "inna";
$def_hash{"+fem+dat+pl"} = "inum";
$def_hash{"+neut+nom+sg"} = "it";
$def_hash{"+neut+acc+sg"} = "it";
$def_hash{"+neut+gen+sg"} = "ins";
$def_hash{"+neut+dat+sg"} = "inu";
$def_hash{"+neut+nom+pl"} = "in";
$def_hash{"+neut+acc+pl"} = "in";
$def_hash{"+neut+gen+pl"} = "inna";
$def_hash{"+neut+dat+pl"} = "inum";

while (<>) {
    
    chop;
    if ($_ ne "") {

	($class, $citeform, $stem, $gloss) = split(/\t/);
	
	$compound_first = "";
	if ($stem =~ /\+/) {
	    ($compound_first, $stem) = split(/\+/, $stem);
	}
	
	# Loop thru each case and number.
	foreach $pos ("+nom+sg", "+acc+sg", "+gen+sg", "+dat+sg", "+nom+pl", "+acc+pl", "+gen+pl", "+dat+pl") {


	    # Look up the endings and sound changes for this
	    # morphological class and case/number.
	    $key = $class . "," . $pos;
	    $sc_and_suffix = $nounhash{$key};
	    ($sound_change, $suffix) = split(/\,/, $sc_and_suffix);

	    # Put the suffix on the stem.
	    $form = $stem . "+" . $suffix;


	    # SOUND CHANGES

	    # Umlaut
	    if ($sound_change eq "uml") {
		$form =~ s/au/ey/;
		$form =~ s/j//;
		$form =~ s/\&o-hook;//;
		$form =~ s/a/e/;
		$form =~ s///;
		$form =~ s/o//;
		$form =~ s//\&oelig;/;
		$form =~ s/u/y/;
		$form =~ s///;
	    }

	    # a goes to o-hook when u follows
	    if ($sound_change eq "u") {
		$form =~ s/a/\&o-hook;/;
	    }

	    # n+n > n, l+l > l, r+r > r after a consonant.
	    $form =~ s/([fkdr][nlr])\+r/$1/;

	    # Delete the second vowel in the stem if the suffix contains
	    # a vowel.
	    $form =~ s/([aeiouy][^-\+]+)[aeiouy](.+\+[aeiou])/$1$2/;


	    # Consonant assimilations.
	    $form =~ s/n\+r/nn/;
	    $form =~ s/s\+r/ss/;
	    $form =~ s/l\+r/ll/;
	    $form =~ s/x\+r/x/;

	    # Vowel coalescence and shifting stress in diphthongs.
	    $form =~ s/\+i$//;
	    $form =~ s/\+a/j/;
	    $form =~ s/\+u/j/;

	    # END SOUND CHANGES

	    $form = $compound_first . $form;


	    # Get rid of our temporary morphological boundary.
	    $form =~ s/\+//;


	    # Output what we came up with.
	    print $form, "\t", $citeform, $class_hash{$class}, $pos, "\t", $gloss, "\n";
	    

	    # Output the definite form too.
	    ($ignore, $def_id, $ignore) = split(/\+/, $class_hash{$class});

	    $def_id .= $pos;
	    $def_id = "+" . $def_id;
#	    print $def_id, " ***\n";

	    $def_form = $form . "+" . $def_hash{$def_id};
	    
	    $def_form =~ s/um\+inum/unum/;
	    $def_form =~ s/([aeiou])\+i/$1/;
	    if ($pos eq "+nom+pl") {
		$def_form =~ s/ar\+i/ar/;		
	    }
	    
	    $def_form =~ s/\+//;

	    print $def_form, "\t", $citeform, $class_hash{$class}, , $pos, "+def\t", $gloss, "\n";


	}

	print "\n";
    }   
}


