Confessions of a Wall Street Programmer

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

itc2csv.pl

This script takes a list of error annotations from the ITC benchmark suite and formats it in csv format.

Usage

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

(itc2csv.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
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;

Comments