#!/bin/sh
# SPDX-License-Identifier: MIT

PTEST_DIR=$(cd "$(dirname "$0")" && pwd)
CC="gcc"
CXX="g++"
if ! command -v gcc >/dev/null 2>&1; then
    CC=$(find /usr/bin -name "*-gcc" | head -n 1)
    CXX=$(find /usr/bin -name "*-g++" | head -n 1)
fi
CFLAGS="-O2 -Wall -I$PTEST_DIR/include -L$PTEST_DIR/lib"

# bhaible tests validate by comparing paired output lines
for t in test-call test-callback; do
    src="$PTEST_DIR/testsuite/libffi.bhaible/$t.c"
    if $CC $CFLAGS -o "$PTEST_DIR/$t" "$src" -lffi 2>&1; then
        "$PTEST_DIR/$t" > "$PTEST_DIR/$t.out" 2>&1
        if ! LC_ALL=C uniq -u < "$PTEST_DIR/$t.out" | grep -q .; then
            echo "PASS: libffi.bhaible/$t"
        else
            echo "FAIL: libffi.bhaible/$t"
            cat "$PTEST_DIR/$t.out"
        fi
    else
        echo "SKIP: libffi.bhaible/$t"
    fi
    rm -f "$PTEST_DIR/$t" "$PTEST_DIR/$t.out"
done

# Individual test programs from upstream dejagnu suites
for suite in libffi.call libffi.closures libffi.complex libffi.go libffi.threads; do
    dir="$PTEST_DIR/testsuite/$suite"
    [ -d "$dir" ] || continue

    extra=""
    [ "$suite" = "libffi.threads" ] && extra="-lpthread"

    for src in "$dir"/*.c "$dir"/*.cc; do
        [ -f "$src" ] || continue
        grep -q "dg-do run" "$src" || continue

        name=$(basename "${src%.*}")

	# complex_int uses non-standard _Complex int, fails on some arches (riscv64)
        [ "$name" = "complex_int" ] && continue
        case "$src" in
            *.cc) cc="$CXX";;
            *)    cc="$CC";;
        esac

        if $cc $CFLAGS -o "$PTEST_DIR/$name" "$src" -lffi $extra 2>&1; then
            if "$PTEST_DIR/$name" 2>&1; then
                echo "PASS: $suite/$name"
            else
                echo "FAIL: $suite/$name"
            fi
        else
            echo "SKIP: $suite/$name"
        fi
        rm -f "$PTEST_DIR/$name"
    done
done
