Add __v*printf_internal with flags arguments

There are a lot more printf variants than there are scanf variants,
and the code for setting up and tearing down their custom FILE
variants around the call to __vf(w)printf is more complicated and
variable.  Therefore, I have added _internal versions of all the
v*printf variants, rather than introducing helper routines so that
they can all directly call __vf(w)printf_internal, as was done with
scanf.

As with the scanf changes, in this patch the _internal functions still
look at the environmental mode bits and all callers pass 0 for the
flags parameter.

Several of the affected public functions had _IO_ name aliases that
were not exported (but, in one case, appeared in libio.h anyway);
I was originally planning to leave them as aliases to avoid having
to touch internal callers, but it turns out ldbl_*_alias only work
for exported symbols, so they've all been removed instead.  It also
turns out there were hardly any internal callers.  _IO_vsprintf and
_IO_vfprintf *are* exported, so those two stick around.

Summary for the changes to each of the affected symbols:

  _IO_vfprintf, _IO_vsprintf:
    All internal calls removed, thus the internal declarations, as well
    as uses of libc_hidden_proto and libc_hidden_def, were also removed.
    The external symbol is now exposed via uses of ldbl_strong_alias
    to __vfprintf_internal and __vsprintf_internal, respectively.

  _IO_vasprintf, _IO_vdprintf, _IO_vsnprintf,
  _IO_vfwprintf, _IO_vswprintf,
  _IO_obstack_vprintf, _IO_obstack_printf:
    All internal calls removed, thus declaration in internal headers
    were also removed.  They were never exported, so there are no
    aliases tying them to the internal functions.  I.e.: entirely gone.

  __vsnprintf:
    Internal calls were always preceded by macros such as
      #define __vsnprintf _IO_vsnprintf, and
      #define __vsnprintf vsnprintf
    The macros were removed and their uses replaced with calls to the
    new internal function __vsnprintf_internal.  Since there were no
    internal calls, the internal declaration was also removed.  The
    external symbol is preserved with ldbl_weak_alias to ___vsnprintf.

  __vfwprintf:
    All internal calls converted into calls to __vfwprintf_internal,
    thus the internal declaration was removed.  The function is now a
    wrapper that calls __vfwprintf_internal.  The external symbol is
    preserved.

  __vswprintf:
    Similarly, but no external symbol.

  __vasprintf, __vdprintf, __vfprintf, __vsprintf:
    New internal wrappers.  Not exported.

  vasprintf, vdprintf, vfprintf, vsprintf, vsnprintf,
  vfwprintf, vswprintf,
  obstack_vprintf, obstack_printf:
    These functions used to be aliases to the respective _IO_* function,
    they are now aliases to their respective __* functions.

Tested for powerpc and powerpc64le.
This commit is contained in:
Zack Weinberg 2018-03-07 14:32:01 -05:00 committed by Gabriel F. T. Gomes
parent d91798b31a
commit 698fb75b9f
45 changed files with 2633 additions and 2466 deletions

View File

@ -1,3 +1,85 @@
2018-12-05 Zack Weinberg <zackw@panix.com>
Gabriel F. T. Gomes <gabriel@inconstante.eti.br>
* libio/libioP.h (__vfprintf_internal, __vfwprintf_internal)
(__vasprintf_internal, __vdprintf_internal, __obstack_vprintf_internal)
(__vsprintf_internal, __vsnprintf_internal, __vswprintf_internal):
New functions.
(PRINTF_LDBL_IS_DBL, PRINTF_FORTIFY): New constants.
(_IO_vasprintf, _IO_vdprintf, _IO_vsnprintf): Remove prototypes.
* stdio-common/vfprintf-internal.c: Rename from vfprintf.c.
Include wctype.h here if COMPILE_WPRINTF is defined.
Define __vfprintf_internal or __vfwprintf_internal, depending
on COMPILE_WPRINTF.
Temporarily, on entry to this function, update mode_flags
according to the environmental settings corresponding to
PRINTF_LDBL_IS_DBL and PRINTF_FORTIFY.
Throughout, check mode_flags instead of __ldbl_is_dbl and
_IO_FLAGS2_FORTIFY on the destination FILE.
* stdio-common/vfwprintf-internal.c: Rename from vfwprintf.c.
Include vfprintf-internal.c. Don't include wctype.h.
* stdio-common/vfprintf.c: New file. Just define __vfprintf
as a wrapper around __vfprintf_internal, with aliases _IO_vfprintf
and vfprintf.
* stdio-common/vfwprintf.c: New file. Just define __vfwprintf
as a wrapper around __vfwprintf_internal, with aliases _IO_vfwprintf
and vfwprintf.
* stdio-common/Makefile: Add vfprintf-internal and vfwprintf-internal.
* libio/iovdprintf.c (_IO_vdprintf): Rename to __vdprintf_internal
and add mode_flags argument; use __vfprintf_internal.
(__vdprintf): New function. Alias vdprintf to this.
* libio/iovsprintf.c (_IO_vsprintf, __vsprintf): Similarly.
* libio/vasprintf.c (_IO_vasprintf, __vasprintf): Similarly.
* libio/obprintf.c (_IO_obstack_vprintf, __obstack_vprintf): Similarly.
(__obstack_printf): Use __obstack_printf_internal.
* libio/vsnprintf.c (_IO_vsnprintf, ___vsnprintf): Similarly, with
public aliases __vsnprintf and vsnprintf.
Remove use of ldbl_hidden_def, since __vsnprintf is no longer
called internally.
* libio/vswprintf (_IO_vswprintf, __vswprintf): Similarly, with
public aliases _IO_vsprintf and vsprintf.
* libio/swprintf.c (__swprintf): Use __vswprintf_internal.
* stdio-common/asprintf.c (__asprintf): Use __vasprintf_internal.
* stdio-common/dprintf.c (__dprintf): Use __vdprintf_internal.
* stdio-common/snprintf.c (__snprintf): Use __vsprintf_internal.
* stdio-common/sprintf.c (__sprintf): Use __vsprintf_internal.
* debug/obprintf_chk.c, debug/vasprintf_chk.c, debug/vdprintf_chk.c
* debug/vsnprintf_chk.c, debug/vsprintf_chk.c, hurd/vpprintf.c
* stdio-common/fprintf.c, stdio-common/fxprintf.c
* stdio-common/printf.c: Use __vfprintf_internal.
* debug/fwprintf_chk.c, debug/vfwprintf_chk.c, debug/vswprintf_chk.c
* debug/vwprintf_chk.c, debug/wprintf_chk.c, libio/fwprintf.c
* libio/vwprintf.c, libio/wprintf.c: Use __vfwprintf_internal.
* sysdeps/ieee754/ldbl-opt/nldbl-compat.c: Use __vsprintf_internal,
__obstack_vprintf_internal, __vasprintf_internal, __vdprintf_internal,
__vsnprintf_internal, __vswprintf_internal, __vfprintf_internal, and
__vfwprintf_internal.
* libio/libio.h: Remove libc_hidden_proto and declaration for
_IO_vfprintf.
Remove declaration of _IO_vfwprintf.
* libio/iolibio.h: Remove libc_hidden_proto and declaration for
_IO_vsprintf.
Remove declarations of _IO_vswprintf, _IO_obstack_printf, and
_IO_obstack_printf.
* include/stdio.h: Add prototype for __vasprintf.
(__vsnprintf): Remove declaration, because there are no more
internal calls.
* include/wchar.h (__vfwprintf, __vswprintf): Remove
declaration, because there are no more internal calls.
* argp/argp-fmtstream.c (__argp_fmtstream_printf): Use
__vsnprintf_internal, instead of _IO_vsnprintf.
* argp/argp-help.c (__argp_error, __argp_failure): Use
__vasprintf_internal, instead of _IO_vasprintf.
* argp/argp-namefrob.h (__vsnprintf): Do not undefined then
redefine, because there are no more internal calls.
2018-12-05 Zack Weinberg <zackw@panix.com>
Gabriel F. T. Gomes <gabriel@inconstante.eti.br>

View File

@ -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
@ -413,7 +412,7 @@ __argp_fmtstream_printf (struct argp_fmtstream *fs, const char *fmt, ...)
va_start (args, fmt);
avail = fs->end - fs->p;
out = __vsnprintf (fs->p, avail, fmt, args);
out = __vsnprintf_internal (fs->p, avail, fmt, args, 0);
va_end (args);
if ((size_t) out >= avail)
size_guess = out + 1;

View File

@ -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_internal (&buf, fmt, ap, 0) < 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_internal (&buf, fmt, ap, 0) < 0)
buf = NULL;
__fxprintf (stream, ": %s", buf);

View File

@ -98,8 +98,6 @@
#define __strerror_r strerror_r
#undef __strndup
#define __strndup strndup
#undef __vsnprintf
#define __vsnprintf vsnprintf
#if defined(HAVE_DECL_CLEARERR_UNLOCKED) && !HAVE_DECL_CLEARERR_UNLOCKED
# define clearerr_unlocked(x) clearerr (x)

View File

@ -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)

View File

@ -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

View File

@ -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);

View File

@ -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);

View 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;

View File

@ -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';

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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)

View File

@ -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;
}

View File

@ -14,9 +14,6 @@ extern int __snprintf (char *__restrict __s, size_t __maxlen,
const char *__restrict __format, ...)
__attribute__ ((__format__ (__printf__, 3, 4)));
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)));
extern int __vfscanf (FILE *__restrict __s,
const char *__restrict __format,
__gnuc_va_list __arg)

View File

@ -203,20 +203,10 @@ extern int __vfwscanf (__FILE *__restrict __s,
__gnuc_va_list __arg)
attribute_hidden
/* __attribute__ ((__format__ (__wscanf__, 2, 0)) */;
extern int __vswprintf (wchar_t *__restrict __s, size_t __n,
const wchar_t *__restrict __format,
__gnuc_va_list __arg)
attribute_hidden
/* __attribute__ ((__format__ (__wprintf__, 3, 0))) */;
extern int __fwprintf (__FILE *__restrict __s,
const wchar_t *__restrict __format, ...)
attribute_hidden
/* __attribute__ ((__format__ (__wprintf__, 2, 3))) */;
extern int __vfwprintf (__FILE *__restrict __s,
const wchar_t *__restrict __format,
__gnuc_va_list __arg)
attribute_hidden
/* __attribute__ ((__format__ (__wprintf__, 2, 0))) */;
extern int __vfwprintf_chk (FILE *__restrict __s, int __flag,
const wchar_t *__restrict __format,
__gnuc_va_list __arg)

View File

@ -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;

View File

@ -51,15 +51,7 @@ extern int _IO_sscanf (const char*, const char*, ...) __THROW;
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) \

View File

@ -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)

View File

@ -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)

View File

@ -255,8 +255,6 @@ extern int _IO_ftrylockfile (FILE *) __THROW;
extern int _IO_vfscanf (FILE * __restrict, const char * __restrict,
__gnuc_va_list, int *__restrict);
extern int _IO_vfprintf (FILE *__restrict, const char *__restrict,
__gnuc_va_list);
extern __ssize_t _IO_padn (FILE *, int, __ssize_t);
extern size_t _IO_sgetn (FILE *, void *, size_t);
@ -298,8 +296,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 +315,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

View File

@ -658,12 +658,49 @@ 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)
attribute_hidden;
extern int __vfwprintf_internal (FILE *fp, const wchar_t *format, va_list ap,
unsigned int mode_flags)
attribute_hidden;
extern int __vasprintf_internal (char **result_ptr, const char *format,
va_list ap, unsigned int mode_flags)
attribute_hidden;
extern int __vdprintf_internal (int d, const char *format, va_list ap,
unsigned int mode_flags)
attribute_hidden;
extern int __obstack_vprintf_internal (struct obstack *ob, const char *fmt,
va_list ap, unsigned int mode_flags)
attribute_hidden;
extern int __vsprintf_internal (char *string, const char *format, va_list ap,
unsigned int mode_flags)
attribute_hidden;
extern int __vsnprintf_internal (char *string, size_t maxlen,
const char *format, va_list ap,
unsigned int mode_flags)
attribute_hidden;
extern int __vswprintf_internal (wchar_t *string, size_t maxlen,
const wchar_t *format, va_list ap,
unsigned int mode_flags)
attribute_hidden;
/* Flags for __v*printf_internal.
PRINTF_LDBL_IS_DBL indicates whether long double values are to be
handled as having the same format as double, in which case the flag
should be set to one, or as another format, otherwise.
PRINTF_FORTIFY, when set to one, indicates that fortification checks
are to be performed in input parameters. This is used by the
__*printf_chk functions, which are used when _FORTIFY_SOURCE is
defined to 1 or 2. Otherwise, such checks are ignored. */
#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)

View File

@ -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
_IO_obstack_printf (struct obstack *obstack, const char *format, ...)
__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
__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)

View File

@ -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;

View File

@ -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_unused = (_IO_alloc_type) malloc;
sf._s._free_buffer_unused = (_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)

View File

@ -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,17 @@ _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_weak_alias (___vsnprintf, vsnprintf)

View File

@ -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)

View File

@ -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)

View File

@ -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;

View File

@ -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

View File

@ -16,11 +16,7 @@
<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 +28,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;

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,2 @@
#define COMPILE_WPRINTF 1
#include "vfprintf-internal.c"

View File

@ -1,3 +1,25 @@
#include <wctype.h>
#define COMPILE_WPRINTF 1
#include "vfprintf.c"
/* 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);

View File

@ -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)

View File

@ -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_internal from libio. */
if (size == 0)
{

View File

@ -166,7 +166,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;
}
@ -175,15 +175,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
@ -193,7 +194,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;
}
@ -245,7 +246,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;
}
@ -257,7 +258,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;
}
@ -269,7 +270,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;
}
@ -289,7 +290,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;
}
@ -303,7 +304,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;
}