#!/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_contents (html_p, file, i, j, target, status) {
if (html_p) print "" >> file
if (html_p) printf "| " >> file
printf "Index" >> file
if (html_p) printf " | " >> file
for (j = 1; j <= nr_statuses; j++) {
status = sorted_statuses[j];
if (html_p) printf "" >> file
printf "\t%s", status >> file
if (html_p) printf " | " >> file
}
if (html_p) printf "Variant | File |
" >> file
printf "\n" >> file
if (html_p) printf " | " >> file
for (i = 1; i <= nr_targets; i++) {
target = sorted_targets[i]
if (html_p) printf "
|---|
" >> file
if (html_p) printf "| " >> file
printf "%d", i >> file
if (html_p) printf " | " >> file
for (j = 1; j <= nr_statuses; j++) {
status = sorted_statuses[j];
if (html_p) printf "" >> file
printf "\t%d", totals[target, status] >> file
if (html_p) printf " | " >> file
}
if (html_p) printf "" >> file
printf "\t%s", target >> file
if (html_p) printf " | " >> file
if (html_p) printf "" >> file
printf " %s", target_file[target] >> file
if (html_p) printf " | " >> file
if (html_p) printf "
" >> file
printf "\n" >> file
}
if (html_p) print "
" >> file
}
function print_begin (file, title, full_title, i, j, target, status) {
full_title = "Failure Table: " title;
trace("Generating " file " (" full_title ")")
printf "" > file
print "" >> file
print "" >> file
print "" full_title "" >> file
print "" >> file
print "" >> file
print "" full_title "
" >> file
print "" >> file
print_contents(1, file)
print "" >> file
}
function print_end (file) {
print "" >> file
print "" >> file
}
function print_opening (file, title) {
print_begin(file, title);
print "" >> file
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 "
" >> file
print_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 (does this work?)
/^((|X|K)(PASS|FAIL)|UNRESOLVED|ERROR|WARNING):/ {
# accumulate statuses
status = $0
sub (/:.*$/, "", status)
statuses[status] = status
# accumulate tests
test = $0
sub (/^[A-Z]*: /, "", test)
gsub (/ *\([^)]*\)/, "", test)
gsub (/ \/[^ ]*\/gdb\//, " ..../gdb/", 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_contents(0, "/dev/stderr")
print_headings(0, "/dev/stderr", "Summary")
print_totals(0, "/dev/stderr")
###
file = "index.html"
print_begin(file, "Contents")
print "" >> file
print "Passes" >> file
print "Failures" >> file
print "Differences" >> file
print "" >> file
print_end(file)
####
# 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);
}
' "$@"