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:
parent
a78ff1f90a
commit
4bcba09122
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue