Prepare for git repository
[spider.git] / perl / Script.pm
index 3128dcde6486021bdce8ef15379f70f505108873..05f408eca6daa26e82289de97da5ac29233e7e6c 100644 (file)
@@ -17,23 +17,34 @@ use DXCommandmode;
 use DXVars;
 use IO::File;
 
-use vars qw($VERSION $BRANCH);
-$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
-$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/  || (0,0));
-$main::build += $VERSION;
-$main::branch += $BRANCH;
-
 my $base = "$main::root/scripts";
 
+sub clean
+{
+       my $s = shift;
+       $s =~ s/[^-\w\.]//g;
+       return $s;
+}
+
 sub new
 {
        my $pkg = shift;
-       my $script = shift;
-       my $fn = "$base/$script";
+       my $script = clean(shift);
+       my $mybase = shift || $base;
+       my $fn = "$mybase/$script";
 
-       my $fh = new IO::File $fn;
-       return undef unless $fh;
-       my $self = bless {call => $script}, $pkg;
+       my $self = {call => $script};
+       my $fh = IO::File->new($fn);
+       if ($fh) {
+               $self->{fn} = $fn;
+       } else {
+               $fh = IO::File->new(lc $fn);
+               if ($fh) {
+                       $self->{fn} = $fn;
+               } else {
+                       return undef;
+               }
+       }
        my @lines;
        while (<$fh>) {
                chomp;
@@ -41,22 +52,71 @@ sub new
        }
        $fh->close;
        $self->{lines} = \@lines;
-       return $self;
+       $self->{inscript} = 1;
+       return bless $self, $pkg;
 }
 
 sub run
 {
        my $self = shift;
        my $dxchan = shift;
+       my $return_output = shift;
+       my @out;
+       
        foreach my $l (@{$self->{lines}}) {
                unless ($l =~ /^\s*\#/ || $l =~ /^\s*$/) {
-                       my @out = DXCommandmode::run_cmd($dxchan, $l);
-                       if ($dxchan->can('send_ans')) {
-                               $dxchan->send_ans(@out);
-                       } else {
-                               dbg($_) for @out;
-                       }
+                       $dxchan->inscript(1) if $self->{inscript};
+                       push @out, DXCommandmode::run_cmd($dxchan, $l);
+                       $dxchan->inscript(0) if $self->{inscript};
                        last if @out && $l =~ /^pri?v?/i;
                }
        }
+       if ($return_output) {
+               return @out;
+       } else {
+               if ($dxchan->can('send_ans')) {
+                       $dxchan->send_ans(@out);
+               } else {
+                       dbg($_) for @out;
+               }
+       }
+       return ();
+}
+
+sub inscript
+{
+       my $self = shift;
+       $self->{inscript} = shift if @_;
+       return $self->{inscript};
+}
+
+sub store
+{
+       my $call = clean(lc shift);
+       my @out;
+       my $ref = ref $_[0] ? shift : \@_;
+       my $count;
+       my $fn = "$base/$call";
+
+    rename $fn, "$fn.o" if -e $fn;
+       my $f = IO::File->new(">$fn") || return undef;
+       for (@$ref) {
+               $f->print("$_\n");
+               $count++;
+       }
+       $f->close;
+       unlink $fn unless $count;
+       return $count;
+}
+
+sub lines
+{
+       my $self = shift;
+       return @{$self->{lines}};
+}
+
+sub erase
+{
+       my $self = shift;
+       unlink $self->{fn};
 }