]> asedeno.scripts.mit.edu Git - git.git/blobdiff - ws.c
Documentation: ls-files -v is about "assume unchanged".
[git.git] / ws.c
diff --git a/ws.c b/ws.c
index 716587498c14843aef1476a9c6b11e403466f992..d09b9df89a7e19367640d4c6ad64ff828d01d26f 100644 (file)
--- a/ws.c
+++ b/ws.c
@@ -121,7 +121,7 @@ unsigned check_and_emit_line(const char *line, int len, unsigned ws_rule,
                             const char *reset, const char *ws)
 {
        unsigned result = 0;
-       int leading_space = -1;
+       int written = 0;
        int trailing_whitespace = -1;
        int trailing_newline = 0;
        int i;
@@ -146,43 +146,46 @@ unsigned check_and_emit_line(const char *line, int len, unsigned ws_rule,
 
        /* Check for space before tab in initial indent. */
        for (i = 0; i < len; i++) {
-               if (line[i] == ' ') {
-                       leading_space = i;
+               if (line[i] == ' ')
                        continue;
-               }
                if (line[i] != '\t')
                        break;
-               if ((ws_rule & WS_SPACE_BEFORE_TAB) && (leading_space != -1))
+               if ((ws_rule & WS_SPACE_BEFORE_TAB) && written < i) {
                        result |= WS_SPACE_BEFORE_TAB;
-               break;
+                       if (stream) {
+                               fputs(ws, stream);
+                               fwrite(line + written, i - written, 1, stream);
+                               fputs(reset, stream);
+                       }
+               } else if (stream)
+                       fwrite(line + written, i - written, 1, stream);
+               if (stream)
+                       fwrite(line + i, 1, 1, stream);
+               written = i + 1;
        }
 
        /* Check for indent using non-tab. */
-       if ((ws_rule & WS_INDENT_WITH_NON_TAB) && leading_space >= 7)
+       if ((ws_rule & WS_INDENT_WITH_NON_TAB) && i - written >= 8) {
                result |= WS_INDENT_WITH_NON_TAB;
-
-       if (stream) {
-               /* Highlight errors in leading whitespace. */
-               if ((result & WS_SPACE_BEFORE_TAB) ||
-                   (result & WS_INDENT_WITH_NON_TAB)) {
+               if (stream) {
                        fputs(ws, stream);
-                       fwrite(line, leading_space + 1, 1, stream);
+                       fwrite(line + written, i - written, 1, stream);
                        fputs(reset, stream);
-                       leading_space++;
                }
-               else
-                       leading_space = 0;
+               written = i;
+       }
 
-               /* Now the rest of the line starts at leading_space.
+       if (stream) {
+               /* Now the rest of the line starts at written.
                 * The non-highlighted part ends at trailing_whitespace. */
                if (trailing_whitespace == -1)
                        trailing_whitespace = len;
 
                /* Emit non-highlighted (middle) segment. */
-               if (trailing_whitespace - leading_space > 0) {
+               if (trailing_whitespace - written > 0) {
                        fputs(set, stream);
-                       fwrite(line + leading_space,
-                           trailing_whitespace - leading_space, 1, stream);
+                       fwrite(line + written,
+                           trailing_whitespace - written, 1, stream);
                        fputs(reset, stream);
                }