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:
parent
9c50374497
commit
b8c2c1fa35
17
strbuf.c
17
strbuf.c
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user