Parallelize `make test`

This may not seem important, but when I run the release script, it will
matter, especially on the ones that take a long time because a parallel
`make test` is about a third as long.

I may back out this change if it doesn't work on non-GNU makes.
diff --git a/functions.sh b/functions.sh
index f117ad7..87f3c85 100755
--- a/functions.sh
+++ b/functions.sh
@@ -59,10 +59,56 @@
 	fi
 
 	printf '%s\n' "$1"
-	printf '\nexiting...\n'
 	exit "$2"
 }
 
+checktest_retcode() {
+
+	_checktest_retcode_d="$1"
+	shift
+
+	_checktest_retcode_err="$1"
+	shift
+
+	_checktest_retcode_name="$1"
+	shift
+
+	if [ "$_checktest_retcode_err" -ne 0 ]; then
+		printf 'FAIL!!!\n'
+		err_exit "$_checktest_retcode_d failed test '$_checktest_retcode_name' with error code $_checktest_retcode_err" 1
+	fi
+}
+
+checktest() {
+
+	_checktest_d="$1"
+	shift
+
+	_checktest_err="$1"
+	shift
+
+	_checktest_name="$1"
+	shift
+
+	_checktest_test_path="$1"
+	shift
+
+	_checktest_results_name="$1"
+	shift
+
+	checktest_retcode "$_checktest_d" "$_checktest_err" "$_checktest_name"
+
+	_checktest_diff=$(diff "$_checktest_test_path" "$_checktest_results_name")
+
+	_checktest_err="$?"
+
+	if [ "$_checktest_err" -ne 0 ]; then
+		printf 'FAIL!!!\n'
+		printf '%s\n' "$_checktest_diff"
+		err_exit "$_checktest_d failed test $_checktest_name" 1
+	fi
+}
+
 die() {
 
 	_die_d="$1"
@@ -99,49 +145,49 @@
 	fi
 }
 
-checktest()
+checkerrtest()
 {
-	_checktest_d="$1"
+	_checkerrtest_d="$1"
 	shift
 
-	_checktest_error="$1"
+	_checkerrtest_error="$1"
 	shift
 
-	_checktest_name="$1"
+	_checkerrtest_name="$1"
 	shift
 
-	_checktest_out="$1"
+	_checkerrtest_out="$1"
 	shift
 
-	_checktest_exebase="$1"
+	_checkerrtest_exebase="$1"
 	shift
 
-	checkcrash "$_checktest_d" "$_checktest_error" "$_checktest_name"
+	checkcrash "$_checkerrtest_d" "$_checkerrtest_error" "$_checkerrtest_name"
 
-	if [ "$_checktest_error" -eq 0 ]; then
-		die "$_checktest_d" "returned no error" "$_checktest_name" 127
+	if [ "$_checkerrtest_error" -eq 0 ]; then
+		die "$_checkerrtest_d" "returned no error" "$_checkerrtest_name" 127
 	fi
 
-	if [ "$_checktest_error" -eq 100 ]; then
+	if [ "$_checkerrtest_error" -eq 100 ]; then
 
-		_checktest_output=$(cat "$_checktest_out")
-		_checktest_fatal_error="Fatal error"
+		_checkerrtest_output=$(cat "$_checkerrtest_out")
+		_checkerrtest_fatal_error="Fatal error"
 
-		if [ "${_checktest_output##*$_checktest_fatal_error*}" ]; then
-			printf "%s\n" "$_checktest_output"
-			die "$_checktest_d" "had memory errors on a non-fatal error" \
-				"$_checktest_name" "$_checktest_error"
+		if [ "${_checkerrtest_output##*$_checkerrtest_fatal_error*}" ]; then
+			printf "%s\n" "$_checkerrtest_output"
+			die "$_checkerrtest_d" "had memory errors on a non-fatal error" \
+				"$_checkerrtest_name" "$_checkerrtest_error"
 		fi
 	fi
 
-	if [ ! -s "$_checktest_out" ]; then
-		die "$_checktest_d" "produced no error message" "$_checktest_name" "$_checktest_error"
+	if [ ! -s "$_checkerrtest_out" ]; then
+		die "$_checkerrtest_d" "produced no error message" "$_checkerrtest_name" "$_checkerrtest_error"
 	fi
 
 	# Display the error messages if not directly running exe.
 	# This allows the script to print valgrind output.
-	if [ "$_checktest_exebase" != "bc" -a "$_checktest_exebase" != "dc" ]; then
-		cat "$_checktest_out"
+	if [ "$_checkerrtest_exebase" != "bc" -a "$_checkerrtest_exebase" != "dc" ]; then
+		cat "$_checkerrtest_out"
 	fi
 }