#!/bin/bash

RESULT_BUF=`echo -e ------------------------------------------------------------`
RESULT_PASS_COUNT=0
RESULT_FAIL_COUNT=0

function result_log
{
	if [ $1 -eq 0 ]; then
		RESULT_BUF="`printf \"%s\n%55s\tpass\" \"$RESULT_BUF\" \"$2\"`"
		RESULT_PASS_COUNT=$(($RESULT_PASS_COUNT + 1))
	else
		RESULT_BUF="`printf \"%s\n%55s\tfail\" \"$RESULT_BUF\" \"$2\"`"
		RESULT_FAIL_COUNT=$(($RESULT_FAIL_COUNT + 1))
	fi
}

function result_print
{
	printf "%s" "$RESULT_BUF"
	echo -e "\n------------------------------------------------------------"
	printf "pass\t$RESULT_PASS_COUNT\n"
	printf "fail\t$RESULT_FAIL_COUNT\n"

	exit $RESULT_FAIL_COUNT
}

function get_build_arch
{
	case `uname -m` in
	    arm*)
	        BUILD_ARCH=ARM;;
	    aarch64*)
	        BUILD_ARCH=AARCH64;;
	    i?86*)
		BUILD_ARCH=IA32;;
	    x86_64*)
		BUILD_ARCH=X64;;
	    *)
	        BUILD_ARCH=other;;
	esac
}

function set_cross_compile
{
	get_build_arch

	echo "Target: $PLATFORM_ARCH"
	echo "Build: $BUILD_ARCH"
 	if [ "$PLATFORM_ARCH" = "$BUILD_ARCH" ]; then
	    TEMP_CROSS_COMPILE=
	else
	    case "$PLATFORM_ARCH" in
		AARCH64)
                    if [ X"$CROSS_COMPILE_64" != X"" ]; then
                        TEMP_CROSS_COMPILE="$CROSS_COMPILE_64"
                    else
                        TEMP_CROSS_COMPILE=aarch64-linux-gnu-
                    fi
                ;;
		ARM)
		    TEMP_CROSS_COMPILE=arm-linux-gnueabihf- ;;
		IA32)
		    TEMP_CROSS_COMPILE=x86_64-linux-gnu-
		    for family in 6 5 4 3; do
		        if i$family86-linux-gnu-as -version >/dev/null 2>&1;then
		            TEMP_CROSS_COMPILE=i$family86-linux-gnu-
		            break
		        fi
		    done
		;;
		X64)
		    TEMP_CROSS_COMPILE=x86_64-linux-gnu- ;;
		*)
	            echo "Unsupported target architecture '$PLATFORM_ARCH'!" >&2
		;;
	    esac
	fi
}

function get_gcc_version
{
	$1 -v >/dev/null 2>&1 || return 1
	gcc_version=$($1 -dumpversion)
	MAJVER=`echo $gcc_version | cut -d. -f1`

	case $gcc_version in
		4*)
			echo GCC$(echo ${gcc_version} | awk -F. '{print $1$2}')
			;;
		*)
			if [ "$MAJVER" -ge 5 ]; then
			    # We only have a GCC5 build profile for now, so...
			    # echo GCC$MAJVER
			    echo GCC5
			else
			    echo "Unknown toolchain version '$gcc_version'" >&2
			    echo "Attempting to build using GCC49 profile." >&2
			    echo GCC49
			fi
			;;
	esac

	return 0
}

function get_clang_version
{
	clang_version=`$1 --version | head -1 | sed 's/^.*version\s*\([0-9]*\).\([0-9]*\).*/\1\2/g'`
	case $clang_version in
		35*)
			echo "CLANG$clang_version"
			;;
		*)
			echo "Unknown toolchain version '$clang_version'" >&2
			echo "Attempting to build using CLANG35 profile." >&2
			echo CLANG35
			;;
	esac
}

function download_patch_openssl
{
    OPENSSL_VER=`ls EDKII_openssl-*.patch | sed 's/^.*-\([0-9.a-z]*\).patch/\1/'`
    OPENSSL_TAR=openssl-${OPENSSL_VER}.tar.gz
    OPENSSL_URL=http://www.openssl.org/source/${OPENSSL_TAR}
    OPENSSL_DIR=openssl-${OPENSSL_VER}
    OPENSSL_PATCH=EDKII_openssl-${OPENSSL_VER}.patch

    if [ -e "$WORKSPACE"/CryptoPkg/Include/openssl/opensslconf.h ]; then
        echo "OpenSSL already imported!"
        return 0
    fi

    # Use cached copy if available
    if [ -f "$WORKSPACE"/LinaroPkg/"$OPENSSL_TAR" ]; then
	tar xzf "$WORKSPACE"/LinaroPkg/"$OPENSSL_TAR"
    else
	wget -O - -q ${OPENSSL_URL} | tar xzf -
    fi

    echo "Importing OpenSSL $OPENSSL_VER"
    ( cd ${OPENSSL_DIR}; patch -p1 -i ../${OPENSSL_PATCH} )
    ./Install.sh

    if [ $? -eq 0 ]; then
	OPENSSL_CONFIGURED=TRUE
    else
	echo "OpenSSL $OPENSSL_VER import failed!" >&2
	rm -rf $OPENSSL_TAR $OPENSSL_DIR
	return 1
    fi
}

function clone_process_openssl
{
    if [ -e openssl/include/openssl/opensslconf.h ]; then
        echo "OpenSSL already imported!"
        return 0
    fi

    OPENSSL_VER=`git ls-remote --tags git://github.com/openssl/openssl.git | awk '{print $2;}' | sed 's-^refs/tags/--g' | grep -v '\^{}$' | grep '^OpenSSL' | grep -v '^OpenSSL_FIPS' | tail -1 | sed -n 's/^OpenSSL_\([0-9]*\)_\([0-9]*\)_\([0-9.a-z]*\)$/openssl-\1.\2.\3\n/p'`
    OPENSSL_TAR="$OPENSSL_VER.tar.gz"
    if [ -z "$OPENSSL_TAR" ]; then
        return 1
    fi
    OPENSSL_URL=http://www.openssl.org/source/${OPENSSL_TAR}
    if [ ! -f "$OPENSSL_TAR" ]; then
        wget -q ${OPENSSL_URL}
    else
        rm -rf openssl
    fi
    tar xzf "$OPENSSL_TAR"
    mv "$OPENSSL_VER" openssl
    # perl process_files.pl # not needed and not currently working
    return $?
}

function import_openssl
{
    # Don't re-import if already done
    if [ "$OPENSSL_CONFIGURED" = "TRUE" ]; then
	echo "Using existing OpenSSL $OPENSSL_VER"
	return 0
    fi

    cd CryptoPkg/Library/OpensslLib/
    if [ -f EDKII_openssl-*.patch ]; then
        download_patch_openssl
    else
        clone_process_openssl
    fi
    RET=$?
    cd - >/dev/null
    return $RET
}

function search_packages_path
{
    file="$1"

    IFS=:
    for dir in $PACKAGES_PATH; do
	if [ -e "$dir/$file" ]; then
	    echo "$dir/$file"
	    unset IFS
	    return 0
	fi
    done

    echo "$file not found in any directory on PACKAGES_PATH!" >&2
    unset IFS
    return 1
}