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