1 #!/usr/bin/perl -w 2 # 3 # Copyright (c) International Business Machines Corp., 2002 4 # 5 # This program is free software; you can redistribute it and/or modify 6 # it under the terms of the GNU General Public License as published by 7 # the Free Software Foundation; either version 2 of the License, or (at 8 # your option) any later version. 9 # 10 # This program is distributed in the hope that it will be useful, but 11 # WITHOUT ANY WARRANTY; without even the implied warranty of 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 # General Public License for more details. 14 # 15 # You should have received a copy of the GNU General Public License 16 # along with this program; if not, write to the Free Software 17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 # 19 # 20 # gendesc 21 # 22 # This script creates a description file as understood by genhtml. 23 # Input file format: 24 # 25 # For each test case: 26 # <test name><optional whitespace> 27 # <at least one whitespace character (blank/tab)><test description> 28 # 29 # Actual description may consist of several lines. By default, output is 30 # written to stdout. Test names consist of alphanumeric characters 31 # including _ and -. 32 # 33 # 34 # History: 35 # 2002-09-02: created by Peter Oberparleiter <Peter.Oberparleiter (at] de.ibm.com> 36 # 37 38 use strict; 39 use File::Basename; 40 use Getopt::Long; 41 42 43 # Constants 44 our $lcov_version = 'LCOV version 1.10'; 45 our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; 46 our $tool_name = basename($0); 47 48 49 # Prototypes 50 sub print_usage(*); 51 sub gen_desc(); 52 sub warn_handler($); 53 sub die_handler($); 54 55 56 # Global variables 57 our $help; 58 our $version; 59 our $output_filename; 60 our $input_filename; 61 62 63 # 64 # Code entry point 65 # 66 67 $SIG{__WARN__} = \&warn_handler; 68 $SIG{__DIE__} = \&die_handler; 69 70 # Prettify version string 71 $lcov_version =~ s/\$\s*Revision\s*:?\s*(\S+)\s*\$/$1/; 72 73 # Parse command line options 74 if (!GetOptions("output-filename=s" => \$output_filename, 75 "version" =>\$version, 76 "help|?" => \$help 77 )) 78 { 79 print(STDERR "Use $tool_name --help to get usage information\n"); 80 exit(1); 81 } 82 83 $input_filename = $ARGV[0]; 84 85 # Check for help option 86 if ($help) 87 { 88 print_usage(*STDOUT); 89 exit(0); 90 } 91 92 # Check for version option 93 if ($version) 94 { 95 print("$tool_name: $lcov_version\n"); 96 exit(0); 97 } 98 99 100 # Check for input filename 101 if (!$input_filename) 102 { 103 die("No input filename specified\n". 104 "Use $tool_name --help to get usage information\n"); 105 } 106 107 # Do something 108 gen_desc(); 109 110 111 # 112 # print_usage(handle) 113 # 114 # Write out command line usage information to given filehandle. 115 # 116 117 sub print_usage(*) 118 { 119 local *HANDLE = $_[0]; 120 121 print(HANDLE <<END_OF_USAGE) 122 Usage: $tool_name [OPTIONS] INPUTFILE 123 124 Convert a test case description file into a format as understood by genhtml. 125 126 -h, --help Print this help, then exit 127 -v, --version Print version number, then exit 128 -o, --output-filename FILENAME Write description to FILENAME 129 130 For more information see: $lcov_url 131 END_OF_USAGE 132 ; 133 } 134 135 136 # 137 # gen_desc() 138 # 139 # Read text file INPUT_FILENAME and convert the contained description to a 140 # format as understood by genhtml, i.e. 141 # 142 # TN:<test name> 143 # TD:<test description> 144 # 145 # If defined, write output to OUTPUT_FILENAME, otherwise to stdout. 146 # 147 # Die on error. 148 # 149 150 sub gen_desc() 151 { 152 local *INPUT_HANDLE; 153 local *OUTPUT_HANDLE; 154 my $empty_line = "ignore"; 155 156 open(INPUT_HANDLE, "<", $input_filename) 157 or die("ERROR: cannot open $input_filename!\n"); 158 159 # Open output file for writing 160 if ($output_filename) 161 { 162 open(OUTPUT_HANDLE, ">", $output_filename) 163 or die("ERROR: cannot create $output_filename!\n"); 164 } 165 else 166 { 167 *OUTPUT_HANDLE = *STDOUT; 168 } 169 170 # Process all lines in input file 171 while (<INPUT_HANDLE>) 172 { 173 chomp($_); 174 175 if (/^(\w[\w-]*)(\s*)$/) 176 { 177 # Matched test name 178 # Name starts with alphanum or _, continues with 179 # alphanum, _ or - 180 print(OUTPUT_HANDLE "TN: $1\n"); 181 $empty_line = "ignore"; 182 } 183 elsif (/^(\s+)(\S.*?)\s*$/) 184 { 185 # Matched test description 186 if ($empty_line eq "insert") 187 { 188 # Write preserved empty line 189 print(OUTPUT_HANDLE "TD: \n"); 190 } 191 print(OUTPUT_HANDLE "TD: $2\n"); 192 $empty_line = "observe"; 193 } 194 elsif (/^\s*$/) 195 { 196 # Matched empty line to preserve paragraph separation 197 # inside description text 198 if ($empty_line eq "observe") 199 { 200 $empty_line = "insert"; 201 } 202 } 203 } 204 205 # Close output file if defined 206 if ($output_filename) 207 { 208 close(OUTPUT_HANDLE); 209 } 210 211 close(INPUT_HANDLE); 212 } 213 214 sub warn_handler($) 215 { 216 my ($msg) = @_; 217 218 warn("$tool_name: $msg"); 219 } 220 221 sub die_handler($) 222 { 223 my ($msg) = @_; 224 225 die("$tool_name: $msg"); 226 } 227