commit fbd786d22aa097f81cea6d4323f79df22fda9d2e Author: sin <s...@2f30.org> Date: Wed Jan 8 20:47:21 2014 +0000
Correctly handle leftover input We cannot rely on ungetc() pushing back more than 1 character reliably on all systems, so just note if we have leftover input and process it in the next run. diff --git a/xargs.c b/xargs.c index 09002d9..59028f1 100644 --- a/xargs.c +++ b/xargs.c @@ -14,7 +14,6 @@ enum { static int inputc(void); static void deinputc(int); -static void deinputstr(char *); static void fillargbuf(int); static int eatspace(void); static int parsequote(int); @@ -40,6 +39,7 @@ usage(void) int main(int argc, char *argv[]) { + int leftover; long argsz, argmaxsz; char *arg; int i; @@ -65,6 +65,7 @@ main(int argc, char *argv[]) if (!cmd) eprintf("malloc:"); + leftover = 0; do { argsz = 0; i = 0; if (argc > 0) { @@ -77,17 +78,18 @@ main(int argc, char *argv[]) argsz += strlen(cmd[i]) + 1; i++; } - while ((arg = poparg())) { + while (leftover == 1 || (arg = poparg())) { if (argsz + strlen(arg) + 1 > argmaxsz || i >= NARGS - 1) { if (strlen(arg) + 1 > argmaxsz) enprintf(EXIT_FAILURE, "insufficient argument space "); - deinputstr(arg); + leftover = 1; break; } cmd[i] = strdup(arg); argsz += strlen(cmd[i]) + 1; i++; + leftover = 0; } cmd[i] = NULL; if (i == 1 && rflag == 1); else spawn(); @@ -119,15 +121,6 @@ deinputc(int ch) } static void -deinputstr(char *arg) -{ - char *p; - - for (p = &arg[strlen(arg) - 1]; p >= arg; p--) - deinputc(*p); -} - -static void fillargbuf(int ch) { if (argbpos >= argbsz) {