15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/perl -w 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) International Business Machines Corp., 2002 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This program is free software; you can redistribute it and/or modify 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# it under the terms of the GNU General Public License as published by 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# the Free Software Foundation; either version 2 of the License, or (at 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# your option) any later version. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This program is distributed in the hope that it will be useful, but 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# WITHOUT ANY WARRANTY; without even the implied warranty of 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# General Public License for more details. 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# You should have received a copy of the GNU General Public License 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# along with this program; if not, write to the Free Software 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# gendesc 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This script creates a description file as understood by genhtml. 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Input file format: 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# For each test case: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# <test name><optional whitespace> 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# <at least one whitespace character (blank/tab)><test description> 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Actual description may consist of several lines. By default, output is 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# written to stdout. Test names consist of alphanumeric characters 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# including _ and -. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# History: 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 2002-09-02: created by Peter Oberparleiter <Peter.Oberparleiter@de.ibm.com> 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)use strict; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)use File::Basename; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)use Getopt::Long; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Constants 443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)our $lcov_version = 'LCOV version 1.10'; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)our $tool_name = basename($0); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Prototypes 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sub print_usage(*); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sub gen_desc(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sub warn_handler($); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sub die_handler($); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Global variables 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)our $help; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)our $version; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)our $output_filename; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)our $input_filename; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Code entry point 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)$SIG{__WARN__} = \&warn_handler; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)$SIG{__DIE__} = \&die_handler; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)# Prettify version string 713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)$lcov_version =~ s/\$\s*Revision\s*:?\s*(\S+)\s*\$/$1/; 723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Parse command line options 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if (!GetOptions("output-filename=s" => \$output_filename, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "version" =>\$version, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "help|?" => \$help 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) )) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print(STDERR "Use $tool_name --help to get usage information\n"); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(1); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)$input_filename = $ARGV[0]; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Check for help option 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if ($help) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_usage(*STDOUT); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(0); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Check for version option 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if ($version) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print("$tool_name: $lcov_version\n"); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(0); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Check for input filename 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if (!$input_filename) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) die("No input filename specified\n". 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Use $tool_name --help to get usage information\n"); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Do something 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gen_desc(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# print_usage(handle) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Write out command line usage information to given filehandle. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sub print_usage(*) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local *HANDLE = $_[0]; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print(HANDLE <<END_OF_USAGE) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Usage: $tool_name [OPTIONS] INPUTFILE 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Convert a test case description file into a format as understood by genhtml. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -h, --help Print this help, then exit 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -v, --version Print version number, then exit 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -o, --output-filename FILENAME Write description to FILENAME 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)For more information see: $lcov_url 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)END_OF_USAGE 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# gen_desc() 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Read text file INPUT_FILENAME and convert the contained description to a 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# format as understood by genhtml, i.e. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# TN:<test name> 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# TD:<test description> 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# If defined, write output to OUTPUT_FILENAME, otherwise to stdout. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Die on error. 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sub gen_desc() 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local *INPUT_HANDLE; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local *OUTPUT_HANDLE; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) my $empty_line = "ignore"; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) open(INPUT_HANDLE, "<", $input_filename) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) or die("ERROR: cannot open $input_filename!\n"); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Open output file for writing 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ($output_filename) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) open(OUTPUT_HANDLE, ">", $output_filename) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) or die("ERROR: cannot create $output_filename!\n"); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *OUTPUT_HANDLE = *STDOUT; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Process all lines in input file 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (<INPUT_HANDLE>) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chomp($_); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (/^(\w[\w-]*)(\s*)$/) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Matched test name 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Name starts with alphanum or _, continues with 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # alphanum, _ or - 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print(OUTPUT_HANDLE "TN: $1\n"); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $empty_line = "ignore"; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elsif (/^(\s+)(\S.*?)\s*$/) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Matched test description 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ($empty_line eq "insert") 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Write preserved empty line 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print(OUTPUT_HANDLE "TD: \n"); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print(OUTPUT_HANDLE "TD: $2\n"); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $empty_line = "observe"; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elsif (/^\s*$/) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Matched empty line to preserve paragraph separation 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # inside description text 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ($empty_line eq "observe") 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $empty_line = "insert"; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Close output file if defined 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ($output_filename) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) close(OUTPUT_HANDLE); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) close(INPUT_HANDLE); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sub warn_handler($) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) my ($msg) = @_; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) warn("$tool_name: $msg"); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sub die_handler($) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) my ($msg) = @_; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) die("$tool_name: $msg"); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 227