svn commit: r216606 - in head: bin/sh/bltin tools/regression/bin/sh/builtins usr.bin/printf

Jilles Tjoelker jilles at FreeBSD.org
Mon Dec 20 23:06:57 UTC 2010


Author: jilles
Date: Mon Dec 20 23:06:57 2010
New Revision: 216606
URL: http://svn.freebsd.org/changeset/base/216606

Log:
  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.

Added:
  head/tools/regression/bin/sh/builtins/printf3.0   (contents, props changed)
  head/tools/regression/bin/sh/builtins/printf4.0   (contents, props changed)
Modified:
  head/bin/sh/bltin/bltin.h
  head/usr.bin/printf/printf.c

Modified: head/bin/sh/bltin/bltin.h
==============================================================================
--- head/bin/sh/bltin/bltin.h	Mon Dec 20 22:56:50 2010	(r216605)
+++ head/bin/sh/bltin/bltin.h	Mon Dec 20 23:06:57 2010	(r216606)
@@ -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

Added: head/tools/regression/bin/sh/builtins/printf3.0
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/tools/regression/bin/sh/builtins/printf3.0	Mon Dec 20 23:06:57 2010	(r216606)
@@ -0,0 +1,5 @@
+# $FreeBSD$
+
+set -e
+v=$(! printf "%d" @wrong 2>/dev/null)
+[ "$v" = "0" ]

Added: head/tools/regression/bin/sh/builtins/printf4.0
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/tools/regression/bin/sh/builtins/printf4.0	Mon Dec 20 23:06:57 2010	(r216606)
@@ -0,0 +1,5 @@
+# $FreeBSD$
+
+set -e
+v=$(! printf "%d" 4wrong 2>/dev/null)
+[ "$v" = "4" ]

Modified: head/usr.bin/printf/printf.c
==============================================================================
--- head/usr.bin/printf/printf.c	Mon Dec 20 22:56:50 2010	(r216605)
+++ head/usr.bin/printf/printf.c	Mon Dec 20 23:06:57 2010	(r216606)
@@ -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
 	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_ldb
 	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;


More information about the svn-src-all mailing list