about summary refs log tree commit diff
path: root/REORG.TODO/stdio-common/printf-parse.h
diff options
context:
space:
mode:
authorZack Weinberg <zackw@panix.com>2017-06-08 15:39:03 -0400
committerZack Weinberg <zackw@panix.com>2017-06-08 15:39:03 -0400
commit5046dbb4a7eba5eccfd258f92f4735c9ffc8d069 (patch)
tree4470480d904b65cf14ca524f96f79eca818c3eaf /REORG.TODO/stdio-common/printf-parse.h
parent199fc19d3aaaf57944ef036e15904febe877fc93 (diff)
downloadglibc-zack/build-layout-experiment.tar.gz
glibc-zack/build-layout-experiment.tar.xz
glibc-zack/build-layout-experiment.zip
Prepare for radical source tree reorganization. zack/build-layout-experiment
All top-level files and directories are moved into a temporary storage
directory, REORG.TODO, except for files that will certainly still
exist in their current form at top level when we're done (COPYING,
COPYING.LIB, LICENSES, NEWS, README), all old ChangeLog files (which
are moved to the new directory OldChangeLogs, instead), and the
generated file INSTALL (which is just deleted; in the new order, there
will be no generated files checked into version control).
Diffstat (limited to 'REORG.TODO/stdio-common/printf-parse.h')
-rw-r--r--REORG.TODO/stdio-common/printf-parse.h144
1 files changed, 144 insertions, 0 deletions
diff --git a/REORG.TODO/stdio-common/printf-parse.h b/REORG.TODO/stdio-common/printf-parse.h
new file mode 100644
index 0000000000..484ba6010d
--- /dev/null
+++ b/REORG.TODO/stdio-common/printf-parse.h
@@ -0,0 +1,144 @@
+/* Internal header for parsing printf format strings.
+   Copyright (C) 1995-2017 Free Software Foundation, Inc.
+   This file is part of th 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 <printf.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <string.h>
+#include <wchar.h>
+
+
+struct printf_spec
+  {
+    /* Information parsed from the format spec.  */
+    struct printf_info info;
+
+    /* Pointers into the format string for the end of this format
+       spec and the next (or to the end of the string if no more).  */
+    const UCHAR_T *end_of_fmt, *next_fmt;
+
+    /* Position of arguments for precision and width, or -1 if `info' has
+       the constant value.  */
+    int prec_arg, width_arg;
+
+    int data_arg;		/* Position of data argument.  */
+    int data_arg_type;		/* Type of first argument.  */
+    /* Number of arguments consumed by this format specifier.  */
+    size_t ndata_args;
+    /* Size of the parameter for PA_USER type.  */
+    int size;
+  };
+
+
+/* The various kinds off arguments that can be passed to printf.  */
+union printf_arg
+  {
+    wchar_t pa_wchar;
+    int pa_int;
+    long int pa_long_int;
+    long long int pa_long_long_int;
+    unsigned int pa_u_int;
+    unsigned long int pa_u_long_int;
+    unsigned long long int pa_u_long_long_int;
+    double pa_double;
+    long double pa_long_double;
+    const char *pa_string;
+    const wchar_t *pa_wstring;
+    void *pa_pointer;
+    void *pa_user;
+  };
+
+
+#ifndef DONT_NEED_READ_INT
+/* Read a simple integer from a string and update the string pointer.
+   It is assumed that the first character is a digit.  */
+static int
+read_int (const UCHAR_T * *pstr)
+{
+  int retval = **pstr - L_('0');
+
+  while (ISDIGIT (*++(*pstr)))
+    if (retval >= 0)
+      {
+	if (INT_MAX / 10 < retval)
+	  retval = -1;
+	else
+	  {
+	    int digit = **pstr - L_('0');
+
+	    retval *= 10;
+	    if (INT_MAX - digit < retval)
+	      retval = -1;
+	    else
+	      retval += digit;
+	  }
+      }
+
+  return retval;
+}
+#endif
+
+
+/* These are defined in reg-printf.c.  */
+extern printf_arginfo_size_function **__printf_arginfo_table attribute_hidden;
+extern printf_function **__printf_function_table attribute_hidden;
+extern printf_va_arg_function **__printf_va_arg_table attribute_hidden;
+
+
+/* Find the next spec in FORMAT, or the end of the string.  Returns
+   a pointer into FORMAT, to a '%' or a '\0'.  */
+__extern_always_inline const unsigned char *
+__find_specmb (const unsigned char *format)
+{
+  return (const unsigned char *) __strchrnul ((const char *) format, '%');
+}
+
+__extern_always_inline const unsigned int *
+__find_specwc (const unsigned int *format)
+{
+  return (const unsigned int *) __wcschrnul ((const wchar_t *) format, L'%');
+}
+
+
+/* FORMAT must point to a '%' at the beginning of a spec.  Fills in *SPEC
+   with the parsed details.  POSN is the number of arguments already
+   consumed.  At most MAXTYPES - POSN types are filled in TYPES.  Return
+   the number of args consumed by this spec; *MAX_REF_ARG is updated so it
+   remains the highest argument index used.  */
+extern size_t __parse_one_specmb (const unsigned char *format, size_t posn,
+				  struct printf_spec *spec,
+				  size_t *max_ref_arg) attribute_hidden;
+
+extern size_t __parse_one_specwc (const unsigned int *format, size_t posn,
+				  struct printf_spec *spec,
+				  size_t *max_ref_arg) attribute_hidden;
+
+
+
+/* This variable is defined in reg-modifier.c.  */
+struct printf_modifier_record;
+extern struct printf_modifier_record **__printf_modifier_table
+     attribute_hidden;
+
+/* Handle registered modifiers.  */
+extern int __handle_registered_modifier_mb (const unsigned char **format,
+					    struct printf_info *info)
+     attribute_hidden;
+extern int __handle_registered_modifier_wc (const unsigned int **format,
+					    struct printf_info *info)
+     attribute_hidden;