#!/usr/athena/bin/perl

$cstate = "q1";
$cp = 0;

&getcode();
&maketape();
while(1){
    if($cp >= 0){
	if(defined($do=$dowhat{"$cstate,$ptape[$cp]"}))
	{
	    $cstate = $nextstate{"$cstate,$ptape[$cp]"};
	    if($do eq "l"){$cp--;}
	    elsif($do eq "r"){$cp++;}
	    elsif($do eq "1"){$ptape[$cp] = "1";}
	    elsif($do eq "b"){$ptape[$cp] = "";}
	}
	else
	{
	    &dostop();
	}
    }
    else
    {				 
	if(defined($do=$dowhat{"$cstate,$ntape[-$cp]"}))
	{				 
	    $cstate = $nextstate{"$cstate,$ntape[-$cp]"};
	    if($do eq "l"){$cp--;}
	    elsif($do eq "r"){$cp++;}
	    elsif($do eq "1"){$ntape[-$cp] = "1";}
	    elsif($do eq "b"){$ntape[-$cp] = "";}
	}
	else
	{				 
	    &dostop();		 
	}				 
    }
    &showtape();
}

sub input {
        local($foo);
        print(">>>");
        $foo = <STDIN>;
        chop($foo);
        $foo;
}

sub getcode {
    print("\nWhat is the filename including the machine code?\n");
    print("Format should be:\n");
    print("state value action  newstate\n");
    print("q      1/b  r/l/1/b   q\n");
    $filename = &input();
    open(CODE, $filename) || die "That doesn't exist.  oh well.\n";
    while(<CODE>){
	($state, $val, $act, $nstat) = split;
	$val =~ s/b//;
	$dowhat{"$state,$val"} = $act;
	print("Action code -$state,$val- does $act\n");
	$nextstate{"$state,$val"} = $nstat;
    }
}
sub maketape {
    print("Please enter the tape, starting with cell 0, increasing.\n");
    $tape = &input();
    split(//, $tape);
    @ptape = @_;
    foreach $i (0.. $#ptape){
	if($ptape[$i] eq "0"){$ptape[$i] = "";}
    }
    &showtape();
}

sub showtape {
    foreach $l (1..15){
	$i = 16 - $l;
	if($ntape[$i] eq "1"){print("1");}
	if($ntape[$i] eq ""){print("0");}
    }
    print("//");
    foreach $i (0..40){
	if($ptape[$i] eq "1"){print("1");}
	if($ptape[$i] eq ""){print("0");}
    }
    print("...$cp, $cstate\n");
}
	
sub dostop {
    print("\nTuring machine has stopped.\n");
    exit;
}

