Avoid printing error messages twice when an invalid

escape sequence (\ sequence) is present in an arg to a %b
conversion.
This commit is contained in:
kre 2018-07-03 01:56:39 +00:00
parent a78ff1f90a
commit 4bcba09122
1 changed files with 14 additions and 12 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: printf.c,v 1.38 2018/07/03 01:54:42 kre Exp $ */
/* $NetBSD: printf.c,v 1.39 2018/07/03 01:56:39 kre Exp $ */
/*
* Copyright (c) 1989, 1993
@ -41,7 +41,7 @@ __COPYRIGHT("@(#) Copyright (c) 1989, 1993\
#if 0
static char sccsid[] = "@(#)printf.c 8.2 (Berkeley) 3/22/95";
#else
__RCSID("$NetBSD: printf.c,v 1.38 2018/07/03 01:54:42 kre Exp $");
__RCSID("$NetBSD: printf.c,v 1.39 2018/07/03 01:56:39 kre Exp $");
#endif
#endif /* not lint */
@ -65,8 +65,8 @@ __RCSID("$NetBSD: printf.c,v 1.38 2018/07/03 01:54:42 kre Exp $");
#define ESCAPE 033
#endif
static void conv_escape_str(char *, void (*)(int));
static char *conv_escape(char *, char *);
static void conv_escape_str(char *, void (*)(int), int);
static char *conv_escape(char *, char *, int);
static char *conv_expand(const char *);
static char getchr(void);
static double getdouble(void);
@ -170,7 +170,7 @@ int main(int argc, char *argv[])
for (fmt = format; (ch = *fmt++) != '\0';) {
if (ch == '\\') {
char c_ch;
fmt = conv_escape(fmt, &c_ch);
fmt = conv_escape(fmt, &c_ch, 0);
putchar(c_ch);
continue;
}
@ -241,7 +241,7 @@ int main(int argc, char *argv[])
t = NULL;
/* Count number of bytes we want to output */
b_length = 0;
conv_escape_str(cp, b_count);
conv_escape_str(cp, b_count, 0);
t = malloc(b_length + 1);
if (t == NULL)
goto out;
@ -254,7 +254,7 @@ int main(int argc, char *argv[])
goto out;
b_fmt = a;
/* Output leading spaces and data bytes */
conv_escape_str(cp, b_output);
conv_escape_str(cp, b_output, 1);
/* Add any trailing spaces */
printf("%s", b_fmt);
break;
@ -357,7 +357,7 @@ b_output(int ch)
* Halts processing string if a \c escape is encountered.
*/
static void
conv_escape_str(char *str, void (*do_putchar)(int))
conv_escape_str(char *str, void (*do_putchar)(int), int quiet)
{
int value;
int ch;
@ -415,7 +415,7 @@ conv_escape_str(char *str, void (*do_putchar)(int))
}
/* Finally test for sequences valid in the format string */
str = conv_escape(str - 1, &c);
str = conv_escape(str - 1, &c, quiet);
do_putchar(c);
}
}
@ -424,7 +424,7 @@ conv_escape_str(char *str, void (*do_putchar)(int))
* Print "standard" escape characters
*/
static char *
conv_escape(char *str, char *conv_ch)
conv_escape(char *str, char *conv_ch, int quiet)
{
char value;
char ch;
@ -434,7 +434,8 @@ conv_escape(char *str, char *conv_ch)
switch (ch) {
case '\0':
warnx("incomplete escape sequence");
if (!quiet)
warnx("incomplete escape sequence");
rval = 1;
value = '\\';
--str;
@ -477,7 +478,8 @@ conv_escape(char *str, char *conv_ch)
case 'v': value = '\v'; break; /* vertical-tab */
default:
warnx("unknown escape sequence `\\%c'", ch);
if (!quiet)
warnx("unknown escape sequence `\\%c'", ch);
rval = 1;
value = ch;
break;