summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.bin/xargs/xargs.18
-rw-r--r--usr.bin/xargs/xargs.c29
2 files changed, 25 insertions, 12 deletions
diff --git a/usr.bin/xargs/xargs.1 b/usr.bin/xargs/xargs.1
index 00a76bec8e8..f2725b675dd 100644
--- a/usr.bin/xargs/xargs.1
+++ b/usr.bin/xargs/xargs.1
@@ -1,4 +1,4 @@
-.\" $OpenBSD: xargs.1,v 1.24 2010/02/04 23:12:48 schwarze Exp $
+.\" $OpenBSD: xargs.1,v 1.25 2010/03/25 01:03:57 schwarze Exp $
.\" $FreeBSD: xargs.1,v 1.30 2003/05/21 21:07:28 ru Exp $$
.\"
.\" Copyright (c) 1990, 1991, 1993
@@ -34,7 +34,7 @@
.\"
.\" @(#)xargs.1 8.1 (Berkeley) 6/6/93
.\"
-.Dd $Mdocdate: February 4 2010 $
+.Dd $Mdocdate: March 25 2010 $
.Dt XARGS 1
.Os
.Sh NAME
@@ -170,7 +170,9 @@ Call
.Ar utility
for every
.Ar number
-of lines read.
+of non-empty lines read.
+A line ending in unescaped white space and the next non-empty line
+are considered to form one single line.
If EOF is reached and fewer than
.Ar number
lines have been read then
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 <sys/param.h>
#include <sys/wait.h>
+#include <ctype.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
@@ -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;
}
/*