commit f374e91343146fc0584d53f4b767a3ebfe7bc49e from: Stefan Sperling date: Tue Sep 22 09:15:13 2020 UTC support output of individual diff chunks in the public API commit - 05b5f01fe731ec1197dbb90d6b0c98cd7dd3b465 commit + f374e91343146fc0584d53f4b767a3ebfe7bc49e blob - 51cb9c7966c778bceaaaf06691252cd4887e5e63 blob + 04a49ba79b9040e95c57a38b6aea04ef38ad3fde --- include/diff/diff_output.h +++ include/diff/diff_output.h @@ -20,11 +20,23 @@ struct diff_input_info { const char *right_path; }; +struct diff_chunk_context { + struct diff_range chunk; + struct diff_range left, right; +}; + int diff_output_plain(FILE *dest, const struct diff_input_info *info, const struct diff_result *result); int diff_output_unidiff(FILE *dest, const struct diff_input_info *info, const struct diff_result *result, unsigned int context_lines); +void diff_chunk_context_get(struct diff_chunk_context *cc, + const struct diff_result *r, + int chunk_idx, int context_lines); +void diff_output_unidiff_chunk(FILE *dest, bool *header_printed, + const struct diff_input_info *info, + const struct diff_result *result, + const struct diff_chunk_context *cc); int diff_output_info(FILE *dest, const struct diff_input_info *info); int diff_output_lines(FILE *dest, const char *prefix, struct diff_atom *start_atom, unsigned int count); blob - 24f7b9467dcfdd013e03242d59c02551eddfc875 blob + 63d712dc89458bd762fad94e1d01c418d4887d19 --- lib/diff_output_unidiff.c +++ lib/diff_output_unidiff.c @@ -27,19 +27,14 @@ #include "diff_debug.h" -struct chunk_context { - struct diff_range chunk; - struct diff_range left, right; -}; - static bool -chunk_context_empty(const struct chunk_context *cc) +chunk_context_empty(const struct diff_chunk_context *cc) { return diff_range_empty(&cc->chunk); } -static void -chunk_context_get(struct chunk_context *cc, const struct diff_result *r, +void +diff_chunk_context_get(struct diff_chunk_context *cc, const struct diff_result *r, int chunk_idx, int context_lines) { const struct diff_chunk *c = &r->chunks.head[chunk_idx]; @@ -53,7 +48,7 @@ chunk_context_get(struct chunk_context *cc, const stru left_start = MAX(0, left_start - context_lines); right_start = MAX(0, right_start - context_lines); - *cc = (struct chunk_context){ + *cc = (struct diff_chunk_context){ .chunk = { .start = chunk_idx, .end = chunk_idx + 1, @@ -70,8 +65,8 @@ chunk_context_get(struct chunk_context *cc, const stru } static bool -chunk_contexts_touch(const struct chunk_context *cc, - const struct chunk_context *other) +chunk_contexts_touch(const struct diff_chunk_context *cc, + const struct diff_chunk_context *other) { return diff_ranges_touch(&cc->chunk, &other->chunk) || diff_ranges_touch(&cc->left, &other->left) @@ -79,19 +74,19 @@ chunk_contexts_touch(const struct chunk_context *cc, } static void -chunk_contexts_merge(struct chunk_context *cc, - const struct chunk_context *other) +chunk_contexts_merge(struct diff_chunk_context *cc, + const struct diff_chunk_context *other) { diff_ranges_merge(&cc->chunk, &other->chunk); diff_ranges_merge(&cc->left, &other->left); diff_ranges_merge(&cc->right, &other->right); } -static void +void diff_output_unidiff_chunk(FILE *dest, bool *header_printed, const struct diff_input_info *info, const struct diff_result *result, - const struct chunk_context *cc) + const struct diff_chunk_context *cc) { if (diff_range_empty(&cc->left) && diff_range_empty(&cc->right)) return; @@ -165,14 +160,14 @@ diff_output_unidiff(FILE *dest, const struct diff_inpu if (result->rc != DIFF_RC_OK) return result->rc; - struct chunk_context cc = {}; + struct diff_chunk_context cc = {}; bool header_printed = false; int i; for (i = 0; i < result->chunks.len; i++) { struct diff_chunk *c = &result->chunks.head[i]; enum diff_chunk_type t = diff_chunk_type(c); - struct chunk_context next; + struct diff_chunk_context next; if (t != CHUNK_MINUS && t != CHUNK_PLUS) continue; @@ -182,7 +177,7 @@ diff_output_unidiff(FILE *dest, const struct diff_inpu * Note down the start point, any number of subsequent * chunks may be joined up to this unidiff chunk by * context lines or by being directly adjacent. */ - chunk_context_get(&cc, result, i, context_lines); + diff_chunk_context_get(&cc, result, i, context_lines); debug("new chunk to be printed:" " chunk %d-%d left %d-%d right %d-%d\n", cc.chunk.start, cc.chunk.end, @@ -193,7 +188,7 @@ diff_output_unidiff(FILE *dest, const struct diff_inpu /* There already is a previous chunk noted down for being * printed. Does it join up with this one? */ - chunk_context_get(&next, result, i, context_lines); + diff_chunk_context_get(&next, result, i, context_lines); debug("new chunk to be printed:" " chunk %d-%d left %d-%d right %d-%d\n", next.chunk.start, next.chunk.end,