Files
paparazzi/tests/lib/Program.pm
Bernard Davison 49dcc05093 Some basic tests to check that Paparazzi compiled.
Some tests that check that the compile of the airframe config works as well as the upload of that airframe to a target board.
2012-03-05 12:11:05 +11:00

305 lines
6.0 KiB
Perl

=head1 SYNOPSIS
use Program;
my $m_program = new Program('ls');
=head1 DESCRIPTION
Program is a generic program wrapper that allows easy use of programs on
multipul platforms with the correct file handle redirection.
=head1 FUNCTIONS
=cut
package Program;
###################
# Standard Modules
use strict;
use Config;
use FileHandle;
###################
# Variables
use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
@ISA = qw();
@EXPORT = qw();
@EXPORT_OK = qw();
$VERSION = 0.04;
# This hash contains the values for redirection.
my %m_redirect_values;
# Standard values
$m_redirect_values{'none'} = '';
$m_redirect_values{'stdout&stderr2stdout'} = '2>&1';
$m_redirect_values{'stdout&stderr2stderr'} = '1>&2';
$m_redirect_values{'stdout2stderr&stderr2stdout'} = '3>&1 1>&2 2>&3 3>&-';
# Platform specific values
if ($Config{'osname'} eq 'MSWin32')
{
if ($Config{'osvers'} ge 4.0)
{
$m_redirect_values{'stdout2stdnull'} = '1>NUL';
$m_redirect_values{'stderr2stdnull'} = '2>NUL';
}
else
{
$m_redirect_values{'stdout2stdnull'} = '1>';
$m_redirect_values{'stderr2stdnull'} = '2>';
}
}
else
{
$m_redirect_values{'stdout2stdnull'} = '1>/dev/null';
$m_redirect_values{'stderr2stdnull'} = '2>/dev/null';
}
###################
# Functions
################################################################################
# Function: new()
=head2 B<new()>
Description: This method returns an objective interface the the passed program.
Arguments: $program
Return: class
Usage: my $ls = new Program('ls');
=cut
sub new
{
my $class = shift;
my $program = shift;
my $self = bless {}, $class;
$self->{'PROGRAM'} = $program;
$self->{'CHOMP'} = 1;
$self->{'REDIRECT'} = 'stdout&stderr2stdout';
$self->{'LAST_COMMAND'} = "No commands have been executed yet.";
$self->{'EXIT_STATUS'} = 0;
return $self;
}
################################################################################
# Function: strip_new_lines()
=head2 B<strip_new_lines()>
Description: This functions is used to set wether the output from a command
has trailing new lines removed.
Arguments: 0 to turn chomping off
1 to turn chomping on
Default: 1
Return: true if chomping is on else undef
Usage: $ls->strip_new_lines(1);
$ls->strip_new_lines(0);
=cut
sub strip_new_lines
{
my $self = shift;
my $value = shift;
if (scalar $value)
{
$self->{'CHOMP'} = $value;
}
else
{
return $self->{'CHOMP'};
}
}
################################################################################
# Function: redirect()
=head2 B<redirect()>
Description: This functions is used to set the STDOUT and STDERR redirection
for commands executed by the program.
Arguments: possible values are stdout&stderr2stdout, stdout&stderr2stderr
stdout2stderr&stderr2stdout, stdout2stdnull, stderr2stdnull
Default: sdtout&stderr2stdout
Return: redirection option if nothing passed else set the redirection
Usage: $ls->redirect('stderr2sdtnull');
=cut
sub redirect
{
my $self = shift;
my $value = shift;
if (scalar $value)
{
$self->{'REDIRECT'} = $value;
}
else
{
return $m_redirect_values{$self->{'REDIRECT'}};
}
}
################################################################################
# Function: last_command()
=head2 B<last_command()>
Description: This function returns the last command executed.
Arguments: None.
Return: The last command
Usage: print $ls->last_command();
=cut
sub last_command
{
my $self = shift;
return $self->{'LAST_COMMAND'};
}
################################################################################
# Function: output()
=head2 B<output()>
Description: This function returns the output from a program.
Arguments: command to execute.
Return: array if called in an array context else string
Usage: my $output = $ls->output("-l");
my @output = $ls->output("-l");
=cut
sub output
{
my $self = shift;
my $command = shift;
my $exec_command = "$self->{'PROGRAM'} $command " . $self->redirect();
$self->{'LAST_COMMAND'} = $exec_command;
my @output_list;
my $output_line;
if (wantarray)
{
@output_list = `$exec_command`;
foreach my $line (@output_list)
{
chomp $line if $self->strip_new_lines();
}
}
else
{
$output_line = `$exec_command`;
chomp $output_line if $self->strip_new_lines();
}
$self->{'EXIT_STATUS'} = $?/256;
return wantarray ? @output_list : $output_line;
}
################################################################################
# Function: status()
=head2 B<status()>
Description: This function returns the exit status of the last
command.
Arguments: None.
Return: exit status.
Usage: my $status = $ls->status();
=cut
sub status
{
my $self = shift;
return $self->{'EXIT_STATUS'};
}
################################################################################
# Function: success()
=head2 B<success()>
Description: This function returns true if the last command was successful
Arguments: None.
Return: true for success else undef.
Usage: if ($ls->success())
{
Print "Success\n";
}
else
{
Print "Failure\n";
}
=cut
sub success
{
my $self = shift;
return 1 if $self->status() eq 0;
return undef
}
################################################################################
# Function: open()
=head2 B<open()>
Description: This function returns an open file handle for the passed command
NOTE: Since the exit status of the file handle cannot be
retrieved by this module the user must check the exit status of
the file handle using the $fh->error() method. See IO::Handle.
Arguments: command to execute.
Return: open file handle.
Usage: my $fh = $ls->open("-l)
while (<$fh>)
{
print "$_\n";
}
=cut
sub open
{
my $self = shift;
my $command = shift;
my $exec_command = "$self->{'PROGRAM'} $command " . $self->redirect() ." |";
$self->{'LAST_COMMAND'} = $exec_command;
$self->{'EXIT_STATUS'} = 0;
my $fh = new FileHandle($exec_command);
return $fh;
}
1;
__END__
=head1 SEE ALSO
FileHandle
=head1 AUTHOR
Bernard Davison bernard@gondwana.com.au
=head1 COPYRIGHT
Copyright (C) 2000, Gondwanatech.
=cut