diff options
author | Russ Allbery <rra@stanford.edu> | 2007-10-04 22:21:19 +0000 |
---|---|---|
committer | Russ Allbery <rra@stanford.edu> | 2007-10-04 22:21:19 +0000 |
commit | 9ff667addf39128f43d08d4ec56a6a94ec3bb062 (patch) | |
tree | 41cd39045fb2d37d343608af57aebf844ecd5690 /m4/snprintf.m4 | |
parent | 2f9387bdf0e047bbd193532c4fed209acabd0e7a (diff) |
Initial import of a C portability framework and utility functions from
remctl so that the wallet client error handling can rest on a firmer
foundation.
Diffstat (limited to 'm4/snprintf.m4')
-rw-r--r-- | m4/snprintf.m4 | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/m4/snprintf.m4 b/m4/snprintf.m4 new file mode 100644 index 0000000..a09833f --- /dev/null +++ b/m4/snprintf.m4 @@ -0,0 +1,55 @@ +dnl snprintf.m4 -- Test for a working C99 snprintf. +dnl $Id$ +dnl +dnl Check for a working snprintf. Some systems have an snprintf that doesn't +dnl nul-terminate if the buffer isn't large enough. Others return -1 if the +dnl string doesn't fit into the buffer instead of returning the number of +dnl characters that would have been formatted. Still others don't support +dnl NULL as the buffer argument (just to get a count of the formatted length). +dnl +dnl Provides RRA_FUNC_SNPRINTF, which adds snprintf.o to LIBOBJS unless a +dnl fully working snprintf is found. +dnl +dnl Written by Russ Allbery <rra@stanford.edu> +dnl Copyright 2006 Board of Trustees, Leland Stanford Jr. University +dnl See README for licensing terms. + +dnl Source used by RRA_FUNC_SNPRINTF. +define([_RRA_FUNC_SNPRINTF_SOURCE], +[[#include <stdio.h> +#include <stdarg.h> + +char buf[2]; + +int +test(char *format, ...) +{ + va_list args; + int count; + + va_start(args, format); + count = vsnprintf(buf, sizeof buf, format, args); + va_end(args); + return count; +} + +int +main() +{ + return ((test("%s", "abcd") == 4 && buf[0] == 'a' && buf[1] == '\0' + && snprintf(NULL, 0, "%s", "abcd") == 4) ? 0 : 1); +}]]) + +dnl The user-callable test. +AC_DEFUN([RRA_FUNC_SNPRINTF], +[AC_CACHE_CHECK([for working snprintf], [rra_cv_func_snprintf_works], + [AC_TRY_RUN(_RRA_FUNC_SNPRINTF_SOURCE(), + [rra_cv_func_snprintf_works=yes], + [rra_cv_func_snprintf_works=no], + [rra_cv_func_snprintf_works=no])]) +if test "$rra_cv_func_snprintf_works" = yes ; then + AC_DEFINE([HAVE_SNPRINTF], 1, + [Define if your system has a working snprintf function.]) +else + AC_LIBOBJ([snprintf]) +fi]) |