summaryrefslogtreecommitdiff
path: root/stdio-common
diff options
context:
space:
mode:
Diffstat (limited to 'stdio-common')
-rw-r--r--stdio-common/printf-parse.h2
-rw-r--r--stdio-common/printf-prs.c7
-rw-r--r--stdio-common/vfprintf.c7
3 files changed, 7 insertions, 9 deletions
diff --git a/stdio-common/printf-parse.h b/stdio-common/printf-parse.h
index a7960e6003..9a5cfbac7e 100644
--- a/stdio-common/printf-parse.h
+++ b/stdio-common/printf-parse.h
@@ -97,6 +97,8 @@ find_spec (const char *format, mbstate_t *ps)
{
int len;
+ /* Remove any hints of a wrong encoding. */
+ ps->count = 0;
if (isascii (*format) || (len = mbrlen (format, MB_CUR_MAX, ps)) <= 0)
++format;
else
diff --git a/stdio-common/printf-prs.c b/stdio-common/printf-prs.c
index d0756de7d4..a15be55c48 100644
--- a/stdio-common/printf-prs.c
+++ b/stdio-common/printf-prs.c
@@ -81,7 +81,6 @@ parse_printf_format (fmt, n, argtypes)
nargs = 0;
max_ref_arg = 0;
- mbstate = 0;
/* Search for format specifications. */
for (fmt = find_spec (fmt, &mbstate); *fmt != '\0'; fmt = spec.next_fmt)
@@ -90,14 +89,14 @@ parse_printf_format (fmt, n, argtypes)
nargs += parse_one_spec (fmt, nargs, &spec, &max_ref_arg, &mbstate);
/* If the width is determined by an argument this is an int. */
- if (spec.width_arg != -1 && spec.width_arg < n)
+ if (spec.width_arg != -1 && (size_t) spec.width_arg < n)
argtypes[spec.width_arg] = PA_INT;
/* If the precision is determined by an argument this is an int. */
- if (spec.prec_arg != -1 && spec.prec_arg < n)
+ if (spec.prec_arg != -1 && (size_t) spec.prec_arg < n)
argtypes[spec.prec_arg] = PA_INT;
- if (spec.data_arg < n)
+ if ((size_t) spec.data_arg < n)
switch (spec.ndata_args)
{
case 0: /* No arguments. */
diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c
index 8031b99ae9..3fa53a62a8 100644
--- a/stdio-common/vfprintf.c
+++ b/stdio-common/vfprintf.c
@@ -735,16 +735,14 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
else \
{ \
const wchar_t *s2 = (const wchar_t *) string; \
- mbstate_t mbstate = 0; \
+ mbstate_t mbstate; \
\
- len = wcsrtombs (NULL, &s2, prec != -1 ? prec : UINT_MAX, \
- &mbstate); \
+ len = wcsrtombs (NULL, &s2, 0, &mbstate); \
if (len == (size_t) -1) \
/* Illegal wide-character string. */ \
return -1; \
\
s2 = (const wchar_t *) string; \
- mbstate = 0; \
string = alloca (len + 1); \
(void) wcsrtombs (string, &s2, prec != -1 ? prec : UINT_MAX, \
&mbstate); \
@@ -841,7 +839,6 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
/* Initialize local variables. */
done = 0;
grouping = (const char *) -1;
- mbstate = 0;
ap_save = ap;
nspecs_done = 0;