commit 11caa5ccb607f41d22b4d2a7630952c0cdd08336 from: Stefan Sperling date: Tue Sep 22 17:38:08 2020 UTC store interal state of output_unidiff API in an opaque struct 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; }