bug-gnulib
[Top][All Lists]
Advanced

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

*printf: recognize non-IEEE numbers


From: Bruno Haible
Subject: *printf: recognize non-IEEE numbers
Date: Wed, 6 Jun 2007 04:20:53 +0200
User-agent: KMail/1.5.4

On i386, x86_64, ia64, the 'long double' format has an explicitly represented
most significant mantissa bit. This has the consequence that some bit patterns
in a 'long double' are not covered by IEEE 754. *printf better prints these
numbers as NaN (rather than printing some of them as finite numbers, or
crashing on some of them, like glibc does [1]).

This changes the gnulib *printf-posix modules to recognize this case and
provide a workaround.

Jim is interested in using the *printf-posix modules but wants no big code
imports on glibc-2.6 systems. Therefore I have tied the recognition of this
workaround to a modules named 'printf-safe'. If you don't want it, simply
pass the option  --avoid=print-safe  to gnulib-tool.

Bruno

[1] http://sourceware.org/bugzilla/show_bug.cgi?id=4586
    The report is for ia64, but the same test program crashes also on i386.


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

        Fix *printf so that it recognizes non-IEEE numbers on i386, x86_64,
        ia64.
        * modules/printf-safe: New file.
        * modules/fprintf-posix (Depends-on): Add printf-safe.
        * modules/printf-posix (Depends-on): Likewise.
        * modules/snprintf-posix (Depends-on): Likewise.
        * modules/sprintf-posix (Depends-on): Likewise.
        * modules/vasnprintf-posix (Depends-on): Likewise.
        * modules/vasprintf-posix (Depends-on): Likewise.
        * modules/vfprintf-posix (Depends-on): Likewise.
        * modules/vprintf-posix (Depends-on): Likewise.
        * modules/vsnprintf-posix (Depends-on): Likewise.
        * modules/vsprintf-posix (Depends-on): Likewise.
        * m4/printf.m4 (gl_PRINTF_INFINITE_LONG_DOUBLE): Require
        AC_C_BIGENDIAN. Define CHECK_PRINTF_SAFE if printf-safe is used. Test
        non-IEEE numbers on i386, x86_64, ia64. When cross-compiling, guess
        "no" on i386, x86_64, ia64.
        * tests/test-snprintf-posix.h (LDBL80_WORDS): New macro.
        (test_function): Check result of %La, %Lf, %Le, %Lg on non-IEEE numbers
        on i386, x86_64, ia64.
        * tests/test-sprintf-posix.h (LDBL80_WORDS): New macro.
        (test_function): Check result of %La, %Lf, %Le, %Lg on non-IEEE numbers
        on i386, x86_64, ia64.
        * tests/test-vasnprintf-posix.c: Include float.h.
        (LDBL80_WORDS): New macro.
        (test_function): Check result of %La, %Lf, %Le, %Lg on non-IEEE numbers
        on i386, x86_64, ia64.
        * tests/test-vasprintf-posix.c: Include float.h.
        (LDBL80_WORDS): New macro.
        (test_function): Check result of %La, %Lf, %Le, %Lg on non-IEEE numbers
        on i386, x86_64, ia64.
        * tests/test-snprintf-posix.c: Include float.h.
        * tests/test-sprintf-posix.c: Likewise.
        * tests/test-vsnprintf-posix.c: Likewise.
        * tests/test-vsprintf-posix.c: Likewise.

======================== modules/printf-safe ============================
Description:
Ensures that the *printf() functions provided by the *printf-posix modules
recognize non-IEEE-754 values of 'long double' arguments and display them as
NaN (rather than producing undefined behavior).

Files:

Depends-on:

configure.ac:
m4_divert_text([INIT_PREPARE], [gl_printf_safe=yes])

Makefile.am:

Include:

License:
LGPL

Maintainer:
Bruno Haible

=========================================================================
*** m4/printf.m4        22 May 2007 01:07:46 -0000      1.33
--- m4/printf.m4        6 Jun 2007 01:46:27 -0000
***************
*** 1,4 ****
! # printf.m4 serial 13
  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 14
  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,
***************
*** 225,237 ****
--- 225,246 ----
  [
    AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
    AC_REQUIRE([AC_PROG_CC])
+   AC_REQUIRE([AC_C_BIGENDIAN])
    AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+   dnl The user can set or unset the variable gl_printf_safe to indicate
+   dnl that he wishes a safe handling of non-IEEE-754 'long double' values.
+   if test -n "$gl_printf_safe"; then
+     AC_DEFINE([CHECK_PRINTF_SAFE], 1,
+       [Define if you wish *printf() functions that have a safe handling of
+        non-IEEE-754 'long double' values.])
+   fi
    case "$gl_cv_func_printf_long_double" in
      *yes)
        AC_CACHE_CHECK([whether printf supports infinite 'long double' 
arguments],
          [gl_cv_func_printf_infinite_long_double],
          [
            AC_TRY_RUN([
+ #include <float.h>
  #include <stdio.h>
  #include <string.h>
  static int
***************
*** 283,312 ****
    if (sprintf (buf, "%Lg", zeroL / zeroL) < 0
        || !strisnan (buf, 0, strlen (buf)))
      return 1;
    return 0;
  }],
            [gl_cv_func_printf_infinite_long_double=yes],
            [gl_cv_func_printf_infinite_long_double=no],
            [
  changequote(,)dnl
!            case "$host_os" in
!                                    # Guess yes on glibc systems.
!              *-gnu*)               
gl_cv_func_printf_infinite_long_double="guessing yes";;
!                                    # Guess yes on FreeBSD >= 6.
!              freebsd[1-5]*)        
gl_cv_func_printf_infinite_long_double="guessing no";;
!              freebsd* | kfreebsd*) 
gl_cv_func_printf_infinite_long_double="guessing yes";;
!                                    # Guess yes on MacOS X >= 10.3.
!              darwin[1-6].*)        
gl_cv_func_printf_infinite_long_double="guessing no";;
!              darwin*)              
gl_cv_func_printf_infinite_long_double="guessing yes";;
!                                    # Guess yes on HP-UX >= 11.
!              hpux[7-9]* | hpux10*) 
gl_cv_func_printf_infinite_long_double="guessing no";;
!              hpux*)                
gl_cv_func_printf_infinite_long_double="guessing yes";;
!                                    # Guess yes on NetBSD >= 3.
!              netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | 
netbsdcoff[1-2]*)
!                                    
gl_cv_func_printf_infinite_long_double="guessing no";;
!              netbsd*)              
gl_cv_func_printf_infinite_long_double="guessing yes";;
!                                    # If we don't know, assume the worst.
!              *)                    
gl_cv_func_printf_infinite_long_double="guessing no";;
             esac
  changequote([,])dnl
            ])
--- 292,433 ----
    if (sprintf (buf, "%Lg", zeroL / zeroL) < 0
        || !strisnan (buf, 0, strlen (buf)))
      return 1;
+ #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined 
__x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || 
defined _I386 || defined _M_IX86 || defined _X86_))
+ /* Representation of an 80-bit 'long double' as an initializer for a sequence
+    of 'unsigned int' words.  */
+ # ifdef WORDS_BIGENDIAN
+ #  define LDBL80_WORDS(exponent,manthi,mantlo) \
+      { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+        ((unsigned int) (manthi) << 16) | (unsigned int) (mantlo) >> 16),    \
+        (unsigned int) (mantlo) << 16                                        \
+      }
+ # else
+ #  define LDBL80_WORDS(exponent,manthi,mantlo) \
+      { mantlo, manthi, exponent }
+ # endif
+   { /* Quiet NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+     if (sprintf (buf, "%Lf", x.value) < 0
+         || !strisnan (buf, 0, strlen (buf)))
+       return 1;
+     if (sprintf (buf, "%Le", x.value) < 0
+         || !strisnan (buf, 0, strlen (buf)))
+       return 1;
+     if (sprintf (buf, "%Lg", x.value) < 0
+         || !strisnan (buf, 0, strlen (buf)))
+       return 1;
+   }
+   {
+     /* Signalling NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+     if (sprintf (buf, "%Lf", x.value) < 0
+         || !strisnan (buf, 0, strlen (buf)))
+       return 1;
+     if (sprintf (buf, "%Le", x.value) < 0
+         || !strisnan (buf, 0, strlen (buf)))
+       return 1;
+     if (sprintf (buf, "%Lg", x.value) < 0
+         || !strisnan (buf, 0, strlen (buf)))
+       return 1;
+   }
+   { /* Pseudo-NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+     if (sprintf (buf, "%Lf", x.value) < 0
+         || !strisnan (buf, 0, strlen (buf)))
+       return 1;
+     if (sprintf (buf, "%Le", x.value) < 0
+         || !strisnan (buf, 0, strlen (buf)))
+       return 1;
+     if (sprintf (buf, "%Lg", x.value) < 0
+         || !strisnan (buf, 0, strlen (buf)))
+       return 1;
+   }
+   { /* Pseudo-Infinity.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+     if (sprintf (buf, "%Lf", x.value) < 0
+         || !strisnan (buf, 0, strlen (buf)))
+       return 1;
+     if (sprintf (buf, "%Le", x.value) < 0
+         || !strisnan (buf, 0, strlen (buf)))
+       return 1;
+     if (sprintf (buf, "%Lg", x.value) < 0
+         || !strisnan (buf, 0, strlen (buf)))
+       return 1;
+   }
+   { /* Pseudo-Zero.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+     if (sprintf (buf, "%Lf", x.value) < 0
+         || !strisnan (buf, 0, strlen (buf)))
+       return 1;
+     if (sprintf (buf, "%Le", x.value) < 0
+         || !strisnan (buf, 0, strlen (buf)))
+       return 1;
+     if (sprintf (buf, "%Lg", x.value) < 0
+         || !strisnan (buf, 0, strlen (buf)))
+       return 1;
+   }
+   { /* Unnormalized number.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+     if (sprintf (buf, "%Lf", x.value) < 0
+         || !strisnan (buf, 0, strlen (buf)))
+       return 1;
+     if (sprintf (buf, "%Le", x.value) < 0
+         || !strisnan (buf, 0, strlen (buf)))
+       return 1;
+     if (sprintf (buf, "%Lg", x.value) < 0
+         || !strisnan (buf, 0, strlen (buf)))
+       return 1;
+   }
+   { /* Pseudo-Denormal.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+     if (sprintf (buf, "%Lf", x.value) < 0
+         || !strisnan (buf, 0, strlen (buf)))
+       return 1;
+     if (sprintf (buf, "%Le", x.value) < 0
+         || !strisnan (buf, 0, strlen (buf)))
+       return 1;
+     if (sprintf (buf, "%Lg", x.value) < 0
+         || !strisnan (buf, 0, strlen (buf)))
+       return 1;
+   }
+ #endif
    return 0;
  }],
            [gl_cv_func_printf_infinite_long_double=yes],
            [gl_cv_func_printf_infinite_long_double=no],
            [
  changequote(,)dnl
!            case "$host_cpu" in
!                                    # Guess no on ia64, i386.
!              ia64 | i*86)          
gl_cv_func_printf_infinite_long_double="guessing no";;
!              *)
!                case "$host_os" in
!                                        # Guess yes on glibc systems.
!                  *-gnu*)               
gl_cv_func_printf_infinite_long_double="guessing yes";;
!                                        # Guess yes on FreeBSD >= 6.
!                  freebsd[1-5]*)        
gl_cv_func_printf_infinite_long_double="guessing no";;
!                  freebsd* | kfreebsd*) 
gl_cv_func_printf_infinite_long_double="guessing yes";;
!                                        # Guess yes on MacOS X >= 10.3.
!                  darwin[1-6].*)        
gl_cv_func_printf_infinite_long_double="guessing no";;
!                  darwin*)              
gl_cv_func_printf_infinite_long_double="guessing yes";;
!                                        # Guess yes on HP-UX >= 11.
!                  hpux[7-9]* | hpux10*) 
gl_cv_func_printf_infinite_long_double="guessing no";;
!                  hpux*)                
gl_cv_func_printf_infinite_long_double="guessing yes";;
!                                        # Guess yes on NetBSD >= 3.
!                  netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | 
netbsdcoff[1-2]*)
!                                        
gl_cv_func_printf_infinite_long_double="guessing no";;
!                  netbsd*)              
gl_cv_func_printf_infinite_long_double="guessing yes";;
!                                        # If we don't know, assume the worst.
!                  *)                    
gl_cv_func_printf_infinite_long_double="guessing no";;
!                esac
!                ;;
             esac
  changequote([,])dnl
            ])
*** modules/fprintf-posix       18 May 2007 18:26:02 -0000      1.4
--- modules/fprintf-posix       6 Jun 2007 01:46:27 -0000
***************
*** 17,22 ****
--- 17,23 ----
  printf-frexpl
  signbit
  fpucw
+ printf-safe
  
  configure.ac:
  gl_FUNC_FPRINTF_POSIX
*** modules/printf-posix        10 Mar 2007 01:20:26 -0000      1.1
--- modules/printf-posix        6 Jun 2007 01:46:27 -0000
***************
*** 9,14 ****
--- 9,15 ----
  Depends-on:
  stdio
  vfprintf-posix
+ printf-safe
  
  configure.ac:
  gl_FUNC_PRINTF_POSIX
*** modules/snprintf-posix      18 May 2007 18:26:03 -0000      1.4
--- modules/snprintf-posix      6 Jun 2007 01:46:27 -0000
***************
*** 16,21 ****
--- 16,22 ----
  printf-frexpl
  signbit
  fpucw
+ printf-safe
  
  configure.ac:
  gl_FUNC_SNPRINTF_POSIX
*** modules/sprintf-posix       18 May 2007 18:26:03 -0000      1.4
--- modules/sprintf-posix       6 Jun 2007 01:46:27 -0000
***************
*** 16,21 ****
--- 16,22 ----
  printf-frexpl
  signbit
  fpucw
+ printf-safe
  
  configure.ac:
  gl_FUNC_SPRINTF_POSIX
*** modules/vasnprintf-posix    18 May 2007 18:26:03 -0000      1.4
--- modules/vasnprintf-posix    6 Jun 2007 01:46:27 -0000
***************
*** 15,20 ****
--- 15,21 ----
  printf-frexpl
  signbit
  fpucw
+ printf-safe
  
  configure.ac:
  gl_FUNC_VASNPRINTF_POSIX
*** modules/vasprintf-posix     18 May 2007 18:26:03 -0000      1.4
--- modules/vasprintf-posix     6 Jun 2007 01:46:27 -0000
***************
*** 15,20 ****
--- 15,21 ----
  printf-frexpl
  signbit
  fpucw
+ printf-safe
  
  configure.ac:
  gl_FUNC_VASPRINTF_POSIX
*** modules/vfprintf-posix      18 May 2007 18:26:03 -0000      1.4
--- modules/vfprintf-posix      6 Jun 2007 01:46:27 -0000
***************
*** 17,22 ****
--- 17,23 ----
  printf-frexpl
  signbit
  fpucw
+ printf-safe
  
  configure.ac:
  gl_FUNC_VFPRINTF_POSIX
*** modules/vprintf-posix       9 Mar 2007 03:42:25 -0000       1.1
--- modules/vprintf-posix       6 Jun 2007 01:46:27 -0000
***************
*** 9,14 ****
--- 9,15 ----
  Depends-on:
  stdio
  vfprintf-posix
+ printf-safe
  
  configure.ac:
  gl_FUNC_VPRINTF_POSIX
*** modules/vsnprintf-posix     18 May 2007 18:26:03 -0000      1.4
--- modules/vsnprintf-posix     6 Jun 2007 01:46:27 -0000
***************
*** 16,21 ****
--- 16,22 ----
  printf-frexpl
  signbit
  fpucw
+ printf-safe
  
  configure.ac:
  gl_FUNC_VSNPRINTF_POSIX
*** modules/vsprintf-posix      18 May 2007 18:26:03 -0000      1.4
--- modules/vsprintf-posix      6 Jun 2007 01:46:27 -0000
***************
*** 16,21 ****
--- 16,22 ----
  printf-frexpl
  signbit
  fpucw
+ printf-safe
  
  configure.ac:
  gl_FUNC_VSPRINTF_POSIX
*** tests/test-snprintf-posix.c 28 May 2007 16:49:45 -0000      1.5
--- tests/test-snprintf-posix.c 6 Jun 2007 01:46:27 -0000
***************
*** 21,26 ****
--- 21,27 ----
  
  #include <stdio.h>
  
+ #include <float.h>
  #include <stddef.h>
  #include <stdio.h>
  #include <stdint.h>
*** tests/test-snprintf-posix.h 24 May 2007 10:10:51 -0000      1.16
--- tests/test-snprintf-posix.h 6 Jun 2007 01:46:27 -0000
***************
*** 38,43 ****
--- 38,56 ----
    return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0;
  }
  
+ /* Representation of an 80-bit 'long double' as an initializer for a sequence
+    of 'unsigned int' words.  */
+ #ifdef WORDS_BIGENDIAN
+ # define LDBL80_WORDS(exponent,manthi,mantlo) \
+     { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+       ((unsigned int) (manthi) << 16) | (unsigned int) (mantlo) >> 16),    \
+       (unsigned int) (mantlo) << 16                                        \
+     }
+ #else
+ # define LDBL80_WORDS(exponent,manthi,mantlo) \
+     { mantlo, manthi, exponent }
+ #endif
+ 
  static int
  strmatch (const char *pattern, const char *string)
  {
***************
*** 465,470 ****
--- 478,570 ----
            && strcmp (result + strlen (result) - 3, " 33") == 0);
      ASSERT (retval == strlen (result));
    }
+ #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined 
__x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || 
defined _I386 || defined _M_IX86 || defined _X86_))
+   { /* Quiet NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%La %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   {
+     /* Signalling NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%La %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+      Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+        Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+        Application Architecture.
+        Table 5-2 "Floating-Point Register Encodings"
+        Figure 5-6 "Memory to Floating-Point Register Data Translation"
+    */
+   { /* Pseudo-NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%La %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Pseudo-Infinity.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%La %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Pseudo-Zero.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%La %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Unnormalized number.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%La %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Pseudo-Denormal.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%La %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+ #endif
  
    { /* Rounding near the decimal point.  */
      char result[100];
***************
*** 1073,1078 ****
--- 1173,1265 ----
            && strcmp (result + strlen (result) - 3, " 33") == 0);
      ASSERT (retval == strlen (result));
    }
+ #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined 
__x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || 
defined _I386 || defined _M_IX86 || defined _X86_))
+   { /* Quiet NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   {
+     /* Signalling NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+      Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+        Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+        Application Architecture.
+        Table 5-2 "Floating-Point Register Encodings"
+        Figure 5-6 "Memory to Floating-Point Register Data Translation"
+    */
+   { /* Pseudo-NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Pseudo-Infinity.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Pseudo-Zero.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Unnormalized number.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Pseudo-Denormal.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+ #endif
  
    { /* Width.  */
      char result[100];
***************
*** 1787,1792 ****
--- 1974,2066 ----
            && strcmp (result + strlen (result) - 3, " 33") == 0);
      ASSERT (retval == strlen (result));
    }
+ #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined 
__x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || 
defined _I386 || defined _M_IX86 || defined _X86_))
+   { /* Quiet NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%Le %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   {
+     /* Signalling NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%Le %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+      Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+        Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+        Application Architecture.
+        Table 5-2 "Floating-Point Register Encodings"
+        Figure 5-6 "Memory to Floating-Point Register Data Translation"
+    */
+   { /* Pseudo-NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%Le %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Pseudo-Infinity.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%Le %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Pseudo-Zero.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%Le %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Unnormalized number.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%Le %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Pseudo-Denormal.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%Le %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+ #endif
  
    { /* Width.  */
      char result[100];
***************
*** 2301,2306 ****
--- 2575,2667 ----
            && strcmp (result + strlen (result) - 3, " 33") == 0);
      ASSERT (retval == strlen (result));
    }
+ #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined 
__x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || 
defined _I386 || defined _M_IX86 || defined _X86_))
+   { /* Quiet NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   {
+     /* Signalling NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+      Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+        Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+        Application Architecture.
+        Table 5-2 "Floating-Point Register Encodings"
+        Figure 5-6 "Memory to Floating-Point Register Data Translation"
+    */
+   { /* Pseudo-NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Pseudo-Infinity.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Pseudo-Zero.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Unnormalized number.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Pseudo-Denormal.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+     char result[100];
+     int retval =
+       my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+ #endif
  
    { /* Width.  */
      char result[100];
*** tests/test-sprintf-posix.c  28 May 2007 16:49:45 -0000      1.4
--- tests/test-sprintf-posix.c  6 Jun 2007 01:46:27 -0000
***************
*** 21,26 ****
--- 21,27 ----
  
  #include <stdio.h>
  
+ #include <float.h>
  #include <stddef.h>
  #include <stdio.h>
  #include <stdint.h>
*** tests/test-sprintf-posix.h  24 May 2007 10:10:51 -0000      1.16
--- tests/test-sprintf-posix.h  6 Jun 2007 01:46:28 -0000
***************
*** 38,43 ****
--- 38,56 ----
    return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0;
  }
  
+ /* Representation of an 80-bit 'long double' as an initializer for a sequence
+    of 'unsigned int' words.  */
+ #ifdef WORDS_BIGENDIAN
+ # define LDBL80_WORDS(exponent,manthi,mantlo) \
+     { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+       ((unsigned int) (manthi) << 16) | (unsigned int) (mantlo) >> 16),    \
+       (unsigned int) (mantlo) << 16                                        \
+     }
+ #else
+ # define LDBL80_WORDS(exponent,manthi,mantlo) \
+     { mantlo, manthi, exponent }
+ #endif
+ 
  static int
  strmatch (const char *pattern, const char *string)
  {
***************
*** 69,75 ****
      }
    return 0;
  }
!         
  static void
  test_function (int (*my_sprintf) (char *, const char *, ...))
  {
--- 82,88 ----
      }
    return 0;
  }
! 
  static void
  test_function (int (*my_sprintf) (char *, const char *, ...))
  {
***************
*** 451,456 ****
--- 464,556 ----
            && strcmp (result + strlen (result) - 3, " 33") == 0);
      ASSERT (retval == strlen (result));
    }
+ #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined 
__x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || 
defined _I386 || defined _M_IX86 || defined _X86_))
+   { /* Quiet NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%La %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   {
+     /* Signalling NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%La %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+      Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+        Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+        Application Architecture.
+        Table 5-2 "Floating-Point Register Encodings"
+        Figure 5-6 "Memory to Floating-Point Register Data Translation"
+    */
+   { /* Pseudo-NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%La %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Pseudo-Infinity.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%La %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Pseudo-Zero.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%La %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Unnormalized number.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%La %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Pseudo-Denormal.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%La %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+ #endif
  
    { /* Rounding near the decimal point.  */
      char result[1000];
***************
*** 1053,1058 ****
--- 1153,1245 ----
            && strcmp (result + strlen (result) - 3, " 33") == 0);
      ASSERT (retval == strlen (result));
    }
+ #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined 
__x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || 
defined _I386 || defined _M_IX86 || defined _X86_))
+   { /* Quiet NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   {
+     /* Signalling NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+      Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+        Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+        Application Architecture.
+        Table 5-2 "Floating-Point Register Encodings"
+        Figure 5-6 "Memory to Floating-Point Register Data Translation"
+    */
+   { /* Pseudo-NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Pseudo-Infinity.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Pseudo-Zero.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Unnormalized number.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Pseudo-Denormal.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+ #endif
  
    { /* Width.  */
      char result[1000];
***************
*** 1761,1766 ****
--- 1948,2040 ----
            && strcmp (result + strlen (result) - 3, " 33") == 0);
      ASSERT (retval == strlen (result));
    }
+ #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined 
__x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || 
defined _I386 || defined _M_IX86 || defined _X86_))
+   { /* Quiet NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%Le %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   {
+     /* Signalling NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%Le %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+      Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+        Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+        Application Architecture.
+        Table 5-2 "Floating-Point Register Encodings"
+        Figure 5-6 "Memory to Floating-Point Register Data Translation"
+    */
+   { /* Pseudo-NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%Le %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Pseudo-Infinity.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%Le %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Pseudo-Zero.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%Le %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Unnormalized number.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%Le %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Pseudo-Denormal.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%Le %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+ #endif
  
    { /* Width.  */
      char result[1000];
***************
*** 2275,2280 ****
--- 2549,2641 ----
            && strcmp (result + strlen (result) - 3, " 33") == 0);
      ASSERT (retval == strlen (result));
    }
+ #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined 
__x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || 
defined _I386 || defined _M_IX86 || defined _X86_))
+   { /* Quiet NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%La %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   {
+     /* Signalling NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%La %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+      Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+        Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+        Application Architecture.
+        Table 5-2 "Floating-Point Register Encodings"
+        Figure 5-6 "Memory to Floating-Point Register Data Translation"
+    */
+   { /* Pseudo-NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Pseudo-Infinity.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Pseudo-Zero.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Unnormalized number.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+   { /* Pseudo-Denormal.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+     char result[1000];
+     int retval =
+       my_sprintf (result, "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+   }
+ #endif
  
    { /* Width.  */
      char result[1000];
*** tests/test-vasnprintf-posix.c       28 May 2007 16:49:46 -0000      1.20
--- tests/test-vasnprintf-posix.c       6 Jun 2007 01:46:28 -0000
***************
*** 21,26 ****
--- 21,27 ----
  
  #include "vasnprintf.h"
  
+ #include <float.h>
  #include <stdarg.h>
  #include <stddef.h>
  #include <stdio.h>
***************
*** 61,66 ****
--- 62,80 ----
    return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0;
  }
  
+ /* Representation of an 80-bit 'long double' as an initializer for a sequence
+    of 'unsigned int' words.  */
+ #ifdef WORDS_BIGENDIAN
+ # define LDBL80_WORDS(exponent,manthi,mantlo) \
+     { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+       ((unsigned int) (manthi) << 16) | (unsigned int) (mantlo) >> 16),    \
+       (unsigned int) (mantlo) << 16                                        \
+     }
+ #else
+ # define LDBL80_WORDS(exponent,manthi,mantlo) \
+     { mantlo, manthi, exponent }
+ #endif
+ 
  static int
  strmatch (const char *pattern, const char *string)
  {
***************
*** 566,571 ****
--- 580,686 ----
      ASSERT (length == strlen (result));
      free (result);
    }
+ #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined 
__x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || 
defined _I386 || defined _M_IX86 || defined _X86_))
+   { /* Quiet NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%La %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+   {
+     /* Signalling NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%La %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+   /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+      Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+        Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+        Application Architecture.
+        Table 5-2 "Floating-Point Register Encodings"
+        Figure 5-6 "Memory to Floating-Point Register Data Translation"
+    */
+   { /* Pseudo-NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%La %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+   { /* Pseudo-Infinity.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%La %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+   { /* Pseudo-Zero.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%La %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+   { /* Unnormalized number.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%La %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+   { /* Pseudo-Denormal.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%La %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+ #endif
  
    { /* Rounding near the decimal point.  */
      size_t length;
***************
*** 1260,1265 ****
--- 1375,1481 ----
      ASSERT (length == strlen (result));
      free (result);
    }
+ #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined 
__x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || 
defined _I386 || defined _M_IX86 || defined _X86_))
+   { /* Quiet NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+   {
+     /* Signalling NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+   /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+      Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+        Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+        Application Architecture.
+        Table 5-2 "Floating-Point Register Encodings"
+        Figure 5-6 "Memory to Floating-Point Register Data Translation"
+    */
+   { /* Pseudo-NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+   { /* Pseudo-Infinity.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+   { /* Pseudo-Zero.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+   { /* Unnormalized number.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+   { /* Pseudo-Denormal.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+ #endif
  
    { /* Width.  */
      size_t length;
***************
*** 2089,2094 ****
--- 2305,2411 ----
      ASSERT (length == strlen (result));
      free (result);
    }
+ #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined 
__x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || 
defined _I386 || defined _M_IX86 || defined _X86_))
+   { /* Quiet NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%Le %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+   {
+     /* Signalling NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%Le %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+   /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+      Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+        Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+        Application Architecture.
+        Table 5-2 "Floating-Point Register Encodings"
+        Figure 5-6 "Memory to Floating-Point Register Data Translation"
+    */
+   { /* Pseudo-NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%Le %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+   { /* Pseudo-Infinity.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%Le %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+   { /* Pseudo-Zero.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%Le %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+   { /* Unnormalized number.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%Le %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+   { /* Pseudo-Denormal.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%Le %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+ #endif
  
    { /* Width.  */
      size_t length;
***************
*** 2683,2688 ****
--- 3000,3106 ----
      ASSERT (length == strlen (result));
      free (result);
    }
+ #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined 
__x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || 
defined _I386 || defined _M_IX86 || defined _X86_))
+   { /* Quiet NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+   {
+     /* Signalling NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+   /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+      Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+        Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+        Application Architecture.
+        Table 5-2 "Floating-Point Register Encodings"
+        Figure 5-6 "Memory to Floating-Point Register Data Translation"
+    */
+   { /* Pseudo-NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+   { /* Pseudo-Infinity.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+   { /* Pseudo-Zero.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+   { /* Unnormalized number.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+   { /* Pseudo-Denormal.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+     size_t length;
+     char *result =
+       my_asnprintf (NULL, &length, "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (length == strlen (result));
+     free (result);
+   }
+ #endif
  
    { /* Width.  */
      size_t length;
*** tests/test-vasprintf-posix.c        28 May 2007 16:49:46 -0000      1.20
--- tests/test-vasprintf-posix.c        6 Jun 2007 01:46:28 -0000
***************
*** 21,26 ****
--- 21,27 ----
  
  #include <stdio.h>
  
+ #include <float.h>
  #include <stdarg.h>
  #include <stddef.h>
  #include <stdio.h>
***************
*** 61,66 ****
--- 62,80 ----
    return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0;
  }
  
+ /* Representation of an 80-bit 'long double' as an initializer for a sequence
+    of 'unsigned int' words.  */
+ #ifdef WORDS_BIGENDIAN
+ # define LDBL80_WORDS(exponent,manthi,mantlo) \
+     { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+       ((unsigned int) (manthi) << 16) | (unsigned int) (mantlo) >> 16),    \
+       (unsigned int) (mantlo) << 16                                        \
+     }
+ #else
+ # define LDBL80_WORDS(exponent,manthi,mantlo) \
+     { mantlo, manthi, exponent }
+ #endif
+ 
  static int
  strmatch (const char *pattern, const char *string)
  {
***************
*** 547,552 ****
--- 561,667 ----
      ASSERT (retval == strlen (result));
      free (result);
    }
+ #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined 
__x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || 
defined _I386 || defined _M_IX86 || defined _X86_))
+   { /* Quiet NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%La %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+   {
+     /* Signalling NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%La %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+   /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+      Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+        Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+        Application Architecture.
+        Table 5-2 "Floating-Point Register Encodings"
+        Figure 5-6 "Memory to Floating-Point Register Data Translation"
+    */
+   { /* Pseudo-NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%La %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+   { /* Pseudo-Infinity.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%La %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+   { /* Pseudo-Zero.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%La %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+   { /* Unnormalized number.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%La %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+   { /* Pseudo-Denormal.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%La %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+ #endif
  
    { /* Rounding near the decimal point.  */
      char *result;
***************
*** 1241,1246 ****
--- 1356,1462 ----
      ASSERT (retval == strlen (result));
      free (result);
    }
+ #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined 
__x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || 
defined _I386 || defined _M_IX86 || defined _X86_))
+   { /* Quiet NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+   {
+     /* Signalling NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+   /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+      Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+        Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+        Application Architecture.
+        Table 5-2 "Floating-Point Register Encodings"
+        Figure 5-6 "Memory to Floating-Point Register Data Translation"
+    */
+   { /* Pseudo-NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+   { /* Pseudo-Infinity.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+   { /* Pseudo-Zero.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+   { /* Unnormalized number.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+   { /* Pseudo-Denormal.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%Lf %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+ #endif
  
    { /* Width.  */
      char *result;
***************
*** 2070,2075 ****
--- 2286,2392 ----
      ASSERT (retval == strlen (result));
      free (result);
    }
+ #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined 
__x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || 
defined _I386 || defined _M_IX86 || defined _X86_))
+   { /* Quiet NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%Le %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+   {
+     /* Signalling NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%Le %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+   /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+      Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+        Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+        Application Architecture.
+        Table 5-2 "Floating-Point Register Encodings"
+        Figure 5-6 "Memory to Floating-Point Register Data Translation"
+    */
+   { /* Pseudo-NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%Le %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+   { /* Pseudo-Infinity.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%Le %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+   { /* Pseudo-Zero.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%Le %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+   { /* Unnormalized number.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%Le %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+   { /* Pseudo-Denormal.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%Le %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+ #endif
  
    { /* Width.  */
      char *result;
***************
*** 2664,2669 ****
--- 2981,3087 ----
      ASSERT (retval == strlen (result));
      free (result);
    }
+ #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined 
__x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || 
defined _I386 || defined _M_IX86 || defined _X86_))
+   { /* Quiet NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+   {
+     /* Signalling NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+   /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
+      Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
+        Intel IA-64 Architecture Software Developer's Manual, Volume 1:
+        Application Architecture.
+        Table 5-2 "Floating-Point Register Encodings"
+        Figure 5-6 "Memory to Floating-Point Register Data Translation"
+    */
+   { /* Pseudo-NaN.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+   { /* Pseudo-Infinity.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+   { /* Pseudo-Zero.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+   { /* Unnormalized number.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+   { /* Pseudo-Denormal.  */
+     static union { unsigned int word[4]; long double value; } x =
+       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+     char *result;
+     int retval =
+       my_asprintf (&result, "%Lg %d", x.value, 33, 44, 55);
+     ASSERT (result != NULL);
+     ASSERT (strlen (result) >= 3 + 3
+           && strisnan (result, 0, strlen (result) - 3, 0)
+           && strcmp (result + strlen (result) - 3, " 33") == 0);
+     ASSERT (retval == strlen (result));
+     free (result);
+   }
+ #endif
  
    { /* Width.  */
      char *result;
*** tests/test-vsnprintf-posix.c        28 May 2007 16:49:46 -0000      1.4
--- tests/test-vsnprintf-posix.c        6 Jun 2007 01:46:28 -0000
***************
*** 21,26 ****
--- 21,27 ----
  
  #include <stdio.h>
  
+ #include <float.h>
  #include <stdarg.h>
  #include <stddef.h>
  #include <stdio.h>
*** tests/test-vsprintf-posix.c 28 May 2007 16:49:46 -0000      1.4
--- tests/test-vsprintf-posix.c 6 Jun 2007 01:46:28 -0000
***************
*** 21,26 ****
--- 21,27 ----
  
  #include <stdio.h>
  
+ #include <float.h>
  #include <stdarg.h>
  #include <stddef.h>
  #include <stdio.h>





reply via email to

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