-/* Copyright (C) 1991,92,95,96,99,2000,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1991-2017 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
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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
#include <stdio.h>
#include <printf.h>
# define ISASCII(Ch) isascii (Ch)
# define MBRLEN(Cp, L, St) __mbrlen (Cp, L, St)
-# ifdef USE_IN_LIBIO
-# define PUT(F, S, N) _IO_sputn (F, S, N)
-# define PAD(Padchar) \
- if (width > 0) \
- done += INTUSE(_IO_padn) (s, Padchar, width)
-# else
-# define PUTC(C, F) putc (C, F)
-ssize_t __printf_pad __P ((FILE *, char pad, size_t n));
+# define PUT(F, S, N) _IO_sputn (F, S, N)
# define PAD(Padchar) \
if (width > 0) \
- { if (__printf_pad (s, Padchar, width) == -1) \
- return -1; else done += width; }
-# endif
+ done += _IO_padn (s, Padchar, width)
#else
# define vfprintf vfwprintf
# define CHAR_T wchar_t
# define L_(Str) L##Str
# define ISDIGIT(Ch) iswdigit (Ch)
-# ifdef USE_IN_LIBIO
# define PUT(F, S, N) _IO_sputn (F, S, N)
# define PAD(Padchar) \
if (width > 0) \
done += _IO_wpadn (s, Padchar, width)
-# else
-# define PUTC(C, F) wputc (C, F)
-ssize_t __wprintf_pad __P ((FILE *, wchar_t pad, size_t n));
-# define PAD(Padchar) \
- if (width > 0) \
- { if (__wprintf_pad (s, Padchar, width) == -1) \
- return -1; else done += width; }
-# endif
#endif
+#define DONT_NEED_READ_INT
#include "printf-parse.h"
size_t
-parse_printf_format (fmt, n, argtypes)
- const char *fmt;
- size_t n;
- int *argtypes;
+parse_printf_format (const char *fmt, size_t n, int *argtypes)
{
size_t nargs; /* Number of arguments. */
size_t max_ref_arg; /* Highest index used in a positional arg. */
struct printf_spec spec;
- mbstate_t mbstate;
+ const unsigned char *f = (const unsigned char *) fmt;
nargs = 0;
max_ref_arg = 0;
/* Search for format specifications. */
- for (fmt = find_spec (fmt, &mbstate); *fmt != '\0'; fmt = spec.next_fmt)
+ for (f = __find_specmb (f); *f != '\0'; f = spec.next_fmt)
{
/* Parse this spec. */
- nargs += parse_one_spec (fmt, nargs, &spec, &max_ref_arg, &mbstate);
+ nargs += __parse_one_specmb (f, nargs, &spec, &max_ref_arg);
/* If the width is determined by an argument this is an int. */
if (spec.width_arg != -1 && (size_t) spec.width_arg < n)
/* We have more than one argument for this format spec. We must
call the arginfo function again to determine all the types. */
(void) (*__printf_arginfo_table[spec.info.spec])
- (&spec.info, n - spec.data_arg, &argtypes[spec.data_arg]);
+ (&spec.info, n - spec.data_arg, &argtypes[spec.data_arg],
+ &spec.size);
break;
}
}