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

* 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-04 22:26:33 -08:00
Родитель 780fc9a0a6 462749b728
Коммит 868cfe0923
3 изменённых файлов: 42 добавлений и 37 удалений

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

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

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

@ -280,22 +280,11 @@ int is_utf8(const char *text)
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_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)) {
strbuf_write(buf, s, sizeof(s) - 1);
count -= sizeof(s) - 1;
}
strbuf_write(buf, s, count);
strbuf_grow(sb, n);
memset(sb->buf + sb->len, c, n);
strbuf_setlen(sb, sb->len + n);
}
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');
if (*eol == '\n')
eol++;
print_spaces(buf, indent);
strbuf_write(buf, text, eol - text);
strbuf_addchars(buf, ' ', indent);
strbuf_add(buf, text, eol - text);
text = eol;
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).
*/
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);
const char *bol = text, *space = NULL;
int indent, w, assume_utf8 = 1;
const char *bol, *space, *start = text;
size_t orig_len = buf->len;
if (width <= 0) {
strbuf_add_indented_text(buf, text, indent, indent2);
strbuf_add_indented_text(buf, text, indent1, indent2);
return 1;
}
retry:
bol = text;
w = indent = indent1;
space = NULL;
if (indent < 0) {
w = -indent;
space = text;
@ -366,8 +360,8 @@ int strbuf_add_wrapped_text(struct strbuf *buf,
if (space)
start = space;
else
print_spaces(buf, indent);
strbuf_write(buf, start, text - start);
strbuf_addchars(buf, ' ', indent);
strbuf_add(buf, start, text - start);
if (!c)
return w;
space = text;
@ -376,40 +370,41 @@ int strbuf_add_wrapped_text(struct strbuf *buf,
else if (c == '\n') {
space++;
if (*space == '\n') {
strbuf_write(buf, "\n", 1);
strbuf_addch(buf, '\n');
goto new_line;
}
else if (!isalnum(*space))
goto new_line;
else
strbuf_write(buf, " ", 1);
strbuf_addch(buf, ' ');
}
w++;
text++;
}
else {
new_line:
strbuf_write(buf, "\n", 1);
strbuf_addch(buf, '\n');
text = bol = space + isspace(*space);
space = NULL;
w = indent = indent2;
}
continue;
}
if (assume_utf8)
if (assume_utf8) {
w += utf8_width(&text, NULL);
else {
if (!text) {
assume_utf8 = 0;
text = start;
strbuf_setlen(buf, orig_len);
goto retry;
}
} else {
w++;
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)
{
if (!name)

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

@ -8,7 +8,6 @@ int utf8_strwidth(const char *string);
int is_utf8(const char *text);
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,
const char *text, int indent, int indent2, int width);