diff options
Diffstat (limited to 'stdio-common')
-rw-r--r-- | stdio-common/printf-parse.h | 1 | ||||
-rw-r--r-- | stdio-common/tstdiomisc.c | 35 | ||||
-rw-r--r-- | stdio-common/vfprintf.c | 14 |
3 files changed, 43 insertions, 7 deletions
diff --git a/stdio-common/printf-parse.h b/stdio-common/printf-parse.h index 1f2878a5fc..4a228a1cb8 100644 --- a/stdio-common/printf-parse.h +++ b/stdio-common/printf-parse.h @@ -390,6 +390,7 @@ parse_one_spec (const UCHAR_T *format, size_t posn, struct printf_spec *spec, case L'e': case L'E': case L'f': + case L'F': case L'g': case L'G': case L'a': diff --git a/stdio-common/tstdiomisc.c b/stdio-common/tstdiomisc.c index 1affac5b51..55d77b0f29 100644 --- a/stdio-common/tstdiomisc.c +++ b/stdio-common/tstdiomisc.c @@ -1,4 +1,8 @@ +#include <float.h> +#include <math.h> #include <stdio.h> +#include <string.h> +#include <wchar.h> int t1 (void) @@ -43,12 +47,43 @@ t2 (void) } int +F (void) +{ + char buf[20]; + wchar_t wbuf[10]; + int result; + + snprintf (buf, sizeof buf, "%f %F", DBL_MAX * DBL_MAX - DBL_MAX * DBL_MAX, + DBL_MAX * DBL_MAX - DBL_MAX * DBL_MAX); + result = strcmp (buf, "nan NAN") != 0; + printf ("expected \"nan NAN\", got \"%s\"\n", buf); + + snprintf (buf, sizeof buf, "%f %F", DBL_MAX * DBL_MAX, DBL_MAX * DBL_MAX); + result |= strcmp (buf, "inf INF") != 0; + printf ("expected \"inf INF\", got \"%s\"\n", buf); + + swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), L"%f %F", + DBL_MAX * DBL_MAX - DBL_MAX * DBL_MAX, + DBL_MAX * DBL_MAX - DBL_MAX * DBL_MAX); + result |= wcscmp (wbuf, L"nan NAN") != 0; + printf ("expected L\"nan NAN\", got L\"%S\"\n", wbuf); + + swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), L"%f %F", + DBL_MAX * DBL_MAX, DBL_MAX * DBL_MAX); + result |= wcscmp (wbuf, L"inf INF") != 0; + printf ("expected L\"inf INF\", got L\"%S\"\n", wbuf); + + return result; +} + +int main (int argc, char *argv[]) { int result = 0; result |= t1 (); result |= t2 (); + result |= F (); result |= fflush (stdout) == EOF; diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c index 3f13026e14..b90f26f7fa 100644 --- a/stdio-common/vfprintf.c +++ b/stdio-common/vfprintf.c @@ -284,7 +284,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) /* '8' */ 8, /* '9' */ 8, 0, 0, 0, 0, 0, 0, 0, /* 'A' */ 26, 0, /* 'C' */ 25, - 0, /* 'E' */ 19, 0, /* 'G' */ 19, + 0, /* 'E' */ 19, /* F */ 19, /* 'G' */ 19, 0, /* 'I' */ 29, 0, 0, /* 'L' */ 12, 0, 0, 0, 0, 0, 0, /* 'S' */ 21, @@ -354,7 +354,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) REF (form_unsigned), /* for 'u' */ \ REF (form_octal), /* for 'o' */ \ REF (form_hexa), /* for 'X', 'x' */ \ - REF (form_float), /* for 'E', 'e', 'f', 'G', 'g' */ \ + REF (form_float), /* for 'E', 'e', 'F', 'f', 'G', 'g' */ \ REF (form_character), /* for 'c' */ \ REF (form_string), /* for 's', 'S' */ \ REF (form_pointer), /* for 'p' */ \ @@ -388,7 +388,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) REF (form_unsigned), /* for 'u' */ \ REF (form_octal), /* for 'o' */ \ REF (form_hexa), /* for 'X', 'x' */ \ - REF (form_float), /* for 'E', 'e', 'f', 'G', 'g' */ \ + REF (form_float), /* for 'E', 'e', 'F', 'f', 'G', 'g' */ \ REF (form_character), /* for 'c' */ \ REF (form_string), /* for 's', 'S' */ \ REF (form_pointer), /* for 'p' */ \ @@ -422,7 +422,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) REF (form_unsigned), /* for 'u' */ \ REF (form_octal), /* for 'o' */ \ REF (form_hexa), /* for 'X', 'x' */ \ - REF (form_float), /* for 'E', 'e', 'f', 'G', 'g' */ \ + REF (form_float), /* for 'E', 'e', 'F', 'f', 'G', 'g' */ \ REF (form_character), /* for 'c' */ \ REF (form_string), /* for 's', 'S' */ \ REF (form_pointer), /* for 'p' */ \ @@ -456,7 +456,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) REF (form_unsigned), /* for 'u' */ \ REF (form_octal), /* for 'o' */ \ REF (form_hexa), /* for 'X', 'x' */ \ - REF (form_unknown), /* for 'E', 'e', 'f', 'G', 'g' */ \ + REF (form_unknown), /* for 'E', 'e', 'F', 'f', 'G', 'g' */ \ REF (form_unknown), /* for 'c' */ \ REF (form_unknown), /* for 's', 'S' */ \ REF (form_unknown), /* for 'p' */ \ @@ -490,7 +490,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) REF (form_unsigned), /* for 'u' */ \ REF (form_octal), /* for 'o' */ \ REF (form_hexa), /* for 'X', 'x' */ \ - REF (form_float), /* for 'E', 'e', 'f', 'G', 'g' */ \ + REF (form_float), /* for 'E', 'e', 'F', 'f', 'G', 'g' */ \ REF (form_character), /* for 'c' */ \ REF (form_string), /* for 's', 'S' */ \ REF (form_pointer), /* for 'p' */ \ @@ -526,7 +526,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) REF (form_unsigned), /* for 'u' */ \ REF (form_octal), /* for 'o' */ \ REF (form_hexa), /* for 'X', 'x' */ \ - REF (form_float), /* for 'E', 'e', 'f', 'G', 'g' */ \ + REF (form_float), /* for 'E', 'e', 'F', 'f', 'G', 'g' */ \ REF (form_character), /* for 'c' */ \ REF (form_string), /* for 's', 'S' */ \ REF (form_pointer), /* for 'p' */ \ |