mirror of
https://github.com/git/git.git
synced 2026-03-12 18:09:46 +01:00
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:
39
line.c
39
line.c
@@ -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
4
line.h
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user