Confessions of a Wall Street Programmer

practical ideas (and perhaps some uncommon knowledge) on software architecture, design, construction and testing

clang2csv.pl

This script takes the output from clang-check or clang-tidy and formats it in csv format.

Usage

clang2csv.pl [-r relative_path] [file]

Parameters

Parameter Description
-r relative_path If specified, relative_path is stripped from the output. This makes it easier to compare results between different directories.
file Specifies the input file. If omitted, input is read from stdin.

Notes

Leading ../ and ./ strings are also stripped from file paths.

See this post for more information.

Code Listing

(clang2csv.pl) download
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
#!/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>) {
   #($_ =~ 'warning:|note:') || next;                     # skip lines that are not clang warnings
   ($_ =~ 'warning:') || next;                            # skip lines that are not clang warnings
   my @tokens = split(" ", $_);
   my @filename = split(':', shift @tokens);
   my $filename = $filename[0] . ':' . $filename [1];
   defined $relative_path && $filename =~ s/$relative_path//;
   $filename = trim($filename);
   my $message = trim(join(" ", @tokens));
   print "\"$filename\",\"$message\"\n";
}

close(INFILE);

0;

Comments