strbuf_split_buf(): simplify iteration
authorMichael Haggerty <mhagger@alum.mit.edu>
Sun, 4 Nov 2012 06:46:52 +0000 (07:46 +0100)
committerJeff King <peff@peff.net>
Sun, 4 Nov 2012 11:46:55 +0000 (06:46 -0500)
While iterating, update str and slen to keep track of the part of the
string that hasn't been processed yet rather than computing things
relative to the start of the original string.  This eliminates one
local variable, reduces the scope of another, and reduces the amount
of arithmetic needed within the loop.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Jeff King <peff@peff.net>
strbuf.c

index 5256c2a0863803433f50b1edde0e952788c5a0f8..c7cd529b3b46e2ea0fc58f2bad89a290cf4e5546 100644 (file)
--- a/strbuf.c
+++ b/strbuf.c
@@ -110,25 +110,22 @@ struct strbuf **strbuf_split_buf(const char *str, size_t slen, int delim, int ma
 {
        struct strbuf **ret = NULL;
        size_t nr = 0, alloc = 0;
-       const char *n, *p;
        struct strbuf *t;
 
-       p = n = str;
-       while (n < str + slen) {
-               int len;
-               if (max <= 0 || nr + 1 < max)
-                       n = memchr(n, delim, slen - (n - str));
-               else
-                       n = NULL;
-               if (!n)
-                       n = str + slen - 1;
-               len = n - p + 1;
+       while (slen) {
+               int len = slen;
+               if (max <= 0 || nr + 1 < max) {
+                       const char *end = memchr(str, delim, slen);
+                       if (end)
+                               len = end - str + 1;
+               }
                t = xmalloc(sizeof(struct strbuf));
                strbuf_init(t, len);
-               strbuf_add(t, p, len);
+               strbuf_add(t, str, len);
                ALLOC_GROW(ret, nr + 2, alloc);
                ret[nr++] = t;
-               p = ++n;
+               str += len;
+               slen -= len;
        }
        ALLOC_GROW(ret, nr + 1, alloc); /* In case string was empty */
        ret[nr] = NULL;