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
| #!/usr/bin/perl
#
# Copyright 2016 by Bill Torpey. All Rights Reserved.
# This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 United States License.
# http://creativecommons.org/licenses/by-nc-nd/3.0/us/deed.en
#
use strict;
###############################################################
# trims quotes, leading & trailing spaces from a string
sub trim
{
my @out = @_;
for (@out) {
s/^\s+//;
s/\s+$//;
s/"//g;
}
return wantarray ? @out : $out[0];
}
###############################################################
# get cmd line args
use Getopt::Long qw(:config pass_through);
# relative path to strip from full path
my $relative_path;
GetOptions('r=s' => \$relative_path);
local *INFILE;
if (defined($ARGV[0])) {
open(INFILE, "<:crlf", "$ARGV[0]") or die "Cant open $ARGV[0]\n";
}
else {
*INFILE = *STDIN;
}
while (<INFILE>) {
($_ =~ /[^"]ERROR:/i) || next; # skip lines that are not relevant comments
my @tokens = split(" ", $_);
my @filename = split(':', shift @tokens);
my $filename = $filename[0] . ':' . $filename [1];
defined $relative_path && $filename =~ s/$relative_path//;
$filename = trim($filename);
$filename =~ s/^\.\.\///; # remove leading "../" from path
$filename =~ s/^\.\///; # remove leading "./" from path
# parse out the relevant comments: "/*ERROR: .... */", etc.
my $index = -1;
for my $i (1 .. $#tokens) {
if ($tokens[$i] =~ /\/\*/) {
$index = $i;
}
}
my @message;
if ($index > 0) {
@message = @tokens[$index..$#tokens];
}
if (@message) {
my $message = trim(join(" ", @message));
print "\"$filename\",\"$message\"\n";
}
}
close(INFILE);
0;
|