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 )