This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
More punctuation, good.
[perl5.git] / utils / pl2pm.PL
1 #!/usr/local/bin/perl
2
3 use Config;
4 use File::Basename qw(&basename &dirname);
5 use Cwd;
6
7 # List explicitly here the variables you want Configure to
8 # generate.  Metaconfig only looks for shell variables, so you
9 # have to mention them as if they were shell variables, not
10 # %Config entries.  Thus you write
11 #  $startperl
12 # to ensure Configure will look for $Config{startperl}.
13
14 # This forces PL files to create target in same directory as PL file.
15 # This is so that make depend always knows where to find PL derivatives.
16 $origdir = cwd;
17 chdir dirname($0);
18 $file = basename($0, '.PL');
19 $file .= '.com' if $^O eq 'VMS';
20
21 open OUT,">$file" or die "Can't create $file: $!";
22
23 print "Extracting $file (with variable substitutions)\n";
24
25 # In this section, perl variables will be expanded during extraction.
26 # You can use $Config{...} to use Configure variables.
27
28 print OUT <<"!GROK!THIS!";
29 $Config{startperl}
30     eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
31         if \$running_under_some_shell;
32 !GROK!THIS!
33
34 # In the following, perl variables are not expanded during extraction.
35
36 print OUT <<'!NO!SUBS!';
37
38 =head1 NAME
39
40 pl2pm - Rough tool to translate Perl4 .pl files to Perl5 .pm modules.
41
42 =head1 SYNOPSIS
43
44 B<pl2pm> F<files>
45
46 =head1 DESCRIPTION
47
48 B<pl2pm> is a tool to aid in the conversion of Perl4-style .pl
49 library files to Perl5-style library modules.  Usually, your old .pl
50 file will still work fine and you should only use this tool if you
51 plan to update your library to use some of the newer Perl 5 features,
52 such as AutoLoading.
53
54 =head1 LIMITATIONS
55
56 It's just a first step, but it's usually a good first step.
57
58 =head1 AUTHOR
59
60 Larry Wall <larry@wall.org>
61
62 =cut
63
64 use strict;
65 use warnings;
66
67 my %keyword = ();
68
69 while (<DATA>) {
70     chomp;
71     $keyword{$_} = 1;
72 }
73
74 local $/;
75
76 while (<>) {
77     my $newname = $ARGV;
78     $newname =~ s/\.pl$/.pm/ || next;
79     $newname =~ s#(.*/)?(\w+)#$1\u$2#;
80     if (-f $newname) {
81         warn "Won't overwrite existing $newname\n";
82         next;
83     }
84     my $oldpack = $2;
85     my $newpack = "\u$2";
86     my @export = ();
87
88     s/\bstd(in|out|err)\b/\U$&/g;
89     s/(sub\s+)(\w+)(\s*\{[ \t]*\n)\s*package\s+$oldpack\s*;[ \t]*\n+/${1}main'$2$3/ig;
90     if (/sub\s+\w+'/) {
91         @export = m/sub\s+\w+'(\w+)/g;
92         s/(sub\s+)main'(\w+)/$1$2/g;
93     }
94     else {
95         @export = m/sub\s+([A-Za-z]\w*)/g;
96     }
97     my @export_ok = grep($keyword{$_}, @export);
98     @export = grep(!$keyword{$_}, @export);
99
100     my %export = ();
101     @export{@export} = (1) x @export;
102
103     s/(^\s*);#/$1#/g;
104     s/(#.*)require ['"]$oldpack\.pl['"]/$1use $newpack/;
105     s/(package\s*)($oldpack)\s*;[ \t]*\n+//ig;
106     s/([\$\@%&*])'(\w+)/&xlate($1,"",$2,$newpack,$oldpack,\%export)/eg;
107     s/([\$\@%&*]?)(\w+)'(\w+)/&xlate($1,$2,$3,$newpack,$oldpack,\%export)/eg;
108     if (!/\$\[\s*\)?\s*=\s*[^0\s]/) {
109         s/^\s*(local\s*\()?\s*\$\[\s*\)?\s*=\s*0\s*;[ \t]*\n//g;
110         s/\$\[\s*\+\s*//g;
111         s/\s*\+\s*\$\[//g;
112         s/\$\[/0/g;
113     }
114     s/open\s+(\w+)/open($1)/g;
115  
116     my $export_ok = '';
117     my $carp      ='';
118
119
120     if (s/\bdie\b/croak/g) {
121         $carp = "use Carp;\n";
122         s/croak "([^"]*)\\n"/croak "$1"/g;
123     }
124
125     if (@export_ok) {
126         $export_ok = "\@EXPORT_OK = qw(@export_ok);\n";
127     }
128
129     if ( open(PM, ">$newname") ) {
130         print PM <<"END";
131 package $newpack;
132 use 5.006;
133 require Exporter;
134 $carp
135 \@ISA = qw(Exporter);
136 \@EXPORT = qw(@export);
137 $export_ok
138 $_
139 END
140     }
141     else {
142       warn "Can't create $newname: $!\n";
143     }
144 }
145
146 sub xlate {
147     my ($prefix, $pack, $ident,$newpack,$oldpack,$export) = @_;
148
149     my $xlated ;
150     if ($prefix eq '' && $ident =~ /^(t|s|m|d|ing|ll|ed|ve|re)$/) {
151         $xlated = "${pack}'$ident";
152     }
153     elsif ($pack eq '' || $pack eq 'main') {
154         if ($export->{$ident}) {
155             $xlated = "$prefix$ident";
156         }
157         else {
158             $xlated = "$prefix${pack}::$ident";
159         }
160     }
161     elsif ($pack eq $oldpack) {
162         $xlated = "$prefix${newpack}::$ident";
163     }
164     else {
165         $xlated = "$prefix${pack}::$ident";
166     }
167
168     return $xlated;
169 }
170 __END__
171 AUTOLOAD
172 BEGIN
173 CORE
174 DESTROY
175 END
176 INIT
177 CHECK
178 abs
179 accept
180 alarm
181 and
182 atan2
183 bind
184 binmode
185 bless
186 caller
187 chdir
188 chmod
189 chomp
190 chop
191 chown
192 chr
193 chroot
194 close
195 closedir
196 cmp
197 connect
198 continue
199 cos
200 crypt
201 dbmclose
202 dbmopen
203 defined
204 delete
205 die
206 do
207 dump
208 each
209 else
210 elsif
211 endgrent
212 endhostent
213 endnetent
214 endprotoent
215 endpwent
216 endservent
217 eof
218 eq
219 eval
220 exec
221 exists
222 exit
223 exp
224 fcntl
225 fileno
226 flock
227 for
228 foreach
229 fork
230 format
231 formline
232 ge
233 getc
234 getgrent
235 getgrgid
236 getgrnam
237 gethostbyaddr
238 gethostbyname
239 gethostent
240 getlogin
241 getnetbyaddr
242 getnetbyname
243 getnetent
244 getpeername
245 getpgrp
246 getppid
247 getpriority
248 getprotobyname
249 getprotobynumber
250 getprotoent
251 getpwent
252 getpwnam
253 getpwuid
254 getservbyname
255 getservbyport
256 getservent
257 getsockname
258 getsockopt
259 glob
260 gmtime
261 goto
262 grep
263 gt
264 hex
265 if
266 index
267 int
268 ioctl
269 join
270 keys
271 kill
272 last
273 lc
274 lcfirst
275 le
276 length
277 link
278 listen
279 local
280 localtime
281 lock
282 log
283 lstat
284 lt
285 m
286 map
287 mkdir
288 msgctl
289 msgget
290 msgrcv
291 msgsnd
292 my
293 ne
294 next
295 no
296 not
297 oct
298 open
299 opendir
300 or
301 ord
302 our
303 pack
304 package
305 pipe
306 pop
307 pos
308 print
309 printf
310 prototype
311 push
312 q
313 qq
314 qr
315 quotemeta
316 qw
317 qx
318 rand
319 read
320 readdir
321 readline
322 readlink
323 readpipe
324 recv
325 redo
326 ref
327 rename
328 require
329 reset
330 return
331 reverse
332 rewinddir
333 rindex
334 rmdir
335 s
336 scalar
337 seek
338 seekdir
339 select
340 semctl
341 semget
342 semop
343 send
344 setgrent
345 sethostent
346 setnetent
347 setpgrp
348 setpriority
349 setprotoent
350 setpwent
351 setservent
352 setsockopt
353 shift
354 shmctl
355 shmget
356 shmread
357 shmwrite
358 shutdown
359 sin
360 sleep
361 socket
362 socketpair
363 sort
364 splice
365 split
366 sprintf
367 sqrt
368 srand
369 stat
370 study
371 sub
372 substr
373 symlink
374 syscall
375 sysopen
376 sysread
377 sysseek
378 system
379 syswrite
380 tell
381 telldir
382 tie
383 tied
384 time
385 times
386 tr
387 truncate
388 uc
389 ucfirst
390 umask
391 undef
392 unless
393 unlink
394 unpack
395 unshift
396 untie
397 until
398 use
399 utime
400 values
401 vec
402 wait
403 waitpid
404 wantarray
405 warn
406 while
407 write
408 x
409 xor
410 y
411 !NO!SUBS!
412
413 close OUT or die "Can't close $file: $!";
414 chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
415 exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
416 chdir $origdir;