Add range clone functions

Since diff_line_range can form a single list through its
'next' pointer, we provide two kind of clone.

diff_line_range_clone:
	used to clone only the element node and set the
	element's 'next' pointer to NULL.
diff_line_range_clone_deeply:
	used to clone the whole list of ranges.

Signed-off-by: Bo Yang <struggleyb.nku@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Bo Yang
2010-08-11 23:03:32 +08:00
committed by Junio C Hamano
parent 5d99e4e3c7
commit 636f3da570
2 changed files with 43 additions and 0 deletions

39
line.c
View File

@@ -384,6 +384,45 @@ void diff_line_range_append(struct diff_line_range *r, const char *arg)
r->ranges[r->nr - 1].arg = arg;
}
struct diff_line_range *diff_line_range_clone(struct diff_line_range *r)
{
struct diff_line_range *ret = xmalloc(sizeof(*ret));
int i = 0;
DIFF_LINE_RANGE_INIT(ret);
ret->ranges = xcalloc(r->nr, sizeof(struct line_range));
memcpy(ret->ranges, r->ranges, sizeof(struct line_range) * r->nr);
ret->alloc = ret->nr = r->nr;
for (; i < ret->nr; i++)
PRINT_PAIR_INIT(&ret->ranges[i].pair);
ret->spec = r->spec;
assert(ret->spec);
ret->spec->count++;
return ret;
}
struct diff_line_range *diff_line_range_clone_deeply(struct diff_line_range *r)
{
struct diff_line_range *ret = NULL;
struct diff_line_range *tmp = NULL, *prev = NULL;
assert(r);
ret = tmp = prev = diff_line_range_clone(r);
r = r->next;
while (r) {
tmp = diff_line_range_clone(r);
prev->next = tmp;
prev = tmp;
r = r->next;
}
return ret;
}
struct diff_line_range *diff_line_range_merge(struct diff_line_range *out,
struct diff_line_range *other)
{

4
line.h
View File

@@ -119,6 +119,10 @@ extern struct diff_line_range *diff_line_range_merge(
struct diff_line_range *out,
struct diff_line_range *other);
extern struct diff_line_range *diff_line_range_clone(struct diff_line_range *r);
extern struct diff_line_range *diff_line_range_clone_deeply(struct diff_line_range *r);
extern void setup_line(struct rev_info *rev, struct diff_line_range *r);
extern void add_line_range(struct rev_info *revs, struct commit *commit,