Merge branch 'rs/optim-text-wrap' into maint-1.6.6

* rs/optim-text-wrap:
  utf8.c: speculatively assume utf-8 in strbuf_add_wrapped_text()
  utf8.c: remove strbuf_write()
  utf8.c: remove print_spaces()
  utf8.c: remove print_wrapped_text()
This commit is contained in:
Junio C Hamano 2010-03-07 14:53:45 -08:00
Родитель 7b576f9910 462749b728
Коммит 11a1a49a16
3 изменённых файлов: 42 добавлений и 37 удалений

Просмотреть файл

@ -304,9 +304,19 @@ parse_done:
return 0; return 0;
} }
static void add_wrapped_shortlog_msg(struct strbuf *sb, const char *s,
const struct shortlog *log)
{
int col = strbuf_add_wrapped_text(sb, s, log->in1, log->in2, log->wrap);
if (col != log->wrap)
strbuf_addch(sb, '\n');
}
void shortlog_output(struct shortlog *log) void shortlog_output(struct shortlog *log)
{ {
int i, j; int i, j;
struct strbuf sb = STRBUF_INIT;
if (log->sort_by_number) if (log->sort_by_number)
qsort(log->list.items, log->list.nr, sizeof(struct string_list_item), qsort(log->list.items, log->list.nr, sizeof(struct string_list_item),
compare_by_number); compare_by_number);
@ -321,9 +331,9 @@ void shortlog_output(struct shortlog *log)
const char *msg = onelines->items[j].string; const char *msg = onelines->items[j].string;
if (log->wrap_lines) { if (log->wrap_lines) {
int col = print_wrapped_text(msg, log->in1, log->in2, log->wrap); strbuf_reset(&sb);
if (col != log->wrap) add_wrapped_shortlog_msg(&sb, msg, log);
putchar('\n'); fwrite(sb.buf, sb.len, 1, stdout);
} }
else else
printf(" %s\n", msg); printf(" %s\n", msg);
@ -337,6 +347,7 @@ void shortlog_output(struct shortlog *log)
log->list.items[i].util = NULL; log->list.items[i].util = NULL;
} }
strbuf_release(&sb);
log->list.strdup_strings = 1; log->list.strdup_strings = 1;
string_list_clear(&log->list, 1); string_list_clear(&log->list, 1);
clear_mailmap(&log->mailmap); clear_mailmap(&log->mailmap);

61
utf8.c
Просмотреть файл

@ -280,22 +280,11 @@ int is_utf8(const char *text)
return 1; return 1;
} }
static inline void strbuf_write(struct strbuf *sb, const char *buf, int len) static void strbuf_addchars(struct strbuf *sb, int c, size_t n)
{ {
if (sb) strbuf_grow(sb, n);
strbuf_insert(sb, sb->len, buf, len); memset(sb->buf + sb->len, c, n);
else strbuf_setlen(sb, sb->len + n);
fwrite(buf, len, 1, stdout);
}
static void print_spaces(struct strbuf *buf, int count)
{
static const char s[] = " ";
while (count >= sizeof(s)) {
strbuf_write(buf, s, sizeof(s) - 1);
count -= sizeof(s) - 1;
}
strbuf_write(buf, s, count);
} }
static void strbuf_add_indented_text(struct strbuf *buf, const char *text, static void strbuf_add_indented_text(struct strbuf *buf, const char *text,
@ -307,8 +296,8 @@ static void strbuf_add_indented_text(struct strbuf *buf, const char *text,
const char *eol = strchrnul(text, '\n'); const char *eol = strchrnul(text, '\n');
if (*eol == '\n') if (*eol == '\n')
eol++; eol++;
print_spaces(buf, indent); strbuf_addchars(buf, ' ', indent);
strbuf_write(buf, text, eol - text); strbuf_add(buf, text, eol - text);
text = eol; text = eol;
indent = indent2; indent = indent2;
} }
@ -335,16 +324,21 @@ static size_t display_mode_esc_sequence_len(const char *s)
* consumed (and no extra indent is necessary for the first line). * consumed (and no extra indent is necessary for the first line).
*/ */
int strbuf_add_wrapped_text(struct strbuf *buf, int strbuf_add_wrapped_text(struct strbuf *buf,
const char *text, int indent, int indent2, int width) const char *text, int indent1, int indent2, int width)
{ {
int w = indent, assume_utf8 = is_utf8(text); int indent, w, assume_utf8 = 1;
const char *bol = text, *space = NULL; const char *bol, *space, *start = text;
size_t orig_len = buf->len;
if (width <= 0) { if (width <= 0) {
strbuf_add_indented_text(buf, text, indent, indent2); strbuf_add_indented_text(buf, text, indent1, indent2);
return 1; return 1;
} }
retry:
bol = text;
w = indent = indent1;
space = NULL;
if (indent < 0) { if (indent < 0) {
w = -indent; w = -indent;
space = text; space = text;
@ -366,8 +360,8 @@ int strbuf_add_wrapped_text(struct strbuf *buf,
if (space) if (space)
start = space; start = space;
else else
print_spaces(buf, indent); strbuf_addchars(buf, ' ', indent);
strbuf_write(buf, start, text - start); strbuf_add(buf, start, text - start);
if (!c) if (!c)
return w; return w;
space = text; space = text;
@ -376,40 +370,41 @@ int strbuf_add_wrapped_text(struct strbuf *buf,
else if (c == '\n') { else if (c == '\n') {
space++; space++;
if (*space == '\n') { if (*space == '\n') {
strbuf_write(buf, "\n", 1); strbuf_addch(buf, '\n');
goto new_line; goto new_line;
} }
else if (!isalnum(*space)) else if (!isalnum(*space))
goto new_line; goto new_line;
else else
strbuf_write(buf, " ", 1); strbuf_addch(buf, ' ');
} }
w++; w++;
text++; text++;
} }
else { else {
new_line: new_line:
strbuf_write(buf, "\n", 1); strbuf_addch(buf, '\n');
text = bol = space + isspace(*space); text = bol = space + isspace(*space);
space = NULL; space = NULL;
w = indent = indent2; w = indent = indent2;
} }
continue; continue;
} }
if (assume_utf8) if (assume_utf8) {
w += utf8_width(&text, NULL); w += utf8_width(&text, NULL);
else { if (!text) {
assume_utf8 = 0;
text = start;
strbuf_setlen(buf, orig_len);
goto retry;
}
} else {
w++; w++;
text++; text++;
} }
} }
} }
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) int is_encoding_utf8(const char *name)
{ {
if (!name) if (!name)

1
utf8.h
Просмотреть файл

@ -9,7 +9,6 @@ int utf8_strwidth(const char *string);
int is_utf8(const char *text); int is_utf8(const char *text);
int is_encoding_utf8(const char *name); int is_encoding_utf8(const char *name);
int print_wrapped_text(const char *text, int indent, int indent2, int len);
int strbuf_add_wrapped_text(struct strbuf *buf, int strbuf_add_wrapped_text(struct strbuf *buf,
const char *text, int indent, int indent2, int width); const char *text, int indent, int indent2, int width);