#!/usr/local/bin/perl

# Hebrew morphology wrapper by Erik Peterson, eepeter@cs.cmu.edu
# Using programs from Yaniv Eytani
# March 2, 2204

## Change these to suit local environment
# Location of morphology program mcht.exe
$morphdir = "/shared/code/Hebrew/hmntx";
# Location of trans.class, parse.class
$converterdir = "/shared/code/Hebrew";
# Directory where temporary files will go
$tmpdir = "/tmp/hebrew";



use IO::Socket::INET;
use Net::hostent;
use FileHandle;
use File::Temp "tempfile";

use POSIX ":sys_wait_h";

$ENV{'CLASSPATH'} = "$converterdir:" . $ENV{'CLASSPATH'};
chdir $morphdir;

# Default server port number is 5762; 
# Include port number as argument if want different port
if (scalar(@ARGV) == 1 and $ARGV[0] =~ m/^\d+$/) {
    $serverport = $ARGV[0];
} else {
    $serverport = 5762;
}


$| = 1;

# Open server port
$server = IO::Socket::INET->new(LocalPort => $serverport,
				Type => SOCK_STREAM,
				Reuse => 1,
				Listen => 12)
    or die "Couldn't be a tcp server on port $serverport: $!\n";

print "Starting Hebrew morphology server on port $serverport; $cachecount words cached\n\n";

$SIG{CHLD} = sub { wait };

$morphinited = 0;

# Wait for connections
while ($client = $server->accept()) {
    if ($kidpid = fork) {
	close $client;
	next;
    }

    defined($kidpid) or die "cannot fork: $!";

    close $server;

    print "[Connection established]\n";

    # Read Hebrew sentence
    while ($sent = <$client>) {
	if ($sent eq "**EXIT**") {
	    last;
	}
	print "Processing $sent";

	# Write sentence into file to be processed into romanization
	($transfd, $transin) = tempfile("wrapperXXXXXX",
					DIR => $tmpdir,
					SUFFIX => '.txt');
	print $transfd  $sent;
	close($transfd);

	($morphfd, $morphin) = tempfile("morphXXXXXX",
					DIR => $tmpdir,
					SUFFIX => '.txt');
	close($morphfd);
	($morphprefix) = ($morphin =~ m/^(.+?)\.txt$/);
	
        # Translate to ASCII
	`java trans $transin $morphin`;
	
        # Run through morphology
	   # May need to change file name in nitux_ay_tokna.mca
	open(INI, "$morphdir/nitux_ay_tokna.mca") or warn $!;


	($paramfd, $paramname) = tempfile("paramXXXXXX",
					  DIR => $tmpdir,
					  SUFFIX => '.txt');
	#open(PRM, "> morphparam") or warn $!;
	while ($line = <INI>) {
	    if ($line =~ s/^(MamrLNituxAlYdiTokna:\s*)(\S*)/${1}$morphprefix/) {
	      print $paramfd $line;
	    } else {
	      print $paramfd $line;
	    }
	}
	close(INI);
	close($paramfd);

	`./mcht.exe $paramname`;

    #chdir "..";

	($fssfd, $fsfilename) = tempfile("fssXXXXX",
					 DIR => $tmpdir,
					 SUFFIX => '.out');
        close($fssfd);

        # Convert morph output to nice list of feature structures
	`java parse $morphprefix.out $fsfilename`;

        # Send feature structures back to xfer engine
	$fss = "";

        open(FS, $fsfilename) or warn $!;
	while ($line = <FS>) {
	    $line =~ s/[\r\n]*$/ /;
	    $line =~ s/\( LEX /\( lex /;
	    $line =~ s/\( POS /\( pos /;
	    $fss .= $line;
	}
	close(FS);

        print $client "$fss\n";

        unlink $transin, $morphin, "$morphprefix.out", $paramname, $fsfilename;
        $transin = $morphin = $morphprefix = $paramname = $fsfilename = "";
    }

    print "[Connection closed]\n";
}

