#!/bin/sh
# Copyright (C) 1999, 2002, 2003, 2004 Free Software Foundation, Inc.
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
#
# This file is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# File: @configure_input@

# General.
prefix="@prefix@"
exec_prefix="@exec_prefix@"
version="@VERSION@"
includedir="@includedir@"
libdir="@libdir@"
gpg_error_libs="@GPG_ERROR_LIBS@"
gpg_error_cflags="@GPG_ERROR_CFLAGS@"

# libgcrypt values.
libs="@LIBGCRYPT_CONFIG_LIBS@"
cflags="@LIBGCRYPT_CONFIG_CFLAGS@"

# API info
api_version="@LIBGCRYPT_CONFIG_API_VERSION@"

# Misc information.
symmetric_ciphers="@LIBGCRYPT_CIPHERS@"
asymmetric_ciphers="@LIBGCRYPT_PUBKEY_CIPHERS@"
digests="@LIBGCRYPT_DIGESTS@"

# State variables.
echo_libs=no
echo_cflags=no
echo_prefix=no
echo_algorithms=no
echo_exec_prefix=no
echo_version=no
echo_api_version=no

# Prints usage information.
usage()
{
    cat <<EOF
Usage: $0 [OPTIONS]
Options:
	[--prefix]
	[--exec-prefix]
	[--version]
        [--api-version]
	[--libs]
	[--cflags]
	[--algorithms]
EOF
    exit $1
}

if test $# -eq 0; then
    # Nothing to do.
    usage 1 1>&2
fi

while test $# -gt 0; do
    case "$1" in
	# Set up `optarg'.
	--*=*)
	    optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'`
	    ;;
	*)
	    optarg=""
	    ;;
    esac

    case $1 in
	--thread=*)
	    echo "$0: --thread option obsolete: use the thread callback interface" 1>&2
	    exit 1
	    ;;
        --prefix=*)
            # For compatibility reasons with old M4 macros, we ignore
            # setting of prefix.
            ;;
	--prefix)
	    echo_prefix=yes
	    ;;
        --exec-prefix=*)
            ;;
	--exec-prefix)
	    echo_exec_prefix=yes
	    ;;
	--version)
	    echo_version=yes
	    ;;
        --api-version)
            echo_api_version=yes
            ;;
	--cflags)
	    echo_cflags=yes
	    ;;
	--libs)
	    echo_libs=yes
	    ;;
	--algorithms)
	    echo_algorithms=yes
	    ;;
	*)
	    usage 1 1>&2
	    ;;
    esac
    shift
done

if test "$echo_prefix" = "yes"; then
    echo "$prefix"
fi

if test "$echo_exec_prefix" = "yes"; then
    echo "$exec_prefix"
fi

if test "$echo_cflags" = "yes"; then
    includes=""
    cflags_final="$cflags"

    # Set up `includes'.
    if test "x$includedir" != "x/usr/include" -a "x$includedir" != "x/include"; then
	includes="-I$includedir"
    fi
    # Set up `cflags_final'.
    cflags_final="$cflags_final $gpg_error_cflags"

    tmp=""
    for i in $includes $cflags_final; do
       if echo "$tmp" | fgrep -v -- "$i" >/dev/null; then
           tmp="$tmp $i"
       fi
    done
    echo $tmp
fi

if test "$echo_libs" = "yes"; then
    libdirs=""
    libs_final="$libs"

    # Set up `libdirs'.
    if test "x$libdir" != "x/usr/lib" -a "x$libdir" != "x/lib"; then
	libdirs="-L$libdir"
    fi

    # Set up `libs_final'.
    libs_final="$libs_final $gpg_error_libs"

    tmp=""
    for i in $libdirs $libs_final; do
       if echo "$tmp" | fgrep -v -- "$i" >/dev/null; then
           tmp="$tmp $i"
       fi
    done
    echo $tmp
fi

if test "$echo_version" = "yes"; then
    echo "$version"
fi

if test "$echo_api_version" = "yes"; then
    echo "$api_version"
fi

if test "$echo_algorithms" = "yes"; then
    echo "Symmetric cipher algorithms: $symmetric_ciphers"
    echo "Public-key cipher algorithms: $asymmetric_ciphers"
    echo "Message digest algorithms: $digests"
fi
