From f4a0b4d282a1718ac6e3fff10d02aa877e294324 Mon Sep 17 00:00:00 2001 From: The Android Open Source Project Date: Wed, 17 Dec 2008 18:04:23 -0800 Subject: Code drop from //branches/cupcake/...@124589 --- m4/ac_func_snprintf.m4 | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 m4/ac_func_snprintf.m4 (limited to 'm4/ac_func_snprintf.m4') diff --git a/m4/ac_func_snprintf.m4 b/m4/ac_func_snprintf.m4 new file mode 100644 index 0000000..3b1d43a --- /dev/null +++ b/m4/ac_func_snprintf.m4 @@ -0,0 +1,73 @@ +dnl From http://autoconf-archive.cryp.to/ + +dnl @synopsis AC_FUNC_SNPRINTF +dnl +dnl Checks for a fully C99 compliant snprintf, in particular checks +dnl whether it does bounds checking and returns the correct string +dnl length; does the same check for vsnprintf. If no working snprintf +dnl or vsnprintf is found, request a replacement and warn the user +dnl about it. Note: the mentioned replacement is freely available and +dnl may be used in any project regardless of it's licence (just like +dnl the autoconf special exemption). +dnl +dnl @category C +dnl @author Rüdiger Kuhlmann +dnl @version 2002-09-26 +dnl @license AllPermissive + +AC_DEFUN([AC_FUNC_SNPRINTF], +[AC_CHECK_FUNCS(snprintf vsnprintf) +AC_MSG_CHECKING(for working snprintf) +AC_CACHE_VAL(ac_cv_have_working_snprintf, +[AC_TRY_RUN( +[#include + +int main(void) +{ + char bufs[5] = { 'x', 'x', 'x', '\0', '\0' }; + char bufd[5] = { 'x', 'x', 'x', '\0', '\0' }; + int i; + i = snprintf (bufs, 2, "%s", "111"); + if (strcmp (bufs, "1")) exit (1); + if (i != 3) exit (1); + i = snprintf (bufd, 2, "%d", 111); + if (strcmp (bufd, "1")) exit (1); + if (i != 3) exit (1); + exit(0); +}], ac_cv_have_working_snprintf=yes, ac_cv_have_working_snprintf=no, ac_cv_have_working_snprintf=cross)]) +AC_MSG_RESULT([$ac_cv_have_working_snprintf]) +AC_MSG_CHECKING(for working vsnprintf) +AC_CACHE_VAL(ac_cv_have_working_vsnprintf, +[AC_TRY_RUN( +[#include +#include + +int my_vsnprintf (char *buf, const char *tmpl, ...) +{ + int i; + va_list args; + va_start (args, tmpl); + i = vsnprintf (buf, 2, tmpl, args); + va_end (args); + return i; +} + +int main(void) +{ + char bufs[5] = { 'x', 'x', 'x', '\0', '\0' }; + char bufd[5] = { 'x', 'x', 'x', '\0', '\0' }; + int i; + i = my_vsnprintf (bufs, "%s", "111"); + if (strcmp (bufs, "1")) exit (1); + if (i != 3) exit (1); + i = my_vsnprintf (bufd, "%d", 111); + if (strcmp (bufd, "1")) exit (1); + if (i != 3) exit (1); + exit(0); +}], ac_cv_have_working_vsnprintf=yes, ac_cv_have_working_vsnprintf=no, ac_cv_have_working_vsnprintf=cross)]) +AC_MSG_RESULT([$ac_cv_have_working_vsnprintf]) +if test x$ac_cv_have_working_snprintf$ac_cv_have_working_vsnprintf != "xyesyes"; then + AC_LIBOBJ(snprintf) + AC_MSG_WARN([Will use fallback (v)snprintf() implementation.]) + AC_DEFINE(PREFER_PORTABLE_SNPRINTF, 1, "enable replacement (v)snprintf if system (v)snprintf is broken") +fi]) -- cgit v1.2.3