#!/usr/bin/perl # debug.pl # by Richard Lawrence (silver@ewtoo.org) use strict; my $mode = 0; my $prevline; # these shouldn't have any calls to ENTERFUNCTION or EXITFUNCTION my @functions = qw(get_string get_string_safe get_int get_int_safe send_to_debug end_string addstack endstack debug_wall); open(FILE, "$ARGV[0]") || die "can't open: $ARGV[0]: $!"; while(<FILE>) { chomp; if (/^[\S ]+?\s{10}.+?(\S+?)\(/ && $mode == 0) { unless (dont_log($1)) { $mode = 1; } print "$_\n"; } elsif (/^\{$/ && $mode == 1) { $mode = 2; print "$_\n"; } elsif ($mode == 2) { if (!$_) { print "$_\n"; } else { unless (/^ \S[\S ]+?\s{10}.+?;.*$/) { if (/ENTERFUNCTION/) { # we've already tagged this function so ignore $mode = 0; print "$_\n"; } else { print "ENTERFUNCTION;\n"; $mode = 3; print "$_\n"; } } else { print "$_\n"; } } } elsif (/^\s+?(return.*?;)$/ && $mode == 3) { my $ret = $1; if ($prevline =~ /^\s+?if\s*\(/ || $prevline =~ /^\s+?else.*/) { print "{ EXITFUNCTION; "; print "$ret }\n"; } else { print "EXITFUNCTION;\n$1\n"; } } elsif (/^\}$/) { if ($mode == 3) { # don't display a leave if the last thing called was a return # ie. we've returned at the end of a function unless ($prevline =~ /^\s+?(return.*?;)$/) { print "EXITFUNCTION;\n"; } } $mode = 0; print "$_\n"; } else { print "$_\n"; } $prevline = $_; } exit; sub dont_log { my $chk = $_[0]; $chk =~ tr/A-Z/a-z/; foreach my $fn (@functions) { $fn =~ tr/A-Z/a-z/; return 1 if ($chk eq $fn); } return 0; }