strbuf_split_buf(): use ALLOC_GROW()

Use ALLOC_GROW() rather than inline code to manage memory in
strbuf_split_buf().  Rename "pos" to "nr" because it better describes
the use of the variable and it better conforms to the "ALLOC_GROW"
idiom.

Also, instead of adding a sentinal NULL value after each entry is
added to the list, only add it once after all of the entries have been
added.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Jeff King <peff@peff.net>
This commit is contained in:
Michael Haggerty 2012-11-04 07:46:51 +01:00 committed by Jeff King
parent 9c50374497
commit b8c2c1fa35

View File

@ -108,33 +108,30 @@ void strbuf_ltrim(struct strbuf *sb)
struct strbuf **strbuf_split_buf(const char *str, size_t slen, int delim, int max) struct strbuf **strbuf_split_buf(const char *str, size_t slen, int delim, int max)
{ {
int alloc = 2, pos = 0; struct strbuf **ret = NULL;
size_t nr = 0, alloc = 0;
const char *n, *p; const char *n, *p;
struct strbuf **ret;
struct strbuf *t; struct strbuf *t;
ret = xcalloc(alloc, sizeof(struct strbuf *));
p = n = str; p = n = str;
while (n < str + slen) { while (n < str + slen) {
int len; int len;
if (max <= 0 || pos + 1 < max) if (max <= 0 || nr + 1 < max)
n = memchr(n, delim, slen - (n - str)); n = memchr(n, delim, slen - (n - str));
else else
n = NULL; n = NULL;
if (pos + 1 >= alloc) {
alloc = alloc * 2;
ret = xrealloc(ret, sizeof(struct strbuf *) * alloc);
}
if (!n) if (!n)
n = str + slen - 1; n = str + slen - 1;
len = n - p + 1; len = n - p + 1;
t = xmalloc(sizeof(struct strbuf)); t = xmalloc(sizeof(struct strbuf));
strbuf_init(t, len); strbuf_init(t, len);
strbuf_add(t, p, len); strbuf_add(t, p, len);
ret[pos] = t; ALLOC_GROW(ret, nr + 2, alloc);
ret[++pos] = NULL; ret[nr++] = t;
p = ++n; p = ++n;
} }
ALLOC_GROW(ret, nr + 1, alloc); /* In case string was empty */
ret[nr] = NULL;
return ret; return ret;
} }