summaryrefslogtreecommitdiff
path: root/utf8.c
diff options
context:
space:
mode:
authorLibravatar Junio C Hamano <gitster@pobox.com>2009-12-06 22:40:16 -0800
committerLibravatar Junio C Hamano <gitster@pobox.com>2009-12-06 22:40:16 -0800
commita24a32ddb30c904d244fe911f4d9e7e3924fdac7 (patch)
treeec39c0620c53f518b7709ee1b9c14c70e91e8cf4 /utf8.c
parentbuiltin-push: don't access freed transport->url (diff)
parentbash: update 'git commit' completion (diff)
downloadtgif-a24a32ddb30c904d244fe911f4d9e7e3924fdac7.tar.xz
Merge branch 'master' into il/vcs-helper
* master: (334 commits) bash: update 'git commit' completion Git 1.6.5.5 Fix diff -B/--dirstat miscounting of newly added contents reset: improve worktree safety valves Documentation: Avoid use of xmlto --stringparam archive: clarify description of path parameter rerere: don't segfault on failure to open rr-cache Prepare for 1.6.5.5 gitweb: Describe (possible) gitweb.js minification in gitweb/README Documentation: xmlto 0.0.18 does not know --stringparam Fix crasher on encountering SHA1-like non-note in notes tree t9001: use older Getopt::Long boolean prefix '--no' rather than '--no-' t4201: use ISO8859-1 rather than ISO-8859-1 Git 1.6.5.4 Unconditionally set man.base.url.for.relative.links Documentation/Makefile: allow man.base.url.for.relative.link to be set from Make Git 1.6.6-rc1 git-pull.sh: Fix call to git-merge for new command format Prepare for 1.6.5.4 merge: do not add standard message when message is given with -m option ... Conflicts: Documentation/git-remote-helpers.txt Makefile builtin-ls-remote.c builtin-push.c transport-helper.c Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'utf8.c')
-rw-r--r--utf8.c90
1 files changed, 80 insertions, 10 deletions
diff --git a/utf8.c b/utf8.c
index db706ac4ed..7ddff23fa7 100644
--- a/utf8.c
+++ b/utf8.c
@@ -1,4 +1,5 @@
#include "git-compat-util.h"
+#include "strbuf.h"
#include "utf8.h"
/* This code is originally from http://www.cl.cam.ac.uk/~mgk25/ucs/ */
@@ -279,14 +280,52 @@ int is_utf8(const char *text)
return 1;
}
-static void print_spaces(int count)
+static inline void strbuf_write(struct strbuf *sb, const char *buf, int len)
+{
+ if (sb)
+ strbuf_insert(sb, sb->len, buf, len);
+ else
+ fwrite(buf, len, 1, stdout);
+}
+
+static void print_spaces(struct strbuf *buf, int count)
{
static const char s[] = " ";
while (count >= sizeof(s)) {
- fwrite(s, sizeof(s) - 1, 1, stdout);
+ strbuf_write(buf, s, sizeof(s) - 1);
count -= sizeof(s) - 1;
}
- fwrite(s, count, 1, stdout);
+ strbuf_write(buf, s, count);
+}
+
+static void strbuf_add_indented_text(struct strbuf *buf, const char *text,
+ int indent, int indent2)
+{
+ if (indent < 0)
+ indent = 0;
+ while (*text) {
+ const char *eol = strchrnul(text, '\n');
+ if (*eol == '\n')
+ eol++;
+ print_spaces(buf, indent);
+ strbuf_write(buf, text, eol - text);
+ text = eol;
+ indent = indent2;
+ }
+}
+
+static size_t display_mode_esc_sequence_len(const char *s)
+{
+ const char *p = s;
+ if (*p++ != '\033')
+ return 0;
+ if (*p++ != '[')
+ return 0;
+ while (isdigit(*p) || *p == ';')
+ p++;
+ if (*p++ != 'm')
+ return 0;
+ return p - s;
}
/*
@@ -295,36 +334,62 @@ static void print_spaces(int count)
* If indent is negative, assume that already -indent columns have been
* consumed (and no extra indent is necessary for the first line).
*/
-int print_wrapped_text(const char *text, int indent, int indent2, int width)
+int strbuf_add_wrapped_text(struct strbuf *buf,
+ const char *text, int indent, int indent2, int width)
{
int w = indent, assume_utf8 = is_utf8(text);
const char *bol = text, *space = NULL;
+ if (width <= 0) {
+ strbuf_add_indented_text(buf, text, indent, indent2);
+ return 1;
+ }
+
if (indent < 0) {
w = -indent;
space = text;
}
for (;;) {
- char c = *text;
+ char c;
+ size_t skip;
+
+ while ((skip = display_mode_esc_sequence_len(text)))
+ text += skip;
+
+ c = *text;
if (!c || isspace(c)) {
if (w < width || !space) {
const char *start = bol;
+ if (!c && text == start)
+ return w;
if (space)
start = space;
else
- print_spaces(indent);
- fwrite(start, text - start, 1, stdout);
+ print_spaces(buf, indent);
+ strbuf_write(buf, start, text - start);
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') {
+ strbuf_write(buf, "\n", 1);
+ goto new_line;
+ }
+ else if (!isalnum(*space))
+ goto new_line;
+ else
+ strbuf_write(buf, " ", 1);
+ }
w++;
text++;
}
else {
- putchar('\n');
+new_line:
+ strbuf_write(buf, "\n", 1);
text = bol = space + isspace(*space);
space = NULL;
w = indent = indent2;
@@ -340,6 +405,11 @@ int 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)
+{
+ return strbuf_add_wrapped_text(NULL, text, indent, indent2, width);
+}
+
int is_encoding_utf8(const char *name)
{
if (!name)