#!/bin/sh
if awk --version < /dev/null 2>&1 | grep -i gnu > /dev/null
then
AWK=awk
else
AWK=gawk
fi
$AWK '
function trace (msg) {
print msg >> "/dev/stderr"
}
# returns a SUPSEP separated list created by sorting TABLE.
function qsort (table, middle, tmp, left, nr_left, right, nr_right, result) {
middle = ""
for (middle in table) { break; }
nr_left = 0;
nr_right = 0;
for (tmp in table) {
if (tmp < middle) {
nr_left++
left[tmp] = tmp
} else if (tmp > middle) {
nr_right++
right[tmp] = tmp
}
}
#print "qsort " nr_left " " middle " " nr_right > "/dev/stderr"
result = ""
if (nr_left > 0) {
result = qsort(left) SUBSEP
}
result = result middle
if (nr_right > 0) {
result = result SUBSEP qsort(right)
}
return result
}
function print_headings (html_p, file, title, target, i) {
if (html_p) {
printf "
| " >> file
}
printf title >> file
if (html_p) {
printf " | " >> file
}
for (i = 1; i <= nr_targets; i++) {
target = sorted_targets[i]
if (html_p) {
printf "" i " " target " | " >> file
} else {
printf "\t" i >> file
}
}
if (html_p) {
printf "
" >> file
}
printf "\n" >> file
}
function print_test (file, test, nr, i) {
printf "" >> file
printf "| %d | ", nr >> file
printf "%s | ", test >> file
for (i = 1; i <= nr_targets; i++) {
target = sorted_targets[i];
result = results[target, test]
if (result == "FAIL") {
printf "%s | ", result >> file
} else {
printf "%s | ", result >> file
}
}
printf "
\n" >> file
}
function print_totals (html_p, file, status, target, i, j) {
for (i = 1; i <= nr_statuses; i++) {
status = sorted_statuses[i];
if (html_p) {
printf " | " >> file
}
printf status >> file
if (html_p) {
printf " | " >> file
}
for (j = 1; j <= nr_targets; j++) {
target = sorted_targets[j];
if (html_p) {
printf "" >> file
} else {
printf "\t"
}
printf totals[target, status] >> file
if (html_p) {
printf " | " >> file
}
}
if (html_p) {
printf "
" >> file
}
printf "\n" >> file
}
}
function print_table_start (file, title, full_title, i, target) {
full_title = "Failure Table: " title;
trace("Generating " file " (" full_title ")")
print "" >> file
print "" >> file
print "" full_title "" >> file
print "" >> file
print "" >> file
print "" full_title "
" >> file
print "" >> file
print "" >> file
for (i = 1; i <= nr_targets; i++) {
target = sorted_targets[i]
print "" >> file
print "| " i " | " >> file
print "" target " | " >> file
print "" target_file[target] " | " >> file
print "
" >> file
}
print "
" >> file
print "" >> file
print "" >> file
}
function print_table_end (file) {
print "
" >> file
print "" >> file
print "" >> file
}
function print_opening (file, title) {
printf "" > file
print_table_start(file, title);
print_headings(1, file, title);
print_totals(1, file);
}
function print_closing (file, title, nr) {
trace(title ": " nr);
print_totals(1, file);
print_headings(1, file, title);
print_table_end(file);
}
BEGIN {
nr_runs = 0
}
/Running target/ {
nr_runs++
sub (/Running target/, "");
gsub (/ /, "");
gsub (/\//, " ");
nr = 1;
do {
target = $0 " (" nr++ ")";
} while (target in targets)
targets[target] = target
target_file[target] = FILENAME
trace("Parsing " nr_runs ": " target " " (target_file[target]));
next
}
# Collect up sizeof???
# Collect the results
/^PASS:/ || /^FAIL:/ || /^XFAIL:/ || /^XPASS:/ {
# accumulate statuses
status = $0
sub (/:.*$/, "", status)
statuses[status] = status
# accumulate tests
test = $0
sub (/^[A-Z]*: /, "", test)
gsub (/ *\([^)]*\)/, "", test)
tests[test] = test
# accumulate result counts
totals[target, status] += 1;
results[target, test] = status;
totals[test, status] += 1;
}
END {
# sort the test names
trace("Sorting results")
nr_tests = split (qsort(tests), sorted_tests, SUBSEP);
trace("Number of tests " nr_tests)
# for (i = 0; i < nr_tests; i++) {
# print i " " sorted_tests[i] > "/dev/stderr"
# }
nr_targets = split (qsort(targets), sorted_targets, SUBSEP);
nr_statuses = split (qsort(statuses), sorted_statuses, SUBSEP);
print_headings(0, "/dev/stderr", "Summary")
print_totals(0, "/dev/stderr")
for (i = 1; i <= nr_targets; i++) {
target = sorted_targets[i]
printf "%3d %s %s\n", i, target, target_file[target] >> "/dev/stderr"
}
####
# heading
file = "diff.html"
print_opening(file, "Differences");
# body - differences
nr = 0
for (i = 1; i <= nr_tests; i++) {
test = sorted_tests[i];
different = 0;
fail = 0;
result = "";
for (target in targets) {
if (result == "") {
result = results[target, test];
} else if (result != results[target, test]) {
different = 1
}
if (results[target, test] == "FAIL") {
fail = 1;
}
# print "TEST=" test, "different=" different, "fail=" fail, "result=" result > "/dev/stderr"
}
if (different) {
print_test(file, test, ++nr);
}
}
print_closing(file, "Differences", nr);
####
file = "fail.html"
print_opening(file, "Failures");
# body - failures
nr = 0
for (i = 1; i <= nr_tests; i++) {
test = sorted_tests[i]
if (totals[test, "FAIL"] > 0) {
print_test(file, test, ++nr);
}
}
print_closing(file, "Failures", nr);
####
file = "pass.html"
print_opening(file, "Passes");
# body - passes
nr = 0
for (i = 1; i <= nr_tests; i++) {
test = sorted_tests[i]
if (totals[test, "PASS"] > 0) {
print_test(file, test, ++nr);
}
}
print_closing(file, "Passes", nr);
}
' "$@"