Skip to content

Commit

Permalink
refactor dir_add_name
Browse files Browse the repository at this point in the history
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@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Jun 13, 2007
1 parent 6718f1f commit 6815e56
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 11 deletions.
15 changes: 15 additions & 0 deletions cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,21 @@ extern void verify_non_filename(const char *prefix, const char *name);

#define alloc_nr(x) (((x)+16)*3/2)

/*
* Realloc the buffer pointed at by variable 'x' so that it can hold
* at least 'nr' entries; the number of entries currently allocated
* is 'alloc', using the standard growing factor alloc_nr() macro.
*
* DO NOT USE any expression with side-effect for 'x' or 'alloc'.
*/
#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 *);
extern int read_index_from(struct index_state *, const char *path);
Expand Down
21 changes: 10 additions & 11 deletions dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit 6815e56

Please sign in to comment.