sh: Make warnings in the printf builtin non-fatal, like in the program.

The #define for warnx now behaves much like the libc function (except that
it uses sh command name and output).

Also, it now uses C99 __VA_ARGS__ so there is no need for three different
macros for 0, 1 or 2 parameters.
This commit is contained in:
Jilles Tjoelker 2010-12-20 23:06:57 +00:00
parent cf90ea94a0
commit 6a6760db7f
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=216606
4 changed files with 29 additions and 32 deletions

View File

@ -57,21 +57,12 @@
#define fwrite(ptr, size, nmemb, file) outbin(ptr, (size) * (nmemb), file) #define fwrite(ptr, size, nmemb, file) outbin(ptr, (size) * (nmemb), file)
#define fflush flushout #define fflush flushout
#define INITARGS(argv) #define INITARGS(argv)
#define warnx1(a, b, c) { \ #define warnx(...) do { \
char buf[64]; \ out2fmt_flush("%s: ", commandname); \
(void)snprintf(buf, sizeof(buf), a); \ out2fmt_flush(__VA_ARGS__); \
error("%s", buf); \ out2fmt_flush("\n"); \
} } while (0)
#define warnx2(a, b, c) { \ #define errx(exitstatus, ...) error(__VA_ARGS__)
char buf[64]; \
(void)snprintf(buf, sizeof(buf), a, b); \
error("%s", buf); \
}
#define warnx3(a, b, c) { \
char buf[64]; \
(void)snprintf(buf, sizeof(buf), a, b, c); \
error("%s", buf); \
}
#else #else
#undef NULL #undef NULL

View File

@ -0,0 +1,5 @@
# $FreeBSD$
set -e
v=$(! printf "%d" @wrong 2>/dev/null)
[ "$v" = "0" ]

View File

@ -0,0 +1,5 @@
# $FreeBSD$
set -e
v=$(! printf "%d" 4wrong 2>/dev/null)
[ "$v" = "4" ]

View File

@ -60,10 +60,6 @@ static const char rcsid[] =
#include "bltin/bltin.h" #include "bltin/bltin.h"
#include "memalloc.h" #include "memalloc.h"
#include "error.h" #include "error.h"
#else
#define warnx1(a, b, c) warnx(a)
#define warnx2(a, b, c) warnx(a, b)
#define warnx3(a, b, c) warnx(a, b, c)
#endif #endif
#define PF(f, func) do { \ #define PF(f, func) do { \
@ -165,7 +161,7 @@ main(int argc, char *argv[])
} }
if (end == 1) { if (end == 1) {
warnx1("missing format character", NULL, NULL); warnx("missing format character");
#ifdef SHELL #ifdef SHELL
INTON; INTON;
#endif #endif
@ -226,7 +222,7 @@ printf_doformat(char *start, int *rval)
} else } else
haveprec = 0; haveprec = 0;
if (!*fmt) { if (!*fmt) {
warnx1("missing format character", NULL, NULL); warnx("missing format character");
return (NULL); return (NULL);
} }
@ -244,7 +240,7 @@ printf_doformat(char *start, int *rval)
mod_ldbl = 1; mod_ldbl = 1;
fmt++; fmt++;
if (!strchr("aAeEfFgG", *fmt)) { if (!strchr("aAeEfFgG", *fmt)) {
warnx2("bad modifier L for %%%c", *fmt, NULL); warnx("bad modifier L for %%%c", *fmt);
return (NULL); return (NULL);
} }
} else { } else {
@ -266,7 +262,7 @@ printf_doformat(char *start, int *rval)
p = strdup(getstr()); p = strdup(getstr());
#endif #endif
if (p == NULL) { if (p == NULL) {
warnx2("%s", strerror(ENOMEM), NULL); warnx("%s", strerror(ENOMEM));
return (NULL); return (NULL);
} }
getout = escape(p, 0, &len); getout = escape(p, 0, &len);
@ -328,7 +324,7 @@ printf_doformat(char *start, int *rval)
break; break;
} }
default: default:
warnx2("illegal format character %c", convch, NULL); warnx("illegal format character %c", convch);
return (NULL); return (NULL);
} }
*fmt = nextch; *fmt = nextch;
@ -352,7 +348,7 @@ mknum(char *str, char ch)
if ((newcopy = realloc(copy, newlen)) == NULL) if ((newcopy = realloc(copy, newlen)) == NULL)
#endif #endif
{ {
warnx2("%s", strerror(ENOMEM), NULL); warnx("%s", strerror(ENOMEM));
return (NULL); return (NULL);
} }
copy = newcopy; copy = newcopy;
@ -465,7 +461,7 @@ getint(int *ip)
return (1); return (1);
rval = 0; rval = 0;
if (val < INT_MIN || val > INT_MAX) { if (val < INT_MIN || val > INT_MAX) {
warnx3("%s: %s", *gargv, strerror(ERANGE)); warnx("%s: %s", *gargv, strerror(ERANGE));
rval = 1; rval = 1;
} }
*ip = (int)val; *ip = (int)val;
@ -496,15 +492,15 @@ getnum(intmax_t *ip, uintmax_t *uip, int signedconv)
else else
*uip = strtoumax(*gargv, &ep, 0); *uip = strtoumax(*gargv, &ep, 0);
if (ep == *gargv) { if (ep == *gargv) {
warnx2("%s: expected numeric value", *gargv, NULL); warnx("%s: expected numeric value", *gargv);
rval = 1; rval = 1;
} }
else if (*ep != '\0') { else if (*ep != '\0') {
warnx2("%s: not completely converted", *gargv, NULL); warnx("%s: not completely converted", *gargv);
rval = 1; rval = 1;
} }
if (errno == ERANGE) { if (errno == ERANGE) {
warnx3("%s: %s", *gargv, strerror(ERANGE)); warnx("%s: %s", *gargv, strerror(ERANGE));
rval = 1; rval = 1;
} }
++gargv; ++gargv;
@ -532,14 +528,14 @@ getfloating(long double *dp, int mod_ldbl)
else else
*dp = strtod(*gargv, &ep); *dp = strtod(*gargv, &ep);
if (ep == *gargv) { if (ep == *gargv) {
warnx2("%s: expected numeric value", *gargv, NULL); warnx("%s: expected numeric value", *gargv);
rval = 1; rval = 1;
} else if (*ep != '\0') { } else if (*ep != '\0') {
warnx2("%s: not completely converted", *gargv, NULL); warnx("%s: not completely converted", *gargv);
rval = 1; rval = 1;
} }
if (errno == ERANGE) { if (errno == ERANGE) {
warnx3("%s: %s", *gargv, strerror(ERANGE)); warnx("%s: %s", *gargv, strerror(ERANGE));
rval = 1; rval = 1;
} }
++gargv; ++gargv;