Confessions of a Wall Street Programmer

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

cppcheck2csv.pl

This script takes the output from cppcheck and formats it in csv format.

Usage

cppcheck2csv.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

(cppcheck2csv.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
52
#!/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, etc. from a string
sub trim
{
   my @out = @_;
   for (@out) {
      s/^\s+//;
      s/\s+$//;
      s/"//g;
      s/\[//g;
      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>) {
   ($_ =~ '^\[') || next;                     # skip lines that are not cppcheck warnings
   my @tokens = split("]:", $_);
   my $filename = trim(shift @tokens);
   $filename =~ s/^\.\.\///;                  # remove leading "../" from path 
   defined $relative_path && $filename =~ s/$relative_path//g;
   my $message = trim(join(" ", @tokens));
   print "\"$filename\",\"$message\"\n";
}

close(INFILE);

0;

Comments