New module 'snprintf-posix'.
authorBruno Haible <bruno@clisp.org>
Wed, 7 Mar 2007 01:59:05 +0000 (01:59 +0000)
committerBruno Haible <bruno@clisp.org>
Wed, 7 Mar 2007 01:59:05 +0000 (01:59 +0000)
ChangeLog
lib/stdio_.h
m4/snprintf-posix.m4 [new file with mode: 0644]
m4/snprintf.m4
m4/stdio_h.m4
modules/snprintf-posix [new file with mode: 0644]
modules/stdio

index ab43988..8c31b57 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,17 @@
 2007-03-06  Bruno Haible  <bruno@clisp.org>
 
+       * modules/snprintf-posix: New file.
+       * m4/snprintf-posix.m4: New file.
+       * m4/snprintf.m4 (gl_REPLACE_SNPRINTF): New macro, extracted from
+       gl_FUNC_SNPRINTF.
+       (gl_FUNC_SNPRINTF): Invoke it.
+       * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Set also REPLACE_SNPRINTF.
+       * lib/stdio_.h (snprintf): Define as a replacement if REPLACE_SNPRINTF
+       is set.
+       * modules/stdio (Makefile.am): Substitute also REPLACE_SNPRINTF.
+
+2007-03-06  Bruno Haible  <bruno@clisp.org>
+
        * modules/vsnprintf-posix-tests: New file.
        * tests/test-vsnprintf-posix.c: New file.
        * tests/test-snprintf-posix.h: New file.
index e48d94c..b4a4072 100644 (file)
@@ -41,7 +41,10 @@ extern "C" {
 
 
 #if @GNULIB_SNPRINTF@
-# if !@HAVE_DECL_SNPRINTF@
+# if @REPLACE_SNPRINTF@
+#  define snprintf rpl_snprintf
+# endif
+# if @REPLACE_SNPRINTF@ || !@HAVE_DECL_SNPRINTF@
 extern int snprintf (char *str, size_t size, const char *format, ...);
 # endif
 #elif defined GNULIB_POSIXCHECK
diff --git a/m4/snprintf-posix.m4 b/m4/snprintf-posix.m4
new file mode 100644 (file)
index 0000000..44c0dbf
--- /dev/null
@@ -0,0 +1,40 @@
+# snprintf-posix.m4 serial 1
+dnl Copyright (C) 2007 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_SNPRINTF_POSIX],
+[
+  AC_REQUIRE([gl_EOVERFLOW])
+  AC_REQUIRE([gl_PRINTF_SIZES_C99])
+  AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
+  AC_REQUIRE([gl_PRINTF_DIRECTIVE_N])
+  AC_REQUIRE([gl_PRINTF_POSITIONS])
+  gl_cv_func_snprintf_posix=no
+  AC_CHECK_FUNCS([snprintf])
+  if test $ac_cv_func_snprintf = yes; then
+    gl_SNPRINTF_TRUNCATION_C99
+    gl_SNPRINTF_RETVAL_C99
+    gl_SNPRINTF_DIRECTIVE_N
+    if expr "$gl_cv_func_printf_sizes_c99" : ".*yes" > /dev/null \
+       && expr "$gl_cv_func_printf_directive_a" : ".*yes" > /dev/null \
+       && expr "$gl_cv_func_printf_directive_n" : ".*yes" > /dev/null \
+       && expr "$gl_cv_func_printf_positions" : ".*yes" > /dev/null \
+       && expr "$gl_cv_func_snprintf_truncation_c99" : ".*yes" > /dev/null \
+       && expr "$gl_cv_func_snprintf_retval_c99" : ".*yes" > /dev/null \
+       && expr "$gl_cv_func_snprintf_directive_n" : ".*yes" > /dev/null; then
+      # snprintf exists and is already POSIX compliant.
+      gl_cv_func_snprintf_posix=yes
+    fi
+  fi
+  if test $gl_cv_func_snprintf_posix = no; then
+    if ! expr "$gl_cv_func_printf_directive_a" : ".*yes" > /dev/null; then
+      AC_DEFINE([NEED_PRINTF_DIRECTIVE_A], 1,
+        [Define if the vasnprintf implementation needs special code for
+         the 'a' and 'A' directives.])
+    fi
+    gl_REPLACE_VASNPRINTF
+    gl_REPLACE_SNPRINTF
+  fi
+])
index b6f9f67..e5d9dd4 100644 (file)
@@ -1,4 +1,4 @@
-# snprintf.m4 serial 3
+# snprintf.m4 serial 4
 dnl Copyright (C) 2002, 2003, 2004, 2007 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -7,11 +7,22 @@ dnl with or without modifications, as long as this notice is preserved.
 AC_DEFUN([gl_FUNC_SNPRINTF],
 [
   AC_REQUIRE([gl_STDIO_H_DEFAULTS])
-  AC_REPLACE_FUNCS(snprintf)
-  AC_CHECK_DECLS_ONCE(snprintf)
+  AC_CHECK_FUNCS([snprintf])
+  if test $ac_cv_func_snprintf = no; then
+    gl_REPLACE_SNPRINTF
+  fi
+  AC_CHECK_DECLS_ONCE([snprintf])
   if test $ac_cv_have_decl_snprintf = no; then
     HAVE_DECL_SNPRINTF=0
   fi
+])
+
+AC_DEFUN([gl_REPLACE_SNPRINTF],
+[
+  AC_LIBOBJ([snprintf])
+  if test $ac_cv_func_snprintf = yes; then
+    REPLACE_SNPRINTF=1
+  fi
   gl_PREREQ_SNPRINTF
 ])
 
index 33b5996..7927157 100644 (file)
@@ -24,6 +24,7 @@ AC_DEFUN([gl_STDIO_H_DEFAULTS],
   GNULIB_SNPRINTF=0;     AC_SUBST([GNULIB_SNPRINTF])
   GNULIB_VSNPRINTF=0;    AC_SUBST([GNULIB_VSNPRINTF])
   dnl Assume proper GNU behavior unless another module says otherwise.
+  REPLACE_SNPRINTF=0;    AC_SUBST([REPLACE_SNPRINTF])
   HAVE_DECL_SNPRINTF=1;  AC_SUBST([HAVE_DECL_SNPRINTF])
   REPLACE_VSNPRINTF=0;   AC_SUBST([REPLACE_VSNPRINTF])
   HAVE_DECL_VSNPRINTF=1; AC_SUBST([HAVE_DECL_VSNPRINTF])
diff --git a/modules/snprintf-posix b/modules/snprintf-posix
new file mode 100644 (file)
index 0000000..a5a6ac1
--- /dev/null
@@ -0,0 +1,30 @@
+Description:
+POSIX compatible snprintf() function: print formatted output to a fixed length
+string
+
+Files:
+m4/snprintf-posix.m4
+m4/printf.m4
+
+Depends-on:
+snprintf
+vasnprintf
+isnan-nolibm
+isnanl-nolibm
+printf-frexp
+printf-frexpl
+
+configure.ac:
+gl_FUNC_SNPRINTF_POSIX
+
+Makefile.am:
+
+Include:
+<stdio.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+
index 7eb9357..a6e1075 100644 (file)
@@ -23,6 +23,7 @@ stdio.h: stdio_.h
          sed -e 's|@''ABSOLUTE_STDIO_H''@|$(ABSOLUTE_STDIO_H)|g' \
              -e 's|@''GNULIB_SNPRINTF''@|$(GNULIB_SNPRINTF)|g' \
              -e 's|@''GNULIB_VSNPRINTF''@|$(GNULIB_VSNPRINTF)|g' \
+             -e 's|@''REPLACE_SNPRINTF''@|$(REPLACE_SNPRINTF)|g' \
              -e 's|@''HAVE_DECL_SNPRINTF''@|$(HAVE_DECL_SNPRINTF)|g' \
              -e 's|@''REPLACE_VSNPRINTF''@|$(REPLACE_VSNPRINTF)|g' \
              -e 's|@''HAVE_DECL_VSNPRINTF''@|$(HAVE_DECL_VSNPRINTF)|g' \