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 )