1*b1cdbd2cSJim Jagielski#!/usr/bin/perl -w 2*b1cdbd2cSJim Jagielski# ************************************************************* 3*b1cdbd2cSJim Jagielski# 4*b1cdbd2cSJim Jagielski# Licensed to the Apache Software Foundation (ASF) under one 5*b1cdbd2cSJim Jagielski# or more contributor license agreements. See the NOTICE file 6*b1cdbd2cSJim Jagielski# distributed with this work for additional information 7*b1cdbd2cSJim Jagielski# regarding copyright ownership. The ASF licenses this file 8*b1cdbd2cSJim Jagielski# to you under the Apache License, Version 2.0 (the 9*b1cdbd2cSJim Jagielski# "License"); you may not use this file except in compliance 10*b1cdbd2cSJim Jagielski# with the License. You may obtain a copy of the License at 11*b1cdbd2cSJim Jagielski# 12*b1cdbd2cSJim Jagielski# http://www.apache.org/licenses/LICENSE-2.0 13*b1cdbd2cSJim Jagielski# 14*b1cdbd2cSJim Jagielski# Unless required by applicable law or agreed to in writing, 15*b1cdbd2cSJim Jagielski# software distributed under the License is distributed on an 16*b1cdbd2cSJim Jagielski# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17*b1cdbd2cSJim Jagielski# KIND, either express or implied. See the License for the 18*b1cdbd2cSJim Jagielski# specific language governing permissions and limitations 19*b1cdbd2cSJim Jagielski# under the License. 20*b1cdbd2cSJim Jagielski# 21*b1cdbd2cSJim Jagielski# ************************************************************* 22*b1cdbd2cSJim Jagielski# 23*b1cdbd2cSJim Jagielski# $Id: gcov_resultinterpreter.pl,v 1.3 2005-11-02 17:24:12 kz Exp $ 24*b1cdbd2cSJim Jagielski# 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielski# GCOV_RESULTINTERPRETER 27*b1cdbd2cSJim Jagielski# 28*b1cdbd2cSJim Jagielski# Helper, to interpret the result 29*b1cdbd2cSJim Jagielski# 30*b1cdbd2cSJim Jagielski# Q: Why perl? 31*b1cdbd2cSJim Jagielski# A: regexp ;-) 32*b1cdbd2cSJim Jagielski# 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielskiuse strict; 35*b1cdbd2cSJim Jagielskiuse File::Basename; 36*b1cdbd2cSJim Jagielskiuse Getopt::Long; 37*b1cdbd2cSJim Jagielski 38*b1cdbd2cSJim Jagielskiour $version_info = 'gcov helper $Revision: 1.3 $ '; 39*b1cdbd2cSJim Jagielski 40*b1cdbd2cSJim Jagielskiour $help; # Help option flag 41*b1cdbd2cSJim Jagielskiour $version; # Version option flag 42*b1cdbd2cSJim Jagielski# our $infile; 43*b1cdbd2cSJim Jagielski 44*b1cdbd2cSJim Jagielskiour $usedFunctions; # show all functions, which have a value > 0 45*b1cdbd2cSJim Jagielskiour $nonusedFunctions; # show all functions, which have a value == 0 46*b1cdbd2cSJim Jagielskiour $nPercent; # show all functions, which have a value > $nPercent 47*b1cdbd2cSJim Jagielskiour $complete; # show all functions, which have a value == 100 48*b1cdbd2cSJim Jagielskiour $incomplete; # show all functions, which have a value > 0 && < 100 49*b1cdbd2cSJim Jagielski 50*b1cdbd2cSJim Jagielski# Prototypes 51*b1cdbd2cSJim Jagielskisub print_usage(*); 52*b1cdbd2cSJim Jagielskisub read_gcov_function_file($); 53*b1cdbd2cSJim Jagielski 54*b1cdbd2cSJim Jagielski# Parse command line options 55*b1cdbd2cSJim Jagielskiif (!GetOptions( 56*b1cdbd2cSJim Jagielski "usedfunctions" => \$usedFunctions, 57*b1cdbd2cSJim Jagielski "nonusedfunctions" => \$nonusedFunctions, 58*b1cdbd2cSJim Jagielski "percent=s" => \$nPercent, 59*b1cdbd2cSJim Jagielski "complete" => \$complete, 60*b1cdbd2cSJim Jagielski "incomplete" => \$incomplete, 61*b1cdbd2cSJim Jagielski "help" => \$help, 62*b1cdbd2cSJim Jagielski "version" => \$version 63*b1cdbd2cSJim Jagielski )) 64*b1cdbd2cSJim Jagielski{ 65*b1cdbd2cSJim Jagielski print_usage(*STDERR); 66*b1cdbd2cSJim Jagielski exit(1); 67*b1cdbd2cSJim Jagielski} 68*b1cdbd2cSJim Jagielski 69*b1cdbd2cSJim Jagielski# Check for help option 70*b1cdbd2cSJim Jagielskiif ($help) 71*b1cdbd2cSJim Jagielski{ 72*b1cdbd2cSJim Jagielski print_usage(*STDOUT); 73*b1cdbd2cSJim Jagielski exit(0); 74*b1cdbd2cSJim Jagielski} 75*b1cdbd2cSJim Jagielski 76*b1cdbd2cSJim Jagielski# Check for version option 77*b1cdbd2cSJim Jagielskiif ($version) 78*b1cdbd2cSJim Jagielski{ 79*b1cdbd2cSJim Jagielski print("$version_info\n"); 80*b1cdbd2cSJim Jagielski exit(0); 81*b1cdbd2cSJim Jagielski} 82*b1cdbd2cSJim Jagielski 83*b1cdbd2cSJim Jagielski# check if enough parameters 84*b1cdbd2cSJim Jagielskiif ($#ARGV < 0) 85*b1cdbd2cSJim Jagielski{ 86*b1cdbd2cSJim Jagielski print("No input filename specified\n"); 87*b1cdbd2cSJim Jagielski print_usage(*STDERR); 88*b1cdbd2cSJim Jagielski exit(1); 89*b1cdbd2cSJim Jagielski} 90*b1cdbd2cSJim Jagielski 91*b1cdbd2cSJim Jagielskiif ($complete) 92*b1cdbd2cSJim Jagielski{ 93*b1cdbd2cSJim Jagielski $nPercent = 100.00; 94*b1cdbd2cSJim Jagielski} 95*b1cdbd2cSJim Jagielski# ------------------------------------------------------------------------------ 96*b1cdbd2cSJim Jagielski 97*b1cdbd2cSJim Jagielskimy %list = read_gcov_function_file($ARGV[0]); 98*b1cdbd2cSJim Jagielski 99*b1cdbd2cSJim Jagielskimy $key; 100*b1cdbd2cSJim Jagielskimy $value; 101*b1cdbd2cSJim Jagielski 102*b1cdbd2cSJim Jagielskiwhile (($key, $value) = each %list) 103*b1cdbd2cSJim Jagielski{ 104*b1cdbd2cSJim Jagielski # print "function: $key = $value\n"; 105*b1cdbd2cSJim Jagielski if ($nonusedFunctions) 106*b1cdbd2cSJim Jagielski { 107*b1cdbd2cSJim Jagielski if ($value <= 0.00) 108*b1cdbd2cSJim Jagielski { 109*b1cdbd2cSJim Jagielski print "$key\n"; 110*b1cdbd2cSJim Jagielski } 111*b1cdbd2cSJim Jagielski } 112*b1cdbd2cSJim Jagielski elsif ($usedFunctions) 113*b1cdbd2cSJim Jagielski { 114*b1cdbd2cSJim Jagielski if ($value != 0.00) 115*b1cdbd2cSJim Jagielski { 116*b1cdbd2cSJim Jagielski print "$key, $value\n"; 117*b1cdbd2cSJim Jagielski } 118*b1cdbd2cSJim Jagielski } 119*b1cdbd2cSJim Jagielski elsif ($nPercent) 120*b1cdbd2cSJim Jagielski { 121*b1cdbd2cSJim Jagielski if ($value >= $nPercent) 122*b1cdbd2cSJim Jagielski { 123*b1cdbd2cSJim Jagielski print "$key, $value\n"; 124*b1cdbd2cSJim Jagielski } 125*b1cdbd2cSJim Jagielski } 126*b1cdbd2cSJim Jagielski elsif ($incomplete) 127*b1cdbd2cSJim Jagielski { 128*b1cdbd2cSJim Jagielski if ($value > 0.00 && $value < 100.00) 129*b1cdbd2cSJim Jagielski { 130*b1cdbd2cSJim Jagielski print "$key, $value\n"; 131*b1cdbd2cSJim Jagielski } 132*b1cdbd2cSJim Jagielski } 133*b1cdbd2cSJim Jagielski else 134*b1cdbd2cSJim Jagielski { 135*b1cdbd2cSJim Jagielski print "$key, $value\n"; 136*b1cdbd2cSJim Jagielski } 137*b1cdbd2cSJim Jagielski} 138*b1cdbd2cSJim Jagielski 139*b1cdbd2cSJim Jagielski# -------------------------------------------------------------------------------- 140*b1cdbd2cSJim Jagielski# Read the gcov function (gcov -f) file 141*b1cdbd2cSJim Jagielski# and compare line by line with the export function list 142*b1cdbd2cSJim Jagielski# so we get a list of functions, which are only exported, and not all stuff. 143*b1cdbd2cSJim Jagielski 144*b1cdbd2cSJim Jagielskisub read_gcov_function_file($) 145*b1cdbd2cSJim Jagielski{ 146*b1cdbd2cSJim Jagielski local *INPUT_HANDLE; 147*b1cdbd2cSJim Jagielski my $file = $_[0]; 148*b1cdbd2cSJim Jagielski my %list; 149*b1cdbd2cSJim Jagielski my $line = ""; 150*b1cdbd2cSJim Jagielski 151*b1cdbd2cSJim Jagielski open(INPUT_HANDLE, $file) 152*b1cdbd2cSJim Jagielski or die("ERROR: cannot open $file!\n"); 153*b1cdbd2cSJim Jagielski 154*b1cdbd2cSJim Jagielski while ($line = <INPUT_HANDLE>) 155*b1cdbd2cSJim Jagielski { 156*b1cdbd2cSJim Jagielski chomp($line); 157*b1cdbd2cSJim Jagielski # sample line (for reg exp:) 158*b1cdbd2cSJim Jagielski # 100.00 rtl_ustr_toDouble 159*b1cdbd2cSJim Jagielski if ($line =~ /^(.*) (\w+)$/ ) 160*b1cdbd2cSJim Jagielski { 161*b1cdbd2cSJim Jagielski my $percent = $1; 162*b1cdbd2cSJim Jagielski my $value = $2; 163*b1cdbd2cSJim Jagielski 164*b1cdbd2cSJim Jagielski $list{$value} = $percent; 165*b1cdbd2cSJim Jagielski } 166*b1cdbd2cSJim Jagielski } 167*b1cdbd2cSJim Jagielski close(INPUT_HANDLE); 168*b1cdbd2cSJim Jagielski return %list; 169*b1cdbd2cSJim Jagielski} 170*b1cdbd2cSJim Jagielski 171*b1cdbd2cSJim Jagielski# ---------------------------------------------------------------------------- 172*b1cdbd2cSJim Jagielskisub print_usage(*) 173*b1cdbd2cSJim Jagielski{ 174*b1cdbd2cSJim Jagielski local *HANDLE = $_[0]; 175*b1cdbd2cSJim Jagielski my $tool_name = basename($0); 176*b1cdbd2cSJim Jagielski 177*b1cdbd2cSJim Jagielski print(HANDLE <<END_OF_USAGE); 178*b1cdbd2cSJim Jagielski 179*b1cdbd2cSJim JagielskiUsage: $tool_name [OPTIONS] INPUTFILE 180*b1cdbd2cSJim Jagielski 181*b1cdbd2cSJim Jagielski -u, --usedFunctions show all functions, which have a value > 0 182*b1cdbd2cSJim Jagielski -n, --nonusedFunctions show all functions, which have a value == 0 183*b1cdbd2cSJim Jagielski -p, --percent show all functions, which have a value > percent 184*b1cdbd2cSJim Jagielski -c, --complete show all functions, which have a value == 100 185*b1cdbd2cSJim Jagielski -i, --incomplete show all functions, which have a value > 0 && < 100 186*b1cdbd2cSJim Jagielski 187*b1cdbd2cSJim Jagielski -h, --help Print this help, then exit 188*b1cdbd2cSJim Jagielski -v, --version Print version number, then exit 189*b1cdbd2cSJim Jagielski 190*b1cdbd2cSJim JagielskiEND_OF_USAGE 191*b1cdbd2cSJim Jagielski ; 192*b1cdbd2cSJim Jagielski} 193