sbase

suckless unix tools
git clone git://git.2f30.org/sbase
Log | Files | Refs | README | LICENSE

commit e27c55aec3550024a66a2b8a32047b7518b2cac1
parent 7a5369ae04736f0f83a253b5a598822b10fb39fb
Author: sin <sin@2f30.org>
Date:   Tue,  7 Jan 2014 11:53:55 +0000

Implement -E eofstr for xargs(1)

Diffstat:
Mxargs.1 | 7++++++-
Mxargs.c | 12+++++++++---
2 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/xargs.1 b/xargs.1 @@ -4,8 +4,10 @@ xargs \- constuct argument list(s) and execute command .SH SYNOPSIS .B xargs .RB [ \-r ] +.RB [ \-E +.IR eofstr ] .RI [ cmd -.RI [arg... ] ] +.IR [arg... ] ] .SH DESCRIPTION xargs reads space, tab, newline and EOF delimited strings from stdin and executes the specified cmd with the strings as arguments. @@ -26,6 +28,9 @@ newlines, may be escaped by a backslash. .BI \-r Do not run the command if there are no arguments. Normally the command is executed at least once even if there are no arguments. +.TP +.B \-E eofstr +Use eofstr as a logical EOF marker. .SH EXIT STATUS xargs exits with one of the following values: diff --git a/xargs.c b/xargs.c @@ -27,12 +27,13 @@ static char *argb; static size_t argbsz = 1; static size_t argbpos; static int nerrors = 0; +static char *eofstr; static int rflag = 0; static void usage(void) { - eprintf("usage: %s [-r] [cmd [arg...]]\n", argv0); + eprintf("usage: %s [-r] [-E eofstr] [cmd [arg...]]\n", argv0); } int @@ -46,6 +47,9 @@ main(int argc, char *argv[]) case 'r': rflag = 1; break; + case 'E': + eofstr = EARGF(usage()); + break; default: usage(); } ARGEND; @@ -186,9 +190,8 @@ poparg(void) while ((ch = inputc()) != EOF) { switch (ch) { case ' ': case '\t': case '\n': - fillbuf('\0'); deinputc(ch); - return argb; + goto out; case '\'': if (parsequote('\'') == -1) enprintf(EXIT_FAILURE, @@ -209,8 +212,11 @@ poparg(void) break; } } +out: if (argbpos > 0) { fillbuf('\0'); + if (eofstr && strcmp(argb, eofstr) == 0) + return NULL; return argb; } return NULL;