Rc

 view release on metacpan or  search on metacpan

lib/Rc/Csh.pm  view on Meta::CPAN

sub _words {
    my $n=shift;
    my @w;
    while ($n->isa('Rc::Lappend')) {
	push @w, $n->kid(1);
	$n = $n->kid(0);
    }
    @w, $n;
}

sub _match {
    my ($x,$y) = @_;
    if (ref $y eq 'Rc::Undef') {
	if ($x->isa('Rc::Var')) {
	    "! \${?".$x->kid(0)->chp."}";
	} else {
	    die $x;
	}
    } else {
	die "don't know how to match against $y";
    }
}

sub Rc::Match::chp {
    my $n=shift;
    join(' || ', map { _match($n->kid(0), $_) } _words($n->kid(1)))
}

sub Rc::Var::chp { "\$". as_var(shift->kid(0)) }

sub _body {
    my $n=shift;
    my @s;
    my @k = $n->kids;
    push @s, $k[0]->chp; # $k[0] always set? XXX
    if (!$k[1]->isa('Rc::Undef')) {
	if (!$k[0]->isa('Rc::Nowait')) {
	    push @s, nl;
	}
	push @s, $k[1]->chp;
    }
    join '', @s;
}

*Rc::Body::chp = \&_body;
*Rc::Cbody::chp = \&_body;

sub Rc::Brace::chp {
    my $n=shift;
    my $k1=$n->kid(1);
    '{'.indent { nl.$n->kid(0)->chp }.nl.'}'.
	(!$k1->isa('Rc::Undef')? $k1->chp:'')
}

sub Rc::Assign::chp {
    my ($n) = @_;
    my $name = $n->kid(0)->chp;
    if ($Local{$name}) {
	'set '.$name.' = '.$n->kid(1)->chp.nl
    } else {
	'setenv '.$name.' '.$n->kid(1)->chp.nl
    }
}

sub Rc::Pre::chp {
    my $n=shift;
    my @l;
    my @s = ("# LOCALISATION BLOCK");
    while (1) {
	my $mod = $n->kid(0);
	if ($mod->isa('Rc::Assign')) {
	    my $name = $mod->kid(0)->chp;
	    die "sh doesn't do nested localization ($name)"
		if $Local{$name};
	    $Local{$name}=1;
	    push @l, $name;
	    push @s, "set $name = ".$mod->kid(1)->chp;
	} elsif ($mod->isa('Rc::Redir')) {
	    die "Pre($mod) - not yet"; #move down? XXX
	} else {
	    die "Pre($mod)?";
	}
	if ($n->kid(1)->isa('Rc::Pre')) {
	    $n = $n->kid(1);
	    next;
	}
	last;
    }
    @s = join(nl,@s);
    indent {
	push @s, nl.no_brace($n->kid(1))->chp;
    };
    push @s,nl;
    for (@l) {
	delete $Local{$_};
	push @s, "unset $_".nl;
    }
    join('',@s);
}

sub Rc::Newfn::chp {
    die "csh doesn't have functions...";
}

1;



( run in 1.517 second using v1.01-cache-2.11-cpan-39bf76dae61 )