diff: use emit_line_0 once per line
authorStefan Beller <sbeller@google.com>
Tue, 14 Aug 2018 01:41:20 +0000 (18:41 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 14 Aug 2018 21:03:05 +0000 (14:03 -0700)
All lines that use emit_line_0 multiple times per line, are combined
into a single call to emit_line_0, making use of the 'set' argument.

We gain a little efficiency here, as we can omit emission of color and
accompanying reset if 'len == 0'.

Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff.c
t/t3206-range-diff.sh
diff --git a/diff.c b/diff.c
index 4ef663892823e09fcde834c1b1ca0f82ac19dbbc..4f430f44e642d035d60476fb45d3117cbd6872fb 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -656,12 +656,14 @@ static void emit_line_0(struct diff_options *o,
                        fputs(set_sign, file);
                if (first && !nofirst)
                        fputc(first, file);
-               if (set && set != set_sign) {
-                       if (set_sign)
-                               fputs(reset, file);
-                       fputs(set, file);
+               if (len) {
+                       if (set && set != set_sign) {
+                               if (set_sign)
+                                       fputs(reset, file);
+                               fputs(set, file);
+                       }
+                       fwrite(line, len, 1, file);
                }
-               fwrite(line, len, 1, file);
                fputs(reset, file);
        }
        if (has_trailing_carriage_return)
@@ -1207,9 +1209,7 @@ static void emit_line_ws_markup(struct diff_options *o,
        if (!ws && !set_sign)
                emit_line_0(o, set, NULL, 0, reset, sign, line, len);
        else if (!ws) {
-               /* Emit just the prefix, then the rest. */
-               emit_line_0(o, set_sign, NULL, !!set_sign, reset, sign, "", 0);
-               emit_line_0(o, set, NULL, 0, reset, 0, line, len);
+               emit_line_0(o, set_sign, set, !!set_sign, reset, sign, line, len);
        } else if (blank_at_eof)
                /* Blank line at EOF - paint '+' as well */
                emit_line_0(o, ws, NULL, 0, reset, sign, line, len);
index 31f6458f961f577a230180fcedc50deb2ead137c..7dc7c80a1dee3463d82dab576a1dbbb9908729a2 100755 (executable)
@@ -151,7 +151,7 @@ test_expect_success 'dual-coloring' '
        :         s/4/A/<RESET>
        :     <RESET>
        :    <REVERSE><GREEN>+<RESET><BOLD>    Also a silly comment here!<RESET>
-       :    <REVERSE><GREEN>+<RESET><BOLD><RESET>
+       :    <REVERSE><GREEN>+<RESET>
        :     diff --git a/file b/file<RESET>
        :    <RED> --- a/file<RESET>
        :    <GREEN> +++ b/file<RESET>