App-sh2p
view release on metacpan or search on metacpan
lib/App/sh2p/Compound.pm view on Meta::CPAN
#####################################################
# shell perl
my %convert = ( '==' => 'eq',
'=' => 'eq',
'!=' => 'ne',
'<' => 'lt',
'>' => 'gt',
'<=' => 'le',
'>=' => 'ge',
'-eq' => '==',
'-ne' => '!=',
'-lt' => '<',
'-gt' => '>',
'-ge' => '>=',
'-le' => '<=',
'-nt'=> undef,
'-ot'=> undef,
'-ef'=> undef,
'-n' => '', # No value required
'-z' => '!',
'-a' => '-e', # see %sh_convert
'-h' => '-l',
'-o' => undef, # shell option, but see %sh_convert
'-O' => '-o', # confused?
'-G' => undef, # owned by egid
'-L' => '-l',
'-N' => undef); # modified since last read);
# Many options are the same as the Perl functions, but not all
# Bourne shell syntax overlaps
my %sh_convert = ('-o' => 'or',
'-a' => 'and');
#####################################################
# ((
sub arith {
my ($statement, @rest) = @_;
# First 2 chars passed should be (( or $((, unless from let
$statement =~ s/^\$?\(\(//;
# Last 2 chars passed should be )), unless from let
$statement =~ s/\)\)$//;
my $out = '( ';
my @tokens = App::sh2p::Parser::tokenise ($statement);
my $pattern = '<<|>>|==|>=|<=|\/=|%=|\+=|-=|\*=|=|>|<|!=|\+\+|\+|--|-|\*|\/|%';
for my $token (@tokens) {
# Further tokenise
$token =~ s/($pattern)/$1 /;
for my $subtok (split (/ /, $token)) {
if ($subtok =~ /^[_A-Za-z]/) {
# Must be a variable!
$subtok = "\$$subtok";
}
elsif ($subtok =~ /\$[A-Z0-9\?#\{\}\[\]]+/i) {
my $special = get_special_var($subtok,0);
$subtok = $special if (defined $special);
}
$out .= "$subtok "
}
}
if (query_semi_colon()) {
out "$out);\n";
}
else {
out "$out)";
}
return 1;
}
#####################################################
# identify_ksh_boolean ($tokens[$i], $types[$i])
sub identify_ksh_boolean (\$\$){
my ($rtok, $rtype) = @_;
my $retn = 1;
if (exists $convert{$$rtok}) { # ksh options
$$rtok = $convert{$$rtok};
$$rtype = [('OPERATOR', \&App::sh2p::Operators::boolean)];
}
elsif (substr($$rtok,0,1) eq '-') {
$$rtype = [('OPERATOR', \&App::sh2p::Operators::boolean)];
}
else {
$retn = 0;
}
return $retn;
} # identify_ksh_boolean
#####################################################
# [[
sub ksh_test {
my ($statement) = @_;
#print STDERR "ksh_test: <$statement>\n";
# First 2 chars passed should be [[
$statement =~ s/^\[\[//;
# Last 2 chars passed should be ]]
$statement =~ s/\]\](.*)$//;
my $rest = $1;
# extglob
my $specials = '\@|\+|\?|\*|\!';
my @tokens = App::sh2p::Parser::tokenise ($statement);
my @types = App::sh2p::Parser::identify (1, @tokens);
lib/App/sh2p/Compound.pm view on Meta::CPAN
#print STDERR "Handle_esac\n";
Handle_case (@g_case_statements);
dec_indent();
dec_block_level();
@g_case_statements = ();
# Fix January 2009 (was: iout "\n}\n")
out "\n";
iout "}\n";
return 1;
}
#####################################################
sub Handle_for {
# Format: for var in list
my ($cmd, $var, $in, @list) = @_;
$g_context = 'for';
my $ntok = 1;
# Using first argument because this is also used for select (temp)
error_out ("No conversion for $cmd, consider Shell::POSIX::select") if $cmd eq 'select';
$ntok++ if defined $var;
iout "$cmd my \$$var (";
$ntok++ if defined $in;
my @for_tokens;
for (my $i=0; $i < @list; $i++) {
last if $list[$i] eq 'do';
last if $list[$i] eq ';';
last if substr($list[$i],0,1) eq '#';
push @for_tokens, $list[$i];
}
#print STDERR "Handle_for: for_tokens <@for_tokens>\n";
if (@for_tokens) {
$ntok += @for_tokens;
}
else {
if (ina_function()) {
out '@_';
}
else {
out '@ARGV';
}
}
# Often a variable to be converted to a list
# Note: excludes @ and * which indicate an array
if ($for_tokens[0] =~ /\$[A-Z0-9#\{\}\[\]]+/i) {
my $IFS = App::sh2p::Utils::get_special_var('IFS',0);
$IFS =~ s/^"(.*)"/$1/;
out "split /$IFS/,$for_tokens[0]";
shift @for_tokens;
}
if (@for_tokens) {
my @types = App::sh2p::Parser::identify (2, @for_tokens);
App::sh2p::Parser::convert (@for_tokens, @types);
}
out ')';
$g_context = '';
return $ntok;
}
#####################################################
sub Handle_while {
my ($cmd, @statements) = @_;
my $ntok = 1;
for (my $i=0; $i < @statements; $i++) {
if (substr($statements[$i],0,1) eq '#') {
splice (@statements, $i);
last;
}
}
#print STDERR "Handle_while: <@statements>\n";
# First token is 'while'
iout "$cmd ";
$g_context = 'while';
# 2nd command?
if (@statements) {
$ntok += process_second_statement(1, @statements);
}
$g_context = '';
return $ntok;
}
#####################################################
sub Handle_until {
my ($cmd, @statements) = @_;
my $ntok = 1;
# First token is 'until'
iout "$cmd ";
$g_context = 'until';
( run in 2.706 seconds using v1.01-cache-2.11-cpan-2aafcb1aa8b )