1 ################################################################################
3 # devtools.pl -- various utility functions
5 ################################################################################
9 # $Date: 2009/01/18 14:10:50 +0100 $
11 ################################################################################
13 # Version 3.x, Copyright (C) 2004-2009, Marcus Holland-Moritz.
14 # Version 2.x, Copyright (C) 2001, Paul Marquess.
15 # Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
17 # This program is free software; you can redistribute it and/or
18 # modify it under the same terms as Perl itself.
20 ################################################################################
24 eval "use Term::ANSIColor";
25 $@ and eval "sub colored { pop; @_ }";
33 s/^(.*)/colored("($0) ", 'bold blue').colored($1, 'blue')/eg for @out;
40 return $opt{verbose} ? ('--verbose') : ();
45 my $opt = ref $_[0] ? shift @_ : {};
46 my($prog, @args) = @_;
47 my $sysstr = join ' ', map { "'$_'" } $prog, @args;
48 $sysstr .= " >$opt->{'out'}" if exists $opt->{'out'};
49 $sysstr .= " 2>$opt->{'err'}" if exists $opt->{'err'};
50 verbose("running $sysstr\n");
51 my $rv = system $sysstr;
52 verbose("$prog => exit code $rv\n");
58 my $opt = ref $_[0] ? shift @_ : {};
59 runtool($opt, $^X, @_);
67 runtool({ 'out' => 'tmp.out', 'err' => 'tmp.err' }, $prog, @args);
69 my $out = IO::File->new("tmp.out") or die "tmp.out: $!\n";
70 my $err = IO::File->new("tmp.err") or die "tmp.err: $!\n";
79 unlink "tmp.out", "tmp.err";
81 $? & 128 and $rval{core} = 1;
82 $? & 127 and $rval{signal} = $? & 127;
89 return "$^X $0 @argvcopy";
94 verbose(ident_str() . "\n");
103 do { $a = <>; } while ($a !~ /^\s*([yn])\s*$/i);
109 print "\nSorry, cannot continue.\n\n";
115 quit_now unless &ask;
120 my($start, $i, $n) = @_;
121 return "--:--:--" if $i < 3;
122 my $elapsed = tv_interval($start);
123 my $h = int($elapsed*($n-$i)/$i);
124 my $s = $h % 60; $h /= 60;
125 my $m = $h % 60; $h /= 60;
126 return sprintf "%02d:%02d:%02d", $h, $m, $s;