Macro: ac_func_snprintf

Back to the Main Page. | # ac_func_snprintf | Download the M4 Source.

Synopsis

  `AC_FUNC_SNPRINTF`

Version

  1.2 (2002/12/12) C_Support @ ac-archive-0.5.39

Author

  Rüdiger Kuhlmann <info@ruediger-kuhlmann.de>

Description

  Checks for a fully C99 compliant snprintf, in particular checks whether it does bounds checking and returns the correct string length; does the same check for vsnprintf. If no working snprintf or vsnprintf is found, request a replacement and warn the user about it. Note: the mentioned replacement is freely available and may be used in any project regardless of it's licence (just like the autoconf special exemption).

M4 Source Code

      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 <stdio.h>

      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 <stdio.h>
      #include <stdarg.h>

      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([Replacing missing/broken (v)snprintf() with version from http://www.ijs.si/software/snprintf/.])
        AC_DEFINE(PREFER_PORTABLE_SNPRINTF, 1, "enable replacement (v)snprintf if system (v)snprintf is broken")
      fi])