blob: 84b0a01ef97cdfa86c949e8dd2022004e3895dd1 [file] [log] [blame]
dnl AC_FUNC_SCANF_CAN_MALLOC macro
dnl
dnl (c) Finn Thain 2006
dnl Copying and distribution of this file, with or without modification,
dnl are permitted in any medium without royalty provided the copyright
dnl notice and this notice are preserved.
# AC_FUNC_SCANF_CAN_MALLOC()
# --------------------------------------
AC_DEFUN([AC_FUNC_SCANF_CAN_MALLOC],
[ AC_CHECK_HEADERS([stdlib.h])
AC_CACHE_CHECK([whether scanf can malloc], [ac_scanf_can_malloc],
[ AC_RUN_IFELSE(
[ AC_LANG_PROGRAM(
[
#include <stdio.h>
#if STDC_HEADERS || HAVE_STDLIB_H
#include <stdlib.h>
#endif
], [
union { float f; char *p; } u;
char *p;
u.f = 0;
char *scan_this = "56789";
int matched = sscanf(scan_this, "%as", &u);
if(matched < 1) return 1; /* shouldn't happens */
if(u.f == (float)56789) return 2;
p = u.p;
while(*scan_this && *p == *scan_this) {
++p;
++scan_this;
};
free(u.p);
if(*scan_this == 0) return 0;
return 3;
])
],
[ac_scanf_can_malloc=yes],
[ac_scanf_can_malloc=no],
[
case $host_alias in
*-*-linux* ) ac_scanf_can_malloc=yes ;;
*-*-solaris* ) ac_scanf_can_malloc=no ;;
*-*-darwin* ) ac_scanf_can_malloc=no ;;
* ) ac_scanf_can_malloc=no ;;
esac
])
])
if test x$ac_scanf_can_malloc = "xyes"; then
AC_DEFINE([SCANF_CAN_MALLOC], 1, [Define to 1 if the scanf %a conversion format mallocs a buffer. Undefine if %a format denotes a float.])
fi
])