Merge branch 'je/hooks'
[gitweb.git] / utf8.c
diff --git a/utf8.c b/utf8.c
index f381a7f137319f636955f2e4b21b8926a442c35e..4efef6faf7c71f3201935f81611806af084c45d4 100644 (file)
--- a/utf8.c
+++ b/utf8.c
@@ -62,7 +62,7 @@ static int bisearch(ucs_char_t ucs, const struct interval *table, int max) {
  * in ISO 10646.
  */
 
-static int wcwidth(ucs_char_t ch)
+static int git_wcwidth(ucs_char_t ch)
 {
        /*
         * Sorted list of non-overlapping intervals of non-spacing characters,
@@ -207,7 +207,7 @@ int utf8_width(const char **start)
                return 0;
        }
 
-       return wcwidth(ch);
+       return git_wcwidth(ch);
 }
 
 int is_utf8(const char *text)
@@ -237,12 +237,19 @@ static void print_spaces(int count)
 /*
  * Wrap the text, if necessary. The variable indent is the indent for the
  * first line, indent2 is the indent for all other lines.
+ * If indent is negative, assume that already -indent columns have been
+ * consumed (and no extra indent is necessary for the first line).
  */
-void print_wrapped_text(const char *text, int indent, int indent2, int width)
+int print_wrapped_text(const char *text, int indent, int indent2, int width)
 {
        int w = indent, assume_utf8 = is_utf8(text);
        const char *bol = text, *space = NULL;
 
+       if (indent < 0) {
+               w = -indent;
+               space = text;
+       }
+
        for (;;) {
                char c = *text;
                if (!c || isspace(c)) {
@@ -253,10 +260,9 @@ void print_wrapped_text(const char *text, int indent, int indent2, int width)
                                else
                                        print_spaces(indent);
                                fwrite(start, text - start, 1, stdout);
-                               if (!c) {
-                                       putchar('\n');
-                                       return;
-                               } else if (c == '\t')
+                               if (!c)
+                                       return w;
+                               else if (c == '\t')
                                        w |= 0x07;
                                space = text;
                                w++;
@@ -264,7 +270,7 @@ void print_wrapped_text(const char *text, int indent, int indent2, int width)
                        }
                        else {
                                putchar('\n');
-                               text = bol = space + 1;
+                               text = bol = space + isspace(*space);
                                space = NULL;
                                w = indent = indent2;
                        }
@@ -277,6 +283,7 @@ void print_wrapped_text(const char *text, int indent, int indent2, int width)
                        text++;
                }
        }
+       return w;
 }
 
 int is_encoding_utf8(const char *name)