#!/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 for (j = 1; j <= nr_statuses; j++) { status = sorted_statuses[j]; if (html_p) printf "" >> file } if (html_p) printf "" >> 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 for (j = 1; j <= nr_statuses; j++) { status = sorted_statuses[j]; if (html_p) printf "" >> file } if (html_p) printf "" >> file if (html_p) printf "" >> file if (html_p) printf "" >> file printf "\n" >> file } if (html_p) print "
" >> file printf "Index" >> file if (html_p) printf "" >> file printf "\t%s", status >> file if (html_p) printf "VariantFile
" >> file printf "%d", i >> file if (html_p) printf "" >> file printf "\t%d", totals[target, status] >> file if (html_p) printf "" >> file printf "\t%s", target >> file if (html_p) printf "" >> file printf " %s", target_file[target] >> file if (html_p) printf "
" >> 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); } ' "$@"