1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-01 10:06:57 +03:00

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

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