6 if (!defined($ARGV[0])) {
7 print "usage: requires .class dump as parameter!\n";
13 untie %bcheckdb if(defined(%bcheckdb));
16 flock MYLOCK
, LOCK_UN
;
26 my ($dbkey, $dbchunk) = @_;
28 if (defined($ENV{"BCHECK_UPDATE"})) {
29 $bcheckdb{$dbkey} = $dbchunk;
33 &bailout
("BC problem detected") if (! -t STDIN
);
35 print "(I)gnore / (Q)uit / (U)pdate: ";
38 while(defined(read STDIN
, $key, 1)) {
41 print "got: >$key<\n";
43 return if ($key eq 'i');
45 &bailout
("BC problem. aborted") if ($key eq 'q');
48 $bcheckdb{$dbkey} = $dbchunk;
51 print "\n(I)gnore / (Q)uit / (U)pdate: ";
57 my ($oldl, $newl) = @_;
58 my @old = split /^/m, $oldl;
59 my @new = split /^/m, $newl;
61 my $max = $#old > $#new ?
$#old : $#new;
63 die "whoops. key different" if ($old[0] ne $new[0]);
66 warn ("Structural difference.\n");
68 print "-----------------------------------------------\n";
76 my ($class) = ($old[0] =~ /^(?:Class |Vtable for )(\S+)/);
80 my ($o, $n) = ($old[$c], $new[$c]);
86 if(defined($class) and $n =~ /^(\d+\s+)\w+(::\S+\s*.*)$/) {
87 next if ($n eq "$1$class$2");
98 local $dblock = $ENV{"HOME"} . "/bcheck.lock";
99 my $dbfile = $ENV{"HOME"} . "/bcheck.db";
100 my $cdump = $ARGV[0];
102 die "file $cdump is not readable: $!" if (! -f
$cdump);
104 # make sure the advisory lock exists
105 open(MYLOCK
, ">$dblock");
108 flock MYLOCK
, LOCK_EX
;
110 tie
%bcheckdb, 'DB_File', $dbfile;
114 open (IN
, "<$cdump") or die "cannot open $cdump: $!";
119 s/0x[0-9a-fA-F]+/0x......../g;
120 s/base size=/size=/g;
121 s/base align=/align=/g;
126 my @lines = split /^/m, $chunk;
130 if($key !~ /<anonymous struct>/ &&
131 $key !~ /<anonymous union>/) {
132 if(defined($bcheckdb{$key})) {
133 my $dbversion = $bcheckdb{$key};
135 if($dbversion ne $chunk) {
136 &ask_user
($key, $chunk) if(&diff_chunk
($dbversion, $chunk));
140 $bcheckdb{$key} = $chunk;
153 flock MYLOCK
, LOCK_UN
;