From ead7936ce0d3dc9310972190844877ad9c80e94d Mon Sep 17 00:00:00 2001 From: Ingo Schwarze Date: Thu, 25 Mar 2010 01:03:58 +0000 Subject: Regarding -L, consider a line ending in unescaped white space and the next non-empty line to form one single line, as required by XPG 4. While here, use isblank(3) to identify white space instead of assuming that only blank and tab are white space characters. Geoff Clare agrees that the standard for -L should say "A line is considered to end with the first unless the last character of the line is an *unescaped* ; an *unescaped* trailing signals continuation to the next non-empty line, inclusive." The word *unescaped* is missing from the standard, but we regard that as a goof in the standard. Bug noticed by, much feedback from, and "should go in now" guenther@ --- usr.bin/xargs/xargs.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) (limited to 'usr.bin/xargs/xargs.c') diff --git a/usr.bin/xargs/xargs.c b/usr.bin/xargs/xargs.c index bba5d2589c5..3684c43a6b3 100644 --- a/usr.bin/xargs/xargs.c +++ b/usr.bin/xargs/xargs.c @@ -1,4 +1,4 @@ -/* $OpenBSD: xargs.c,v 1.26 2009/10/27 23:59:50 deraadt Exp $ */ +/* $OpenBSD: xargs.c,v 1.27 2010/03/25 01:03:57 schwarze Exp $ */ /* $FreeBSD: xargs.c,v 1.51 2003/05/03 19:09:11 obrien Exp $ */ /*- @@ -38,6 +38,7 @@ #include #include +#include #include #include #include @@ -239,10 +240,23 @@ main(int argc, char *argv[]) static void parse_input(int argc, char *argv[]) { + int hasblank = 0; + static int hadblank = 0; int ch, foundeof = 0; char **avj; - switch (ch = getchar()) { + ch = getchar(); + if (isblank(ch)) { + /* Quotes escape tabs and spaces. */ + if (insingle || indouble) + goto addch; + hasblank = 1; + if (zflag) + goto addch; + goto arg2; + } + + switch (ch) { case EOF: /* No arguments since last exec. */ if (p == bbp) { @@ -252,18 +266,14 @@ parse_input(int argc, char *argv[]) exit(rval); } goto arg1; - case ' ': - case '\t': - /* Quotes escape tabs and spaces. */ - if (insingle || indouble || zflag) - goto addch; - goto arg2; case '\0': if (zflag) goto arg2; goto addch; case '\n': - count++; + hasblank = 1; + if (hadblank == 0) + count++; if (zflag) goto addch; @@ -382,6 +392,7 @@ addch: if (p < ebp) { *p++ = ch; break; } + hadblank = hasblank; } /* -- cgit v1.2.3