1#ifndef LINE_LOG_H 2#define LINE_LOG_H 3 4#include"diffcore.h" 5 6struct rev_info; 7struct commit; 8 9/* A range [start,end]. Lines are numbered starting at 0, and the 10 * ranges include start but exclude end. */ 11struct range { 12long start, end; 13}; 14 15/* A set of ranges. The ranges must always be disjoint and sorted. */ 16struct range_set { 17unsigned int alloc, nr; 18struct 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. */ 23struct diff_ranges { 24struct range_set parent; 25struct range_set target; 26}; 27 28voidrange_set_init(struct range_set *,size_t prealloc); 29voidrange_set_release(struct range_set *); 30/* Range includes start; excludes end */ 31voidrange_set_append_unsafe(struct range_set *,long start,long end); 32/* New range must begin at or after end of last added range */ 33voidrange_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 */ 38voidsort_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 */ 46struct line_log_data { 47struct line_log_data *next; 48char*path; 49char status; 50struct range_set ranges; 51int arg_alloc, arg_nr; 52const char**args; 53struct diff_filepair *pair; 54struct diff_ranges diff; 55}; 56 57voidline_log_init(struct rev_info *rev,const char*prefix,struct string_list *args); 58 59intline_log_filter(struct rev_info *rev); 60 61intline_log_print(struct rev_info *rev,struct commit *commit); 62 63#endif/* LINE_LOG_H */