+dnl FPTOOLS_CHECK_HTYPE(TYPE [, DEFAULT_VALUE ])
+AC_DEFUN([FPTOOLS_CHECK_HTYPE],[
+ changequote(<<, >>)
+ dnl The name to #define.
+ define(<<AC_TYPE_NAME>>, translit(htype_$1, [a-z *], [A-Z_P]))
+ dnl The cache variable names.
+ define(<<AC_CV_NAME>>, translit(fptools_cv_htype_$1, [ *], [_p]))
+ define(<<AC_CV_NAME_supported>>, translit(fptools_cv_htype_sup_$1, [ *], [_p]))
+ changequote([, ])
+
+ AC_MSG_CHECKING(Haskell type for $1)
+ AC_CACHE_VAL(AC_CV_NAME,[
+ AC_CV_NAME_supported=yes
+ FP_COMPUTE_INT([HTYPE_IS_INTEGRAL],
+ [(($1)((int)(($1)1.4))) == (($1)1.4)],
+ [FPTOOLS_HTYPE_INCLUDES],[AC_CV_NAME_supported=no])
+ if test "$AC_CV_NAME_supported" = "yes"
+ then
+ if test "$HTYPE_IS_INTEGRAL" -eq 0
+ then
+ FP_COMPUTE_INT([HTYPE_IS_FLOAT],[sizeof($1) == sizeof(float)],
+ [FPTOOLS_HTYPE_INCLUDES],
+ [AC_CV_NAME_supported=no])
+ FP_COMPUTE_INT([HTYPE_IS_DOUBLE],[sizeof($1) == sizeof(double)],
+ [FPTOOLS_HTYPE_INCLUDES],
+ [AC_CV_NAME_supported=no])
+ FP_COMPUTE_INT([HTYPE_IS_LDOUBLE],[sizeof($1) == sizeof(long double)],
+ [FPTOOLS_HTYPE_INCLUDES],
+ [AC_CV_NAME_supported=no])
+ if test "$HTYPE_IS_FLOAT" -eq 1
+ then
+ AC_CV_NAME=Float
+ elif test "$HTYPE_IS_DOUBLE" -eq 1
+ then
+ AC_CV_NAME=Double
+ elif test "$HTYPE_IS_LDOUBLE" -eq 1
+ then
+ AC_CV_NAME=LDouble
+ else
+ AC_CV_NAME_supported=no
+ fi
+ else
+ FP_COMPUTE_INT([HTYPE_IS_SIGNED],[(($1)(-1)) < (($1)0)],
+ [FPTOOLS_HTYPE_INCLUDES],
+ [AC_CV_NAME_supported=no])
+ FP_COMPUTE_INT([HTYPE_SIZE],[sizeof($1) * 8],
+ [FPTOOLS_HTYPE_INCLUDES],
+ [AC_CV_NAME_supported=no])
+ if test "$HTYPE_IS_SIGNED" -eq 0
+ then
+ AC_CV_NAME="Word$HTYPE_SIZE"
+ else
+ AC_CV_NAME="Int$HTYPE_SIZE"
+ fi
+ fi
+ fi
+ ])
+ if test "$AC_CV_NAME_supported" = yes; then
+ AC_MSG_RESULT($AC_CV_NAME)
+ AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME,
+ [Define to Haskell type for $1])
+ else
+ AC_CV_NAME=NotReallyAType
+ AC_MSG_RESULT([not supported])
+ fi
+ undefine([AC_TYPE_NAME])dnl
+ undefine([AC_CV_NAME])dnl
+ undefine([AC_CV_NAME_supported])dnl
+])