-/* Copyright (C) 1991,92,93,95,96,97,98,99 Free Software Foundation, Inc.
+/* 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 Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
+ 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
- Library General Public License for more details.
+ Lesser General Public License for more details.
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
+ 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/>. */
#ifndef _PRINTF_H
__BEGIN_DECLS
-#define __need_FILE
-#include <stdio.h>
+#include <bits/types/FILE.h>
+
#define __need_size_t
#define __need_wchar_t
#include <stddef.h>
+#include <stdarg.h>
+
struct printf_info
{
unsigned int extra:1; /* For special use. */
unsigned int is_char:1; /* hh flag. */
unsigned int wide:1; /* Nonzero for wide character streams. */
+ unsigned int i18n:1; /* I flag. */
+ unsigned int is_binary128:1; /* Floating-point argument is ABI-compatible
+ with IEC 60559 binary128. */
+ unsigned int __pad:3; /* Unused so far. */
+ unsigned short int user; /* Bits for user-installed modifiers. */
wchar_t pad; /* Padding character. */
};
The function should return the number of characters written,
or -1 for errors. */
-typedef int printf_function __PMT ((FILE *__stream,
- __const struct printf_info *__info,
- __const void *__const *__args));
+typedef int printf_function (FILE *__stream,
+ const struct printf_info *__info,
+ const void *const *__args);
/* Type of a printf specifier-arginfo function.
INFO gives information about the format specification.
- N, ARGTYPES, and return value are as for printf_parse_format. */
+ N, ARGTYPES, *SIZE has to contain the size of the parameter for
+ user-defined types, and return value are as for parse_printf_format
+ except that -1 should be returned if the handler cannot handle
+ this case. This allows to partially overwrite the functionality
+ of existing format specifiers. */
+
+typedef int printf_arginfo_size_function (const struct printf_info *__info,
+ size_t __n, int *__argtypes,
+ int *__size);
+
+/* Old version of 'printf_arginfo_function' without a SIZE parameter. */
-typedef int printf_arginfo_function __PMT ((__const struct printf_info *__info,
- size_t __n,
- int *__argtypes));
+typedef int printf_arginfo_function (const struct printf_info *__info,
+ size_t __n, int *__argtypes);
+
+/* Type of a function to get a value of a user-defined from the
+ variable argument list. */
+typedef void printf_va_arg_function (void *__mem, va_list *__ap);
/* Register FUNC to be called to format SPEC specifiers; ARGINFO must be
specified to determine how many arguments a SPEC conversion requires and
what their types are. */
-extern int register_printf_function __P ((int __spec, printf_function __func,
- printf_arginfo_function __arginfo));
+extern int register_printf_specifier (int __spec, printf_function __func,
+ printf_arginfo_size_function __arginfo)
+ __THROW;
+
+
+/* Obsolete interface similar to register_printf_specifier. It can only
+ handle basic data types because the ARGINFO callback does not return
+ information on the size of the user-defined type. */
+
+extern int register_printf_function (int __spec, printf_function __func,
+ printf_arginfo_function __arginfo)
+ __THROW __attribute_deprecated__;
+
+
+/* Register a new modifier character sequence. If the call succeeds
+ it returns a positive value representing the bit set in the USER
+ field in 'struct printf_info'. */
+
+extern int register_printf_modifier (const wchar_t *__str) __THROW __wur;
+
+
+/* Register variable argument handler for user type. The return value
+ is to be used in ARGINFO functions to signal the use of the
+ type. */
+extern int register_printf_type (printf_va_arg_function __fct) __THROW __wur;
/* Parse FMT, and fill in N elements of ARGTYPES with the
array it is passed with the types of the arguments it wants, and return
the number of arguments it wants. */
-extern size_t parse_printf_format __P ((__const char *__restrict __fmt,
- size_t __n,
- int *__restrict __argtypes));
+extern size_t parse_printf_format (const char *__restrict __fmt, size_t __n,
+ int *__restrict __argtypes) __THROW;
/* Codes returned by `parse_printf_format' for basic types.
These values cover all the standard format specifications.
- Users can add new values after PA_LAST for their own types. */
+ Users can reserve new values after PA_LAST for their own types
+ using 'register_printf_type'. */
enum
{ /* C type: */
of magnitude used for numbers ('k' for kilo, 'm' for mega etc). If
the format specifier is a uppercase character powers of 1000 are
used. Otherwise powers of 1024. */
-extern int printf_size __P ((FILE *__restrict __fp,
- __const struct printf_info *__info,
- __const void *__const *__restrict __args));
+extern int printf_size (FILE *__restrict __fp,
+ const struct printf_info *__info,
+ const void *const *__restrict __args) __THROW;
/* This is the appropriate argument information function for `printf_size'. */
-extern int printf_size_info __P ((__const struct printf_info *__restrict
- __info, size_t __n,
- int *__restrict __argtypes));
+extern int printf_size_info (const struct printf_info *__restrict
+ __info, size_t __n, int *__restrict __argtypes)
+ __THROW;
+#ifdef __LDBL_COMPAT
+# include <bits/printf-ldbl.h>
+#endif
__END_DECLS