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:
parent
cf90ea94a0
commit
6a6760db7f
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=216606
@ -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
|
||||||
|
5
tools/regression/bin/sh/builtins/printf3.0
Normal file
5
tools/regression/bin/sh/builtins/printf3.0
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# $FreeBSD$
|
||||||
|
|
||||||
|
set -e
|
||||||
|
v=$(! printf "%d" @wrong 2>/dev/null)
|
||||||
|
[ "$v" = "0" ]
|
5
tools/regression/bin/sh/builtins/printf4.0
Normal file
5
tools/regression/bin/sh/builtins/printf4.0
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# $FreeBSD$
|
||||||
|
|
||||||
|
set -e
|
||||||
|
v=$(! printf "%d" 4wrong 2>/dev/null)
|
||||||
|
[ "$v" = "4" ]
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user