summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cache.h22
-rw-r--r--list-objects-filter-options.c17
2 files changed, 29 insertions, 10 deletions
diff --git a/cache.h b/cache.h
index bf20337ef4..cf5d70c196 100644
--- a/cache.h
+++ b/cache.h
@@ -660,6 +660,9 @@ int daemonize(void);
* at least 'nr' entries; the number of entries currently allocated
* is 'alloc', using the standard growing factor alloc_nr() macro.
*
+ * Consider using ALLOC_GROW_BY instead of ALLOC_GROW as it has some
+ * added niceties.
+ *
* DO NOT USE any expression with side-effect for 'x', 'nr', or 'alloc'.
*/
#define ALLOC_GROW(x, nr, alloc) \
@@ -673,6 +676,25 @@ int daemonize(void);
} \
} while (0)
+/*
+ * Similar to ALLOC_GROW but handles updating of the nr value and
+ * zeroing the bytes of the newly-grown array elements.
+ *
+ * DO NOT USE any expression with side-effect for any of the
+ * arguments.
+ */
+#define ALLOC_GROW_BY(x, nr, increase, alloc) \
+ do { \
+ if (increase) { \
+ size_t new_nr = nr + (increase); \
+ if (new_nr < nr) \
+ BUG("negative growth in ALLOC_GROW_BY"); \
+ ALLOC_GROW(x, new_nr, alloc); \
+ memset((x) + nr, 0, sizeof(*(x)) * (increase)); \
+ nr = new_nr; \
+ } \
+ } while (0)
+
/* Initialize and use the cache information */
struct lock_file;
void preload_index(struct index_state *index,
diff --git a/list-objects-filter-options.c b/list-objects-filter-options.c
index 2506dc8327..44bc1153d1 100644
--- a/list-objects-filter-options.c
+++ b/list-objects-filter-options.c
@@ -120,14 +120,12 @@ static int parse_combine_subfilter(
struct strbuf *subspec,
struct strbuf *errbuf)
{
- size_t new_index = filter_options->sub_nr++;
+ size_t new_index = filter_options->sub_nr;
char *decoded;
int result;
- ALLOC_GROW(filter_options->sub, filter_options->sub_nr,
- filter_options->sub_alloc);
- memset(&filter_options->sub[new_index], 0,
- sizeof(*filter_options->sub));
+ ALLOC_GROW_BY(filter_options->sub, filter_options->sub_nr, 1,
+ filter_options->sub_alloc);
decoded = url_percent_decode(subspec->buf);
@@ -255,13 +253,12 @@ int parse_list_objects_filter(
string_list_append(&filter_options->filter_spec, xstrdup("+"));
filter_spec_append_urlencode(filter_options, arg);
- ALLOC_GROW(filter_options->sub, filter_options->sub_nr + 1,
- filter_options->sub_alloc);
- filter_options = &filter_options->sub[filter_options->sub_nr++];
- memset(filter_options, 0, sizeof(*filter_options));
+ ALLOC_GROW_BY(filter_options->sub, filter_options->sub_nr, 1,
+ filter_options->sub_alloc);
parse_error = gently_parse_list_objects_filter(
- filter_options, arg, &errbuf);
+ &filter_options->sub[filter_options->sub_nr - 1], arg,
+ &errbuf);
}
if (parse_error)
die("%s", errbuf.buf);