diff: use hunk callback for word-diff

Our word-diff does not look at the -/+ lines generated by xdiff at all (because they are not real lines to show the user, but just the tokenized words split into lines). Instead we use the line numbers from the hunk headers to index our own data structure. As a result, our xdi_diff_outf() callback throws away all lines except hunk headers. We can instead use a hunk callback, which has two benefits: 1. We don't have to re-parse the generated hunk header line, but can use the passed parameters directly. 2. By setting our line callback to NULL, we can tell xdiff-interface that it does not even need to bother generating the other lines, saving a small amount of work. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King committed Nov 2, 2018 at 02:37 UTC 7c61e25fbf1a4a65208be1197940a383f220a1b7
2 files changed +8 -7
diff.c
+5 -7
@@ -1883,19 +1883,17 @@ static int color_words_output_graph_prefix(struct diff_words_data *diff_words)
1883 }
1884 }
1885
1886 -static void fn_out_diff_words_aux(void *priv, char *line, unsigned long len)
1886 +static void fn_out_diff_words_aux(void *priv,
1887 + long minus_first, long minus_len,
1888 + long plus_first, long plus_len,
1889 + const char *func, long funclen)
1890 {
1891 struct diff_words_data *diff_words = priv;
1892 struct diff_words_style *style = diff_words->style;
1890 - int minus_first, minus_len, plus_first, plus_len;
1893 const char *minus_begin, *minus_end, *plus_begin, *plus_end;
1894 struct diff_options *opt = diff_words->opt;
1895 const char *line_prefix;
1896
1895 - if (line[0] != '@' || parse_hunk_header(line, len,
1896 - &minus_first, &minus_len, &plus_first, &plus_len))
1897 - return;
1898 -
1897 assert(opt);
1898 line_prefix = diff_line_prefix(opt);
1899
@@ -2045,7 +2043,7 @@ static void diff_words_show(struct diff_words_data *diff_words)
2043 xpp.flags = 0;
2044 /* as only the hunk header will be parsed, we need a 0-context */
2045 xecfg.ctxlen = 0;
2048 - if (xdi_diff_outf(&minus, &plus, NULL, fn_out_diff_words_aux,
2046 + if (xdi_diff_outf(&minus, &plus, fn_out_diff_words_aux, NULL,
2047 diff_words, &xpp, &xecfg))
2048 die("unable to generate word diff");
2049 free(minus.ptr);
xdiff-interface.c
+3
@@ -95,6 +95,9 @@ static int xdiff_outf(void *priv_, mmbuffer_t *mb, int nbuf)
95 struct xdiff_emit_state *priv = priv_;
96 int i;
97
98 + if (!priv->line_fn)
99 + return 0;
100 +
101 for (i = 0; i < nbuf; i++) {
102 if (mb[i].ptr[mb[i].size-1] != '\n') {
103 /* Incomplete line */