Rc
view release on metacpan or search on metacpan
lib/Rc/Csh.pm view on Meta::CPAN
use strict;
package Rc::Csh; #sea shell backend
use Carp;
use Rc qw($OutputFH);
use vars qw($level %Local $Backq);
$level = 0;
sub HELP { die "Will a 'csh' expert please step forward?" }
sub indent(&) { local $level = $level + 1; shift->() }
sub nl() { "\n" . ' 'x($level*4) }
sub Rc::Node::csh {
print $OutputFH shift->chp(). "\n";
}
sub Rc::Node::chp {
my $n=shift;
die ref($n)." not implemented yet for 'csh'";
}
sub Rc::Word::chp { shift->string }
sub Rc::Qword::chp {
my $s = shift->string;
# quotemeta XXX
"'$s'"
}
sub no_brace {
my $n=shift;
$n->isa('Rc::Brace')? $n->kid(0) : $n
}
sub Rc::If::chp {
my $n=shift;
my $k = $n->kid(1);
'if ('.$n->kid(0)->chp.') then'.
($k->isa('Rc::Else')? $k->chp :
indent { nl.no_brace($k)->chp }.nl.'endif' )
}
sub Rc::Orelse::chp {
my $n=shift;
die "csh doesn't know || {}" if $n->kid(1)->isa('Rc::Brace');
join(' || ', map { $_->chp } $n->kids);
}
sub Rc::Concat::chp {
my $n = shift;
# maybe some sanity check? XXX
join('', map { $_->chp } $n->kids);
}
sub Rc::Else::chp {
my $n =shift;
my $k = $n->kid(1);
indent { nl.$n->kid(0)->chp }.nl.do {
if ($k->isa('Rc::If')) {
'else '.$k->chp
} else {
'else '.nl.$k->chp;
}
};
}
sub Rc::Args::chp {
my $n = shift;
join(' ', map { $_->chp } $n->kids)
}
( run in 2.543 seconds using v1.01-cache-2.11-cpan-364913b4093 )