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 *, ...))
{
int retval =
my_sprintf (result, "%a %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
- && memcmp (result, "nan", 3) == 0
+ && strisnan (result, 0, strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
{ /* FLAG_ZERO with NaN. */
char result[1000];
int retval =
- my_sprintf (result, "%020a %d", NaN (), 33, 44, 55);
+ my_sprintf (result, "%050a %d", NaN (), 33, 44, 55);
/* "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
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
int retval =
my_sprintf (result, "%La %d", 0.0L / 0.0L, 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
- && memcmp (result, "nan", 3) == 0
+ && strisnan (result, 0, strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
{ /* FLAG_ZERO with NaN. */
char result[1000];
int retval =
- my_sprintf (result, "%020La %d", 0.0L / 0.0L, 33, 44, 55);
+ my_sprintf (result, "%050La %d", 0.0L / 0.0L, 33, 44, 55);
/* "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
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
int retval =
my_sprintf (result, "%f %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
- && memcmp (result, "nan", 3) == 0
+ && strisnan (result, 0, strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
{ /* FLAG_ZERO with NaN. */
char result[1000];
int retval =
- my_sprintf (result, "%020f %d", NaN (), 33, 44, 55);
- ASSERT (strlen (result) == 20 + 3
- && memcmp (result + strspn (result, " "), "nan", 3) == 0
+ my_sprintf (result, "%050f %d", NaN (), 33, 44, 55);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
int retval =
my_sprintf (result, "%Lf %d", zero / zero, 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
- && memcmp (result, "nan", 3) == 0
+ && strisnan (result, 0, strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
static long double zero = 0.0L;
char result[1000];
int retval =
- my_sprintf (result, "%020Lf %d", zero / zero, 33, 44, 55);
- ASSERT (strlen (result) == 20 + 3
- && memcmp (result + strspn (result, " "), "nan", 3) == 0
+ my_sprintf (result, "%050Lf %d", zero / zero, 33, 44, 55);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
int retval =
my_sprintf (result, "%F %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
- && memcmp (result, "NAN", 3) == 0
+ && strisnan (result, 0, strlen (result) - 3, 1)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
int retval =
my_sprintf (result, "%LF %d", zero / zero, 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
- && memcmp (result, "NAN", 3) == 0
+ && strisnan (result, 0, strlen (result) - 3, 1)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
int retval =
my_sprintf (result, "%e %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
- && memcmp (result, "nan", 3) == 0
+ && strisnan (result, 0, strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
{ /* FLAG_ZERO with NaN. */
char result[1000];
int retval =
- my_sprintf (result, "%020e %d", NaN (), 33, 44, 55);
- ASSERT (strlen (result) == 20 + 3
- && memcmp (result + strspn (result, " "), "nan", 3) == 0
+ my_sprintf (result, "%050e %d", NaN (), 33, 44, 55);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
int retval =
my_sprintf (result, "%Le %d", zero / zero, 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
- && memcmp (result, "nan", 3) == 0
+ && strisnan (result, 0, strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
static long double zero = 0.0L;
char result[1000];
int retval =
- my_sprintf (result, "%020Le %d", zero / zero, 33, 44, 55);
- ASSERT (strlen (result) == 20 + 3
- && memcmp (result + strspn (result, " "), "nan", 3) == 0
+ my_sprintf (result, "%050Le %d", zero / zero, 33, 44, 55);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
int retval =
my_sprintf (result, "%g %d", NaN (), 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
- && memcmp (result, "nan", 3) == 0
+ && strisnan (result, 0, strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
{ /* FLAG_ZERO with NaN. */
char result[1000];
int retval =
- my_sprintf (result, "%020g %d", NaN (), 33, 44, 55);
- ASSERT (strlen (result) == 20 + 3
- && memcmp (result + strspn (result, " "), "nan", 3) == 0
+ my_sprintf (result, "%050g %d", NaN (), 33, 44, 55);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
int retval =
my_sprintf (result, "%Lg %d", zero / zero, 33, 44, 55);
ASSERT (strlen (result) >= 3 + 3
- && memcmp (result, "nan", 3) == 0
+ && strisnan (result, 0, strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}
static long double zero = 0.0L;
char result[1000];
int retval =
- my_sprintf (result, "%020Lg %d", zero / zero, 33, 44, 55);
- ASSERT (strlen (result) == 20 + 3
- && memcmp (result + strspn (result, " "), "nan", 3) == 0
+ my_sprintf (result, "%050Lg %d", zero / zero, 33, 44, 55);
+ ASSERT (strlen (result) == 50 + 3
+ && strisnan (result, strspn (result, " "), strlen (result) - 3, 0)
&& strcmp (result + strlen (result) - 3, " 33") == 0);
ASSERT (retval == strlen (result));
}