source: trunk/essentials/dev-lang/perl/win32/bin/pl2bat.pl@ 3299

Last change on this file since 3299 was 3181, checked in by bird, 19 years ago

perl 5.8.8

File size: 12.5 KB
Line 
1 eval 'exec perl -x -S "$0" ${1+"$@"}'
2 if 0; # In case running under some shell
3
4require 5;
5use Getopt::Std;
6use Config;
7
8$0 =~ s|.*[/\\]||;
9
10my $usage = <<EOT;
11Usage: $0 [-h]
12 or: $0 [-w] [-u] [-a argstring] [-s stripsuffix] [files]
13 or: $0 [-w] [-u] [-n ntargs] [-o otherargs] [-s stripsuffix] [files]
14 -n ntargs arguments to invoke perl with in generated file
15 when run from Windows NT. Defaults to
16 '-x -S %0 %*'.
17 -o otherargs arguments to invoke perl with in generated file
18 other than when run from Windows NT. Defaults
19 to '-x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9'.
20 -a argstring arguments to invoke perl with in generated file
21 ignoring operating system (for compatibility
22 with previous pl2bat versions).
23 -u update files that may have already been processed
24 by (some version of) pl2bat.
25 -w include "-w" on the /^#!.*perl/ line (unless
26 a /^#!.*perl/ line was already present).
27 -s stripsuffix strip this suffix from file before appending ".bat"
28 Not case-sensitive
29 Can be a regex if it begins with `/'
30 Defaults to "/\.plx?/"
31 -h show this help
32EOT
33
34my %OPT = ();
35warn($usage), exit(0) if !getopts('whun:o:a:s:',\%OPT) or $OPT{'h'};
36# NOTE: %0 is already enclosed in doublequotes by cmd.exe, as appropriate
37$OPT{'n'} = '-x -S %0 %*' unless exists $OPT{'n'};
38$OPT{'o'} = '-x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9' unless exists $OPT{'o'};
39$OPT{'s'} = '/\\.plx?/' unless exists $OPT{'s'};
40$OPT{'s'} = ($OPT{'s'} =~ m#^/([^/]*[^/\$]|)\$?/?$# ? $1 : "\Q$OPT{'s'}\E");
41
42my $head;
43if( defined( $OPT{'a'} ) ) {
44 $head = <<EOT;
45 \@rem = '--*-Perl-*--
46 \@echo off
47 perl $OPT{'a'}
48 goto endofperl
49 \@rem ';
50EOT
51} else {
52 $head = <<EOT;
53 \@rem = '--*-Perl-*--
54 \@echo off
55 if "%OS%" == "Windows_NT" goto WinNT
56 perl $OPT{'o'}
57 goto endofperl
58 :WinNT
59 perl $OPT{'n'}
60 if NOT "%COMSPEC%" == "%SystemRoot%\\system32\\cmd.exe" goto endofperl
61 if %errorlevel% == 9009 echo You do not have Perl in your PATH.
62 if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
63 goto endofperl
64 \@rem ';
65EOT
66}
67$head =~ s/^\t//gm;
68my $headlines = 2 + ($head =~ tr/\n/\n/);
69my $tail = "\n__END__\n:endofperl\n";
70
71@ARGV = ('-') unless @ARGV;
72
73foreach ( @ARGV ) {
74 process($_);
75}
76
77sub process {
78 my( $file )= @_;
79 my $myhead = $head;
80 my $linedone = 0;
81 my $taildone = 0;
82 my $linenum = 0;
83 my $skiplines = 0;
84 my $line;
85 my $start= $Config{startperl};
86 $start= "#!perl" unless $start =~ /^#!.*perl/;
87 open( FILE, $file ) or die "$0: Can't open $file: $!";
88 @file = <FILE>;
89 foreach $line ( @file ) {
90 $linenum++;
91 if ( $line =~ /^:endofperl\b/ ) {
92 if( ! exists $OPT{'u'} ) {
93 warn "$0: $file has already been converted to a batch file!\n";
94 return;
95 }
96 $taildone++;
97 }
98 if ( not $linedone and $line =~ /^#!.*perl/ ) {
99 if( exists $OPT{'u'} ) {
100 $skiplines = $linenum - 1;
101 $line .= "#line ".(1+$headlines)."\n";
102 } else {
103 $line .= "#line ".($linenum+$headlines)."\n";
104 }
105 $linedone++;
106 }
107 if ( $line =~ /^#\s*line\b/ and $linenum == 2 + $skiplines ) {
108 $line = "";
109 }
110 }
111 close( FILE );
112 $file =~ s/$OPT{'s'}$//oi;
113 $file .= '.bat' unless $file =~ /\.bat$/i or $file =~ /^-$/;
114 open( FILE, ">$file" ) or die "Can't open $file: $!";
115 print FILE $myhead;
116 print FILE $start, ( $OPT{'w'} ? " -w" : "" ),
117 "\n#line ", ($headlines+1), "\n" unless $linedone;
118 print FILE @file[$skiplines..$#file];
119 print FILE $tail unless $taildone;
120 close( FILE );
121}
122__END__