Skip to content

Instantly share code, notes, and snippets.

@whipsch
Created April 30, 2012 04:36
Show Gist options
  • Save whipsch/2555549 to your computer and use it in GitHub Desktop.
Save whipsch/2555549 to your computer and use it in GitHub Desktop.
#!/usr/bin/perl
#
#
use warnings;
use strict;
my ($from_dir, $to_dir, $jargs) = @ARGV;
unless ($from_dir && $to_dir) {
print "usage: javapdir <from> <to> [javap args]\n";
exit 1;
}
my @dirs = ();
sub list_rec
{
my ($d, $reg, $depth) = @_;
my @list = ();
$depth = '' unless $depth;
opendir(my $dir, $d) or die "couldn't open directory $d: $!";
foreach my $entry (readdir $dir) {
next if $entry eq '.' or $entry eq '..';
if (-d $d . $entry) {
print "$depth > $d$entry\n";
push @dirs, $d . $entry . '/'; # bad!
push @list, list_rec($d . $entry . '/', $reg, $depth . ' ');
} elsif ($entry =~ /$reg/) {
push @list, $d . $entry;
}
}
closedir $dir;
return @list;
}
print "aggregating class list\n";
my @entries = list_rec($from_dir, '\.class$', '');
printf "%d total\n", scalar @entries;
foreach my $dir (@dirs) {
$dir =~ s/^$from_dir/$to_dir/;
mkdir $dir or die "couldn't make directory $dir: $!";
print " >> $dir\n";
}
foreach my $entry (@entries) {
$entry =~ s/^$from_dir//;
my $cname = $entry;
$cname =~ s/\.class$//;
$cname =~ s/\//./g;
$entry =~ s/\.class$/.txt/;
if (system("javap -classpath $from_dir $jargs $cname > $to_dir$entry") == 0) {
print " + $cname\n";
} else {
print " - $cname: $?\n";
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment