mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-22 19:00:07 +00:00
* stdio-common/printf-parse.h: Include string.h and wchar.h.
(__find_specwc): Change into __extern_always_inline function. (__find_specmb): Likewise. Remove ps argument. Use __strchrnul. (__parse_one_specmb): Remove ps argument. * stdio-common/vfprintf.c (vfprintf): Remove mbstate variable. Adjust __find_specmb and __parse_one_specmb callers. * stdio-common/printf-prs.c (parse_printf_format): Likewise. * stdio-common/printf-parsemb.c (__find_specwc, __find_specmb): Removed. (__parse_one_specmb): Remove ps argument, adjust __find_specmb caller.
This commit is contained in:
parent
59d430c680
commit
c06b7169e4
14
ChangeLog
14
ChangeLog
@ -1,3 +1,17 @@
|
|||||||
|
2007-10-10 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* stdio-common/printf-parse.h: Include string.h and wchar.h.
|
||||||
|
(__find_specwc): Change into __extern_always_inline function.
|
||||||
|
(__find_specmb): Likewise. Remove ps argument. Use __strchrnul.
|
||||||
|
(__parse_one_specmb): Remove ps argument.
|
||||||
|
* stdio-common/vfprintf.c (vfprintf): Remove mbstate variable.
|
||||||
|
Adjust __find_specmb and __parse_one_specmb callers.
|
||||||
|
* stdio-common/printf-prs.c (parse_printf_format): Likewise.
|
||||||
|
* stdio-common/printf-parsemb.c (__find_specwc, __find_specmb):
|
||||||
|
Removed.
|
||||||
|
(__parse_one_specmb): Remove ps argument, adjust __find_specmb
|
||||||
|
caller.
|
||||||
|
|
||||||
2007-10-09 Ulrich Drepper <drepper@redhat.com>
|
2007-10-09 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
* sysdeps/x86_64/cacheinfo.c (init_cacheinfo): Work around problem
|
* sysdeps/x86_64/cacheinfo.c (init_cacheinfo): Work around problem
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/* Internal header for parsing printf format strings.
|
/* Internal header for parsing printf format strings.
|
||||||
Copyright (C) 1995-1999, 2000, 2002, 2003 Free Software Foundation, Inc.
|
Copyright (C) 1995-1999, 2000, 2002, 2003, 2007
|
||||||
|
Free Software Foundation, Inc.
|
||||||
This file is part of th GNU C Library.
|
This file is part of th GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -20,6 +21,8 @@
|
|||||||
#include <printf.h>
|
#include <printf.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <wchar.h>
|
||||||
|
|
||||||
|
|
||||||
struct printf_spec
|
struct printf_spec
|
||||||
@ -86,11 +89,17 @@ extern printf_function **__printf_function_table attribute_hidden;
|
|||||||
|
|
||||||
/* Find the next spec in FORMAT, or the end of the string. Returns
|
/* Find the next spec in FORMAT, or the end of the string. Returns
|
||||||
a pointer into FORMAT, to a '%' or a '\0'. */
|
a pointer into FORMAT, to a '%' or a '\0'. */
|
||||||
extern const unsigned char *__find_specmb (const UCHAR_T *format,
|
__extern_always_inline const unsigned char *
|
||||||
mbstate_t *ps) attribute_hidden;
|
__find_specmb (const unsigned char *format)
|
||||||
|
{
|
||||||
|
return (const unsigned char *) __strchrnul ((const char *) format, '%');
|
||||||
|
}
|
||||||
|
|
||||||
extern const unsigned int *__find_specwc (const UCHAR_T *format)
|
__extern_always_inline const unsigned int *
|
||||||
attribute_hidden;
|
__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
|
/* FORMAT must point to a '%' at the beginning of a spec. Fills in *SPEC
|
||||||
@ -100,8 +109,7 @@ extern const unsigned int *__find_specwc (const UCHAR_T *format)
|
|||||||
remains the highest argument index used. */
|
remains the highest argument index used. */
|
||||||
extern size_t __parse_one_specmb (const unsigned char *format, size_t posn,
|
extern size_t __parse_one_specmb (const unsigned char *format, size_t posn,
|
||||||
struct printf_spec *spec,
|
struct printf_spec *spec,
|
||||||
size_t *max_ref_arg, mbstate_t *ps)
|
size_t *max_ref_arg) attribute_hidden;
|
||||||
attribute_hidden;
|
|
||||||
|
|
||||||
extern size_t __parse_one_specwc (const unsigned int *format, size_t posn,
|
extern size_t __parse_one_specwc (const unsigned int *format, size_t posn,
|
||||||
struct printf_spec *spec,
|
struct printf_spec *spec,
|
||||||
|
@ -46,35 +46,6 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Find the next spec in FORMAT, or the end of the string. Returns
|
|
||||||
a pointer into FORMAT, to a '%' or a '\0'. */
|
|
||||||
const UCHAR_T *
|
|
||||||
#ifdef COMPILE_WPRINTF
|
|
||||||
__find_specwc (const UCHAR_T *format)
|
|
||||||
#else
|
|
||||||
__find_specmb (const UCHAR_T *format, mbstate_t *ps)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
#ifdef COMPILE_WPRINTF
|
|
||||||
return (const UCHAR_T *) __wcschrnul ((const CHAR_T *) format, L'%');
|
|
||||||
#else
|
|
||||||
while (*format != L_('\0') && *format != L_('%'))
|
|
||||||
{
|
|
||||||
int len;
|
|
||||||
|
|
||||||
/* Remove any hints of a wrong encoding. */
|
|
||||||
ps->__count = 0;
|
|
||||||
if (! isascii (*format)
|
|
||||||
&& (len = __mbrlen ((const CHAR_T *) format, MB_CUR_MAX, ps)) > 0)
|
|
||||||
format += len;
|
|
||||||
else
|
|
||||||
++format;
|
|
||||||
}
|
|
||||||
return format;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* FORMAT must point to a '%' at the beginning of a spec. Fills in *SPEC
|
/* 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
|
with the parsed details. POSN is the number of arguments already
|
||||||
consumed. At most MAXTYPES - POSN types are filled in TYPES. Return
|
consumed. At most MAXTYPES - POSN types are filled in TYPES. Return
|
||||||
@ -87,8 +58,7 @@ __parse_one_specwc (const UCHAR_T *format, size_t posn,
|
|||||||
struct printf_spec *spec, size_t *max_ref_arg)
|
struct printf_spec *spec, size_t *max_ref_arg)
|
||||||
#else
|
#else
|
||||||
__parse_one_specmb (const UCHAR_T *format, size_t posn,
|
__parse_one_specmb (const UCHAR_T *format, size_t posn,
|
||||||
struct printf_spec *spec, size_t *max_ref_arg,
|
struct printf_spec *spec, size_t *max_ref_arg)
|
||||||
mbstate_t *ps)
|
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
unsigned int n;
|
unsigned int n;
|
||||||
@ -403,7 +373,7 @@ __parse_one_specmb (const UCHAR_T *format, size_t posn,
|
|||||||
#ifdef COMPILE_WPRINTF
|
#ifdef COMPILE_WPRINTF
|
||||||
spec->next_fmt = __find_specwc (format);
|
spec->next_fmt = __find_specwc (format);
|
||||||
#else
|
#else
|
||||||
spec->next_fmt = __find_specmb (format, ps);
|
spec->next_fmt = __find_specmb (format);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (C) 1991, 1992, 1995, 1996, 1999, 2000, 2002, 2003, 2004, 2005
|
/* Copyright (C) 1991, 1992, 1995, 1996, 1999, 2000, 2002, 2003, 2004, 2005,
|
||||||
Free Software Foundation, Inc.
|
2007 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -66,17 +66,16 @@ parse_printf_format (fmt, n, argtypes)
|
|||||||
size_t nargs; /* Number of arguments. */
|
size_t nargs; /* Number of arguments. */
|
||||||
size_t max_ref_arg; /* Highest index used in a positional arg. */
|
size_t max_ref_arg; /* Highest index used in a positional arg. */
|
||||||
struct printf_spec spec;
|
struct printf_spec spec;
|
||||||
mbstate_t mbstate;
|
|
||||||
const unsigned char *f = (const unsigned char *) fmt;
|
const unsigned char *f = (const unsigned char *) fmt;
|
||||||
|
|
||||||
nargs = 0;
|
nargs = 0;
|
||||||
max_ref_arg = 0;
|
max_ref_arg = 0;
|
||||||
|
|
||||||
/* Search for format specifications. */
|
/* Search for format specifications. */
|
||||||
for (f = __find_specmb (f, &mbstate); *f != '\0'; f = spec.next_fmt)
|
for (f = __find_specmb (f); *f != '\0'; f = spec.next_fmt)
|
||||||
{
|
{
|
||||||
/* Parse this spec. */
|
/* Parse this spec. */
|
||||||
nargs += __parse_one_specmb (f, 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 the width is determined by an argument this is an int. */
|
||||||
if (spec.width_arg != -1 && (size_t) spec.width_arg < n)
|
if (spec.width_arg != -1 && (size_t) spec.width_arg < n)
|
||||||
|
@ -209,11 +209,6 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
|
|||||||
CHAR_T *workstart = NULL;
|
CHAR_T *workstart = NULL;
|
||||||
CHAR_T *workend;
|
CHAR_T *workend;
|
||||||
|
|
||||||
/* State for restartable multibyte character handling functions. */
|
|
||||||
#ifndef COMPILE_WPRINTF
|
|
||||||
mbstate_t mbstate;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* We have to save the original argument pointer. */
|
/* We have to save the original argument pointer. */
|
||||||
va_list ap_save;
|
va_list ap_save;
|
||||||
|
|
||||||
@ -1294,11 +1289,8 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
|
|||||||
/* Find the first format specifier. */
|
/* Find the first format specifier. */
|
||||||
f = lead_str_end = __find_specwc ((const UCHAR_T *) format);
|
f = lead_str_end = __find_specwc ((const UCHAR_T *) format);
|
||||||
#else
|
#else
|
||||||
/* Put state for processing format string in initial state. */
|
|
||||||
memset (&mbstate, '\0', sizeof (mbstate_t));
|
|
||||||
|
|
||||||
/* Find the first format specifier. */
|
/* Find the first format specifier. */
|
||||||
f = lead_str_end = __find_specmb ((const UCHAR_T *) format, &mbstate);
|
f = lead_str_end = __find_specmb ((const UCHAR_T *) format);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Lock stream. */
|
/* Lock stream. */
|
||||||
@ -1591,7 +1583,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
|
|||||||
#ifdef COMPILE_WPRINTF
|
#ifdef COMPILE_WPRINTF
|
||||||
f = __find_specwc ((end_of_spec = ++f));
|
f = __find_specwc ((end_of_spec = ++f));
|
||||||
#else
|
#else
|
||||||
f = __find_specmb ((end_of_spec = ++f), &mbstate);
|
f = __find_specmb ((end_of_spec = ++f));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Write the following constant string. */
|
/* Write the following constant string. */
|
||||||
@ -1674,8 +1666,7 @@ do_positional:
|
|||||||
#ifdef COMPILE_WPRINTF
|
#ifdef COMPILE_WPRINTF
|
||||||
nargs += __parse_one_specwc (f, nargs, &specs[nspecs], &max_ref_arg);
|
nargs += __parse_one_specwc (f, nargs, &specs[nspecs], &max_ref_arg);
|
||||||
#else
|
#else
|
||||||
nargs += __parse_one_specmb (f, nargs, &specs[nspecs], &max_ref_arg,
|
nargs += __parse_one_specmb (f, nargs, &specs[nspecs], &max_ref_arg);
|
||||||
&mbstate);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user