#! /usr/bin/perl -w # Copyright (C) 2006 Benoit Sigoure <[email protected]>. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, # USA. use strict; # Oh yeah, spank me baby! use File::Basename; # Let's try -in vain- to get non-buffered output. my $old_select = select STDOUT; $| = 1; # Don't buffer output. select STDERR; $| = 1; select $old_select; if ($#ARGV < 0) { print STDERR "Usage: $0 [-c] prognam [args]\n"; print STDERR "The -c argument is ignored (compatibility with sh -c).\n"; exit 1; } shift if $ARGV[0] eq '-c'; my $orig_cmd = "@ARGV"; # correct_args(progname, replacement-list) # If $ARGV[0] is progname or matches progname, it is replaced by # replacement-list. sub correct_args($@) { my ($progname, @replacement) = @_; if ($ARGV[0] eq $progname) { shift(@ARGV); unshift(@ARGV, @replacement); return 1; } elsif ($ARGV[0] =~ / *$progname +/) { $ARGV[0] =~ s/ *$progname +//; unshift(@ARGV, @replacement); return 1; } return 0; } # unixify(string) # Returns the string with the backslashes transformed in slashes where # necessary. Some lines are commented for debugging. sub unixify($) { my $orig = shift; my @str = split(//, $orig); my $dst = ''; my $c = 'x'; my $n = $#str; #print "Orig string<$n>: $orig\n"; for (my $i = 0; $i <= $n; ++$i) { $c = $str[$i]; if ($c eq '\'') { #print "String start: $i\n"; $dst .= $c; ++$i; while ($i <= $n && $str[$i] ne "'") { #print ">String[$i]: $str[$i]\n"; $dst .= $str[$i++]; } $dst .= '\'' if $i <= $n; #print "String end: $i\n"; } else { if ($c eq '\\') { if ($str[$i + 1] =~ /[\\'"$ `|*&?]/) { #print "Char[$i, ", $i + 1, "]: \\$str[$i + 1]\n"; $dst .= '\\' . $str[++$i]; } else { $dst .= '/'; #print "Char[$i]: \\ -> /\n"; } } else { #print "Char[$i]: $c\n"; $dst .= $c; } } } return $dst; } # $(SHELL) was invoked (eg, for libtool) forward the call to sh: correct_args('.*perl.*' . basename($0), 'sh'); # Transform windows utils in UNIX utils: correct_args('del', 'rm', '-f'); correct_args('byacc', 'bison'); correct_args('copy /y', 'cp', '-f', '-p'); correct_args('xcopy /s /q /y /i', 'cp', '-r', '-f', '-p'); correct_args('move', 'mv', '-f'); correct_args('if not exist', 'test', '-d') && map s/mkdir/|| mkdir/, @ARGV; # Final step: my $cmd = unixify("@ARGV"); if ($cmd ne $orig_cmd) { #print STDOUT "$0: Original command: $orig_cmd\n"; print STDOUT "$0: Rewrote the command to: $cmd\n"; } exec $cmd or exit $!;