[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: RFT: *printf-posix modules
From: |
Bruno Haible |
Subject: |
Re: RFT: *printf-posix modules |
Date: |
Tue, 22 May 2007 03:10:07 +0200 |
User-agent: |
KMail/1.5.4 |
Eric Blake wrote:
> I noticed you added a patch that allows "nan0x7fffffff" instead of "nan". My
> reading of POSIX says this is illegal and that IRIX has a bug; if the n-char-
> sequence form of NaN is used, it must be in the style "nan(0x7fffffff)", with
> the ( and ) as literal characters. Compare the wording in C99 and POSIX for
> strtod() and nan().
Indeed. I was seeing angle brackets instead of parentheses... Together with
the description of strtod(), it's clear, however. Here is a fix.
2007-05-21 Bruno Haible <address@hidden>
* m4/printf.m4 (gl_PRINTF_INFINITE, gl_PRINTF_INFINITE_LONG_DOUBLE):
Check also the output for NaN arguments. When cross-compiling, guess
no on IRIX.
* lib/vasnprintf.c: Update comments.
* tests/test-vasnprintf-posix.c (strisnan): New function.
(test_function): Use it.
* tests/test-vasprintf-posix.c (strisnan): New function.
(test_function): Use it.
* tests/test-snprintf-posix.h (strisnan): New function.
(test_function): Use it.
* tests/test-sprintf-posix.h (strisnan): New function.
(test_function): Use it.
Reported by Eric Blake.
*** m4/printf.m4 20 May 2007 21:51:27 -0000 1.32
--- m4/printf.m4 22 May 2007 01:02:09 -0000
***************
*** 1,4 ****
! # printf.m4 serial 12
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 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,
***************
*** 124,131 ****
])
])
! dnl Test whether the *printf family of functions supports infinite 'double'
! dnl arguments in the %f, %e, %g directives. (ISO C99, POSIX:2001)
dnl Result is gl_cv_func_printf_infinite.
AC_DEFUN([gl_PRINTF_INFINITE],
--- 124,131 ----
])
])
! dnl Test whether the *printf family of functions supports infinite and NaN
! dnl 'double' arguments in the %f, %e, %g directives. (ISO C99, POSIX:2001)
dnl Result is gl_cv_func_printf_infinite.
AC_DEFUN([gl_PRINTF_INFINITE],
***************
*** 138,144 ****
--- 138,163 ----
AC_TRY_RUN([
#include <stdio.h>
#include <string.h>
+ static int
+ strisnan (const char *string, size_t start_index, size_t end_index)
+ {
+ if (start_index < end_index)
+ {
+ if (string[start_index] == '-')
+ start_index++;
+ if (start_index + 3 <= end_index
+ && memcmp (string + start_index, "nan", 3) == 0)
+ {
+ start_index += 3;
+ if (start_index == end_index
+ || (string[start_index] == '(' && string[end_index - 1] == ')'))
+ return 1;
+ }
+ }
+ return 0;
+ }
static char buf[100];
+ static double zero = 0.0;
int main ()
{
if (sprintf (buf, "%f", 1.0 / 0.0) < 0
***************
*** 147,164 ****
--- 166,192 ----
if (sprintf (buf, "%f", -1.0 / 0.0) < 0
|| (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
return 1;
+ if (sprintf (buf, "%f", zero / zero) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
if (sprintf (buf, "%e", 1.0 / 0.0) < 0
|| (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
return 1;
if (sprintf (buf, "%e", -1.0 / 0.0) < 0
|| (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
return 1;
+ if (sprintf (buf, "%e", zero / zero) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
if (sprintf (buf, "%g", 1.0 / 0.0) < 0
|| (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
return 1;
if (sprintf (buf, "%g", -1.0 / 0.0) < 0
|| (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
return 1;
+ if (sprintf (buf, "%g", zero / zero) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
return 0;
}], [gl_cv_func_printf_infinite=yes], [gl_cv_func_printf_infinite=no],
[
***************
*** 175,182 ****
# Guess yes on HP-UX >= 11.
hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite="guessing no";;
hpux*) gl_cv_func_printf_infinite="guessing yes";;
- # Guess yes on IRIX >= 6.5.
- irix6.5) gl_cv_func_printf_infinite="guessing yes";;
# Guess yes on NetBSD >= 3.
netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
gl_cv_func_printf_infinite="guessing no";;
--- 203,208 ----
***************
*** 191,198 ****
])
])
! dnl Test whether the *printf family of functions supports infinite 'long
double'
! dnl arguments in the %f, %e, %g directives. (ISO C99, POSIX:2001)
dnl Result is gl_cv_func_printf_infinite_long_double.
AC_DEFUN([gl_PRINTF_INFINITE_LONG_DOUBLE],
--- 217,224 ----
])
])
! dnl Test whether the *printf family of functions supports infinite and NaN
! dnl 'long double' arguments in the %f, %e, %g directives. (ISO C99,
POSIX:2001)
dnl Result is gl_cv_func_printf_infinite_long_double.
AC_DEFUN([gl_PRINTF_INFINITE_LONG_DOUBLE],
***************
*** 208,214 ****
--- 234,259 ----
AC_TRY_RUN([
#include <stdio.h>
#include <string.h>
+ static int
+ strisnan (const char *string, size_t start_index, size_t end_index)
+ {
+ if (start_index < end_index)
+ {
+ if (string[start_index] == '-')
+ start_index++;
+ if (start_index + 3 <= end_index
+ && memcmp (string + start_index, "nan", 3) == 0)
+ {
+ start_index += 3;
+ if (start_index == end_index
+ || (string[start_index] == '(' && string[end_index - 1] == ')'))
+ return 1;
+ }
+ }
+ return 0;
+ }
static char buf[100];
+ static long double zeroL = 0.0L;
int main ()
{
if (sprintf (buf, "%Lf", 1.0L / 0.0L) < 0
***************
*** 217,234 ****
--- 262,288 ----
if (sprintf (buf, "%Lf", -1.0L / 0.0L) < 0
|| (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
return 1;
+ if (sprintf (buf, "%Lf", zeroL / zeroL) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
if (sprintf (buf, "%Le", 1.0L / 0.0L) < 0
|| (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
return 1;
if (sprintf (buf, "%Le", -1.0L / 0.0L) < 0
|| (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
return 1;
+ if (sprintf (buf, "%Le", zeroL / zeroL) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
if (sprintf (buf, "%Lg", 1.0L / 0.0L) < 0
|| (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
return 1;
if (sprintf (buf, "%Lg", -1.0L / 0.0L) < 0
|| (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
return 1;
+ if (sprintf (buf, "%Lg", zeroL / zeroL) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ return 1;
return 0;
}],
[gl_cv_func_printf_infinite_long_double=yes],
***************
*** 247,254 ****
# 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 IRIX >= 6.5.
- irix6.5)
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";;
--- 301,306 ----
***************
*** 895,901 ****
dnl AIX 4.3.2, 5.1 # . # # # # . . . # . . . .
.
dnl HP-UX 11.31 . . . . # . . . . # . . # #
.
dnl HP-UX 10.20, 11.{00,11,23} # . . . # # . . . # . . # #
#
! dnl IRIX 6.5 # . . . # # . . . # . . # .
.
dnl OSF/1 5.1 # . # # # # . . . # . . # .
#
dnl OSF/1 4.0d # . # # # # . . . # # # # #
#
dnl NetBSD 4.0 . ? ? ? ? ? . . ? ? . . . ?
?
--- 947,953 ----
dnl AIX 4.3.2, 5.1 # . # # # # . . . # . . . .
.
dnl HP-UX 11.31 . . . . # . . . . # . . # #
.
dnl HP-UX 10.20, 11.{00,11,23} # . . . # # . . . # . . # #
#
! dnl IRIX 6.5 # . # # # # . . . # . . # .
.
dnl OSF/1 5.1 # . # # # # . . . # . . # .
#
dnl OSF/1 4.0d # . # # # # . . . # # # # #
#
dnl NetBSD 4.0 . ? ? ? ? ? . . ? ? . . . ?
?
*** lib/vasnprintf.c 20 May 2007 09:01:49 -0000 1.51
--- lib/vasnprintf.c 22 May 2007 01:02:09 -0000
***************
*** 1297,1313 ****
# if NEED_PRINTF_INFINITE_DOUBLE
|| (a.arg[dp->arg_index].type == TYPE_DOUBLE
/* The systems (mingw) which produce wrong output
! for Inf and -Inf also do so for NaN and -0.0.
! Therefore we treat these cases here as well. */
&& is_infinite_or_zero
(a.arg[dp->arg_index].a.a_double))
# endif
# if NEED_PRINTF_LONG_DOUBLE
|| a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
# elif NEED_PRINTF_INFINITE_LONG_DOUBLE
|| (a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
! /* The systems which produce wrong output for Inf
! and -Inf also do so for NaN. Therefore treat
! this case here as well. */
&& is_infinitel
(a.arg[dp->arg_index].a.a_longdouble))
# endif
))
--- 1297,1312 ----
# if NEED_PRINTF_INFINITE_DOUBLE
|| (a.arg[dp->arg_index].type == TYPE_DOUBLE
/* The systems (mingw) which produce wrong output
! for Inf, -Inf, and NaN also do so for -0.0.
! Therefore we treat this case here as well. */
&& is_infinite_or_zero
(a.arg[dp->arg_index].a.a_double))
# endif
# if NEED_PRINTF_LONG_DOUBLE
|| a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
# elif NEED_PRINTF_INFINITE_LONG_DOUBLE
|| (a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
! /* Some systems produce wrong output for Inf,
! -Inf, and NaN. */
&& is_infinitel
(a.arg[dp->arg_index].a.a_longdouble))
# endif
))
*** tests/test-snprintf-posix.h 20 May 2007 08:12:26 -0000 1.14
--- tests/test-snprintf-posix.h 22 May 2007 01:02:10 -0000
***************
*** 49,54 ****
--- 49,75 ----
return 1;
}
+ /* Test whether string[start_index..end_index-1] is a valid textual
+ representation of NaN. */
+ static int
+ strisnan (const char *string, size_t start_index, size_t end_index, int
uppercase)
+ {
+ if (start_index < end_index)
+ {
+ if (string[start_index] == '-')
+ start_index++;
+ if (start_index + 3 <= end_index
+ && memcmp (string + start_index, uppercase ? "NAN" : "nan", 3) == 0)
+ {
+ start_index += 3;
+ if (start_index == end_index
+ || (string[start_index] == '(' && string[end_index - 1] == ')'))
+ return 1;
+ }
+ }
+ return 0;
+ }
+
static void
test_function (int (*my_snprintf) (char *, size_t, const char *, ...))
{
***************
*** 176,183 ****
int retval =
my_snprintf (result, sizeof (result), "%a %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 197,203 ----
int retval =
my_snprintf (result, sizeof (result), "%a %d", NaN (), 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));
}
***************
*** 376,383 ****
/* "0000000nan 33" is not a valid result; see
<http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 396,402 ----
/* "0000000nan 33" is not a valid result; see
<http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
***************
*** 442,449 ****
int retval =
my_snprintf (result, sizeof (result), "%La %d", 0.0L / 0.0L, 33, 44,
55);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 461,467 ----
int retval =
my_snprintf (result, sizeof (result), "%La %d", 0.0L / 0.0L, 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));
}
***************
*** 643,650 ****
/* "0000000nan 33" is not a valid result; see
<http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 661,667 ----
/* "0000000nan 33" is not a valid result; see
<http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
***************
*** 804,811 ****
int retval =
my_snprintf (result, sizeof (result), "%f %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 821,827 ----
int retval =
my_snprintf (result, sizeof (result), "%f %d", NaN (), 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));
}
***************
*** 886,893 ****
int retval =
my_snprintf (result, sizeof (result), "%020f %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 902,908 ----
int retval =
my_snprintf (result, sizeof (result), "%020f %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
***************
*** 1054,1061 ****
int retval =
my_snprintf (result, sizeof (result), "%Lf %d", zero / zero, 33, 44,
55);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 1069,1075 ----
int retval =
my_snprintf (result, sizeof (result), "%Lf %d", zero / zero, 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));
}
***************
*** 1137,1144 ****
int retval =
my_snprintf (result, sizeof (result), "%020Lf %d", zero / zero, 33, 44,
55);
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 1151,1157 ----
int retval =
my_snprintf (result, sizeof (result), "%020Lf %d", zero / zero, 33, 44,
55);
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
***************
*** 1217,1224 ****
int retval =
my_snprintf (result, sizeof (result), "%F %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "NAN", 3) == 0
! || memcmp (result, "-NAN", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 1230,1236 ----
int retval =
my_snprintf (result, sizeof (result), "%F %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
! && strisnan (result, 0, strlen (result) - 3, 1)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
***************
*** 1313,1320 ****
int retval =
my_snprintf (result, sizeof (result), "%LF %d", zero / zero, 33, 44,
55);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "NAN", 3) == 0
! || memcmp (result, "-NAN", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 1325,1331 ----
int retval =
my_snprintf (result, sizeof (result), "%LF %d", zero / zero, 33, 44,
55);
ASSERT (strlen (result) >= 3 + 3
! && strisnan (result, 0, strlen (result) - 3, 1)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
***************
*** 1513,1520 ****
int retval =
my_snprintf (result, sizeof (result), "%e %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 1524,1530 ----
int retval =
my_snprintf (result, sizeof (result), "%e %d", NaN (), 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));
}
***************
*** 1605,1612 ****
int retval =
my_snprintf (result, sizeof (result), "%020e %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 1615,1621 ----
int retval =
my_snprintf (result, sizeof (result), "%020e %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
***************
*** 1774,1781 ****
int retval =
my_snprintf (result, sizeof (result), "%Le %d", zero / zero, 33, 44,
55);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 1783,1789 ----
int retval =
my_snprintf (result, sizeof (result), "%Le %d", zero / zero, 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));
}
***************
*** 1859,1866 ****
int retval =
my_snprintf (result, sizeof (result), "%020Le %d", zero / zero, 33, 44,
55);
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 1867,1873 ----
int retval =
my_snprintf (result, sizeof (result), "%020Le %d", zero / zero, 33, 44,
55);
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
***************
*** 2038,2045 ****
int retval =
my_snprintf (result, sizeof (result), "%g %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 2045,2051 ----
int retval =
my_snprintf (result, sizeof (result), "%g %d", NaN (), 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));
}
***************
*** 2123,2130 ****
int retval =
my_snprintf (result, sizeof (result), "%020g %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 2129,2135 ----
int retval =
my_snprintf (result, sizeof (result), "%020g %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
***************
*** 2292,2299 ****
int retval =
my_snprintf (result, sizeof (result), "%Lg %d", zero / zero, 33, 44,
55);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 2297,2303 ----
int retval =
my_snprintf (result, sizeof (result), "%Lg %d", zero / zero, 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));
}
***************
*** 2377,2384 ****
int retval =
my_snprintf (result, sizeof (result), "%020Lg %d", zero / zero, 33, 44,
55);
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 2381,2387 ----
int retval =
my_snprintf (result, sizeof (result), "%020Lg %d", zero / zero, 33, 44,
55);
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
*** tests/test-sprintf-posix.h 20 May 2007 08:12:26 -0000 1.14
--- tests/test-sprintf-posix.h 22 May 2007 01:02:10 -0000
***************
*** 49,54 ****
--- 49,75 ----
return 1;
}
+ /* Test whether string[start_index..end_index-1] is a valid textual
+ representation of NaN. */
+ static int
+ strisnan (const char *string, size_t start_index, size_t end_index, int
uppercase)
+ {
+ if (start_index < end_index)
+ {
+ if (string[start_index] == '-')
+ start_index++;
+ if (start_index + 3 <= end_index
+ && memcmp (string + start_index, uppercase ? "NAN" : "nan", 3) == 0)
+ {
+ start_index += 3;
+ if (start_index == end_index
+ || (string[start_index] == '(' && string[end_index - 1] == ')'))
+ return 1;
+ }
+ }
+ return 0;
+ }
+
static void
test_function (int (*my_sprintf) (char *, const char *, ...))
{
***************
*** 162,169 ****
int retval =
my_sprintf (result, "%a %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 183,189 ----
int retval =
my_sprintf (result, "%a %d", NaN (), 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));
}
***************
*** 362,369 ****
/* "0000000nan 33" is not a valid result; see
<http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 382,388 ----
/* "0000000nan 33" is not a valid result; see
<http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
***************
*** 428,435 ****
int retval =
my_sprintf (result, "%La %d", 0.0L / 0.0L, 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 447,453 ----
int retval =
my_sprintf (result, "%La %d", 0.0L / 0.0L, 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));
}
***************
*** 629,636 ****
/* "0000000nan 33" is not a valid result; see
<http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 647,653 ----
/* "0000000nan 33" is not a valid result; see
<http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
***************
*** 790,797 ****
int retval =
my_sprintf (result, "%f %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 807,813 ----
int retval =
my_sprintf (result, "%f %d", NaN (), 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));
}
***************
*** 866,873 ****
int retval =
my_sprintf (result, "%020f %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 882,888 ----
int retval =
my_sprintf (result, "%020f %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
***************
*** 1034,1041 ****
int retval =
my_sprintf (result, "%Lf %d", zero / zero, 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 1049,1055 ----
int retval =
my_sprintf (result, "%Lf %d", zero / zero, 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));
}
***************
*** 1111,1118 ****
int retval =
my_sprintf (result, "%020Lf %d", zero / zero, 33, 44, 55);
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 1125,1131 ----
int retval =
my_sprintf (result, "%020Lf %d", zero / zero, 33, 44, 55);
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
***************
*** 1191,1198 ****
int retval =
my_sprintf (result, "%F %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "NAN", 3) == 0
! || memcmp (result, "-NAN", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 1204,1210 ----
int retval =
my_sprintf (result, "%F %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
! && strisnan (result, 0, strlen (result) - 3, 1)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
***************
*** 1287,1294 ****
int retval =
my_sprintf (result, "%LF %d", zero / zero, 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "NAN", 3) == 0
! || memcmp (result, "-NAN", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 1299,1305 ----
int retval =
my_sprintf (result, "%LF %d", zero / zero, 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
! && strisnan (result, 0, strlen (result) - 3, 1)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
***************
*** 1487,1494 ****
int retval =
my_sprintf (result, "%e %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 1498,1504 ----
int retval =
my_sprintf (result, "%e %d", NaN (), 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));
}
***************
*** 1579,1586 ****
int retval =
my_sprintf (result, "%020e %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 1589,1595 ----
int retval =
my_sprintf (result, "%020e %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
***************
*** 1748,1755 ****
int retval =
my_sprintf (result, "%Le %d", zero / zero, 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 1757,1763 ----
int retval =
my_sprintf (result, "%Le %d", zero / zero, 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));
}
***************
*** 1833,1840 ****
int retval =
my_sprintf (result, "%020Le %d", zero / zero, 33, 44, 55);
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 1841,1847 ----
int retval =
my_sprintf (result, "%020Le %d", zero / zero, 33, 44, 55);
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
***************
*** 2012,2019 ****
int retval =
my_sprintf (result, "%g %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 2019,2025 ----
int retval =
my_sprintf (result, "%g %d", NaN (), 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));
}
***************
*** 2097,2104 ****
int retval =
my_sprintf (result, "%020g %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 2103,2109 ----
int retval =
my_sprintf (result, "%020g %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
***************
*** 2266,2273 ****
int retval =
my_sprintf (result, "%Lg %d", zero / zero, 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 2271,2277 ----
int retval =
my_sprintf (result, "%Lg %d", zero / zero, 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));
}
***************
*** 2351,2358 ****
int retval =
my_sprintf (result, "%020Lg %d", zero / zero, 33, 44, 55);
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
--- 2355,2361 ----
int retval =
my_sprintf (result, "%020Lg %d", zero / zero, 33, 44, 55);
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
*** tests/test-vasnprintf-posix.c 20 May 2007 08:12:26 -0000 1.17
--- tests/test-vasnprintf-posix.c 22 May 2007 01:02:10 -0000
***************
*** 74,79 ****
--- 74,100 ----
return 1;
}
+ /* Test whether string[start_index..end_index-1] is a valid textual
+ representation of NaN. */
+ static int
+ strisnan (const char *string, size_t start_index, size_t end_index, int
uppercase)
+ {
+ if (start_index < end_index)
+ {
+ if (string[start_index] == '-')
+ start_index++;
+ if (start_index + 3 <= end_index
+ && memcmp (string + start_index, uppercase ? "NAN" : "nan", 3) == 0)
+ {
+ start_index += 3;
+ if (start_index == end_index
+ || (string[start_index] == '(' && string[end_index - 1] == ')'))
+ return 1;
+ }
+ }
+ return 0;
+ }
+
static void
test_function (char * (*my_asnprintf) (char *, size_t *, const char *, ...))
{
***************
*** 228,235 ****
my_asnprintf (NULL, &length, "%a %d", NaN (), 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
--- 249,255 ----
my_asnprintf (NULL, &length, "%a %d", NaN (), 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);
***************
*** 464,471 ****
/* "0000000nan 33" is not a valid result; see
<http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
--- 484,490 ----
/* "0000000nan 33" is not a valid result; see
<http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
***************
*** 544,551 ****
my_asnprintf (NULL, &length, "%La %d", 0.0L / 0.0L, 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
--- 563,569 ----
my_asnprintf (NULL, &length, "%La %d", 0.0L / 0.0L, 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);
***************
*** 781,788 ****
/* "0000000nan 33" is not a valid result; see
<http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
--- 799,805 ----
/* "0000000nan 33" is not a valid result; see
<http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
***************
*** 960,967 ****
my_asnprintf (NULL, &length, "%f %d", NaN (), 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
--- 977,983 ----
my_asnprintf (NULL, &length, "%f %d", NaN (), 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);
***************
*** 1054,1061 ****
my_asnprintf (NULL, &length, "%020f %d", NaN (), 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
--- 1070,1076 ----
my_asnprintf (NULL, &length, "%020f %d", NaN (), 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
***************
*** 1242,1249 ****
my_asnprintf (NULL, &length, "%Lf %d", zero / zero, 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
--- 1257,1263 ----
my_asnprintf (NULL, &length, "%Lf %d", zero / zero, 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);
***************
*** 1337,1344 ****
my_asnprintf (NULL, &length, "%020Lf %d", zero / zero, 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
--- 1351,1357 ----
my_asnprintf (NULL, &length, "%020Lf %d", zero / zero, 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
***************
*** 1435,1442 ****
my_asnprintf (NULL, &length, "%F %d", NaN (), 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "NAN", 3) == 0
! || memcmp (result, "-NAN", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
--- 1448,1454 ----
my_asnprintf (NULL, &length, "%F %d", NaN (), 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) >= 3 + 3
! && strisnan (result, 0, strlen (result) - 3, 1)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
***************
*** 1553,1560 ****
my_asnprintf (NULL, &length, "%LF %d", zero / zero, 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "NAN", 3) == 0
! || memcmp (result, "-NAN", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
--- 1565,1571 ----
my_asnprintf (NULL, &length, "%LF %d", zero / zero, 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) >= 3 + 3
! && strisnan (result, 0, strlen (result) - 3, 1)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
***************
*** 1776,1783 ****
my_asnprintf (NULL, &length, "%e %d", NaN (), 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
--- 1787,1793 ----
my_asnprintf (NULL, &length, "%e %d", NaN (), 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);
***************
*** 1888,1895 ****
my_asnprintf (NULL, &length, "%020e %d", NaN (), 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
--- 1898,1904 ----
my_asnprintf (NULL, &length, "%020e %d", NaN (), 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
***************
*** 2077,2084 ****
my_asnprintf (NULL, &length, "%Le %d", zero / zero, 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
--- 2086,2092 ----
my_asnprintf (NULL, &length, "%Le %d", zero / zero, 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);
***************
*** 2182,2189 ****
my_asnprintf (NULL, &length, "%020Le %d", zero / zero, 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
--- 2190,2196 ----
my_asnprintf (NULL, &length, "%020Le %d", zero / zero, 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
***************
*** 2381,2388 ****
my_asnprintf (NULL, &length, "%g %d", NaN (), 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
--- 2388,2394 ----
my_asnprintf (NULL, &length, "%g %d", NaN (), 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);
***************
*** 2486,2493 ****
my_asnprintf (NULL, &length, "%020g %d", NaN (), 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
--- 2492,2498 ----
my_asnprintf (NULL, &length, "%020g %d", NaN (), 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
***************
*** 2675,2682 ****
my_asnprintf (NULL, &length, "%Lg %d", zero / zero, 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
--- 2680,2686 ----
my_asnprintf (NULL, &length, "%Lg %d", zero / zero, 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);
***************
*** 2780,2787 ****
my_asnprintf (NULL, &length, "%020Lg %d", zero / zero, 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
--- 2784,2790 ----
my_asnprintf (NULL, &length, "%020Lg %d", zero / zero, 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (length == strlen (result));
free (result);
*** tests/test-vasprintf-posix.c 20 May 2007 08:12:26 -0000 1.17
--- tests/test-vasprintf-posix.c 22 May 2007 01:02:10 -0000
***************
*** 74,79 ****
--- 74,100 ----
return 1;
}
+ /* Test whether string[start_index..end_index-1] is a valid textual
+ representation of NaN. */
+ static int
+ strisnan (const char *string, size_t start_index, size_t end_index, int
uppercase)
+ {
+ if (start_index < end_index)
+ {
+ if (string[start_index] == '-')
+ start_index++;
+ if (start_index + 3 <= end_index
+ && memcmp (string + start_index, uppercase ? "NAN" : "nan", 3) == 0)
+ {
+ start_index += 3;
+ if (start_index == end_index
+ || (string[start_index] == '(' && string[end_index - 1] == ')'))
+ return 1;
+ }
+ }
+ return 0;
+ }
+
static void
test_function (int (*my_asprintf) (char **, const char *, ...))
{
***************
*** 209,216 ****
my_asprintf (&result, "%a %d", NaN (), 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
--- 230,236 ----
my_asprintf (&result, "%a %d", NaN (), 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);
***************
*** 445,452 ****
/* "0000000nan 33" is not a valid result; see
<http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
--- 465,471 ----
/* "0000000nan 33" is not a valid result; see
<http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
***************
*** 525,532 ****
my_asprintf (&result, "%La %d", 0.0L / 0.0L, 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
--- 544,550 ----
my_asprintf (&result, "%La %d", 0.0L / 0.0L, 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);
***************
*** 762,769 ****
/* "0000000nan 33" is not a valid result; see
<http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
--- 780,786 ----
/* "0000000nan 33" is not a valid result; see
<http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
***************
*** 941,948 ****
my_asprintf (&result, "%f %d", NaN (), 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
--- 958,964 ----
my_asprintf (&result, "%f %d", NaN (), 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);
***************
*** 1035,1042 ****
my_asprintf (&result, "%020f %d", NaN (), 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
--- 1051,1057 ----
my_asprintf (&result, "%020f %d", NaN (), 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
***************
*** 1223,1230 ****
my_asprintf (&result, "%Lf %d", zero / zero, 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
--- 1238,1244 ----
my_asprintf (&result, "%Lf %d", zero / zero, 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);
***************
*** 1318,1325 ****
my_asprintf (&result, "%020Lf %d", zero / zero, 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
--- 1332,1338 ----
my_asprintf (&result, "%020Lf %d", zero / zero, 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
***************
*** 1416,1423 ****
my_asprintf (&result, "%F %d", NaN (), 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "NAN", 3) == 0
! || memcmp (result, "-NAN", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
--- 1429,1435 ----
my_asprintf (&result, "%F %d", NaN (), 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) >= 3 + 3
! && strisnan (result, 0, strlen (result) - 3, 1)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
***************
*** 1534,1541 ****
my_asprintf (&result, "%LF %d", zero / zero, 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "NAN", 3) == 0
! || memcmp (result, "-NAN", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
--- 1546,1552 ----
my_asprintf (&result, "%LF %d", zero / zero, 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) >= 3 + 3
! && strisnan (result, 0, strlen (result) - 3, 1)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
***************
*** 1757,1764 ****
my_asprintf (&result, "%e %d", NaN (), 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
--- 1768,1774 ----
my_asprintf (&result, "%e %d", NaN (), 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);
***************
*** 1869,1876 ****
my_asprintf (&result, "%020e %d", NaN (), 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
--- 1879,1885 ----
my_asprintf (&result, "%020e %d", NaN (), 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
***************
*** 2058,2065 ****
my_asprintf (&result, "%Le %d", zero / zero, 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
--- 2067,2073 ----
my_asprintf (&result, "%Le %d", zero / zero, 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);
***************
*** 2163,2170 ****
my_asprintf (&result, "%020Le %d", zero / zero, 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
--- 2171,2177 ----
my_asprintf (&result, "%020Le %d", zero / zero, 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
***************
*** 2362,2369 ****
my_asprintf (&result, "%g %d", NaN (), 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
--- 2369,2375 ----
my_asprintf (&result, "%g %d", NaN (), 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);
***************
*** 2467,2474 ****
my_asprintf (&result, "%020g %d", NaN (), 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
--- 2473,2479 ----
my_asprintf (&result, "%020g %d", NaN (), 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
***************
*** 2656,2663 ****
my_asprintf (&result, "%Lg %d", zero / zero, 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) >= 3 + 3
! && (memcmp (result, "nan", 3) == 0
! || memcmp (result, "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
--- 2661,2667 ----
my_asprintf (&result, "%Lg %d", zero / zero, 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);
***************
*** 2761,2768 ****
my_asprintf (&result, "%020Lg %d", zero / zero, 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) == 20 + 3
! && (memcmp (result + strspn (result, " "), "nan", 3) == 0
! || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
--- 2765,2771 ----
my_asprintf (&result, "%020Lg %d", zero / zero, 33, 44, 55);
ASSERT (result != NULL);
ASSERT (strlen (result) == 20 + 3
! && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
free (result);
Re: RFT: *printf-posix modules, Eric Blake, 2007/05/20
Re: RFT: *printf-posix modules, Eric Blake, 2007/05/21
- Re: RFT: *printf-posix modules,
Bruno Haible <=