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@xxxxxxxxxxxx> --- strbuf.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/strbuf.c b/strbuf.c index 4b9e30c..5256c2a 100644 --- a/strbuf.c +++ b/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) { - int alloc = 2, pos = 0; + struct strbuf **ret = NULL; + size_t nr = 0, alloc = 0; const char *n, *p; - struct strbuf **ret; struct strbuf *t; - ret = xcalloc(alloc, sizeof(struct strbuf *)); p = n = str; while (n < str + slen) { int len; - if (max <= 0 || pos + 1 < max) + if (max <= 0 || nr + 1 < max) n = memchr(n, delim, slen - (n - str)); else n = NULL; - if (pos + 1 >= alloc) { - alloc = alloc * 2; - ret = xrealloc(ret, sizeof(struct strbuf *) * alloc); - } if (!n) n = str + slen - 1; len = n - p + 1; t = xmalloc(sizeof(struct strbuf)); strbuf_init(t, len); strbuf_add(t, p, len); - ret[pos] = t; - ret[++pos] = NULL; + ALLOC_GROW(ret, nr + 2, alloc); + ret[nr++] = t; p = ++n; } + ALLOC_GROW(ret, nr + 1, alloc); /* In case string was empty */ + ret[nr] = NULL; return ret; } -- 1.8.0 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html