bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: check for C99-compliant snprintf


From: Bruno Haible
Subject: Re: check for C99-compliant snprintf
Date: Tue, 6 Mar 2007 01:54:06 +0100
User-agent: KMail/1.5.4

Ralf Wildenhues wrote:
> |                                     1  2  3  4  5  6  7
> |     OpenBSD 3.9                     .  #  .  .  .  .  .
> |     HP-UX 10.20                     #  #  .  .  .  .  #
> |     NetBSD 4.99.13                  .  .  .  .  .  .  . 

Thanks for these results. I've added them to printf.m4. For NetBSD, the
printf improvements (which they borrowed from FreeBSD) appear to be also
on the branch for NetBSD 4.0, therefore I've noted "NetBSD 4" instead of
NetBSD 4.99.13, although I couldn't directly test it.

> Not sure why my HP-UX results differ from yours, I did not investigate
> at all. 

The failures of %n on HP-UX were in the truncated tail of an snprintf() call.
I've now added the corresponding test:

2007-03-05  Bruno Haible  <address@hidden>

        * m4/printf.m4 (gl_SNPRINTF_DIRECTIVE_N): New macro.

*** m4/printf.m4        5 Mar 2007 23:51:20 -0000       1.8
--- m4/printf.m4        6 Mar 2007 00:44:21 -0000
***************
*** 1,4 ****
! # printf.m4 serial 1
  dnl Copyright (C) 2003, 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,
--- 1,4 ----
! # printf.m4 serial 2
  dnl Copyright (C) 2003, 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,
***************
*** 368,373 ****
--- 368,432 ----
      ])
  ])
  
+ dnl Test whether the snprintf function supports the %n format directive
+ dnl also in truncated portions of the format string. (ISO C99, POSIX:2001)
+ dnl Result is gl_cv_func_snprintf_directive_n.
+ 
+ AC_DEFUN([gl_SNPRINTF_DIRECTIVE_N],
+ [
+   AC_REQUIRE([AC_PROG_CC])
+   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+   AC_CACHE_CHECK([whether snprintf fully supports the 'n' directive],
+     [gl_cv_func_snprintf_directive_n], 
+     [
+       AC_TRY_RUN([
+ #include <stdio.h>
+ #include <string.h>
+ static char buf[100];
+ int main ()
+ {
+   int count = -1;
+   snprintf (buf, 4, "%d %n", 12345, &count, 33, 44, 55);
+   if (count != 6)
+     return 1;
+   return 0;
+ }], [gl_cv_func_snprintf_directive_n=yes], 
[gl_cv_func_snprintf_directive_n=no],
+       [
+ changequote(,)dnl
+        case "$host_os" in
+                                dnl Guess yes on glibc systems.
+          *-gnu*)               gl_cv_func_snprintf_directive_n="guessing 
yes";;
+                                dnl Guess yes on FreeBSD >= 5.
+          freebsd[1-4]*)        gl_cv_func_snprintf_directive_n="guessing no";;
+          freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing 
yes";;
+                                dnl Guess yes on MacOS X >= 10.3.
+          darwin[1-6].*)        gl_cv_func_snprintf_directive_n="guessing no";;
+          darwin*)              gl_cv_func_snprintf_directive_n="guessing 
yes";;
+                                dnl Guess yes on Solaris >= 2.6.
+          solaris2.[0-5]*)      gl_cv_func_snprintf_directive_n="guessing no";;
+          solaris*)             gl_cv_func_snprintf_directive_n="guessing 
yes";;
+                                dnl Guess yes on AIX >= 4.
+          aix[1-3]*)            gl_cv_func_snprintf_directive_n="guessing no";;
+          aix*)                 gl_cv_func_snprintf_directive_n="guessing 
yes";;
+                                dnl Guess yes on IRIX >= 6.5.
+          irix6.5)              gl_cv_func_snprintf_directive_n="guessing 
yes";;
+                                dnl Guess yes on OSF/1 >= 5.
+          osf[3-4]*)            gl_cv_func_snprintf_directive_n="guessing no";;
+          osf*)                 gl_cv_func_snprintf_directive_n="guessing 
yes";;
+                                dnl Guess yes on NetBSD >= 3.
+          netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+                                gl_cv_func_snprintf_directive_n="guessing no";;
+          netbsd*)              gl_cv_func_snprintf_directive_n="guessing 
yes";;
+                                dnl Guess yes on BeOS.
+          beos*)                gl_cv_func_snprintf_directive_n="guessing 
yes";;
+                                dnl If we don't know, assume the worst.
+          *)                    gl_cv_func_snprintf_directive_n="guessing no";;
+        esac
+ changequote([,])dnl
+       ])
+     ])
+ ])
+ 
  dnl The results of these tests on various platforms are:
  dnl
  dnl 1 = gl_PRINTF_SIZES_C99
***************
*** 377,382 ****
--- 436,442 ----
  dnl 5 = gl_SNPRINTF_PRESENCE
  dnl 6 = gl_SNPRINTF_TRUNCATION_C99
  dnl 7 = gl_SNPRINTF_RETVAL_C99
+ dnl 8 = gl_SNPRINTF_DIRECTIVE_N
  dnl
  dnl 1 = checking whether printf supports size specifiers as in C99...
  dnl 2 = checking whether printf supports the 'a' and 'A' directives...
***************
*** 385,411 ****
  dnl 5 = checking for snprintf...
  dnl 6 = checking whether snprintf truncates the result as in C99...
  dnl 7 = checking whether snprintf returns a byte count as in C99...
  dnl
  dnl . = yes, # = no.
  dnl
! dnl                                        1  2  3  4  5  6  7
! dnl   glibc 2.5                            .  .  .  .  .  .  .
! dnl   glibc 2.3.6                          .  #  .  .  .  .  .
! dnl   FreeBSD 5.4, 6.1                     .  .  .  .  .  .  .
! dnl   MacOS X 10.3.9                       .  #  .  .  .  .  .
! dnl   OpenBSD 3.9                          .  #  .  .  .  .  .
! dnl   Cygwin 2007                          .  #  .  .  .  .  .
! dnl   Cygwin 2006                          #  #  .  .  .  .  .
! dnl   Solaris 10                           .  #  .  .  .  .  .
! dnl   Solaris 2.6 ... 9                    #  #  .  .  .  .  .
! dnl   Solaris 2.5.1                        #  #  .  .  #  #  #
! dnl   AIX 4.3.2, 5.1                       #  #  .  .  .  .  .
! dnl   HP-UX 11.31                          .  #  .  .  .  .  #
! dnl   HP-UX 10.20, 11.00, 11.11, 11.23     #  #  .  .  .  .  #
! dnl   IRIX 6.5                             #  #  .  .  .  .  #
! dnl   OSF/1 5.1                            #  #  .  .  .  .  #
! dnl   OSF/1 4.0d                           #  #  .  .  #  #  #
! dnl   NetBSD 4.0                           .  .  .  .  .  .  .
! dnl   NetBSD 3.0                           .  #  .  #  .  .  .
! dnl   BeOS                                 #  #  .  #  .  .  .
! dnl   mingw                                #  #  .  #  .  #  #
--- 445,472 ----
  dnl 5 = checking for snprintf...
  dnl 6 = checking whether snprintf truncates the result as in C99...
  dnl 7 = checking whether snprintf returns a byte count as in C99...
+ dnl 8 = checking whether snprintf fully supports the 'n' directive...
  dnl
  dnl . = yes, # = no.
  dnl
! dnl                                        1  2  3  4  5  6  7  8
! dnl   glibc 2.5                            .  .  .  .  .  .  .  .
! dnl   glibc 2.3.6                          .  #  .  .  .  .  .  .
! dnl   FreeBSD 5.4, 6.1                     .  .  .  .  .  .  .  .
! dnl   MacOS X 10.3.9                       .  #  .  .  .  .  .  .
! dnl   OpenBSD 3.9                          .  #  .  .  .  .  .  ?
! dnl   Cygwin 2007                          .  #  .  .  .  .  .  ?
! dnl   Cygwin 2006                          #  #  .  .  .  .  .  ?
! dnl   Solaris 10                           .  #  .  .  .  .  .  .
! dnl   Solaris 2.6 ... 9                    #  #  .  .  .  .  .  .
! dnl   Solaris 2.5.1                        #  #  .  .  #  #  #  #
! dnl   AIX 4.3.2, 5.1                       #  #  .  .  .  .  .  .
! dnl   HP-UX 11.31                          .  #  .  .  .  .  #  #
! dnl   HP-UX 10.20, 11.00, 11.11, 11.23     #  #  .  .  .  .  #  #
! dnl   IRIX 6.5                             #  #  .  .  .  .  #  .
! dnl   OSF/1 5.1                            #  #  .  .  .  .  #  .
! dnl   OSF/1 4.0d                           #  #  .  .  #  #  #  #
! dnl   NetBSD 4.0                           .  .  .  .  .  .  .  ?
! dnl   NetBSD 3.0                           .  #  .  #  .  .  .  .
! dnl   BeOS                                 #  #  .  #  .  .  .  .
! dnl   mingw                                #  #  .  #  .  #  #  #





reply via email to

[Prev in Thread] Current Thread [Next in Thread]