forked from rurban/safeclib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
gcov-upd.pl
executable file
·121 lines (113 loc) · 3.03 KB
/
gcov-upd.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#!/usr/bin/perl
=head1 DESCRIPTION
parse the stderr output of gcov for each src file:
File 'str/sprintf_s.c'
Lines executed:90.32% of 31
and update each test file with the new coverage,
printing changes from previous runs.
=cut
use File::Basename qw(dirname basename);
my $file = shift || die "missing input file";
open my $f, "<", $file || die "cannot read input file: $!";
my ($src, $test, $gcov, %warned);
while (<$f>) {
if (/^File '(.*)'/) {
$src = $1;
if ($src =~ /test_/) {
$src = undef;
}
}
elsif (/^Lines executed:(.*)\n/) {
$gcov = $1;
$test = basename $src;
$test = "tests/test_$test";
if (-e $test && $src && $gcov) {
upd_test($test, $src, $gcov);
} elsif (!exists $warned{$test}) {
if (!-e $test) {
warn "Missing $test for $src $gcov\n";
} elsif (!$src) {
warn "Missing src for $test $gcov\n";
} elsif ($gcov) {
warn "Missing gcov for $test $src\n";
}
$warned{$test}++;
}
}
}
close $f;
sub upd_test {
my ($file, $src, $gcov) = @_; # 2 lines, like
#str/sprintf_s.c
#90.32% of 31
my $t;
if (!open $t, "<", $file) {
warn "cannot read test file $file\n";
return;
}
my $base = basename $file;
$base =~ s/\.c$//;
my $out = $file . ".tmp";
open my $o, ">", $out || die "cannot write tmp file $file\n";
my $found;
$. = 0;
while (<$t>) {
print $o $_;
if (!$found) {
if ($. < 3 && /^\s*\*\s*\Q$base\E/) {
# read next line to see if its already there
$_ = <$t>;
if (/^ \* File/) {
print $o $_;
$_ = <$t>; # read cov
my ($old) = $_ =~ /Lines executed:(.*)\n/;
if ($old ne $gcov) {
printf STDERR "%-24s\t%s => %s\n", $src, $old, $gcov;
if ($gcov =~ /^0.00/) {
$gcov = $old;
} else {
$changed++;
}
} else {
printf STDERR "%-24s\t%s\n", $src, $gcov;
}
print $o " * Lines executed:$gcov\n";
} else {
$changed++;
print $o " * File '$src'\n";
print $o " * Lines executed:$gcov\n";
print $o $_;
printf STDERR "%-24s\t%s\n", $src, $gcov;
}
$found++;
next;
} elsif ($. >= 3) {
$changed++;
if (/^\s*\*/) {
print $o " * File '$src'\n";
print $o " * Lines executed:$gcov\n";
printf STDERR "%-24s\t%s\n", $src, $gcov;
$found++;
next;
} else {
print $o "/*------------------------------------------------------------------\n";
print $o " * $base\n";
print $o " * File '$src'\n";
print $o " * Lines executed:$gcov\n";
print $o " *\n *------------------------------------------------------------------\n*/\n";
printf STDERR "%-24s\t%s\n", $src, $gcov;
$found++;
next;
}
}
}
}
close $t;
close $o;
if ($changed) {
rename $file, $file."~";
rename $out, $file;
} else {
unlink $out;
}
}