提交 1173bb33 编写于 作者: M Michael Haggerty 提交者: Jeff King

strbuf_split_buf(): simplify iteration

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: NMichael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: NJeff King <peff@peff.net>
上级 b8c2c1fa
......@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册