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 )