From 95ba4723023f4280a3bbff9a5119fcdebf447ce2 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Fri, 8 Feb 2019 13:45:44 +0100 Subject: [PATCH] lib: vfprintf, vsnprintf: Support gcc-4.6.4: #-type. * lib/stdio/vfprintf.c (vfprintf): Support #-type prefix. Show whole format upon error. * lib/stdio/vsnprintf.c (vsnprintf): Likewise. * lib/stdio/vfscanf.c (vfscanf): Show whole template upon error. * lib/stdio/vsscanf.c (vsscanf): Likewise. --- lib/stdio/vfprintf.c | 24 ++++++++++++++++++++++-- lib/stdio/vfscanf.c | 2 ++ lib/stdio/vsnprintf.c | 24 ++++++++++++++++++++++-- lib/stdio/vsscanf.c | 2 ++ 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/lib/stdio/vfprintf.c b/lib/stdio/vfprintf.c index 0b2c30a0..7f2c55ee 100644 --- a/lib/stdio/vfprintf.c +++ b/lib/stdio/vfprintf.c @@ -41,6 +41,7 @@ vfprintf (FILE * f, char const *format, va_list ap) char c = *p; int left_p = 0; int precision = -1; + int prefix_p = 0; int width = -1; if (c == '-') { @@ -51,12 +52,17 @@ vfprintf (FILE * f, char const *format, va_list ap) if (c == ' ') { pad = c; - c = *p++; + c = *++p; + } + if (c == '#') + { + prefix_p = 1; + c = *++p; } if (c == '0') { pad = c; - c = *p++; + c = *++p; } if (c >= '0' && c <= '9') { @@ -134,6 +140,18 @@ vfprintf (FILE * f, char const *format, va_list ap) count++; } } + if (prefix_p && *s && c == 'o') + { + fputc ('0', f); + width--; + } + if (prefix_p && *s && (c == 'x' || c == 'X')) + { + fputc ('0', f); + width--; + fputc ('x', f); + width--; + } while (*s) { if (precision-- <= 0) @@ -241,6 +259,8 @@ vfprintf (FILE * f, char const *format, va_list ap) { eputs ("vfprintf: not supported: %:"); eputc (c); + eputs (", in format: "); + eputs (format); eputs ("\n"); p++; } diff --git a/lib/stdio/vfscanf.c b/lib/stdio/vfscanf.c index b1083a56..fe12649d 100644 --- a/lib/stdio/vfscanf.c +++ b/lib/stdio/vfscanf.c @@ -110,6 +110,8 @@ vfscanf (FILE * stream, char const *template, va_list ap) { eputs ("vsscanf: not supported: %:"); eputc (c); + eputs (", in template: "); + eputs (template); eputs ("\n"); t++; p = fgetc (stream); diff --git a/lib/stdio/vsnprintf.c b/lib/stdio/vsnprintf.c index 9a8d796d..c1b56840 100644 --- a/lib/stdio/vsnprintf.c +++ b/lib/stdio/vsnprintf.c @@ -43,6 +43,7 @@ vsnprintf (char *str, size_t size, char const *format, va_list ap) c = *p; int left_p = 0; int precision = -1; + int prefix_p = 0; int width = -1; if (c == '-') { @@ -53,12 +54,17 @@ vsnprintf (char *str, size_t size, char const *format, va_list ap) if (c == ' ') { pad = c; - c = *p++; + c = *++p; + } + if (c == '#') + { + prefix_p = 1; + c = *++p; } if (c == '0') { pad = c; - c = *p++; + c = *++p; } if (c >= '0' && c <= '9') { @@ -142,6 +148,18 @@ vsnprintf (char *str, size_t size, char const *format, va_list ap) count++; } } + if (prefix_p && *s && c == 'o') + { + *s++ = '0'; + width--; + } + if (prefix_p && *s && (c == 'x' || c == 'X')) + { + *s++ = '0'; + width--; + *s++ = 'x'; + width--; + } while (*s) { if (precision-- <= 0) @@ -262,6 +280,8 @@ vsnprintf (char *str, size_t size, char const *format, va_list ap) { eputs ("vsnprintf: not supported: %:"); eputc (c); + eputs (", in format: "); + eputs (format); eputs ("\n"); p++; } diff --git a/lib/stdio/vsscanf.c b/lib/stdio/vsscanf.c index 4573bc01..a42b0dba 100644 --- a/lib/stdio/vsscanf.c +++ b/lib/stdio/vsscanf.c @@ -81,6 +81,8 @@ vsscanf (char const *s, char const *template, va_list ap) { eputs ("vsscanf: not supported: %:"); eputc (c); + eputs (", in template: "); + eputs (template); eputs ("\n"); t++; p++;