| #include <math.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| |
| static int |
| test (const char str[]) |
| { |
| char *endp; |
| int result = 0; |
| |
| puts (str); |
| |
| double d = strtod (str, &endp); |
| if (!isnan (d)) |
| { |
| puts ("strtod did not return NAN"); |
| result = 1; |
| } |
| if (issignaling (d)) |
| { |
| puts ("strtod returned a sNAN"); |
| result = 1; |
| } |
| if (strcmp (endp, "something") != 0) |
| { |
| puts ("strtod set incorrect end pointer"); |
| result = 1; |
| } |
| |
| float f = strtof (str, &endp); |
| if (!isnanf (f)) |
| { |
| puts ("strtof did not return NAN"); |
| result = 1; |
| } |
| if (issignaling (f)) |
| { |
| puts ("strtof returned a sNAN"); |
| result = 1; |
| } |
| if (strcmp (endp, "something") != 0) |
| { |
| puts ("strtof set incorrect end pointer"); |
| result = 1; |
| } |
| |
| long double ld = strtold (str, &endp); |
| if (!isnan (ld)) |
| { |
| puts ("strtold did not return NAN"); |
| result = 1; |
| } |
| if (issignaling (ld)) |
| { |
| puts ("strtold returned a sNAN"); |
| result = 1; |
| } |
| if (strcmp (endp, "something") != 0) |
| { |
| puts ("strtold set incorrect end pointer"); |
| result = 1; |
| } |
| |
| return result; |
| } |
| |
| static int |
| do_test (void) |
| { |
| int result = 0; |
| |
| result |= test ("NaN(blabla)something"); |
| result |= test ("NaN(1234)something"); |
| /* UINT32_MAX. */ |
| result |= test ("NaN(4294967295)something"); |
| /* UINT64_MAX. */ |
| result |= test ("NaN(18446744073709551615)something"); |
| /* The case of zero is special in that "something" has to be done to make the |
| mantissa different from zero, which would mean infinity instead of |
| NaN. */ |
| result |= test ("NaN(0)something"); |
| |
| return result; |
| } |
| |
| #define TEST_FUNCTION do_test () |
| #include "../test-skeleton.c" |