1#!/usr/bin/env perl
2
3use warnings;
4use strict;
5
6#---------------------------------------------------------------------
7# A list of files specific to the tool at hand. Line numbers in
8# these files will be removed from backtrace entries matching these files.
9#---------------------------------------------------------------------
10my @tool_files = ( "vg_replace_strmem.c", "vg_replace_malloc.c" );
11
12
13sub massage_backtrace_line ($$$) {
14    my ($line, $tool_files, $cmdlin_files) = @_;
15    my ($string, $qstring);
16
17# If LINE matches any of the file names passed on the command line
18# (i.e. in CMDLIN_FILES) return LINE unmodified.
19
20    foreach $string (@$cmdlin_files) {
21        $qstring = quotemeta($string);
22        return $line if ($line =~ /$qstring/);
23    }
24
25# If LINE matches any of the file names in TOOL_FILES remove the line
26# number and return the so modified line.
27
28    foreach $string (@$tool_files) {
29        $qstring = quotemeta($string);
30        return $line if ($line =~ s/$qstring:[0-9]+/$string:.../m);
31# Special case for functions whose line numbers have been removed in 
32# filter_stderr_basic. FIXME: filter_stderr_basic should not do that.
33        return $line if ($line =~ s/$qstring:\.\.\./$string:.../m);
34    }
35
36# Did not match anything
37    $line =~ s/[\w]+.*/.../m;
38
39    return "$line";
40}
41
42
43#---------------------------------------------------------------------
44# Process lines. Two categories
45# (a) lines from back traces
46#     pass through those lines that contain file names we're interested in
47# (b) everything else
48#     pass through as is
49#---------------------------------------------------------------------
50my $prev_line = "";
51while (<STDIN>) {
52    my $line = $_;
53    chomp($line);
54    if ($line =~ /^\s+(at |by )/)  {   # lines in a back trace
55        $line = massage_backtrace_line($line, \@tool_files, \@ARGV);
56        if ($line =~ /\s+\.\.\./) {
57            print "$line\n" if ($prev_line !~ /\s+\.\.\./);
58        } else {
59            print "$line\n";
60        }
61    } else {
62        print "$line\n";  # everything else
63    }
64    $prev_line = $line
65}
66
67exit 0;
68