commit fe8af0d6c0a2ba7f1c50f0b88cd7e13d784d2e23 from: Stefan Sperling date: Tue Oct 06 12:25:54 2020 UTC add helper functions for obtaining the start/end line numbers of a diff chunk commit - 5e2413799664c1d48a0e266fffaa1b320b348c29 commit + fe8af0d6c0a2ba7f1c50f0b88cd7e13d784d2e23 blob - eb04709b9c9adb66907177f82e036589906fcfb0 blob + 20767052a7fd8ba51f93706796155ffdbfb04a82 --- include/diff/diff_output.h +++ include/diff/diff_output.h @@ -43,6 +43,18 @@ int diff_output_unidiff(struct diff_output_info **outp FILE *dest, const struct diff_input_info *info, const struct diff_result *result, unsigned int context_lines); +int diff_chunk_get_left_start(const struct diff_chunk *c, + const struct diff_result *r, + int context_lines); +int diff_chunk_get_left_end(const struct diff_chunk *c, + const struct diff_result *r, + int context_lines); +int diff_chunk_get_right_start(const struct diff_chunk *c, + const struct diff_result *r, + int context_lines); +int diff_chunk_get_right_end(const struct diff_chunk *c, + const struct diff_result *r, + int context_lines); void diff_chunk_context_get(struct diff_chunk_context *cc, const struct diff_result *r, int chunk_idx, int context_lines); blob - a9a176b4261f749224df4eebf1c0bea6f37b2026 blob + fc5b69b7af9741fe8308060d890d82c1eeb4c8c4 --- lib/diff_output_unidiff.c +++ lib/diff_output_unidiff.c @@ -34,20 +34,49 @@ chunk_context_empty(const struct diff_chunk_context *c return diff_range_empty(&cc->chunk); } +int +diff_chunk_get_left_start(const struct diff_chunk *c, + const struct diff_result *r, int context_lines) +{ + int left_start = diff_atom_root_idx(&r->left, c->left_start); + return MAX(0, left_start - context_lines); +} + +int +diff_chunk_get_left_end(const struct diff_chunk *c, + const struct diff_result *r, int context_lines) +{ + int left_start = diff_chunk_get_left_start(c, r, 0); + return MIN(r->left.atoms.len, + left_start + c->left_count + context_lines); +} + +int +diff_chunk_get_right_start(const struct diff_chunk *c, + const struct diff_result *r, int context_lines) +{ + int right_start = diff_atom_root_idx(&r->right, c->right_start); + return MAX(0, right_start - context_lines); +} + +int +diff_chunk_get_right_end(const struct diff_chunk *c, + const struct diff_result *r, int context_lines) +{ + int right_start = diff_chunk_get_right_start(c, r, 0); + return MIN(r->right.atoms.len, + right_start + c->right_count + context_lines); +} + 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]; - int left_start = diff_atom_root_idx(&r->left, c->left_start); - int left_end = MIN(r->left.atoms.len, - left_start + c->left_count + context_lines); - int right_start = diff_atom_root_idx(&r->right, c->right_start); - int right_end = MIN(r->right.atoms.len, - right_start + c->right_count + context_lines); - - left_start = MAX(0, left_start - context_lines); - right_start = MAX(0, right_start - context_lines); + int left_start = diff_chunk_get_left_start(c, r, context_lines); + int left_end = diff_chunk_get_left_end(c, r, context_lines); + int right_start = diff_chunk_get_right_start(c, r, context_lines); + int right_end = diff_chunk_get_right_end(c, r, context_lines); *cc = (struct diff_chunk_context){ .chunk = {