Index: classes/pmc2c2.pl
===================================================================
RCS file: /cvs/public/parrot/classes/pmc2c2.pl,v
retrieving revision 1.13
diff -u -2 -r1.13 pmc2c2.pl
--- classes/pmc2c2.pl	30 Apr 2004 15:34:24 -0000	1.13
+++ classes/pmc2c2.pl	13 Aug 2004 21:36:11 -0000
@@ -50,4 +50,8 @@
 Emit an empty body in the dump. This may be useful for debugging.
 
+=item C<--include=/path/to/pmc>
+
+Specify include path where to find PMCs.
+
 =back
 
@@ -215,5 +219,4 @@
 
 use FindBin;
-use lib 'lib';
 use lib "$FindBin::Bin/..";
 use lib "$FindBin::Bin/../lib";
@@ -227,4 +230,21 @@
 main();
 
+sub find_file {
+    my $include = shift;
+    my $file = shift;
+    my $die_unless_found = shift;
+
+    foreach my $dir ( @$include ) {
+        my $path = File::Spec->catfile( $dir, $file );
+        return $path if -e $path;
+    }
+
+    die "can't find file '$file' in path '",
+      ( join "', '", @$include ), "'"
+        if $die_unless_found;
+
+    undef;
+}
+
 sub dump_default {
     my $file = "$FindBin::Bin/../vtable.tbl";
@@ -386,4 +406,5 @@
 # make a linear list of class->{parents} array
 sub gen_parent_list {
+    my $include = shift;
     my ($this, $all) = @_;
     my @todo = ($this);
@@ -397,5 +418,5 @@
             if (!$all->{$parent}) {
                 my $pf = lc $parent;
-                $all->{$parent} = read_dump("classes/$pf.pmc");
+                $all->{$parent} = read_dump($include, "$pf.pmc");
             }
             $class->{has_parent}{$parent} = { %{$all->{$parent}{has_method} }};
@@ -469,4 +490,5 @@
 
 sub dump_pmc {
+    my $include = shift;
     my @files = @_;
     my %all;
@@ -479,7 +501,7 @@
     }
 
-    my $vt = read_dump("vtable.pmc");
+    my $vt = read_dump($include, "vtable.pmc");
     if (!$all{default}) {
-        $all{default} = read_dump("classes/default.pmc");
+        $all{default} = read_dump($include, "classes/default.pmc");
     }
     add_defaulted($all{default}, $vt);
@@ -489,11 +511,10 @@
         my $file = $all{$name}->{file};
         ($dump = $file) =~ s/\.\w+$/\.dump/;
-        gen_parent_list($name, \%all);
+        gen_parent_list($include, $name, \%all);
         my $class = $all{$name};
         gen_super_meths($class, $vt);
         # XXX write default.dump only once
-        next if (  ## $dump eq 'classes/default.dump' &&
-            ((-e $dump && dump_is_newer($dump)) ||
-            (-e "../$dump"  && dump_is_newer("../$dump"))));
+        my $existing = find_file($include, $dump);
+        next if ($existing && -e $existing && dump_is_newer($existing));
         my $Dumper = Data::Dumper->new([$class], [qw(class)]);
         $Dumper->Indent(1);
@@ -506,18 +527,9 @@
 
 sub read_dump {
+    my $include = shift;
     my $file = shift;
     my $dump;
     ($dump = $file) =~ s/\.\w+$/.dump/;
-    unless ( -e $dump) {
-        if ($dump =~ m!^classes/!) {
-            $dump =~ s!^classes/!!;
-        }
-        elsif ($dump =~ m!^vtable!) {
-            $dump = "$FindBin::Bin/../vtable.dump";
-        }
-        unless ( -e $dump) {
-            $dump = "$FindBin::Bin/../classes/$dump";
-        }
-    }
+    $dump = find_file($include, $dump, 1);
     print "Reading $dump\n" if $opt{verbose};
 
@@ -534,7 +546,8 @@
 
 sub print_tree {
+    my $include = shift;
     my ($depth, @files) = @_;
     foreach my $file (@files) {
-	my $class = read_dump($file);
+	my $class = read_dump($include, $file);
 	my $name = $class->{class};
 	print "    " x $depth, $name, "\n";
@@ -547,9 +560,10 @@
 
 sub gen_c {
+    my $include = shift;
     my (@files) = @_;
     foreach my $file (@files) {
-	my $class = read_dump($file);
+	my $class = read_dump($include, $file);
         # finally append vtable.dump
-        $class->{vtable} = read_dump("vtable.pmc");
+        $class->{vtable} = read_dump($include, "vtable.pmc");
 	my $generator = Parrot::Pmc2c->new($class, \%opt);
 	print Data::Dumper->Dump([$generator]) if $opt{debug} > 1;
@@ -576,5 +590,5 @@
 
 sub main {
-    my ($default, $dump, $gen_c, $result, $tree, $debug, $verbose, $nobody, $nolines);
+    my ($default, $dump, $gen_c, $result, $tree, $debug, $verbose, $nobody, $nolines, @include);
     $result = GetOptions(
 	"vtable"        => \$default,
@@ -586,4 +600,5 @@
 	"debug+"        => \$debug,
 	"verbose+"      => \$verbose,
+        "include=s"     => \@include,
     );
     $opt{debug} = $debug || 0;
@@ -591,4 +606,5 @@
     $opt{nobody} = $nobody || 0;
     $opt{nolines} = $nolines || 0;
+    unshift @include, "$FindBin::Bin/..", $FindBin::Bin;
 
     $default and do {
@@ -597,13 +613,13 @@
     };
     $dump and do {
-	dump_pmc(@ARGV);
+	dump_pmc(\@include, @ARGV);
 	exit;
     };
     $tree and do {
-	print_tree(0, @ARGV);
+	print_tree(\@include, 0, @ARGV);
 	exit;
     };
     $gen_c and do {
-	gen_c(@ARGV);
+	gen_c(\@include, @ARGV);
 	exit;
     };
