| OLD | NEW |
| 1 #!/usr/bin/perl -w | 1 #!/usr/bin/perl -w |
| 2 # | 2 # |
| 3 # Copyright (c) International Business Machines Corp., 2002 | 3 # Copyright (c) International Business Machines Corp., 2002 |
| 4 # | 4 # |
| 5 # This program is free software; you can redistribute it and/or modify | 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 | 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 | 7 # the Free Software Foundation; either version 2 of the License, or (at |
| 8 # your option) any later version. | 8 # your option) any later version. |
| 9 # | 9 # |
| 10 # This program is distributed in the hope that it will be useful, but | 10 # This program is distributed in the hope that it will be useful, but |
| 11 # WITHOUT ANY WARRANTY; without even the implied warranty of | 11 # WITHOUT ANY WARRANTY; without even the implied warranty of |
| 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 13 # General Public License for more details. | 13 # General Public License for more details. |
| 14 # | 14 # |
| 15 # You should have received a copy of the GNU General Public License | 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 | 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 | 17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 18 # | 18 # |
| 19 # | 19 # |
| 20 # genpng | 20 # genpng |
| 21 # | 21 # |
| 22 # This script creates an overview PNG image of a source code file by | 22 # This script creates an overview PNG image of a source code file by |
| 23 # representing each source code character by a single pixel. | 23 # representing each source code character by a single pixel. |
| 24 # | 24 # |
| 25 # Note that the PERL module GD.pm is required for this script to work. | 25 # Note that the Perl module GD.pm is required for this script to work. |
| 26 # It may be obtained from http://www.cpan.org | 26 # It may be obtained from http://www.cpan.org |
| 27 # | 27 # |
| 28 # History: | 28 # History: |
| 29 # 2002-08-26: created by Peter Oberparleiter <Peter.Oberparleiter@de.ibm.com> | 29 # 2002-08-26: created by Peter Oberparleiter <Peter.Oberparleiter@de.ibm.com> |
| 30 # | 30 # |
| 31 | 31 |
| 32 use strict; | 32 use strict; |
| 33 use File::Basename; | 33 use File::Basename; |
| 34 use Getopt::Long; | 34 use Getopt::Long; |
| 35 | 35 |
| 36 | 36 |
| 37 # Constants | 37 # Constants |
| 38 our $lcov_version» = "LCOV version 1.7"; | 38 our $lcov_version» = 'LCOV version 1.10'; |
| 39 our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; | 39 our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; |
| 40 our $tool_name = basename($0); | 40 our $tool_name = basename($0); |
| 41 | 41 |
| 42 | 42 |
| 43 # Prototypes | 43 # Prototypes |
| 44 sub gen_png($$$@); | 44 sub gen_png($$$@); |
| 45 sub check_and_load_module($); | 45 sub check_and_load_module($); |
| 46 sub genpng_print_usage(*); | 46 sub genpng_print_usage(*); |
| 47 sub genpng_process_file($$$$); | 47 sub genpng_process_file($$$$); |
| 48 sub warn_handler($); | 48 sub genpng_warn_handler($); |
| 49 sub die_handler($); | 49 sub genpng_die_handler($); |
| 50 | 50 |
| 51 | 51 |
| 52 # | 52 # |
| 53 # Code entry point | 53 # Code entry point |
| 54 # | 54 # |
| 55 | 55 |
| 56 # Prettify version string |
| 57 $lcov_version =~ s/\$\s*Revision\s*:?\s*(\S+)\s*\$/$1/; |
| 58 |
| 56 # Check whether required module GD.pm is installed | 59 # Check whether required module GD.pm is installed |
| 57 if (check_and_load_module("GD")) | 60 if (check_and_load_module("GD")) |
| 58 { | 61 { |
| 59 # Note: cannot use die() to print this message because inserting this | 62 # Note: cannot use die() to print this message because inserting this |
| 60 # code into another script via do() would not fail as required! | 63 # code into another script via do() would not fail as required! |
| 61 print(STDERR <<END_OF_TEXT) | 64 print(STDERR <<END_OF_TEXT) |
| 62 ERROR: required module GD.pm not found on this system (see www.cpan.org). | 65 ERROR: required module GD.pm not found on this system (see www.cpan.org). |
| 63 END_OF_TEXT | 66 END_OF_TEXT |
| 64 ; | 67 ; |
| 65 exit(2); | 68 exit(2); |
| 66 } | 69 } |
| 67 | 70 |
| 68 # Check whether we're called from the command line or from another script | 71 # Check whether we're called from the command line or from another script |
| 69 if (!caller) | 72 if (!caller) |
| 70 { | 73 { |
| 71 my $filename; | 74 my $filename; |
| 72 my $tab_size = 4; | 75 my $tab_size = 4; |
| 73 my $width = 80; | 76 my $width = 80; |
| 74 my $out_filename; | 77 my $out_filename; |
| 75 my $help; | 78 my $help; |
| 76 my $version; | 79 my $version; |
| 77 | 80 |
| 78 » $SIG{__WARN__} = \&warn_handler; | 81 » $SIG{__WARN__} = \&genpng_warn_handler; |
| 79 » $SIG{__DIE__} = \&die_handler; | 82 » $SIG{__DIE__} = \&genpng_die_handler; |
| 80 | 83 |
| 81 # Parse command line options | 84 # Parse command line options |
| 82 if (!GetOptions("tab-size=i" => \$tab_size, | 85 if (!GetOptions("tab-size=i" => \$tab_size, |
| 83 "width=i" => \$width, | 86 "width=i" => \$width, |
| 84 "output-filename=s" => \$out_filename, | 87 "output-filename=s" => \$out_filename, |
| 85 "help" => \$help, | 88 "help" => \$help, |
| 86 "version" => \$version)) | 89 "version" => \$version)) |
| 87 { | 90 { |
| 88 print(STDERR "Use $tool_name --help to get usage ". | 91 print(STDERR "Use $tool_name --help to get usage ". |
| 89 "information\n"); | 92 "information\n"); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 172 | 175 |
| 173 sub genpng_process_file($$$$) | 176 sub genpng_process_file($$$$) |
| 174 { | 177 { |
| 175 my $filename = $_[0]; | 178 my $filename = $_[0]; |
| 176 my $out_filename = $_[1]; | 179 my $out_filename = $_[1]; |
| 177 my $width = $_[2]; | 180 my $width = $_[2]; |
| 178 my $tab_size = $_[3]; | 181 my $tab_size = $_[3]; |
| 179 local *HANDLE; | 182 local *HANDLE; |
| 180 my @source; | 183 my @source; |
| 181 | 184 |
| 182 » open(HANDLE, "<$filename") | 185 » open(HANDLE, "<", $filename) |
| 183 or die("ERROR: cannot open $filename!\n"); | 186 or die("ERROR: cannot open $filename!\n"); |
| 184 | 187 |
| 185 # Check for .gcov filename extension | 188 # Check for .gcov filename extension |
| 186 if ($filename =~ /^(.*).gcov$/) | 189 if ($filename =~ /^(.*).gcov$/) |
| 187 { | 190 { |
| 188 # Assume gcov text format | 191 # Assume gcov text format |
| 189 while (<HANDLE>) | 192 while (<HANDLE>) |
| 190 { | 193 { |
| 191 if (/^\t\t(.*)$/) | 194 if (/^\t\t(.*)$/) |
| 192 { | 195 { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 228 # | 231 # |
| 229 # Die on error. | 232 # Die on error. |
| 230 # | 233 # |
| 231 | 234 |
| 232 sub gen_png($$$@) | 235 sub gen_png($$$@) |
| 233 { | 236 { |
| 234 my $filename = shift(@_); # Filename for PNG file | 237 my $filename = shift(@_); # Filename for PNG file |
| 235 my $overview_width = shift(@_); # Imagewidth for image | 238 my $overview_width = shift(@_); # Imagewidth for image |
| 236 my $tab_size = shift(@_); # Replacement string for tab signs | 239 my $tab_size = shift(@_); # Replacement string for tab signs |
| 237 my @source = @_; # Source code as passed via argument 2 | 240 my @source = @_; # Source code as passed via argument 2 |
| 238 » my $height = scalar(@source);» # Height as define by source size | 241 » my $height;» » # Height as define by source size |
| 239 my $overview; # Source code overview image data | 242 my $overview; # Source code overview image data |
| 240 my $col_plain_back; # Color for overview background | 243 my $col_plain_back; # Color for overview background |
| 241 my $col_plain_text; # Color for uninstrumented text | 244 my $col_plain_text; # Color for uninstrumented text |
| 242 my $col_cov_back; # Color for background of covered lines | 245 my $col_cov_back; # Color for background of covered lines |
| 243 my $col_cov_text; # Color for text of covered lines | 246 my $col_cov_text; # Color for text of covered lines |
| 244 my $col_nocov_back; # Color for background of lines which | 247 my $col_nocov_back; # Color for background of lines which |
| 245 # were not covered (count == 0) | 248 # were not covered (count == 0) |
| 246 my $col_nocov_text; # Color for test of lines which were not | 249 my $col_nocov_text; # Color for test of lines which were not |
| 247 # covered (count == 0) | 250 # covered (count == 0) |
| 248 my $col_hi_back; # Color for background of highlighted lines | 251 my $col_hi_back; # Color for background of highlighted lines |
| 249 my $col_hi_text; # Color for text of highlighted lines | 252 my $col_hi_text; # Color for text of highlighted lines |
| 250 my $line; # Current line during iteration | 253 my $line; # Current line during iteration |
| 251 my $row = 0; # Current row number during iteration | 254 my $row = 0; # Current row number during iteration |
| 252 my $column; # Current column number during iteration | 255 my $column; # Current column number during iteration |
| 253 my $color_text; # Current text color during iteration | 256 my $color_text; # Current text color during iteration |
| 254 my $color_back; # Current background color during iteration | 257 my $color_back; # Current background color during iteration |
| 255 my $last_count; # Count of last processed line | 258 my $last_count; # Count of last processed line |
| 256 my $count; # Count of current line | 259 my $count; # Count of current line |
| 257 my $source; # Source code of current line | 260 my $source; # Source code of current line |
| 258 my $replacement; # Replacement string for tabulator chars | 261 my $replacement; # Replacement string for tabulator chars |
| 259 local *PNG_HANDLE; # Handle for output PNG file | 262 local *PNG_HANDLE; # Handle for output PNG file |
| 260 | 263 |
| 264 # Handle empty source files |
| 265 if (!@source) { |
| 266 @source = ( "" ); |
| 267 } |
| 268 $height = scalar(@source); |
| 261 # Create image | 269 # Create image |
| 262 $overview = new GD::Image($overview_width, $height) | 270 $overview = new GD::Image($overview_width, $height) |
| 263 or die("ERROR: cannot allocate overview image!\n"); | 271 or die("ERROR: cannot allocate overview image!\n"); |
| 264 | 272 |
| 265 # Define colors | 273 # Define colors |
| 266 $col_plain_back = $overview->colorAllocate(0xff, 0xff, 0xff); | 274 $col_plain_back = $overview->colorAllocate(0xff, 0xff, 0xff); |
| 267 $col_plain_text = $overview->colorAllocate(0xaa, 0xaa, 0xaa); | 275 $col_plain_text = $overview->colorAllocate(0xaa, 0xaa, 0xaa); |
| 268 $col_cov_back = $overview->colorAllocate(0xaa, 0xa7, 0xef); | 276 $col_cov_back = $overview->colorAllocate(0xaa, 0xa7, 0xef); |
| 269 $col_cov_text = $overview->colorAllocate(0x5d, 0x5d, 0xea); | 277 $col_cov_text = $overview->colorAllocate(0x5d, 0x5d, 0xea); |
| 270 $col_nocov_back = $overview->colorAllocate(0xff, 0x00, 0x00); | 278 $col_nocov_back = $overview->colorAllocate(0xff, 0x00, 0x00); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 352 { | 360 { |
| 353 $overview->setPixel($column++, $row, $color_back); | 361 $overview->setPixel($column++, $row, $color_back); |
| 354 } | 362 } |
| 355 | 363 |
| 356 $last_count = $2; | 364 $last_count = $2; |
| 357 | 365 |
| 358 $row++; | 366 $row++; |
| 359 } | 367 } |
| 360 | 368 |
| 361 # Write PNG file | 369 # Write PNG file |
| 362 » open (PNG_HANDLE, ">$filename") | 370 » open (PNG_HANDLE, ">", $filename) |
| 363 or die("ERROR: cannot write png file $filename!\n"); | 371 or die("ERROR: cannot write png file $filename!\n"); |
| 364 binmode(*PNG_HANDLE); | 372 binmode(*PNG_HANDLE); |
| 365 print(PNG_HANDLE $overview->png()); | 373 print(PNG_HANDLE $overview->png()); |
| 366 close(PNG_HANDLE); | 374 close(PNG_HANDLE); |
| 367 } | 375 } |
| 368 | 376 |
| 369 sub warn_handler($) | 377 sub genpng_warn_handler($) |
| 370 { | 378 { |
| 371 my ($msg) = @_; | 379 my ($msg) = @_; |
| 372 | 380 |
| 373 warn("$tool_name: $msg"); | 381 warn("$tool_name: $msg"); |
| 374 } | 382 } |
| 375 | 383 |
| 376 sub die_handler($) | 384 sub genpng_die_handler($) |
| 377 { | 385 { |
| 378 my ($msg) = @_; | 386 my ($msg) = @_; |
| 379 | 387 |
| 380 die("$tool_name: $msg"); | 388 die("$tool_name: $msg"); |
| 381 } | 389 } |
| OLD | NEW |