changeset 8664:40c507f55b0f

Implement the %F directive if the system doesn't implement it correctly.
author Bruno Haible <bruno@clisp.org>
date Wed, 11 Apr 2007 23:46:07 +0000
parents e2189cab039d
children c18ed5db8600
files ChangeLog lib/vasnprintf.c m4/fprintf-posix.m4 m4/printf.m4 m4/snprintf-posix.m4 m4/sprintf-posix.m4 m4/vasnprintf-posix.m4 m4/vasnprintf.m4 m4/vasprintf-posix.m4 m4/vfprintf-posix.m4 m4/vsnprintf-posix.m4 m4/vsprintf-posix.m4
diffstat 12 files changed, 240 insertions(+), 88 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,35 @@
+2007-04-11  Bruno Haible  <bruno@clisp.org>
+
+	* lib/vasnprintf.c (VASNPRINTF): Implement the %F directive using the
+	%f directive, if NEED_PRINTF_DIRECTIVE_F is defined.
+	* m4/printf.m4 (gl_PRINTF_DIRECTIVE_F): New macro.
+	* m4/vasnprintf.m4 (gl_PREREQ_VASNPRINTF_DIRECTIVE_F): New macro.
+	* m4/fprintf-posix.m4 (gl_FUNC_FPRINTF_POSIX): Invoke
+	gl_PRINTF_DIRECTIVE_F. Test gl_cv_func_printf_directive_f. Invoke
+	gl_PREREQ_VASNPRINTF_DIRECTIVE_F for the replacement.
+	* m4/snprintf-posix.m4 (gl_FUNC_SNPRINTF_POSIX): Invoke
+	gl_PRINTF_DIRECTIVE_F. Test gl_cv_func_printf_directive_f. Invoke
+	gl_PREREQ_VASNPRINTF_DIRECTIVE_F for the replacement.
+	* m4/sprintf-posix.m4 (gl_FUNC_SPRINTF_POSIX): Invoke
+	gl_PRINTF_DIRECTIVE_F. Test gl_cv_func_printf_directive_f. Invoke
+	gl_PREREQ_VASNPRINTF_DIRECTIVE_F for the replacement.
+	* m4/vasnprintf-posix.m4 (gl_FUNC_VASNPRINTF_POSIX): Invoke
+	gl_PRINTF_DIRECTIVE_F. Test gl_cv_func_printf_directive_f. Invoke
+	gl_PREREQ_VASNPRINTF_DIRECTIVE_F for the replacement.
+	* m4/vasprintf-posix.m4 (gl_FUNC_VASPRINTF_POSIX): Invoke
+	gl_PRINTF_DIRECTIVE_F. Test gl_cv_func_printf_directive_f. Invoke
+	gl_PREREQ_VASNPRINTF_DIRECTIVE_F for the replacement.
+	* m4/vfprintf-posix.m4 (gl_FUNC_VFPRINTF_POSIX): Invoke
+	gl_PRINTF_DIRECTIVE_F. Test gl_cv_func_printf_directive_f. Invoke
+	gl_PREREQ_VASNPRINTF_DIRECTIVE_F for the replacement.
+	* m4/vsnprintf-posix.m4 (gl_FUNC_VSNPRINTF_POSIX): Invoke
+	gl_PRINTF_DIRECTIVE_F. Test gl_cv_func_printf_directive_f. Invoke
+	gl_PREREQ_VASNPRINTF_DIRECTIVE_F for the replacement.
+	* m4/vsprintf-posix.m4 (gl_FUNC_VSPRINTF_POSIX): Invoke
+	gl_PRINTF_DIRECTIVE_F. Test gl_cv_func_printf_directive_f. Invoke
+	gl_PREREQ_VASNPRINTF_DIRECTIVE_F for the replacement.
+	Reported by Eric Blake.
+
 2007-04-11  Bruno Haible  <bruno@clisp.org>
 
 	* m4/printf.m4 (gl_PRINTF_DIRECTIVE_A): Fix test. It always failed.
--- a/lib/vasnprintf.c
+++ b/lib/vasnprintf.c
@@ -1061,7 +1061,12 @@
 		  default:
 		    break;
 		  }
-		*p = dp->conversion;
+#if NEED_PRINTF_DIRECTIVE_F
+		if (dp->conversion == 'F')
+		  *p = 'f';
+		else
+#endif
+		  *p = dp->conversion;
 #if USE_SNPRINTF
 		p[1] = '%';
 		p[2] = 'n';
@@ -1348,6 +1353,18 @@
 		      free (tmp);
 #endif
 
+#if NEED_PRINTF_DIRECTIVE_F
+		    if (dp->conversion == 'F')
+		      {
+			/* Convert the %f result to upper case for %F.  */
+			CHAR_T *rp = result + length;
+			size_t rc;
+			for (rc = count; rc > 0; rc--, rp++)
+			  if (*rp >= 'a' && *rp <= 'z')
+			    *rp = *rp - 'a' + 'A';
+		      }
+#endif
+
 		    length += count;
 		    break;
 		  }
--- a/m4/fprintf-posix.m4
+++ b/m4/fprintf-posix.m4
@@ -1,4 +1,4 @@
-# fprintf-posix.m4 serial 2
+# fprintf-posix.m4 serial 3
 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,
@@ -9,6 +9,7 @@
   AC_REQUIRE([gl_EOVERFLOW])
   AC_REQUIRE([gl_PRINTF_SIZES_C99])
   AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
+  AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
   AC_REQUIRE([gl_PRINTF_DIRECTIVE_N])
   AC_REQUIRE([gl_PRINTF_POSITIONS])
   gl_cv_func_fprintf_posix=no
@@ -16,12 +17,16 @@
     *yes)
       case "$gl_cv_func_printf_directive_a" in
         *yes)
-          case "$gl_cv_func_printf_directive_n" in
+          case "$gl_cv_func_printf_directive_f" in
             *yes)
-              case "$gl_cv_func_printf_positions" in
+              case "$gl_cv_func_printf_directive_n" in
                 *yes)
-                  # fprintf exists and is already POSIX compliant.
-                  gl_cv_func_fprintf_posix=yes
+                  case "$gl_cv_func_printf_positions" in
+                    *yes)
+                      # fprintf exists and is already POSIX compliant.
+                      gl_cv_func_fprintf_posix=yes
+                      ;;
+                  esac
                   ;;
               esac
               ;;
@@ -32,6 +37,7 @@
   esac
   if test $gl_cv_func_fprintf_posix = no; then
     gl_PREREQ_VASNPRINTF_DIRECTIVE_A
+    gl_PREREQ_VASNPRINTF_DIRECTIVE_F
     gl_REPLACE_VASNPRINTF
     gl_REPLACE_FPRINTF
   fi
--- a/m4/printf.m4
+++ b/m4/printf.m4
@@ -1,4 +1,4 @@
-# printf.m4 serial 5
+# printf.m4 serial 6
 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,
@@ -162,6 +162,44 @@
     ])
 ])
 
+dnl Test whether the *printf family of functions supports the %F format
+dnl directive. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_printf_directive_f.
+
+AC_DEFUN([gl_PRINTF_DIRECTIVE_F],
+[
+  AC_REQUIRE([AC_PROG_CC])
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+  AC_CACHE_CHECK([whether printf supports the 'F' directive],
+    [gl_cv_func_printf_directive_f], 
+    [
+      AC_TRY_RUN([
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+int main ()
+{
+  if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0
+      || strcmp (buf, "1234567.000000 33") != 0)
+    return 1;
+  if (sprintf (buf, "%F", 1.0 / 0.0) < 0
+      || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0))
+    return 1;
+  /* This catches a Cygwin 2007 bug.  */
+  if (sprintf (buf, "%.F", 1234.0) < 0
+      || strcmp (buf, "1234") != 0)
+    return 1;
+  return 0;
+}], [gl_cv_func_printf_directive_f=yes], [gl_cv_func_printf_directive_f=no],
+      [
+       case "$host_os" in
+                               # If we don't know, assume the worst.
+         *)                    gl_cv_func_printf_directive_f="guessing no";;
+       esac
+      ])
+    ])
+])
+
 dnl Test whether the *printf family of functions supports the %n format
 dnl directive. (ISO C99, POSIX:2001)
 dnl Result is gl_cv_func_printf_directive_n.
@@ -428,42 +466,44 @@
 dnl
 dnl 1 = gl_PRINTF_SIZES_C99
 dnl 2 = gl_PRINTF_DIRECTIVE_A
-dnl 3 = gl_PRINTF_DIRECTIVE_N
-dnl 4 = gl_PRINTF_POSITIONS
-dnl 5 = gl_SNPRINTF_PRESENCE
-dnl 6 = gl_SNPRINTF_TRUNCATION_C99
-dnl 7 = gl_SNPRINTF_RETVAL_C99
-dnl 8 = gl_SNPRINTF_DIRECTIVE_N
+dnl 3 = gl_PRINTF_DIRECTIVE_F
+dnl 4 = gl_PRINTF_DIRECTIVE_N
+dnl 5 = gl_PRINTF_POSITIONS
+dnl 6 = gl_SNPRINTF_PRESENCE
+dnl 7 = gl_SNPRINTF_TRUNCATION_C99
+dnl 8 = gl_SNPRINTF_RETVAL_C99
+dnl 9 = 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...
-dnl 3 = checking whether printf supports the 'n' directive...
-dnl 4 = checking whether printf supports POSIX/XSI format strings with positions...
-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 3 = checking whether printf supports the 'F' directive...
+dnl 4 = checking whether printf supports the 'n' directive...
+dnl 5 = checking whether printf supports POSIX/XSI format strings with positions...
+dnl 6 = checking for snprintf...
+dnl 7 = checking whether snprintf truncates the result as in C99...
+dnl 8 = checking whether snprintf returns a byte count as in C99...
+dnl 9 = 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, 4.0                     .  #  .  .  .  .  .  ?
-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                                #  #  .  #  .  #  #  #
+dnl                                        1  2  3  4  5  6  7  8  9
+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, 4.0                     .  #  ?  .  .  .  .  .  ?
+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                                #  #  #  .  #  .  #  #  #
--- a/m4/snprintf-posix.m4
+++ b/m4/snprintf-posix.m4
@@ -1,4 +1,4 @@
-# snprintf-posix.m4 serial 2
+# snprintf-posix.m4 serial 3
 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,
@@ -9,6 +9,7 @@
   AC_REQUIRE([gl_EOVERFLOW])
   AC_REQUIRE([gl_PRINTF_SIZES_C99])
   AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
+  AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
   AC_REQUIRE([gl_PRINTF_DIRECTIVE_N])
   AC_REQUIRE([gl_PRINTF_POSITIONS])
   gl_cv_func_snprintf_posix=no
@@ -21,19 +22,23 @@
       *yes)
         case "$gl_cv_func_printf_directive_a" in
           *yes)
-            case "$gl_cv_func_printf_directive_n" in
+            case "$gl_cv_func_printf_directive_f" in
               *yes)
-                case "$gl_cv_func_printf_positions" in
+                case "$gl_cv_func_printf_directive_n" in
                   *yes)
-                    case "$gl_cv_func_snprintf_truncation_c99" in
+                    case "$gl_cv_func_printf_positions" in
                       *yes)
-                        case "$gl_cv_func_snprintf_retval_c99" in
+                        case "$gl_cv_func_snprintf_truncation_c99" in
                           *yes)
-                            case "$gl_cv_func_snprintf_directive_n" in
+                            case "$gl_cv_func_snprintf_retval_c99" in
                               *yes)
-                                # snprintf exists and is already POSIX
-                                # compliant.
-                                gl_cv_func_snprintf_posix=yes
+                                case "$gl_cv_func_snprintf_directive_n" in
+                                  *yes)
+                                    # snprintf exists and is already POSIX
+                                    # compliant.
+                                    gl_cv_func_snprintf_posix=yes
+                                    ;;
+                                esac
                                 ;;
                             esac
                             ;;
@@ -51,6 +56,7 @@
   fi
   if test $gl_cv_func_snprintf_posix = no; then
     gl_PREREQ_VASNPRINTF_DIRECTIVE_A
+    gl_PREREQ_VASNPRINTF_DIRECTIVE_F
     gl_REPLACE_VASNPRINTF
     gl_REPLACE_SNPRINTF
   fi
--- a/m4/sprintf-posix.m4
+++ b/m4/sprintf-posix.m4
@@ -1,4 +1,4 @@
-# sprintf-posix.m4 serial 2
+# sprintf-posix.m4 serial 3
 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,
@@ -9,6 +9,7 @@
   AC_REQUIRE([gl_EOVERFLOW])
   AC_REQUIRE([gl_PRINTF_SIZES_C99])
   AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
+  AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
   AC_REQUIRE([gl_PRINTF_DIRECTIVE_N])
   AC_REQUIRE([gl_PRINTF_POSITIONS])
   gl_cv_func_sprintf_posix=no
@@ -16,12 +17,16 @@
     *yes)
       case "$gl_cv_func_printf_directive_a" in
         *yes)
-          case "$gl_cv_func_printf_directive_n" in
+          case "$gl_cv_func_printf_directive_f" in
             *yes)
-              case "$gl_cv_func_printf_positions" in
+              case "$gl_cv_func_printf_directive_n" in
                 *yes)
-                  # sprintf exists and is already POSIX compliant.
-                  gl_cv_func_sprintf_posix=yes
+                  case "$gl_cv_func_printf_positions" in
+                    *yes)
+                      # sprintf exists and is already POSIX compliant.
+                      gl_cv_func_sprintf_posix=yes
+                      ;;
+                  esac
                   ;;
               esac
               ;;
@@ -32,6 +37,7 @@
   esac
   if test $gl_cv_func_sprintf_posix = no; then
     gl_PREREQ_VASNPRINTF_DIRECTIVE_A
+    gl_PREREQ_VASNPRINTF_DIRECTIVE_F
     gl_REPLACE_VASNPRINTF
     gl_REPLACE_SPRINTF
   fi
--- a/m4/vasnprintf-posix.m4
+++ b/m4/vasnprintf-posix.m4
@@ -1,4 +1,4 @@
-# vasnprintf-posix.m4 serial 3
+# vasnprintf-posix.m4 serial 4
 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,
@@ -9,6 +9,7 @@
   AC_REQUIRE([gl_EOVERFLOW])
   AC_REQUIRE([gl_PRINTF_SIZES_C99])
   AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
+  AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
   AC_REQUIRE([gl_PRINTF_DIRECTIVE_N])
   AC_REQUIRE([gl_PRINTF_POSITIONS])
   gl_cv_func_vasnprintf_posix=no
@@ -17,14 +18,18 @@
     *yes)
       case "$gl_cv_func_printf_directive_a" in
         *yes)
-          case "$gl_cv_func_printf_directive_n" in
+          case "$gl_cv_func_printf_directive_f" in
             *yes)
-              case "$gl_cv_func_printf_positions" in
+              case "$gl_cv_func_printf_directive_n" in
                 *yes)
-                  if test $ac_cv_func_vasnprintf = yes; then
-                    # vasnprintf exists and is already POSIX compliant.
-                    gl_cv_func_vasnprintf_posix=yes
-                  fi
+                  case "$gl_cv_func_printf_positions" in
+                    *yes)
+                      if test $ac_cv_func_vasnprintf = yes; then
+                        # vasnprintf exists and is already POSIX compliant.
+                        gl_cv_func_vasnprintf_posix=yes
+                      fi
+                      ;;
+                  esac
                   ;;
               esac
               ;;
@@ -35,6 +40,7 @@
   esac
   if test $gl_cv_func_vasnprintf_posix = no; then
     gl_PREREQ_VASNPRINTF_DIRECTIVE_A
+    gl_PREREQ_VASNPRINTF_DIRECTIVE_F
     gl_REPLACE_VASNPRINTF
   fi
 ])
--- a/m4/vasnprintf.m4
+++ b/m4/vasnprintf.m4
@@ -1,4 +1,4 @@
-# vasnprintf.m4 serial 12
+# vasnprintf.m4 serial 13
 dnl Copyright (C) 2002-2004, 2006-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,
@@ -75,6 +75,21 @@
   esac
 ])
 
+# Extra prerequisites of lib/vasnprintf.c for supporting the 'F' directive.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_DIRECTIVE_F],
+[
+  AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
+  case "$gl_cv_func_printf_directive_f" in
+    *yes)
+      ;;
+    *)
+      AC_DEFINE([NEED_PRINTF_DIRECTIVE_F], 1,
+        [Define if the vasnprintf implementation needs special code for
+         the 'F' directive.])
+      ;;
+  esac
+])
+
 # Prerequisites of lib/asnprintf.c.
 AC_DEFUN([gl_PREREQ_ASNPRINTF],
 [
--- a/m4/vasprintf-posix.m4
+++ b/m4/vasprintf-posix.m4
@@ -1,4 +1,4 @@
-# vasprintf-posix.m4 serial 3
+# vasprintf-posix.m4 serial 4
 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,
@@ -9,6 +9,7 @@
   AC_REQUIRE([gl_EOVERFLOW])
   AC_REQUIRE([gl_PRINTF_SIZES_C99])
   AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
+  AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
   AC_REQUIRE([gl_PRINTF_DIRECTIVE_N])
   AC_REQUIRE([gl_PRINTF_POSITIONS])
   gl_cv_func_vasprintf_posix=no
@@ -17,14 +18,18 @@
     *yes)
       case "$gl_cv_func_printf_directive_a" in
         *yes)
-          case "$gl_cv_func_printf_directive_n" in
+          case "$gl_cv_func_printf_directive_f" in
             *yes)
-              case "$gl_cv_func_printf_positions" in
+              case "$gl_cv_func_printf_directive_n" in
                 *yes)
-                  if test $ac_cv_func_vasprintf = yes; then
-                    # vasprintf exists and is already POSIX compliant.
-                    gl_cv_func_vasprintf_posix=yes
-                  fi
+                  case "$gl_cv_func_printf_positions" in
+                    *yes)
+                      if test $ac_cv_func_vasprintf = yes; then
+                        # vasprintf exists and is already POSIX compliant.
+                        gl_cv_func_vasprintf_posix=yes
+                      fi
+                      ;;
+                  esac
                   ;;
               esac
               ;;
@@ -35,6 +40,7 @@
   esac
   if test $gl_cv_func_vasprintf_posix = no; then
     gl_PREREQ_VASNPRINTF_DIRECTIVE_A
+    gl_PREREQ_VASNPRINTF_DIRECTIVE_F
     gl_REPLACE_VASNPRINTF
     gl_REPLACE_VASPRINTF
   fi
--- a/m4/vfprintf-posix.m4
+++ b/m4/vfprintf-posix.m4
@@ -1,4 +1,4 @@
-# vfprintf-posix.m4 serial 2
+# vfprintf-posix.m4 serial 3
 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,
@@ -9,6 +9,7 @@
   AC_REQUIRE([gl_EOVERFLOW])
   AC_REQUIRE([gl_PRINTF_SIZES_C99])
   AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
+  AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
   AC_REQUIRE([gl_PRINTF_DIRECTIVE_N])
   AC_REQUIRE([gl_PRINTF_POSITIONS])
   gl_cv_func_vfprintf_posix=no
@@ -16,12 +17,16 @@
     *yes)
       case "$gl_cv_func_printf_directive_a" in
         *yes)
-          case "$gl_cv_func_printf_directive_n" in
+          case "$gl_cv_func_printf_directive_f" in
             *yes)
-              case "$gl_cv_func_printf_positions" in
+              case "$gl_cv_func_printf_directive_n" in
                 *yes)
-                  # vfprintf exists and is already POSIX compliant.
-                  gl_cv_func_vfprintf_posix=yes
+                  case "$gl_cv_func_printf_positions" in
+                    *yes)
+                      # vfprintf exists and is already POSIX compliant.
+                      gl_cv_func_vfprintf_posix=yes
+                      ;;
+                  esac
                   ;;
               esac
               ;;
@@ -32,6 +37,7 @@
   esac
   if test $gl_cv_func_vfprintf_posix = no; then
     gl_PREREQ_VASNPRINTF_DIRECTIVE_A
+    gl_PREREQ_VASNPRINTF_DIRECTIVE_F
     gl_REPLACE_VASNPRINTF
     gl_REPLACE_VFPRINTF
   fi
--- a/m4/vsnprintf-posix.m4
+++ b/m4/vsnprintf-posix.m4
@@ -1,4 +1,4 @@
-# vsnprintf-posix.m4 serial 2
+# vsnprintf-posix.m4 serial 3
 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,
@@ -9,6 +9,7 @@
   AC_REQUIRE([gl_EOVERFLOW])
   AC_REQUIRE([gl_PRINTF_SIZES_C99])
   AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
+  AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
   AC_REQUIRE([gl_PRINTF_DIRECTIVE_N])
   AC_REQUIRE([gl_PRINTF_POSITIONS])
   gl_cv_func_vsnprintf_posix=no
@@ -22,19 +23,23 @@
       *yes)
         case "$gl_cv_func_printf_directive_a" in
           *yes)
-            case "$gl_cv_func_printf_directive_n" in
+            case "$gl_cv_func_printf_directive_f" in
               *yes)
-                case "$gl_cv_func_printf_positions" in
+                case "$gl_cv_func_printf_directive_n" in
                   *yes)
-                    case "$gl_cv_func_snprintf_truncation_c99" in
+                    case "$gl_cv_func_printf_positions" in
                       *yes)
-                        case "$gl_cv_func_snprintf_retval_c99" in
+                        case "$gl_cv_func_snprintf_truncation_c99" in
                           *yes)
-                            case "$gl_cv_func_snprintf_directive_n" in
+                            case "$gl_cv_func_snprintf_retval_c99" in
                               *yes)
-                                # vsnprintf exists and is already POSIX
-                                # compliant.
-                                gl_cv_func_vsnprintf_posix=yes
+                                case "$gl_cv_func_snprintf_directive_n" in
+                                  *yes)
+                                    # vsnprintf exists and is already POSIX
+                                    # compliant.
+                                    gl_cv_func_vsnprintf_posix=yes
+                                    ;;
+                                esac
                                 ;;
                             esac
                             ;;
@@ -52,6 +57,7 @@
   fi
   if test $gl_cv_func_vsnprintf_posix = no; then
     gl_PREREQ_VASNPRINTF_DIRECTIVE_A
+    gl_PREREQ_VASNPRINTF_DIRECTIVE_F
     gl_REPLACE_VASNPRINTF
     gl_REPLACE_VSNPRINTF
   fi
--- a/m4/vsprintf-posix.m4
+++ b/m4/vsprintf-posix.m4
@@ -1,4 +1,4 @@
-# vsprintf-posix.m4 serial 2
+# vsprintf-posix.m4 serial 3
 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,
@@ -9,6 +9,7 @@
   AC_REQUIRE([gl_EOVERFLOW])
   AC_REQUIRE([gl_PRINTF_SIZES_C99])
   AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
+  AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
   AC_REQUIRE([gl_PRINTF_DIRECTIVE_N])
   AC_REQUIRE([gl_PRINTF_POSITIONS])
   gl_cv_func_vsprintf_posix=no
@@ -16,12 +17,16 @@
     *yes)
       case "$gl_cv_func_printf_directive_a" in
         *yes)
-          case "$gl_cv_func_printf_directive_n" in
+          case "$gl_cv_func_printf_directive_f" in
             *yes)
-              case "$gl_cv_func_printf_positions" in
+              case "$gl_cv_func_printf_directive_n" in
                 *yes)
-                  # vsprintf exists and is already POSIX compliant.
-                  gl_cv_func_vsprintf_posix=yes
+                  case "$gl_cv_func_printf_positions" in
+                    *yes)
+                      # vsprintf exists and is already POSIX compliant.
+                      gl_cv_func_vsprintf_posix=yes
+                      ;;
+                  esac
                   ;;
               esac
               ;;
@@ -32,6 +37,7 @@
   esac
   if test $gl_cv_func_vsprintf_posix = no; then
     gl_PREREQ_VASNPRINTF_DIRECTIVE_A
+    gl_PREREQ_VASNPRINTF_DIRECTIVE_F
     gl_REPLACE_VASNPRINTF
     gl_REPLACE_VSPRINTF
   fi