Merge branch 'jk/tighten-alloc' into maint
[git] / line-log.h
1 #ifndef LINE_LOG_H
2 #define LINE_LOG_H
3
4 #include "diffcore.h"
5
6 struct rev_info;
7 struct commit;
8
9 /* A range [start,end].  Lines are numbered starting at 0, and the
10  * ranges include start but exclude end. */
11 struct range {
12         long start, end;
13 };
14
15 /* A set of ranges.  The ranges must always be disjoint and sorted. */
16 struct range_set {
17         int alloc, nr;
18         struct range *ranges;
19 };
20
21 /* A diff, encoded as the set of pre- and post-image ranges where the
22  * files differ. A pair of ranges corresponds to a hunk. */
23 struct diff_ranges {
24         struct range_set parent;
25         struct range_set target;
26 };
27
28 extern void range_set_init(struct range_set *, size_t prealloc);
29 extern void range_set_release(struct range_set *);
30 /* Range includes start; excludes end */
31 extern void range_set_append_unsafe(struct range_set *, long start, long end);
32 /* New range must begin at or after end of last added range */
33 extern void range_set_append(struct range_set *, long start, long end);
34 /*
35  * In-place pass of sorting and merging the ranges in the range set,
36  * to sort and make the ranges disjoint.
37  */
38 extern void sort_and_merge_range_set(struct range_set *);
39
40 /* Linked list of interesting files and their associated ranges.  The
41  * list must be kept sorted by path.
42  *
43  * For simplicity, even though this is highly redundant, each
44  * line_log_data owns its 'path'.
45  */
46 struct line_log_data {
47         struct line_log_data *next;
48         char *path;
49         char status;
50         struct range_set ranges;
51         int arg_alloc, arg_nr;
52         const char **args;
53         struct diff_filepair *pair;
54         struct diff_ranges diff;
55 };
56
57 extern void line_log_init(struct rev_info *rev, const char *prefix, struct string_list *args);
58
59 extern int line_log_filter(struct rev_info *rev);
60
61 extern int line_log_print(struct rev_info *rev, struct commit *commit);
62
63 #endif /* LINE_LOG_H */