Commit Diff


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 = {