From 6a6760db7f0ba4588af5cb587f482a49d65d1536 Mon Sep 17 00:00:00 2001 From: Jilles Tjoelker Date: Mon, 20 Dec 2010 23:06:57 +0000 Subject: [PATCH] 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. --- bin/sh/bltin/bltin.h | 21 +++++---------- tools/regression/bin/sh/builtins/printf3.0 | 5 ++++ tools/regression/bin/sh/builtins/printf4.0 | 5 ++++ usr.bin/printf/printf.c | 30 ++++++++++------------ 4 files changed, 29 insertions(+), 32 deletions(-) create mode 100644 tools/regression/bin/sh/builtins/printf3.0 create mode 100644 tools/regression/bin/sh/builtins/printf4.0 diff --git a/bin/sh/bltin/bltin.h b/bin/sh/bltin/bltin.h index 0fc8a28fa1d5..6618108d350f 100644 --- a/bin/sh/bltin/bltin.h +++ b/bin/sh/bltin/bltin.h @@ -57,21 +57,12 @@ #define fwrite(ptr, size, nmemb, file) outbin(ptr, (size) * (nmemb), file) #define fflush flushout #define INITARGS(argv) -#define warnx1(a, b, c) { \ - char buf[64]; \ - (void)snprintf(buf, sizeof(buf), a); \ - error("%s", buf); \ -} -#define warnx2(a, b, c) { \ - 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); \ -} +#define warnx(...) do { \ + out2fmt_flush("%s: ", commandname); \ + out2fmt_flush(__VA_ARGS__); \ + out2fmt_flush("\n"); \ + } while (0) +#define errx(exitstatus, ...) error(__VA_ARGS__) #else #undef NULL diff --git a/tools/regression/bin/sh/builtins/printf3.0 b/tools/regression/bin/sh/builtins/printf3.0 new file mode 100644 index 000000000000..0e7ea85cddb4 --- /dev/null +++ b/tools/regression/bin/sh/builtins/printf3.0 @@ -0,0 +1,5 @@ +# $FreeBSD$ + +set -e +v=$(! printf "%d" @wrong 2>/dev/null) +[ "$v" = "0" ] diff --git a/tools/regression/bin/sh/builtins/printf4.0 b/tools/regression/bin/sh/builtins/printf4.0 new file mode 100644 index 000000000000..2dd3e729574a --- /dev/null +++ b/tools/regression/bin/sh/builtins/printf4.0 @@ -0,0 +1,5 @@ +# $FreeBSD$ + +set -e +v=$(! printf "%d" 4wrong 2>/dev/null) +[ "$v" = "4" ] diff --git a/usr.bin/printf/printf.c b/usr.bin/printf/printf.c index ef8111fd66e9..d2fd37e2cb2a 100644 --- a/usr.bin/printf/printf.c +++ b/usr.bin/printf/printf.c @@ -60,10 +60,6 @@ static const char rcsid[] = #include "bltin/bltin.h" #include "memalloc.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 #define PF(f, func) do { \ @@ -165,7 +161,7 @@ main(int argc, char *argv[]) } if (end == 1) { - warnx1("missing format character", NULL, NULL); + warnx("missing format character"); #ifdef SHELL INTON; #endif @@ -226,7 +222,7 @@ printf_doformat(char *start, int *rval) } else haveprec = 0; if (!*fmt) { - warnx1("missing format character", NULL, NULL); + warnx("missing format character"); return (NULL); } @@ -244,7 +240,7 @@ printf_doformat(char *start, int *rval) mod_ldbl = 1; fmt++; if (!strchr("aAeEfFgG", *fmt)) { - warnx2("bad modifier L for %%%c", *fmt, NULL); + warnx("bad modifier L for %%%c", *fmt); return (NULL); } } else { @@ -266,7 +262,7 @@ printf_doformat(char *start, int *rval) p = strdup(getstr()); #endif if (p == NULL) { - warnx2("%s", strerror(ENOMEM), NULL); + warnx("%s", strerror(ENOMEM)); return (NULL); } getout = escape(p, 0, &len); @@ -328,7 +324,7 @@ printf_doformat(char *start, int *rval) break; } default: - warnx2("illegal format character %c", convch, NULL); + warnx("illegal format character %c", convch); return (NULL); } *fmt = nextch; @@ -352,7 +348,7 @@ mknum(char *str, char ch) if ((newcopy = realloc(copy, newlen)) == NULL) #endif { - warnx2("%s", strerror(ENOMEM), NULL); + warnx("%s", strerror(ENOMEM)); return (NULL); } copy = newcopy; @@ -465,7 +461,7 @@ getint(int *ip) return (1); rval = 0; if (val < INT_MIN || val > INT_MAX) { - warnx3("%s: %s", *gargv, strerror(ERANGE)); + warnx("%s: %s", *gargv, strerror(ERANGE)); rval = 1; } *ip = (int)val; @@ -496,15 +492,15 @@ getnum(intmax_t *ip, uintmax_t *uip, int signedconv) else *uip = strtoumax(*gargv, &ep, 0); if (ep == *gargv) { - warnx2("%s: expected numeric value", *gargv, NULL); + warnx("%s: expected numeric value", *gargv); rval = 1; } else if (*ep != '\0') { - warnx2("%s: not completely converted", *gargv, NULL); + warnx("%s: not completely converted", *gargv); rval = 1; } if (errno == ERANGE) { - warnx3("%s: %s", *gargv, strerror(ERANGE)); + warnx("%s: %s", *gargv, strerror(ERANGE)); rval = 1; } ++gargv; @@ -532,14 +528,14 @@ getfloating(long double *dp, int mod_ldbl) else *dp = strtod(*gargv, &ep); if (ep == *gargv) { - warnx2("%s: expected numeric value", *gargv, NULL); + warnx("%s: expected numeric value", *gargv); rval = 1; } else if (*ep != '\0') { - warnx2("%s: not completely converted", *gargv, NULL); + warnx("%s: not completely converted", *gargv); rval = 1; } if (errno == ERANGE) { - warnx3("%s: %s", *gargv, strerror(ERANGE)); + warnx("%s: %s", *gargv, strerror(ERANGE)); rval = 1; } ++gargv;