Commit Diff


commit - 00d5652be692793aa7c9285b490702d05a7ab8df
commit + 11caa5ccb607f41d22b4d2a7630952c0cdd08336
blob - 04a49ba79b9040e95c57a38b6aea04ef38ad3fde
blob + 7dfc84fa74faeb29413f4a7aacd57215ba15277a
--- include/diff/diff_output.h
+++ include/diff/diff_output.h
@@ -33,7 +33,12 @@ int diff_output_unidiff(FILE *dest, const struct diff_
 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,
+struct diff_output_unidiff_state;
+struct diff_output_unidiff_state *diff_output_unidiff_state_alloc(void);
+void diff_output_unidiff_state_reset(struct diff_output_unidiff_state *state);
+void diff_output_unidiff_state_free(struct diff_output_unidiff_state *state);
+void diff_output_unidiff_chunk(FILE *dest,
+			  struct diff_output_unidiff_state *state,
 			  const struct diff_input_info *info,
 			  const struct diff_result *result,
 			  const struct diff_chunk_context *cc);
blob - 189d9d7583c852336b9e70c6a20d6969b4f6726c
blob + 1ba0e22228be6b72005e9491693117d038503646
--- lib/diff_output_unidiff.c
+++ lib/diff_output_unidiff.c
@@ -83,8 +83,35 @@ chunk_contexts_merge(struct diff_chunk_context *cc,
 	diff_ranges_merge(&cc->right, &other->right);
 }
 
+struct diff_output_unidiff_state {
+	bool header_printed;
+};
+
+struct diff_output_unidiff_state *
+diff_output_unidiff_state_alloc(void)
+{
+	struct diff_output_unidiff_state *state;
+
+	state = calloc(1, sizeof(struct diff_output_unidiff_state));
+	if (state != NULL)
+		diff_output_unidiff_state_reset(state);
+	return state;
+}
+
 void
-diff_output_unidiff_chunk(FILE *dest, bool *header_printed,
+diff_output_unidiff_state_reset(struct diff_output_unidiff_state *state)
+{
+	state->header_printed = false;
+}
+
+void
+diff_output_unidiff_state_free(struct diff_output_unidiff_state *state)
+{
+	free(state);
+}
+
+void
+diff_output_unidiff_chunk(FILE *dest, struct diff_output_unidiff_state *state,
 			  const struct diff_input_info *info,
 			  const struct diff_result *result,
 			  const struct diff_chunk_context *cc)
@@ -92,11 +119,11 @@ diff_output_unidiff_chunk(FILE *dest, bool *header_pri
 	if (diff_range_empty(&cc->left) && diff_range_empty(&cc->right))
 		return;
 
-	if (!(*header_printed)) {
+	if (!(state->header_printed)) {
 		fprintf(dest, "--- %s\n+++ %s\n",
 			info->left_path ? : "a",
 			info->right_path ? : "b");
-		*header_printed = true;
+		state->header_printed = true;
 	}
 
 	fprintf(dest, "@@ -%d,%d +%d,%d @@\n",
@@ -156,15 +183,19 @@ diff_output_unidiff(FILE *dest, const struct diff_inpu
 		    const struct diff_result *result,
 		    unsigned int context_lines)
 {
+	struct diff_output_unidiff_state *state;
+	struct diff_chunk_context cc = {};
+	int i;
+
 	if (!result)
 		return EINVAL;
 	if (result->rc != DIFF_RC_OK)
 		return result->rc;
 
-	struct diff_chunk_context cc = {};
-	bool header_printed = false;
+	state = diff_output_unidiff_state_alloc();
+	if (state == NULL)
+		return ENOMEM;
 
-	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);
@@ -213,15 +244,14 @@ diff_output_unidiff(FILE *dest, const struct diff_inpu
 		debug("new chunk to be printed does not touch previous chunk;"
 		      " print left %d-%d right %d-%d\n",
 		      cc.left.start, cc.left.end, cc.right.start, cc.right.end);
-		diff_output_unidiff_chunk(dest, &header_printed, info, result,
-					  &cc);
+		diff_output_unidiff_chunk(dest, state, info, result, &cc);
 		cc = next;
 		debug("new unprinted chunk is left %d-%d right %d-%d\n",
 		      cc.left.start, cc.left.end, cc.right.start, cc.right.end);
 	}
 
 	if (!chunk_context_empty(&cc))
-		diff_output_unidiff_chunk(dest, &header_printed, info, result,
-					  &cc);
+		diff_output_unidiff_chunk(dest, state, info, result, &cc);
+	diff_output_unidiff_state_free(state);
 	return DIFF_RC_OK;
 }