@@ -42,7 +42,6 @@
#ifdef _LIBC
# include <wchar.h>
# include <libio/libioP.h>
-# define __vsnprintf(s, l, f, a) _IO_vsnprintf (s, l, f, a)
#endif
#define INIT_BUF_SIZE 200
@@ -1769,7 +1769,7 @@ __argp_error (const struct argp_state *state, const char *fmt, ...)
#ifdef _LIBC
char *buf;
- if (_IO_vasprintf (&buf, fmt, ap) < 0)
+ if (__vasprintf (&buf, fmt, ap) < 0)
buf = NULL;
__fxprintf (stream, "%s: %s\n",
@@ -1839,7 +1839,7 @@ __argp_failure (const struct argp_state *state, int status, int errnum,
#ifdef _LIBC
char *buf;
- if (_IO_vasprintf (&buf, fmt, ap) < 0)
+ if (__vasprintf (&buf, fmt, ap) < 0)
buf = NULL;
__fxprintf (stream, ": %s", buf);
@@ -98,6 +98,8 @@
#define __strerror_r strerror_r
#undef __strndup
#define __strndup strndup
+#undef __vasprintf
+#define __vasprintf vasprintf
#undef __vsnprintf
#define __vsnprintf vsnprintf
@@ -32,7 +32,7 @@ __fwprintf_chk (FILE *fp, int flag, const wchar_t *format, ...)
fp->_flags2 |= _IO_FLAGS2_FORTIFY;
va_start (ap, format);
- done = _IO_vfwprintf (fp, format, ap);
+ done = __vfwprintf_internal (fp, format, ap, 0);
va_end (ap);
if (flag > 0)
@@ -91,7 +91,7 @@ __obstack_vprintf_chk (struct obstack *obstack, int flags, const char *format,
if (flags > 0)
new_f.ofile.file.file._flags2 |= _IO_FLAGS2_FORTIFY;
- result = _IO_vfprintf (&new_f.ofile.file.file, format, args);
+ result = __vfprintf_internal (&new_f.ofile.file.file, format, args, 0);
/* Shrink the buffer to the space we really currently need. */
obstack_blank_fast (obstack, (new_f.ofile.file.file._IO_write_ptr
@@ -63,7 +63,7 @@ __vasprintf_chk (char **result_ptr, int flags, const char *format,
if (flags > 0)
sf._sbf._f._flags2 |= _IO_FLAGS2_FORTIFY;
- ret = _IO_vfprintf (&sf._sbf._f, format, args);
+ ret = __vfprintf_internal (&sf._sbf._f, format, args, 0);
if (ret < 0)
{
free (sf._sbf._f._IO_buf_base);
@@ -55,7 +55,7 @@ __vdprintf_chk (int d, int flags, const char *format, va_list arg)
if (flags > 0)
tmpfil.file._flags2 |= _IO_FLAGS2_FORTIFY;
- done = _IO_vfprintf (&tmpfil.file, format, arg);
+ done = __vfprintf_internal (&tmpfil.file, format, arg, 0);
_IO_FINISH (&tmpfil.file);
@@ -30,7 +30,7 @@ __vfwprintf_chk (FILE *fp, int flag, const wchar_t *format, va_list ap)
if (flag > 0)
fp->_flags2 |= _IO_FLAGS2_FORTIFY;
- done = _IO_vfwprintf (fp, format, ap);
+ done = __vfwprintf_internal (fp, format, ap, 0);
if (flag > 0)
fp->_flags2 &= ~_IO_FLAGS2_FORTIFY;
@@ -60,7 +60,7 @@ ___vsnprintf_chk (char *s, size_t maxlen, int flags, size_t slen,
sf.f._sbf._f._flags2 |= _IO_FLAGS2_FORTIFY;
_IO_str_init_static_internal (&sf.f, s, maxlen - 1, s);
- ret = _IO_vfprintf (&sf.f._sbf._f, format, args);
+ ret = __vfprintf_internal (&sf.f._sbf._f, format, args, 0);
if (sf.f._sbf._f._IO_buf_base != sf.overflow_buf)
*sf.f._sbf._f._IO_write_ptr = '\0';
@@ -80,7 +80,7 @@ ___vsprintf_chk (char *s, int flags, size_t slen, const char *format,
if (flags > 0)
f._sbf._f._flags2 |= _IO_FLAGS2_FORTIFY;
- ret = _IO_vfprintf (&f._sbf._f, format, args);
+ ret = __vfprintf_internal (&f._sbf._f, format, args, 0);
*f._sbf._f._IO_write_ptr = '\0';
return ret;
@@ -59,7 +59,7 @@ __vswprintf_chk (wchar_t *s, size_t maxlen, int flags, size_t slen,
sf.f._sbf._f._flags2 |= _IO_FLAGS2_FORTIFY;
_IO_wstr_init_static (&sf.f._sbf._f, s, maxlen - 1, s);
- ret = _IO_vfwprintf ((FILE *) &sf.f._sbf, format, args);
+ ret = __vfwprintf_internal ((FILE *) &sf.f._sbf, format, args, 0);
if (sf.f._sbf._f._wide_data->_IO_buf_base == sf.overflow_buf)
/* ISO C99 requires swprintf/vswprintf to return an error if the
@@ -31,7 +31,7 @@ __vwprintf_chk (int flag, const wchar_t *format, va_list ap)
if (flag > 0)
stdout->_flags2 |= _IO_FLAGS2_FORTIFY;
- done = _IO_vfwprintf (stdout, format, ap);
+ done = __vfwprintf_internal (stdout, format, ap, 0);
if (flag > 0)
stdout->_flags2 &= ~_IO_FLAGS2_FORTIFY;
@@ -33,7 +33,7 @@ __wprintf_chk (int flag, const wchar_t *format, ...)
stdout->_flags2 |= _IO_FLAGS2_FORTIFY;
va_start (ap, format);
- done = _IO_vfwprintf (stdout, format, ap);
+ done = __vfwprintf_internal (stdout, format, ap, 0);
va_end (ap);
if (flag > 0)
@@ -53,7 +53,7 @@ vpprintf (io_t port, const char *format, va_list arg)
_IO_cookie_init (&temp_f.cfile, _IO_NO_READS,
(void *) port, (cookie_io_functions_t) { write: do_write });
- done = _IO_vfprintf (&temp_f.cfile.__fp.file, format, arg);
+ done = __vfprintf_internal (&temp_f.cfile.__fp.file, format, arg, 0);
return done;
}
@@ -17,6 +17,10 @@ libc_hidden_proto (__snprintf)
extern int __vsnprintf (char *__restrict __s, size_t __maxlen,
const char *__restrict __format, __gnuc_va_list __arg)
__attribute__ ((__format__ (__printf__, 3, 0)));
+libc_hidden_proto (__vsnprintf)
+extern int __vasprintf (char **__result_ptr, const char *__restrict __format,
+ va_list args)
+ __attribute__ ((__format__ (__printf__, 2, 0)));
extern int __vfscanf (FILE *__restrict __s,
const char *__restrict __format,
__gnuc_va_list __arg)
@@ -30,7 +30,7 @@ __fwprintf (FILE *stream, const wchar_t *format, ...)
int done;
va_start (arg, format);
- done = __vfwprintf (stream, format, arg);
+ done = __vfwprintf_internal (stream, format, arg, 0);
va_end (arg);
return done;
@@ -51,14 +51,7 @@ extern int _IO_sprintf (char *, const char*, ...) __THROW;
extern int _IO_ungetc (int, FILE*) __THROW;
extern int _IO_vsscanf (const char *, const char *, __gnuc_va_list) __THROW;
extern int _IO_vsprintf (char*, const char*, __gnuc_va_list) __THROW;
-libc_hidden_proto (_IO_vsprintf)
-extern int _IO_vswprintf (wchar_t*, size_t, const wchar_t*, __gnuc_va_list)
- __THROW;
-struct obstack;
-extern int _IO_obstack_vprintf (struct obstack *, const char *, __gnuc_va_list)
- __THROW;
-extern int _IO_obstack_printf (struct obstack *, const char *, ...) __THROW;
#define _IO_clearerr(FP) ((FP)->_flags &= ~(_IO_ERR_SEEN|_IO_EOF_SEEN))
#define _IO_fseek(__fp, __offset, __whence) \
(_IO_seekoff_unlocked (__fp, __offset, __whence, _IOS_INPUT|_IOS_OUTPUT) \
@@ -28,7 +28,8 @@
#include <stdio_ext.h>
int
-_IO_vdprintf (int d, const char *format, va_list arg)
+__vdprintf_internal (int d, const char *format, va_list arg,
+ unsigned int mode_flags)
{
struct _IO_FILE_plus tmpfil;
struct _IO_wide_data wd;
@@ -50,7 +51,7 @@ _IO_vdprintf (int d, const char *format, va_list arg)
_IO_mask_flags (&tmpfil.file, _IO_NO_READS,
_IO_NO_READS+_IO_NO_WRITES+_IO_IS_APPENDING);
- done = _IO_vfprintf (&tmpfil.file, format, arg);
+ done = __vfprintf_internal (&tmpfil.file, format, arg, mode_flags);
if (done != EOF && _IO_do_flush (&tmpfil.file) == EOF)
done = EOF;
@@ -59,4 +60,10 @@ _IO_vdprintf (int d, const char *format, va_list arg)
return done;
}
-ldbl_weak_alias (_IO_vdprintf, vdprintf)
+
+int
+__vdprintf (int d, const char *format, va_list arg)
+{
+ return __vdprintf_internal (d, format, arg, 0);
+}
+ldbl_weak_alias (__vdprintf, vdprintf)
@@ -28,7 +28,8 @@
#include "strfile.h"
int
-__IO_vsprintf (char *string, const char *format, va_list args)
+__vsprintf_internal (char *string, const char *format, va_list args,
+ unsigned int mode_flags)
{
_IO_strfile sf;
int ret;
@@ -39,11 +40,16 @@ __IO_vsprintf (char *string, const char *format, va_list args)
_IO_no_init (&sf._sbf._f, _IO_USER_LOCK, -1, NULL, NULL);
_IO_JUMPS (&sf._sbf) = &_IO_str_jumps;
_IO_str_init_static_internal (&sf, string, -1, string);
- ret = _IO_vfprintf (&sf._sbf._f, format, args);
+ ret = __vfprintf_internal (&sf._sbf._f, format, args, mode_flags);
_IO_putc_unlocked ('\0', &sf._sbf._f);
return ret;
}
-ldbl_hidden_def (__IO_vsprintf, _IO_vsprintf)
-ldbl_strong_alias (__IO_vsprintf, _IO_vsprintf)
-ldbl_weak_alias (__IO_vsprintf, vsprintf)
+int
+__vsprintf (char *string, const char *format, va_list args)
+{
+ return __vsprintf_internal (string, format, args, 0);
+}
+
+ldbl_strong_alias (__vsprintf, _IO_vsprintf)
+ldbl_weak_alias (__vsprintf, vsprintf)
@@ -298,8 +298,6 @@ weak_extern (_IO_stdin_used);
extern int _IO_vfwscanf (FILE * __restrict, const wchar_t * __restrict,
__gnuc_va_list, int *__restrict);
-extern int _IO_vfwprintf (FILE *__restrict, const wchar_t *__restrict,
- __gnuc_va_list);
extern __ssize_t _IO_wpadn (FILE *, wint_t, __ssize_t);
extern void _IO_free_wbackup_area (FILE *) __THROW;
@@ -319,7 +317,6 @@ libc_hidden_proto (_IO_free_wbackup_area)
libc_hidden_proto (_IO_padn)
libc_hidden_proto (_IO_putc)
libc_hidden_proto (_IO_sgetn)
-libc_hidden_proto (_IO_vfprintf)
#ifdef _IO_MTSAFE_IO
# undef _IO_peekc
@@ -658,12 +658,32 @@ extern off64_t _IO_wstr_seekoff (FILE *, off64_t, int, int)
extern wint_t _IO_wstr_pbackfail (FILE *, wint_t) __THROW;
extern void _IO_wstr_finish (FILE *, int) __THROW;
-extern int _IO_vasprintf (char **result_ptr, const char *format,
- va_list args) __THROW;
-extern int _IO_vdprintf (int d, const char *format, va_list arg);
-extern int _IO_vsnprintf (char *string, size_t maxlen,
- const char *format, va_list args) __THROW;
-
+/* Internal versions of v*printf that take an additional flags
+ parameter. */
+extern int __vfprintf_internal (FILE *fp, const char *format, va_list ap,
+ unsigned int mode_flags);
+extern int __vfwprintf_internal (FILE *fp, const wchar_t *format, va_list ap,
+ unsigned int mode_flags);
+
+extern int __vasprintf_internal (char **result_ptr, const char *format,
+ va_list ap, unsigned int mode_flags);
+extern int __vdprintf_internal (int d, const char *format, va_list ap,
+ unsigned int mode_flags);
+extern int __obstack_vprintf_internal (struct obstack *ob, const char *fmt,
+ va_list ap, unsigned int mode_flags);
+
+extern int __vsprintf_internal (char *string, const char *format, va_list ap,
+ unsigned int mode_flags);
+extern int __vsnprintf_internal (char *string, size_t maxlen,
+ const char *format, va_list ap,
+ unsigned int mode_flags);
+extern int __vswprintf_internal (wchar_t *string, size_t maxlen,
+ const wchar_t *format, va_list ap,
+ unsigned int mode_flags);
+
+/* Flags for __v*printf_internal. */
+#define PRINTF_LDBL_IS_DBL 0x0001
+#define PRINTF_FORTIFY 0x0002
extern size_t _IO_getline (FILE *,char *, size_t, int, int);
libc_hidden_proto (_IO_getline)
@@ -117,7 +117,8 @@ const struct _IO_jump_t _IO_obstack_jumps libio_vtable attribute_hidden =
int
-_IO_obstack_vprintf (struct obstack *obstack, const char *format, va_list args)
+__obstack_vprintf_internal (struct obstack *obstack, const char *format,
+ va_list args, unsigned int mode_flags)
{
struct obstack_FILE
{
@@ -164,7 +165,8 @@ _IO_obstack_vprintf (struct obstack *obstack, const char *format, va_list args)
new_f.ofile.obstack = obstack;
- result = _IO_vfprintf (&new_f.ofile.file.file, format, args);
+ result = __vfprintf_internal (&new_f.ofile.file.file, format, args,
+ mode_flags);
/* Shrink the buffer to the space we really currently need. */
obstack_blank_fast (obstack, (new_f.ofile.file.file._IO_write_ptr
@@ -172,17 +174,22 @@ _IO_obstack_vprintf (struct obstack *obstack, const char *format, va_list args)
return result;
}
-ldbl_weak_alias (_IO_obstack_vprintf, obstack_vprintf)
+int
+__obstack_vprintf (struct obstack *obstack, const char *format, va_list ap)
+{
+ return __obstack_vprintf_internal (obstack, format, ap, 0);
+}
+ldbl_weak_alias (__obstack_vprintf, obstack_vprintf)
int
-_IO_obstack_printf (struct obstack *obstack, const char *format, ...)
+__obstack_printf (struct obstack *obstack, const char *format, ...)
{
int result;
va_list ap;
va_start (ap, format);
- result = _IO_obstack_vprintf (obstack, format, ap);
+ result = __obstack_vprintf_internal (obstack, format, ap, 0);
va_end (ap);
return result;
}
-ldbl_weak_alias (_IO_obstack_printf, obstack_printf)
+ldbl_weak_alias (__obstack_printf, obstack_printf)
@@ -28,7 +28,7 @@ __swprintf (wchar_t *s, size_t n, const wchar_t *format, ...)
int done;
va_start (arg, format);
- done = __vswprintf (s, n, format, arg);
+ done = __vswprintf_internal (s, n, format, arg, 0);
va_end (arg);
return done;
@@ -24,15 +24,13 @@
This exception applies to code released by its copyright holders
in files containing the exception. */
-#include <malloc.h>
#include <string.h>
-#include "libioP.h"
-#include "stdio.h"
-#include <stdio_ext.h>
-#include "strfile.h"
+#include <stdlib.h>
+#include <strfile.h>
int
-_IO_vasprintf (char **result_ptr, const char *format, va_list args)
+__vasprintf_internal (char **result_ptr, const char *format, va_list args,
+ unsigned int mode_flags)
{
/* Initial size of the buffer to be used. Will be doubled each time an
overflow occurs. */
@@ -56,7 +54,7 @@ _IO_vasprintf (char **result_ptr, const char *format, va_list args)
sf._sbf._f._flags &= ~_IO_USER_BUF;
sf._s._allocate_buffer = (_IO_alloc_type) malloc;
sf._s._free_buffer = (_IO_free_type) free;
- ret = _IO_vfprintf (&sf._sbf._f, format, args);
+ ret = __vfprintf_internal (&sf._sbf._f, format, args, mode_flags);
if (ret < 0)
{
free (sf._sbf._f._IO_buf_base);
@@ -85,4 +83,10 @@ _IO_vasprintf (char **result_ptr, const char *format, va_list args)
(*result_ptr)[needed - 1] = '\0';
return ret;
}
-ldbl_weak_alias (_IO_vasprintf, vasprintf)
+
+int
+__vasprintf (char **result_ptr, const char *format, va_list args)
+{
+ return __vasprintf_internal (result_ptr, format, args, 0);
+}
+ldbl_weak_alias (__vasprintf, vasprintf)
@@ -90,8 +90,8 @@ const struct _IO_jump_t _IO_strn_jumps libio_vtable attribute_hidden =
int
-_IO_vsnprintf (char *string, size_t maxlen, const char *format,
- va_list args)
+__vsnprintf_internal (char *string, size_t maxlen, const char *format,
+ va_list args, unsigned int mode_flags)
{
_IO_strnfile sf;
int ret;
@@ -111,11 +111,18 @@ _IO_vsnprintf (char *string, size_t maxlen, const char *format,
_IO_JUMPS (&sf.f._sbf) = &_IO_strn_jumps;
string[0] = '\0';
_IO_str_init_static_internal (&sf.f, string, maxlen - 1, string);
- ret = _IO_vfprintf (&sf.f._sbf._f, format, args);
+ ret = __vfprintf_internal (&sf.f._sbf._f, format, args, mode_flags);
if (sf.f._sbf._f._IO_buf_base != sf.overflow_buf)
*sf.f._sbf._f._IO_write_ptr = '\0';
return ret;
}
-ldbl_weak_alias (_IO_vsnprintf, __vsnprintf)
-ldbl_weak_alias (_IO_vsnprintf, vsnprintf)
+
+int
+___vsnprintf (char *string, size_t maxlen, const char *format, va_list args)
+{
+ return __vsnprintf_internal (string, maxlen, format, args, 0);
+}
+ldbl_weak_alias (___vsnprintf, __vsnprintf)
+ldbl_hidden_def (___vsnprintf, __vsnprintf)
+ldbl_weak_alias (___vsnprintf, vsnprintf)
@@ -89,8 +89,8 @@ const struct _IO_jump_t _IO_wstrn_jumps libio_vtable attribute_hidden =
int
-_IO_vswprintf (wchar_t *string, size_t maxlen, const wchar_t *format,
- va_list args)
+__vswprintf_internal (wchar_t *string, size_t maxlen, const wchar_t *format,
+ va_list args, unsigned int mode_flags)
{
_IO_wstrnfile sf;
int ret;
@@ -108,7 +108,7 @@ _IO_vswprintf (wchar_t *string, size_t maxlen, const wchar_t *format,
_IO_fwide (&sf.f._sbf._f, 1);
string[0] = L'\0';
_IO_wstr_init_static (&sf.f._sbf._f, string, maxlen - 1, string);
- ret = _IO_vfwprintf ((FILE *) &sf.f._sbf, format, args);
+ ret = __vfwprintf_internal ((FILE *) &sf.f._sbf, format, args, mode_flags);
if (sf.f._sbf._f._wide_data->_IO_buf_base == sf.overflow_buf)
/* ISO C99 requires swprintf/vswprintf to return an error if the
@@ -120,5 +120,11 @@ _IO_vswprintf (wchar_t *string, size_t maxlen, const wchar_t *format,
return ret;
}
-weak_alias (_IO_vswprintf, __vswprintf)
-ldbl_weak_alias (_IO_vswprintf, vswprintf)
+
+int
+__vswprintf (wchar_t *string, size_t maxlen, const wchar_t *format,
+ va_list args)
+{
+ return __vswprintf_internal (string, maxlen, format, args, 0);
+}
+ldbl_weak_alias (__vswprintf, vswprintf)
@@ -25,6 +25,6 @@
int
__vwprintf (const wchar_t *format, __gnuc_va_list arg)
{
- return __vfwprintf (stdout, format, arg);
+ return __vfwprintf_internal (stdout, format, arg, 0);
}
ldbl_strong_alias (__vwprintf, vwprintf)
@@ -29,7 +29,7 @@ __wprintf (const wchar_t *format, ...)
int done;
va_start (arg, format);
- done = __vfwprintf (stdout, format, arg);
+ done = __vfwprintf_internal (stdout, format, arg, 0);
va_end (arg);
return done;
@@ -40,7 +40,8 @@ routines := \
isoc99_scanf isoc99_vscanf isoc99_fscanf isoc99_vfscanf isoc99_sscanf \
isoc99_vsscanf \
psiginfo gentempfd \
- vfscanf-internal vfwscanf-internal iovfscanf iovfwscanf
+ vfscanf-internal vfwscanf-internal iovfscanf iovfwscanf \
+ vfprintf-internal vfwprintf-internal
aux := errlist siglist printf-parsemb printf-parsewc fxprintf
@@ -16,11 +16,8 @@
<http://www.gnu.org/licenses/>. */
#include <stdarg.h>
-#include <stdio.h>
-
#include <libioP.h>
-#define vasprintf(s, f, a) _IO_vasprintf (s, f, a)
-#undef __asprintf
+
/* Write formatted output from FORMAT to a string which is
allocated with malloc and stored in *STRING_PTR. */
@@ -32,7 +29,7 @@ ___asprintf (char **string_ptr, const char *format, ...)
int done;
va_start (arg, format);
- done = vasprintf (string_ptr, format, arg);
+ done = __vasprintf_internal (string_ptr, format, arg, 0);
va_end (arg);
return done;
@@ -16,10 +16,7 @@
<http://www.gnu.org/licenses/>. */
#include <stdarg.h>
-#include <stdio.h>
-
#include <libioP.h>
-#define vdprintf(d, f, a) _IO_vdprintf (d, f, a)
/* Write formatted output to D, according to the format string FORMAT. */
/* VARARGS2 */
@@ -30,7 +27,7 @@ __dprintf (int d, const char *format, ...)
int done;
va_start (arg, format);
- done = vdprintf (d, format, arg);
+ done = __vdprintf_internal (d, format, arg, 0);
va_end (arg);
return done;
@@ -29,7 +29,7 @@ __fprintf (FILE *stream, const char *format, ...)
int done;
va_start (arg, format);
- done = vfprintf (stream, format, arg);
+ done = __vfprintf_internal (stream, format, arg, 0);
va_end (arg);
return done;
@@ -27,7 +27,7 @@ static int
locked_vfxprintf (FILE *fp, const char *fmt, va_list ap)
{
if (_IO_fwide (fp, 0) <= 0)
- return _IO_vfprintf (fp, fmt, ap);
+ return __vfprintf_internal (fp, fmt, ap, 0);
/* We must convert the narrow format string to a wide one.
Each byte can produce at most one wide character. */
@@ -53,7 +53,7 @@ locked_vfxprintf (FILE *fp, const char *fmt, va_list ap)
res = __mbsrtowcs (wfmt, &fmt, len, &mbstate);
if (res != -1)
- res = _IO_vfwprintf (fp, wfmt, ap);
+ res = __vfwprintf_internal (fp, wfmt, ap, 0);
if (used_malloc)
free (wfmt);
@@ -30,7 +30,7 @@ __printf (const char *format, ...)
int done;
va_start (arg, format);
- done = vfprintf (stdout, format, arg);
+ done = __vfprintf_internal (stdout, format, arg, 0);
va_end (arg);
return done;
@@ -38,5 +38,4 @@ __printf (const char *format, ...)
#undef _IO_printf
ldbl_strong_alias (__printf, printf);
-/* This is for libg++. */
ldbl_strong_alias (__printf, _IO_printf);
@@ -16,9 +16,7 @@
<http://www.gnu.org/licenses/>. */
#include <stdarg.h>
-#include <stdio.h>
#include <libioP.h>
-#define __vsnprintf(s, l, f, a) _IO_vsnprintf (s, l, f, a)
/* Write formatted output into S, according to the format
string FORMAT, writing no more than MAXLEN characters. */
@@ -30,7 +28,7 @@ __snprintf (char *s, size_t maxlen, const char *format, ...)
int done;
va_start (arg, format);
- done = __vsnprintf (s, maxlen, format, arg);
+ done = __vsnprintf_internal (s, maxlen, format, arg, 0);
va_end (arg);
return done;
@@ -16,9 +16,7 @@
<http://www.gnu.org/licenses/>. */
#include <stdarg.h>
-#include <stdio.h>
#include <libioP.h>
-#define vsprintf(s, f, a) _IO_vsprintf (s, f, a)
/* Write formatted output into S, according to the format string FORMAT. */
/* VARARGS2 */
@@ -29,7 +27,7 @@ __sprintf (char *s, const char *format, ...)
int done;
va_start (arg, format);
- done = vsprintf (s, format, arg);
+ done = __vsprintf_internal (s, format, arg, 0);
va_end (arg);
return done;
similarity index 98%
rename from stdio-common/vfprintf.c
rename to stdio-common/vfprintf-internal.c
@@ -41,6 +41,10 @@
#include <libioP.h>
+#ifdef COMPILE_WPRINTF
+#include <wctype.h>
+#endif
+
/* In some cases we need extra space for all the output which is not
counted in the width of the string. We assume 32 characters is
enough. */
@@ -63,6 +67,8 @@
} \
} while (0)
#define UNBUFFERED_P(S) ((S)->_flags & _IO_UNBUFFERED)
+#define LDBL_IS_DBL (__glibc_unlikely ((mode_flags & PRINTF_LDBL_IS_DBL) != 0))
+#define DO_FORTIFY ((mode_flags & PRINTF_FORTIFY) != 0)
#define done_add(val) \
do { \
@@ -78,7 +84,7 @@
} while (0)
#ifndef COMPILE_WPRINTF
-# define vfprintf _IO_vfprintf_internal
+# define vfprintf __vfprintf_internal
# define CHAR_T char
# define UCHAR_T unsigned char
# define INT_T int
@@ -105,7 +111,7 @@ typedef const char *THOUSANDS_SEP_T;
# define ORIENT if (_IO_vtable_offset (s) == 0 && _IO_fwide (s, -1) != -1)\
return -1
#else
-# define vfprintf _IO_vfwprintf
+# define vfprintf __vfwprintf_internal
# define CHAR_T wchar_t
/* This is a hack!!! There should be a type uwchar_t. */
# define UCHAR_T unsigned int /* uwchar_t */
@@ -747,7 +753,7 @@ static const uint8_t jump_table[] =
\
if (fspec == NULL) \
{ \
- if (__ldbl_is_dbl) \
+ if (LDBL_IS_DBL) \
is_long_double = 0; \
\
struct printf_info info = { .prec = prec, \
@@ -778,7 +784,7 @@ static const uint8_t jump_table[] =
else \
{ \
ptr = (const void *) &args_value[fspec->data_arg]; \
- if (__ldbl_is_dbl) \
+ if (LDBL_IS_DBL) \
{ \
fspec->data_arg_type = PA_DOUBLE; \
fspec->info.is_long_double = 0; \
@@ -808,7 +814,7 @@ static const uint8_t jump_table[] =
\
if (fspec == NULL) \
{ \
- if (__ldbl_is_dbl) \
+ if (LDBL_IS_DBL) \
is_long_double = 0; \
\
struct printf_info info = { .prec = prec, \
@@ -838,7 +844,7 @@ static const uint8_t jump_table[] =
else \
{ \
ptr = (const void *) &args_value[fspec->data_arg]; \
- if (__ldbl_is_dbl) \
+ if (LDBL_IS_DBL) \
fspec->info.is_long_double = 0; \
/* Not supported by *printf functions. */ \
fspec->info.is_binary128 = 0; \
@@ -891,7 +897,7 @@ static const uint8_t jump_table[] =
/* NOTREACHED */ \
\
LABEL (form_number): \
- if (s->_flags2 & _IO_FLAGS2_FORTIFY) \
+ if (DO_FORTIFY) \
{ \
if (! readonly_format) \
{ \
@@ -1214,7 +1220,8 @@ static const uint8_t jump_table[] =
#endif
/* Helper function to provide temporary buffering for unbuffered streams. */
-static int buffered_vfprintf (FILE *stream, const CHAR_T *fmt, va_list)
+static int buffered_vfprintf (FILE *stream, const CHAR_T *fmt, va_list,
+ unsigned int)
__THROW __attribute__ ((noinline));
/* Handle positional format specifiers. */
@@ -1223,7 +1230,9 @@ static int printf_positional (FILE *s,
va_list ap, va_list *ap_savep, int done,
int nspecs_done, const UCHAR_T *lead_str_end,
CHAR_T *work_buffer, int save_errno,
- const char *grouping, THOUSANDS_SEP_T);
+ const char *grouping,
+ THOUSANDS_SEP_T thousands_sep,
+ unsigned int mode_flags);
/* Handle unknown format specifier. */
static int printf_unknown (FILE *, const struct printf_info *,
@@ -1235,7 +1244,7 @@ static CHAR_T *group_number (CHAR_T *, CHAR_T *, CHAR_T *, const char *,
/* The function itself. */
int
-vfprintf (FILE *s, const CHAR_T *format, va_list ap)
+vfprintf (FILE *s, const CHAR_T *format, va_list ap, unsigned int mode_flags)
{
/* The character used as thousands separator. */
THOUSANDS_SEP_T thousands_sep = 0;
@@ -1273,6 +1282,12 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
0 if unknown. */
int readonly_format = 0;
+ /* Temporarily honor environmental settings. */
+ if (__ldbl_is_dbl)
+ mode_flags |= PRINTF_LDBL_IS_DBL;
+ if (s->_flags2 & _IO_FLAGS2_FORTIFY)
+ mode_flags |= PRINTF_FORTIFY;
+
/* Orient the stream. */
#ifdef ORIENT
ORIENT;
@@ -1293,7 +1308,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
if (UNBUFFERED_P (s))
/* Use a helper function which will allocate a local temporary buffer
for the stream and then call us again. */
- return buffered_vfprintf (s, format, ap);
+ return buffered_vfprintf (s, format, ap, mode_flags);
/* Initialize local variables. */
done = 0;
@@ -1682,7 +1697,7 @@ do_positional:
}
done = printf_positional (s, format, readonly_format, ap, &ap_save,
done, nspecs_done, lead_str_end, work_buffer,
- save_errno, grouping, thousands_sep);
+ save_errno, grouping, thousands_sep, mode_flags);
all_done:
if (__glibc_unlikely (workstart != NULL))
@@ -1699,7 +1714,8 @@ printf_positional (FILE *s, const CHAR_T *format, int readonly_format,
va_list ap, va_list *ap_savep, int done, int nspecs_done,
const UCHAR_T *lead_str_end,
CHAR_T *work_buffer, int save_errno,
- const char *grouping, THOUSANDS_SEP_T thousands_sep)
+ const char *grouping, THOUSANDS_SEP_T thousands_sep,
+ unsigned int mode_flags)
{
/* For positional argument handling. */
struct scratch_buffer specsbuf;
@@ -1789,7 +1805,7 @@ printf_positional (FILE *s, const CHAR_T *format, int readonly_format,
now. */
args_size = &args_value[nargs].pa_int;
args_type = &args_size[nargs];
- memset (args_type, s->_flags2 & _IO_FLAGS2_FORTIFY ? '\xff' : '\0',
+ memset (args_type, DO_FORTIFY ? '\xff' : '\0',
nargs * sizeof (*args_type));
}
@@ -1856,7 +1872,7 @@ printf_positional (FILE *s, const CHAR_T *format, int readonly_format,
case PA_FLOAT: /* Promoted. */
T (PA_DOUBLE, pa_double, double);
case PA_DOUBLE|PA_FLAG_LONG_DOUBLE:
- if (__ldbl_is_dbl)
+ if (LDBL_IS_DBL)
{
args_value[cnt].pa_double = va_arg (*ap_savep, double);
args_type[cnt] &= ~PA_FLAG_LONG_DOUBLE;
@@ -1884,7 +1900,7 @@ printf_positional (FILE *s, const CHAR_T *format, int readonly_format,
case -1:
/* Error case. Not all parameters appear in N$ format
strings. We have no way to determine their type. */
- assert (s->_flags2 & _IO_FLAGS2_FORTIFY);
+ assert (DO_FORTIFY);
__libc_fatal ("*** invalid %N$ use detected ***\n");
}
@@ -2285,7 +2301,8 @@ static const struct _IO_jump_t _IO_helper_jumps libio_vtable =
#endif
static int
-buffered_vfprintf (FILE *s, const CHAR_T *format, va_list args)
+buffered_vfprintf (FILE *s, const CHAR_T *format, va_list args,
+ unsigned int mode_flags)
{
CHAR_T buf[BUFSIZ];
struct helper_file helper;
@@ -2318,11 +2335,7 @@ buffered_vfprintf (FILE *s, const CHAR_T *format, va_list args)
_IO_JUMPS (&helper._f) = (struct _IO_jump_t *) &_IO_helper_jumps;
/* Now print to helper instead. */
-#ifndef COMPILE_WPRINTF
- result = _IO_vfprintf (hp, format, args);
-#else
- result = vfprintf (hp, format, args);
-#endif
+ result = vfprintf (hp, format, args, mode_flags);
/* Lock stream. */
__libc_cleanup_region_start (1, (void (*) (void *)) &_IO_funlockfile, s);
@@ -2351,14 +2364,3 @@ buffered_vfprintf (FILE *s, const CHAR_T *format, va_list args)
return result;
}
-
-#undef vfprintf
-#ifdef COMPILE_WPRINTF
-strong_alias (_IO_vfwprintf, __vfwprintf);
-ldbl_weak_alias (_IO_vfwprintf, vfwprintf);
-#else
-ldbl_strong_alias (_IO_vfprintf_internal, vfprintf);
-ldbl_hidden_def (_IO_vfprintf_internal, vfprintf)
-ldbl_strong_alias (_IO_vfprintf_internal, _IO_vfprintf);
-ldbl_hidden_def (_IO_vfprintf_internal, _IO_vfprintf)
-#endif
new file mode 100644
@@ -0,0 +1,27 @@
+/* Copyright (C) 1991-2018 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <libio/libioP.h>
+
+extern int
+__vfprintf (FILE *fp, const char *format, va_list ap)
+{
+ return __vfprintf_internal (fp, format, ap, 0);
+}
+ldbl_strong_alias (__vfprintf, _IO_vfprintf);
+ldbl_strong_alias (__vfprintf, vfprintf);
+ldbl_hidden_def (__vfprintf, vfprintf)
similarity index 33%
rename from stdio-common/vfwprintf.c
rename to stdio-common/vfwprintf-internal.c
@@ -1,3 +1,2 @@
-#include <wctype.h>
#define COMPILE_WPRINTF 1
-#include "vfprintf.c"
+#include "vfprintf-internal.c"
new file mode 100644
@@ -0,0 +1,25 @@
+/* Copyright (C) 1991-2018 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <libio/libioP.h>
+
+extern int
+__vfwprintf (FILE *fp, const wchar_t *format, va_list ap)
+{
+ return __vfwprintf_internal (fp, format, ap, 0);
+}
+ldbl_weak_alias (__vfwprintf, vfwprintf);
@@ -25,9 +25,9 @@
/* Write formatted output to stdout according to the
format string FORMAT, using the argument list in ARG. */
int
-__vprintf (const char *format, __gnuc_va_list arg)
+__vprintf (const char *format, va_list ap)
{
- return vfprintf (stdout, format, arg);
+ return __vfprintf_internal (stdout, format, ap, 0);
}
ldbl_strong_alias (__vprintf, vprintf)
@@ -106,7 +106,7 @@ STRFROM (char *dest, size_t size, const char *format, FLOAT f)
}
/* The following code to prepare the virtual file has been adapted from the
- function _IO_vsnprintf from libio. */
+ function __vsnprintf from libio. */
if (size == 0)
{
@@ -165,7 +165,7 @@ __nldbl_vfprintf (FILE *s, const char *fmt, va_list ap)
{
int done;
set_no_long_double ();
- done = _IO_vfprintf (s, fmt, ap);
+ done = __vfprintf_internal (s, fmt, ap, 0);
clear_no_long_double ();
return done;
}
@@ -174,15 +174,16 @@ strong_alias (__nldbl_vfprintf, __nldbl__IO_vfprintf)
int
attribute_compat_text_section
-__nldbl__IO_vsprintf (char *string, const char *fmt, va_list ap)
+__nldbl___vsprintf (char *string, const char *fmt, va_list ap)
{
int done;
__no_long_double = 1;
- done = _IO_vsprintf (string, fmt, ap);
+ done = __vsprintf_internal (string, fmt, ap, 0);
__no_long_double = 0;
return done;
}
-weak_alias (__nldbl__IO_vsprintf, __nldbl_vsprintf)
+strong_alias (__nldbl___vsprintf, __nldbl__IO_vsprintf)
+weak_alias (__nldbl___vsprintf, __nldbl_vsprintf)
libc_hidden_def (__nldbl_vsprintf)
int
@@ -192,7 +193,7 @@ __nldbl_obstack_vprintf (struct obstack *obstack, const char *fmt,
{
int done;
__no_long_double = 1;
- done = _IO_obstack_vprintf (obstack, fmt, ap);
+ done = __obstack_vprintf_internal (obstack, fmt, ap, 0);
__no_long_double = 0;
return done;
}
@@ -244,7 +245,7 @@ __nldbl_vasprintf (char **result_ptr, const char *fmt, va_list ap)
{
int res;
__no_long_double = 1;
- res = _IO_vasprintf (result_ptr, fmt, ap);
+ res = __vasprintf_internal (result_ptr, fmt, ap, 0);
__no_long_double = 0;
return res;
}
@@ -256,7 +257,7 @@ __nldbl_vdprintf (int d, const char *fmt, va_list arg)
{
int res;
set_no_long_double ();
- res = _IO_vdprintf (d, fmt, arg);
+ res = __vdprintf_internal (d, fmt, arg, 0);
clear_no_long_double ();
return res;
}
@@ -268,7 +269,7 @@ __nldbl_vfwprintf (FILE *s, const wchar_t *fmt, va_list ap)
{
int res;
set_no_long_double ();
- res = _IO_vfwprintf (s, fmt, ap);
+ res = __vfwprintf_internal (s, fmt, ap, 0);
clear_no_long_double ();
return res;
}
@@ -288,7 +289,7 @@ __nldbl_vsnprintf (char *string, size_t maxlen, const char *fmt,
{
int res;
__no_long_double = 1;
- res = _IO_vsnprintf (string, maxlen, fmt, ap);
+ res = __vsnprintf_internal (string, maxlen, fmt, ap, 0);
__no_long_double = 0;
return res;
}
@@ -302,7 +303,7 @@ __nldbl_vswprintf (wchar_t *string, size_t maxlen, const wchar_t *fmt,
{
int res;
__no_long_double = 1;
- res = _IO_vswprintf (string, maxlen, fmt, ap);
+ res = __vswprintf_internal (string, maxlen, fmt, ap, 0);
__no_long_double = 0;
return res;
}