This is in preparation for keeping two entry lists in the dir object. This patch adds and uses the alloc_grow macro, which implements the commonly used idiom of growing a dynamic array using the alloc_nr function (not just in dir.c, but everywhere). We also move creation of a dir_entry to dir_entry_new. Signed-off-by: Jeff King <peff@xxxxxxxx> --- If we like the alloc_grow approach, there are a lot of places where we can drop a 3-5 line conditional into a single line. I find it much more readable, but others may disagree. cache.h | 6 ++++++ dir.c | 23 +++++++++++------------ 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/cache.h b/cache.h index 5e7381e..f771519 100644 --- a/cache.h +++ b/cache.h @@ -224,6 +224,12 @@ extern void verify_filename(const char *prefix, const char *name); extern void verify_non_filename(const char *prefix, const char *name); #define alloc_nr(x) (((x)+16)*3/2) +#define alloc_grow(x, nr, alloc) do { \ + if(nr >= alloc) { \ + alloc = alloc_nr(alloc); \ + x = xrealloc((x), alloc * sizeof(*(x))); \ + } \ +} while(0) /* Initialize and use the cache information */ extern int read_index(struct index_state *); diff --git a/dir.c b/dir.c index f543f50..e810258 100644 --- a/dir.c +++ b/dir.c @@ -271,27 +271,26 @@ int excluded(struct dir_struct *dir, const char *pathname) return 0; } -struct dir_entry *dir_add_name(struct dir_struct *dir, const char *pathname, int len) -{ +static +struct dir_entry *dir_entry_new(const char *pathname, int len) { struct dir_entry *ent; - - if (cache_name_pos(pathname, len) >= 0) - return NULL; - - if (dir->nr == dir->alloc) { - int alloc = alloc_nr(dir->alloc); - dir->alloc = alloc; - dir->entries = xrealloc(dir->entries, alloc*sizeof(ent)); - } ent = xmalloc(sizeof(*ent) + len + 1); ent->ignored = ent->ignored_dir = 0; ent->len = len; memcpy(ent->name, pathname, len); ent->name[len] = 0; - dir->entries[dir->nr++] = ent; return ent; } +struct dir_entry *dir_add_name(struct dir_struct *dir, const char *pathname, int len) +{ + if (cache_name_pos(pathname, len) >= 0) + return NULL; + + alloc_grow(dir->entries, dir->nr, dir->alloc); + return dir->entries[dir->nr++] = dir_entry_new(pathname, len); +} + enum exist_status { index_nonexistent = 0, index_directory, -- 1.5.2.1.958.gbaa74-dirty - 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