#!/usr/bin/perl use strict; use warnings; use Getopt::Long; my $type; GetOptions( "type=s" => \$type ); if (not defined $type) { print STDERR "Usage: ./depchart.pl -type=TYPE < FILE | dot ...\n"; exit(); } my $last_defined = -1; my %parent = (); my %name = (); while () { if (/[^\/]*begindefine$type\s+(\d+)/) { $parent{$1} = $last_defined; $last_defined = $1; } elsif (/[^\/]*begindefine/) { $last_defined = -1; } elsif (/[^\/]*import\s*=\s*(\d+)/ && $last_defined != -1) { $parent{$last_defined} = $1; } elsif (/[^\/]*name\s*=\s*"(.+)"/ && $last_defined != -1) { $name{$last_defined} = $1; } } print "digraph tree {\n"; foreach (sort {$a <=> $b} keys %parent) { if ($parent{$_} != -1) { my $name = defined $name{$_} ? $name{$_} : ""; my $parent_name = defined $name{$parent{$_}} ? $name{$parent{$_}} : ""; print "\"$name ($_)\" -> \"$parent_name ($parent{$_})\"\n"; } } print "}\n";