diff options
-rw-r--r-- | findutils/xargs.c | 54 |
1 files changed, 25 insertions, 29 deletions
diff --git a/findutils/xargs.c b/findutils/xargs.c index b90f44ca4..1a83ee189 100644 --- a/findutils/xargs.c +++ b/findutils/xargs.c @@ -83,9 +83,9 @@ static int xargs_exec(char **args) typedef struct xlist_t { - char *data; - size_t length; struct xlist_t *link; + size_t length; + char xstr[1]; } xlist_t; static smallint eof_stdin_detected; @@ -105,7 +105,7 @@ static xlist_t *process_stdin(xlist_t *list_arg, char *s = NULL; /* start word */ char *p = NULL; /* pointer to end word */ - char q = 0; /* quote char */ + char q = '\0'; /* quote char */ char state = NORM; char eof_str_detected = 0; size_t line_l = 0; /* size loaded args line */ @@ -135,18 +135,16 @@ static xlist_t *process_stdin(xlist_t *list_arg, state = NORM; goto set; } else if (state == QUOTE) { - if (c == q) { - q = 0; - state = NORM; - } else { + if (c != q) goto set; - } + q = '\0'; + state = NORM; } else { /* if (state == NORM) */ if (ISSPACE(c)) { if (s) { -unexpected_eof: + unexpected_eof: state = SPACE; - c = 0; + c = '\0'; goto set; } } else { @@ -158,7 +156,7 @@ unexpected_eof: q = c; state = QUOTE; } else { -set: + set: if ((size_t)(p - buf) >= mc) bb_error_msg_and_die("argument line too long"); *p++ = c; @@ -176,11 +174,11 @@ set: } if (!eof_str_detected) { size_t length = (p - buf); -// TODO: smarter llist_t - cur = xzalloc(sizeof(xlist_t) + length); - cur->data = memcpy(cur + 1, s, length); + /* Dont xzalloc - it can be quite big */ + cur = xmalloc(offsetof(xlist_t, xstr) + length); + cur->link = NULL; cur->length = length; - /*cur->link = NULL;*/ + memcpy(cur->xstr, s, length); if (prev == NULL) { list_arg = cur; } else { @@ -237,7 +235,7 @@ static xlist_t *process_stdin(xlist_t *list_arg, s = p = buf; if ((p - buf) >= mc) bb_error_msg_and_die("argument line too long"); - *p++ = c == EOF ? 0 : c; + *p++ = (c == EOF ? '\0' : c); if (c == EOF) { /* word's delimiter or EOF detected */ /* word loaded */ if (eof_str) { @@ -245,12 +243,11 @@ static xlist_t *process_stdin(xlist_t *list_arg, } if (!eof_str_detected) { size_t length = (p - buf); - - cur = xzalloc(sizeof(xlist_t) + length); -// TODO: smarter llist_t - cur->data = memcpy(cur + 1, s, length); + /* Dont xzalloc - it can be quite big */ + cur = xmalloc(offsetof(xlist_t, xstr) + length); + cur->link = NULL; cur->length = length; - /*cur->link = NULL;*/ + memcpy(cur->xstr, s, length); if (prev == NULL) { list_arg = cur; } else { @@ -318,22 +315,21 @@ static xlist_t *process0_stdin(xlist_t *list_arg, eof_stdin_detected = 1; if (s == NULL) break; - c = 0; + c = '\0'; } if (s == NULL) s = p = buf; if ((size_t)(p - buf) >= mc) bb_error_msg_and_die("argument line too long"); *p++ = c; - if (c == 0) { /* word's delimiter or EOF detected */ + if (c == '\0') { /* word's delimiter or EOF detected */ /* word loaded */ size_t length = (p - buf); - - cur = xzalloc(sizeof(xlist_t) + length); -// TODO: smarter llist_t - cur->data = memcpy(cur + 1, s, length); + /* Dont xzalloc - it can be quite big */ + cur = xmalloc(offsetof(xlist_t, xstr) + length); + cur->link = NULL; cur->length = length; - /*cur->link = NULL;*/ + memcpy(cur->xstr, s, length); if (prev == NULL) { list_arg = cur; } else { @@ -479,7 +475,7 @@ int xargs_main(int argc, char **argv) args[i] = argv[i]; /* (taken from stdin) */ for (cur = list; n; cur = cur->link) { - args[i++] = cur->data; + args[i++] = cur->xstr; n--; } |