#!/usr/bin/perl
# xenv: defines XMLterm environment variables
# Usage: xenv  [-s|--shell] <shell-path>

use Getopt::Long;

Getopt::Long::config('bundling');

&GetOptions("shell|s=s", "help|h");

if ($opt_help) {
    print "Usage: xenv [-s <shell-path>]\n";
    exit;
}

my $shell = $ENV{SHELL};
$shell = $opt_shell if $opt_shell;

my $cshell = 0;

$cshell = 1 if ($shell =~ /csh$/);

$| = 1;      # Flush output

cbreak();          # Raw (noecho) mode

print STDERR "\033{A\n";  # Send escape sequence on STDERR

my $key = '';
my $param_str = "";

my $bytes = sysread(STDIN, $key, 1);
while ($bytes && ($key ne "\n")) {
    $param_str .= $key;
    $bytes = sysread(STDIN, $key, 1);
}

cooked();          # Cooked mode

my @params = split /;/, $param_str;

foreach my $param (@params) {
    if ( $param =~ /^(\w+)=(.*)$/ ) {
        my ($name, $value) = ($1, $2);

        if ($cshell) {
            print "setenv $name $value;\n";
        } else {
            print "$name=$value; export $name;\n";
        }
    }
}

exit;

BEGIN {
    use POSIX qw(:termios_h);

    my ($term, $oterm, $echo, $noecho, $fd_stdin);

    $fd_stdin = fileno(STDIN);

    $term     = POSIX::Termios->new();
    $term->getattr($fd_stdin);
    $oterm     = $term->getlflag();

    $echo     = ECHO | ECHOK | ICANON;
    $noecho   = $oterm & ~$echo;

    sub cbreak {
        $term->setlflag($noecho);
        $term->setcc(VTIME, 1);
        $term->setattr($fd_stdin, TCSANOW);
    }

    sub cooked {
        $term->setlflag($oterm);
        $term->setcc(VTIME, 0);
        $term->setattr($fd_stdin, TCSANOW);
    }
}

END { cooked() }
