commit - 00d5652be692793aa7c9285b490702d05a7ab8df
commit + 11caa5ccb607f41d22b4d2a7630952c0cdd08336
blob - 04a49ba79b9040e95c57a38b6aea04ef38ad3fde
blob + 7dfc84fa74faeb29413f4a7aacd57215ba15277a
--- include/diff/diff_output.h
+++ include/diff/diff_output.h
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
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)
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",
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);
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;
}