diff --color-words: bit of clean-up

When we introduced the "word diff" mode, we could have done one of three
things:

 * change fn_out_consume() to "this is called every time a line worth of
   diff becomes ready from the lower-level diff routine.  This function
   knows two sets of helpers (one for line-oriented diff, another for word
   diff), and each set has various functions to be called at certain
   places (e.g. hunk header, context, ...).  The function's role is to
   inspect the incoming line, and dispatch appropriate helpers to produce
   either line- or word- oriented diff output."

 * introduce fn_out_consume_word_diff() that is "this is called every time
   a line worth of diff becomes ready from the lower-level diff routine,
   and here is what we do to prepare word oriented diff using that line."
   without touching fn_out_consume() at all.

 * Do neither of the above, and keep fn_out_consume() to "this is called
   every time a line worth of diff becomes ready from the lower-level diff
   routine, and here is what we do to output line oriented diff using that
   line."  but sprinkle a handful of 'are we in word-diff mode?  if so do
   this totally different thing' at random places.

This patch is to at least abstract the details of "this totally different
thing" out from the main codepath, in order to improve readability.

We can later refactor it by introducing fn_out_consume_word_diff(), taking
the second route above, but that is a separate topic.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Junio C Hamano 2009-10-30 10:09:06 -07:00
Родитель a4ca1465ec
Коммит 76fd28283f
1 изменённых файлов: 12 добавлений и 14 удалений

26
diff.c
Просмотреть файл

@ -541,14 +541,18 @@ struct emit_callback {
FILE *file; FILE *file;
}; };
/* In "color-words" mode, show word-diff of words accumulated in the buffer */
static void diff_words_flush(struct emit_callback *ecbdata)
{
if (ecbdata->diff_words->minus.text.size ||
ecbdata->diff_words->plus.text.size)
diff_words_show(ecbdata->diff_words);
}
static void free_diff_words_data(struct emit_callback *ecbdata) static void free_diff_words_data(struct emit_callback *ecbdata)
{ {
if (ecbdata->diff_words) { if (ecbdata->diff_words) {
/* flush buffers */ diff_words_flush(ecbdata);
if (ecbdata->diff_words->minus.text.size ||
ecbdata->diff_words->plus.text.size)
diff_words_show(ecbdata->diff_words);
free (ecbdata->diff_words->minus.text.ptr); free (ecbdata->diff_words->minus.text.ptr);
free (ecbdata->diff_words->minus.orig); free (ecbdata->diff_words->minus.orig);
free (ecbdata->diff_words->plus.text.ptr); free (ecbdata->diff_words->plus.text.ptr);
@ -656,12 +660,8 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
for (i = 0; i < len && line[i] == '@'; i++) for (i = 0; i < len && line[i] == '@'; i++)
; ;
if (2 <= i && i < len && line[i] == ' ') { if (2 <= i && i < len && line[i] == ' ') {
/* flush --color-words even for --unified=0 */ if (ecbdata->diff_words)
if (ecbdata->diff_words && diff_words_flush(ecbdata);
(ecbdata->diff_words->minus.text.size ||
ecbdata->diff_words->plus.text.size))
diff_words_show(ecbdata->diff_words);
ecbdata->nparents = i - 1; ecbdata->nparents = i - 1;
len = sane_truncate_line(ecbdata, line, len); len = sane_truncate_line(ecbdata, line, len);
emit_line(ecbdata->file, emit_line(ecbdata->file,
@ -691,9 +691,7 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
&ecbdata->diff_words->plus); &ecbdata->diff_words->plus);
return; return;
} }
if (ecbdata->diff_words->minus.text.size || diff_words_flush(ecbdata);
ecbdata->diff_words->plus.text.size)
diff_words_show(ecbdata->diff_words);
line++; line++;
len--; len--;
emit_line(ecbdata->file, plain, reset, line, len); emit_line(ecbdata->file, plain, reset, line, len);