dnl @synopsis XERCES_TRANSCODER_SELECTION
dnl
dnl Determines the which transcoder to use
dnl
dnl @category C
dnl @author James Berry
dnl @version 2005-05-23
dnl @license AllPermissive
dnl
dnl $Id$

AC_DEFUN([XERCES_TRANSCODER_SELECTION],
	[

	######################################################
	# Test for availability of each transcoder on this host.
	# For each transcoder that's available, and hasn't been disabled, add it to our list.
	# If the transcoder has been explicitly "enable"d, then vote for it strongly,
	# in upper case.
	######################################################

	tc_list=

	# Check for GNU iconv support
	no_GNUiconv=false
	AC_CHECK_HEADERS([iconv.h wchar.h ctype.h locale.h errno.h], [], [no_GNUiconv=true])
        # The code in iconv needs just on of these include files
	AC_CHECK_HEADER([endian.h],
                        [],
                        [
                         AC_CHECK_HEADER([machine/endian.h],
                                         [],
                                         [
                                          AC_CHECK_HEADER([arpa/nameser_compat.h],
                                                          [],
                                                          [no_GNUiconv=true])
                                         ])
                        ])
	AC_CHECK_FUNCS([iconv_open iconv_close iconv], [], [no_GNUiconv=true])
	AC_MSG_CHECKING([whether we can support the GNU iconv Transcoder])
	list_add=
	AS_IF([! $no_GNUiconv], [
		AC_ARG_ENABLE([transcoder-gnuiconv],
			AS_HELP_STRING([--enable-transcoder-gnuiconv],
				[Enable GNU iconv-based transcoder support]),
			[AS_IF([test x"$enableval" = xyes],
				[list_add=GNUICONV])],
			[list_add=gnuiconv])
	])
	AS_IF([test x"$list_add" != x],
		[tc_list="$tc_list -$list_add-"; AC_MSG_RESULT(yes)],
		[AC_MSG_RESULT(no)]
	)

	# Check for iconv support
	no_iconv=false
	AC_CHECK_HEADERS([wchar.h], [], [no_iconv=true])
	AC_CHECK_FUNCS([mblen wcstombs mbstowcs], [], [no_iconv=true])
	AC_MSG_CHECKING([whether we can support the iconv Transcoder])
	list_add=
	AS_IF([! $no_iconv], [
		AC_ARG_ENABLE([transcoder-iconv],
			AS_HELP_STRING([--enable-transcoder-iconv],
				[Enable iconv-based transcoder support]),
			[AS_IF([test x"$enableval" = xyes],
				[list_add=ICONV])],
			[list_add=iconv])
	])
	AS_IF([test x"$list_add" != x],
		[tc_list="$tc_list -$list_add-"; AC_MSG_RESULT(yes)],
		[AC_MSG_RESULT(no)]
	)

	# Check for ICU
	AC_REQUIRE([XERCES_ICU_PREFIX])
	AC_MSG_CHECKING([whether we can support the ICU Transcoder])
	list_add=
	AS_IF([test x"$xerces_cv_icu_present" != x"no"], [
		AC_ARG_ENABLE([transcoder-icu],
			AS_HELP_STRING([--enable-transcoder-icu],
				[Enable icu-based transcoder support]),
			[AS_IF([test x"$enableval" = xyes],
				[list_add=ICU])],
			[list_add=icu])
	])
	AS_IF([test x"$list_add" != x],
		[tc_list="$tc_list -$list_add-"; AC_MSG_RESULT(yes)],
		[AC_MSG_RESULT(no)]
	)


	# Check for platform-specific transcoders
	list_add=
	case $host_os in
	darwin*)
		AC_MSG_CHECKING([whether we can support the MacOSUnicodeConverter Transcoder])
		AS_IF([test x"$ac_cv_header_CoreServices_CoreServices_h" = xyes], [
			AC_ARG_ENABLE([transcoder-macosunicodeconverter],
				AS_HELP_STRING([--enable-transcoder-macosunicodeconverter],
					[Enable MacOSUnicodeConverter-based transcoder support]),
				[AS_IF([test x"$enableval" = xyes],
					[list_add=MACOSUNICODECONVERTER])],
				[list_add=macosunicodeconverter])
		])
		AS_IF([test x"$list_add" != x],
			[tc_list="$tc_list -$list_add-"; AC_MSG_RESULT(yes)],
			[AC_MSG_RESULT(no)]
		)
		;;
	windows* | mingw*)
		AC_MSG_CHECKING([whether we can support the Windows Transcoder])
		AC_ARG_ENABLE([transcoder-windows],
			AS_HELP_STRING([--enable-transcoder-windows],
				[Enable Windows-based transcoder support]),
			[AS_IF([test x"$enableval" = xyes],
				[list_add=WINDOWS])],
			[list_add=windows])
		AS_IF([test x"$list_add" != x],
			[tc_list="$tc_list -$list_add-"; AC_MSG_RESULT(yes)],
			[AC_MSG_RESULT(no)]
		)
		;;
	cygwin*)
		# Only add it to the list if the user explicitly asked
                # for it.
		#
		AC_MSG_CHECKING([whether to use the Windows Transcoder])
		AC_ARG_ENABLE([transcoder-windows],
			AS_HELP_STRING([--enable-transcoder-windows],
				[Enable Windows-based transcoder support]),
			[AS_IF([test x"$enableval" = xyes],
			       [list_add=WINDOWS])])
		AS_IF([test x"$list_add" != x],
			[tc_list="$tc_list -$list_add-"; AC_MSG_RESULT(yes)],
			[AC_MSG_RESULT(no)]
		)
		;;
	esac

	# TODO: Tests for additional transcoders

	######################################################
	# Determine which transcoder to use.
	#
	# We do this in two passes. Transcoders that have been enabled with "yes",
	# and which start out in upper case, get the top priority on the first pass.
	# On the second pass, we consider those which are simply available, but
	# which were not "disable"d (these won't even be in our list).
	######################################################
	transcoder=
	az_lower=abcdefghijklmnopqrstuvwxyz
	az_upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
	AC_MSG_CHECKING([for which Transcoder to use (choices:$tc_list)])
	for i in 1 2; do
 		# Swap upper/lower case in the tc_list. Cannot use tr ranges
                # because of the portability issues.
                #
		tc_list=`echo $tc_list | tr "$az_lower$az_upper" "$az_upper$az_lower"`

		# Check for each transcoder, in implicit rank order
		case $tc_list in

		*-icu-*)
			transcoder=icu
			AC_DEFINE([XERCES_USE_TRANSCODER_ICU], 1, [Define to use the ICU-based transcoder])
			LIBS="${LIBS} ${xerces_cv_icu_libs}"
			break
			;;

		*-macosunicodeconverter-*)
			transcoder=macosunicodeconverter
			AC_DEFINE([XERCES_USE_TRANSCODER_MACOSUNICODECONVERTER], 1, [Define to use the Mac OS UnicodeConverter-based transcoder])
			XERCES_LINK_DARWIN_FRAMEWORK([CoreServices])
			break
			;;

		*-gnuiconv-*)
			transcoder=gnuiconv
			AC_DEFINE([XERCES_USE_TRANSCODER_GNUICONV], 1, [Define to use the GNU iconv transcoder])
			break
			;;

		*-windows-*)
			transcoder=windows
			AC_DEFINE([XERCES_USE_TRANSCODER_WINDOWS], 1, [Define to use the Windows transcoder])
			break
			;;

		*-iconv-*)
			transcoder=iconv
			AC_DEFINE([XERCES_USE_TRANSCODER_ICONV], 1, [Define to use the iconv transcoder])
			break
			;;

		*)
			AS_IF([test $i -eq 2], [
				AC_MSG_RESULT([none])
				AC_MSG_ERROR([Xerces cannot function without a transcoder])
				]
			)
			;;
		esac
	done
	if test x"$transcoder" != x; then
		AC_MSG_RESULT($transcoder)
	fi

	# Define the auto-make conditionals which determine what actually gets compiled
	# Note that these macros can't be executed conditionally, which is why they're here, not above.
	AM_CONDITIONAL([XERCES_USE_TRANSCODER_ICU],			[test x"$transcoder" = xicu])
	AM_CONDITIONAL([XERCES_USE_TRANSCODER_MACOSUNICODECONVERTER],	[test x"$transcoder" = xmacosunicodeconverter])
	AM_CONDITIONAL([XERCES_USE_TRANSCODER_GNUICONV],		[test x"$transcoder" = xgnuiconv])
	AM_CONDITIONAL([XERCES_USE_TRANSCODER_ICONV],			[test x"$transcoder" = xiconv])
	AM_CONDITIONAL([XERCES_USE_TRANSCODER_WINDOWS],			[test x"$transcoder" = xwindows])

	]
)
