+sub patch_html_output
+{
+ my $filesref = shift;
+
+ my $html = HTML::Element->new('html');
+ my $head = HTML::Element->new('head');
+ my $title = HTML::Element->new('title');
+ $title->push_content("Patch Coverage");
+ $head->push_content($title, "\n");
+ $html->push_content($head, "\n");
+
+ my $body = HTML::Element->new('body');
+ $body->attr('bgcolor', "white");
+
+ foreach my $file (sort(keys(%$filesref)))
+ {
+ my ($name, $path, $suffix) = fileparse($file, qr{\.[^.]*$});
+ next if($path !~ /^dali/);
+
+ my $patchref = $filesref->{$file}->{"patch"};
+ my $b_lines_ref = $filesref->{$file}->{"b_lines"};
+ my $coverage_ref = $filesref->{$file}->{"coverage"};
+
+ my $header = HTML::Element->new('h2');
+ $header->push_content($file);
+ $body->push_content($header);
+ $body->push_content("\n");
+ if($coverage_ref)
+ {
+ if( $coverage_ref->{"covered_lines"} > 0
+ ||
+ $coverage_ref->{"uncovered_lines"} > 0 )
+ {
+ my $para = HTML::Element->new('p');
+ my $covered = HTML::Element->new('span');
+ $covered->attr('style', "color:green;");
+ $covered->push_content("Covered: " . $coverage_ref->{"covered_lines"} );
+ $para->push_content($covered);
+
+ my $para2 = HTML::Element->new('p');
+ my $uncovered = HTML::Element->new('span');
+ $uncovered->attr('style', "color:red;");
+ $uncovered->push_content("Uncovered: " . $coverage_ref->{"uncovered_lines"} );
+ $para2->push_content($uncovered);
+ $body->push_content($para, $para2);
+ }
+ else
+ {
+ #print "coverage ref exists for $file:\n" . Data::Dumper::Dumper($coverage_ref) . "\n";
+ }
+ }
+ else
+ {
+ my $para = HTML::Element->new('p');
+ my $span = HTML::Element->new('span');
+ if($suffix eq ".cpp" || $suffix eq ".c" || $suffix eq ".h")
+ {
+ $span->attr('style', "color:red;");
+ }
+ $span->push_content("No coverage found");
+ $para->push_content($span);
+ $body->push_content($para);
+ }
+
+ for my $patch (@$patchref)
+ {
+ my $hunkstr="Hunk: " . $patch->[0];
+ if( $patch->[1] > 1 )
+ {
+ $hunkstr .= " - " . ($patch->[0]+$patch->[1]-1);
+ }
+
+ my $para = HTML::Element->new('p');
+ my $span = HTML::Element->new('span');
+ $span->attr('style', "font-weight:bold;");
+ $span->push_content($hunkstr);
+ $para->push_content($span);
+ $body->push_content($para);
+
+ my $codeHunk = HTML::Element->new('pre');
+ for(my $i = 0; $i < $patch->[1]; $i++ )
+ {
+ my $line = $i + $patch->[0];
+ my $num_line_digits=log($line)/log(10);
+ for $i (0..(6-$num_line_digits-1))
+ {
+ $codeHunk->push_content(" ");
+ }
+
+ $codeHunk->push_content("$line ");
+
+ my $srcLine = HTML::Element->new('span');
+ if($coverage_ref)
+ {
+ my $color;
+
+ if($coverage_ref->{"covered"}->{$line})
+ {
+ $srcLine->attr('style', "color:green;");
+ }
+ elsif($coverage_ref->{"uncovered"}->{$line})
+ {
+ $srcLine->attr('style', "color:red;font-weight:bold;");
+ }
+ else
+ {
+ $srcLine->attr('style', "color:black;font-weight:normal;");
+ }
+ my $src=$coverage_ref->{"src"}->{$line};
+ chomp($src);
+ $srcLine->push_content($src);
+ }
+ else
+ {
+ # We don't have coverage data, so print it from the patch instead.
+ my $src = $b_lines_ref->{$line};
+ $srcLine->attr('style', "color:black;font-weight:normal;");
+ $srcLine->push_content($src);
+ }
+ $codeHunk->push_content($srcLine, "\n");
+ }
+ $body->push_content($codeHunk, "\n");
+ }
+ }
+ $body->push_content(HTML::Element->new('hr'));
+ $html->push_content($body, "\n");
+
+ open( my $filehandle, ">", $opt_output ) || die "Can't open $opt_output for writing:$!\n";
+
+ print $filehandle <<EOH;
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
+"http://www.w3.org/TR/REC-html40/loose.dtd">
+EOH
+;
+ print $filehandle $html->as_HTML();
+ close $filehandle;
+}
+
+