+# Checks the difference between stdout:
+#
+# The file with path "$1", and the file with path "$2"
+#
+# And the difference between stderr:
+#
+# The file with path "$3", and the file with path "$4"
+#
+# Returns 0 if there's no difference, and 1 if there is, also printing
+# said difference to the standard error, and an error message with the
+# args starting at "$5".
+bt_diff() {
+ local expected_stdout_file="$1"
+ local actual_stdout_file="$2"
+ local expected_stderr_file="$3"
+ local actual_stderr_file="$4"
+ shift 4
+ local args=("$@")
+
+ local ret=0
+ local temp_diff
+
+ temp_diff="$(mktemp -t diff.XXXXXX)"
+
+ # Strip any \r present due to Windows (\n -> \r\n).
+ # "diff --string-trailing-cr" is not used since it is not present on
+ # Solaris.
+ "$BT_TESTS_SED_BIN" -i 's/\r//g' "$actual_stdout_file"
+ "$BT_TESTS_SED_BIN" -i 's/\r//g' "$actual_stderr_file"
+
+ # Compare stdout output with expected stdout output
+ if ! diff -u "$actual_stdout_file" "$expected_stdout_file" 2>/dev/null >"$temp_diff"; then
+ echo "ERROR: for '${args[*]}': actual standard output and expected output differ:" >&2
+ cat "$temp_diff" >&2
+ ret=1
+ fi
+
+ # Compare stderr output with expected stderr output
+ if ! diff -u "$actual_stderr_file" "$expected_stderr_file" 2>/dev/null >"$temp_diff"; then
+ echo "ERROR: for '${args[*]}': actual standard error and expected error differ:" >&2
+ cat "$temp_diff" >&2
+ ret=1
+ fi
+
+ rm -f "$temp_diff"
+
+ return $ret
+}
+