summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Schindelin <johannes.schindelin@gmx.de>2007-11-11 14:14:15 +0000
committerJunio C Hamano <gitster@pobox.com>2009-10-19 00:57:29 -0700
commitae0b27023018416c0bfe54823466dee67c20705a (patch)
treebf5e60d5cbe639db18d1c4148dc124df891a7cc2
parente79999b1a285d4dcf1d84bc893c864516a390cfa (diff)
downloadgit-ae0b27023018416c0bfe54823466dee67c20705a.tar.gz
print_wrapped_text(): allow hard newlines
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>
-rw-r--r--utf8.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/utf8.c b/utf8.c
index db706ac4ed..2aace1d42c 100644
--- 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;