#!/afs/athena.mit.edu/contrib/perl5/perl -w

$0 =~ m@^(.*?)([^/]*)$@;
$dir = $1;
$fmt = $2;
@newcmd = ($dir . etexfmtname($fmt));
$bs = bschar($fmt);
$| = 1;

for (; $ARGV[0] && $ARGV[0] =~ /^-/; shift @ARGV) {
    if ($ARGV[0] =~ /^-+help/) {
	exit exec(@newcmd, '-help');
    }
    if ($ARGV[0] =~ /^-+(progname|fmt)=(.*)$/) {
	$fmt = $2;
	$bs = bschar($fmt);
	push(@newcmd, "-$1=" . etexfmtname($fmt));
    } else {
	push(@newcmd, $ARGV[0]);
    }
}

while (!parseargs(@ARGV)) {
    print "** ";
    @ARGV = split(' ', <STDIN>);
}

print "Running @newcmd\n";
exec(@newcmd);

sub parseargs {
    # returns 0 if we want more args and 1 otherwise.
    for (; @_; shift @_) {
	if ($_[0] =~ /^&(.*)$/) {
	    $fmt = $1;
	    $bs = bschar($fmt);
	    push(@newcmd, "&" . etexfmtname($fmt));
	} elsif ($_[0] =~ /^\Q$bs\E/) {
	    push(@newcmd, "${bs}TeXXeTstate=1", @_);
	    return 1;
	} else {
	    push(@newcmd, "${bs}TeXXeTstate=1", "${bs}input", @_, "${bs}bye");
	    return 1;
	}
    }
}

sub etexfmtname {
    $_[0] =~ m@^(.*?)([^/]*)@;
    $f = $2;
    $f =~ s/xet//g;
    return $1 . ($f eq 'tex' ? 'etex' : "etex_$f");
}

sub bschar {
    return ($_[0] =~ /tex(xet)?info$/ ? '@' : '\\');
}
