Code

print_wrapped_text(): allow hard newlines
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Sun, 11 Nov 2007 14:14:15 +0000 (14:14 +0000)
committerJunio C Hamano <gitster@pobox.com>
Mon, 19 Oct 2009 07:57:29 +0000 (00:57 -0700)
print_wrapped_text() will insert its own newlines. Up until now, if the
text passed to it contained newlines, they would not be handled properly
(the wrapping got confused after that).

The strategy is to replace a single new-line with a space, but keep double
new-lines so that already-wrapped text with empty lines between paragraphs
will be handled properly.

However, single new-line characters are only handled this way if the
character after it is an alphanumeric character, as per Linus' suggestion.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
utf8.c

diff --git a/utf8.c b/utf8.c
index db706ac4ed6f033091cfaeb7b23c07ca7fd71675..2aace1d42cd224e578e667290515daadf006e71c 100644 (file)
--- a/utf8.c
+++ b/utf8.c
@@ -310,6 +310,8 @@ int print_wrapped_text(const char *text, int indent, int indent2, int width)
                if (!c || isspace(c)) {
                        if (w < width || !space) {
                                const char *start = bol;
+                               if (!c && text == start)
+                                       return w;
                                if (space)
                                        start = space;
                                else
@@ -317,13 +319,25 @@ int print_wrapped_text(const char *text, int indent, int indent2, int width)
                                fwrite(start, text - start, 1, stdout);
                                if (!c)
                                        return w;
-                               else if (c == '\t')
-                                       w |= 0x07;
                                space = text;
+                               if (c == '\t')
+                                       w |= 0x07;
+                               else if (c == '\n') {
+                                       space++;
+                                       if (*space == '\n') {
+                                               putchar('\n');
+                                               goto new_line;
+                                       }
+                                       else if (!isalnum(*space))
+                                               goto new_line;
+                                       else
+                                               putchar(' ');
+                               }
                                w++;
                                text++;
                        }
                        else {
+new_line:
                                putchar('\n');
                                text = bol = space + isspace(*space);
                                space = NULL;