]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - stdio-common/printf-prs.c
Deprecate external use of libio.h and _G_config.h.
[thirdparty/glibc.git] / stdio-common / printf-prs.c
index f0cd75b928b1e757e90b80ceffb4cce7f61f9ab8..d63855612a669cadbcfdff35b395b505400584dc 100644 (file)
@@ -1,4 +1,4 @@
-/* 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
@@ -12,9 +12,8 @@
    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>
@@ -23,6 +22,8 @@
 #include <wchar.h>
 #include <sys/param.h>
 
+#include "../locale/localeinfo.h"
+
 #ifndef COMPILE_WPRINTF
 # define CHAR_T                char
 # define UCHAR_T       unsigned char
 # 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
@@ -53,43 +45,32 @@ ssize_t __printf_pad __P ((FILE *, char pad, size_t n));
 # 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)
@@ -111,7 +92,8 @@ parse_printf_format (fmt, n, argtypes)
            /* 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;
          }
     }