diff --git a/build-aux/configure-lib.sh b/build-aux/configure-lib.sh index eb320a66..dd585840 100644 --- a/build-aux/configure-lib.sh +++ b/build-aux/configure-lib.sh @@ -250,6 +250,7 @@ lib/stdio/fclose.c lib/stdio/fdopen.c lib/stdio/ferror.c lib/stdio/fflush.c +lib/stdio/fileno.c lib/stdio/fopen.c lib/stdio/fprintf.c lib/stdio/fread.c @@ -334,7 +335,6 @@ lib/posix/unsetenv.c lib/stdio/clearerr.c lib/stdio/feof.c lib/stdio/fgets.c -lib/stdio/fileno.c lib/stdio/freopen.c lib/stdio/fscanf.c lib/stdio/perror.c diff --git a/include/stdio.h b/include/stdio.h index c68576e0..9b371ba3 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -65,6 +65,7 @@ int ferror (FILE * stream); int fflush (FILE * stream); int fgetc (FILE * stream); char *fgets (char *s, int size, FILE * stream); +int fileno (FILE *); int fpurge (FILE * stream); int fputc (int c, FILE * stream); int fputs (char const *s, FILE * stream); diff --git a/lib/stdio/vfprintf.c b/lib/stdio/vfprintf.c index 0b2c30a0..b87479ba 100644 --- a/lib/stdio/vfprintf.c +++ b/lib/stdio/vfprintf.c @@ -26,7 +26,7 @@ int vfprintf (FILE * f, char const *format, va_list ap) { - int fd = (long) f; + int fd = fileno (f); char const *p = format; int count = 0; while (*p) @@ -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) @@ -194,6 +212,9 @@ vfprintf (FILE * f, char const *format, va_list ap) case 'G': { double d = va_arg8 (ap, double); +#if 1 + fputs ("0.0", f); +#else char *s = dtoab (d, 10, 1); if (c == 'E' || c == 'G') strupr (s); @@ -229,6 +250,7 @@ vfprintf (FILE * f, char const *format, va_list ap) fputc (pad, f); count++; } +#endif break; } case 'n': @@ -241,6 +263,8 @@ vfprintf (FILE * f, char const *format, va_list ap) { eputs ("vfprintf: not supported: %:"); eputc (c); + eputs (", in format: "); + eputs (format); eputs ("\n"); p++; } @@ -248,5 +272,5 @@ vfprintf (FILE * f, char const *format, va_list ap) p++; } va_end (ap); - return 0; + return count; } 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..c524d223 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) @@ -210,6 +228,11 @@ vsnprintf (char *str, size_t size, char const *format, va_list ap) case 'G': { double d = va_arg8 (ap, double); +#if 1 + *str++ = '0'; + *str++ = '.'; + *str++ = '0'; +#else char *s = dtoab (d, 10, 1); if (c == 'E' || c == 'G') strupr (s); @@ -250,6 +273,7 @@ vsnprintf (char *str, size_t size, char const *format, va_list ap) *str++ = pad; count++; } +#endif break; } case 'n': @@ -262,6 +286,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++;