#!/bin/sh
#
# Run a test under valgrind.
#

# Use VALGRIND if set, else look on path. 
test -z "$VALGRIND" && VALGRIND=`which valgrind 2>/dev/null`
# No valgrind, just run the command
test -z "$VALGRIND" && { exec  libtool --mode=execute "$@"; exit $?; }

test "$VERBOSE" = yes && set -x
test -z "$vg_log" && vg_log=valgrind.out
rm -f $vg_log

# Dump log file, print a message and exit non-0.
vg_failed() {
    cat $vg_log 1>&2
    echo $1 1>&2
    exit 1
}

# Check for errors in valgrind output.
vg_check()
{
    # Ensure there is an ERROR SUMMARY line.
    grep -E '^==[0-9]+== ERROR SUMMARY:' $vg_log > /dev/null || \
	vg_failed "No valgrind ERROR SUMMARY line in $$vg_failed."
    # Ensure that the number of errors is 0.
    grep -E '^==[0-9]+== ERROR SUMMARY: [^0] ' $vg_log > /dev/null && \
	vg_failed "Valgrind reported errors in $vg_out; see above." 
    # Check for leaks.
    grep -E '^==[0-9]+== +.* lost: [^0]' $vg_log && \
	vg_failed "Found memory leaks (see log file, $vg_log); see above."
    true
}

# Output to file, only display if there is an error.
opts=--log-file-exactly=$vg_log

libtool --mode=execute $VALGRIND $opts  -- "$@" || fail=1
vg_check && test -z "$fail"
