xargs: simplify word list management
authorDenis Vlasenko <vda.linux@googlemail.com>
Sun, 15 Apr 2007 08:38:50 +0000 (08:38 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sun, 15 Apr 2007 08:38:50 +0000 (08:38 -0000)
findutils/xargs.c

index b90f44ca4f533d3d123e4c659c7e3296e18d4d5d..1a83ee189bfc3f9a14fe347cddf3d3bab9902094 100644 (file)
@@ -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--;
                }