#include "cache.h"
+#include "config.h"
#include "column.h"
#include "string-list.h"
#include "parse-options.h"
};
/* return length of 's' in letters, ANSI escapes stripped */
-static int item_length(unsigned int colopts, const char *s)
+static int item_length(const char *s)
{
- int len, i = 0;
- struct strbuf str = STRBUF_INIT;
-
- strbuf_addstr(&str, s);
- while ((s = strstr(str.buf + i, "\033[")) != NULL) {
- int len = strspn(s + 2, "0123456789;");
- i = s - str.buf;
- strbuf_remove(&str, i, len + 3); /* \033[<len><func char> */
- }
- len = utf8_strwidth(str.buf);
- strbuf_release(&str);
- return len;
+ return utf8_strnwidth(s, -1, 1);
}
/*
printf("%s%s%s", indent, list->items[i].string, nl);
}
-/* Print a cell to stdout with all necessary leading/traling space */
+/* Print a cell to stdout with all necessary leading/trailing space */
static int display_cell(struct column_data *data, int initial_width,
const char *empty_cell, int x, int y)
{
data.colopts = colopts;
data.opts = *opts;
- data.len = xmalloc(sizeof(*data.len) * list->nr);
+ ALLOC_ARRAY(data.len, list->nr);
for (i = 0; i < list->nr; i++)
- data.len[i] = item_length(colopts, list->items[i].string);
+ data.len[i] = item_length(list->items[i].string);
layout(&data, &initial_width);
if (colopts & COL_DENSE)
shrink_columns(&data);
- empty_cell = xmalloc(initial_width + 1);
+ empty_cell = xmallocz(initial_width);
memset(empty_cell, ' ', initial_width);
- empty_cell[initial_width] = '\0';
for (y = 0; y < data.rows; y++) {
for (x = 0; x < data.cols; x++)
if (display_cell(&data, initial_width, empty_cell, x, y))
display_table(list, colopts, &nopts);
break;
default:
- die("BUG: invalid layout mode %d", COL_LAYOUT(colopts));
+ BUG("invalid layout mode %d", COL_LAYOUT(colopts));
}
}
if (stdout_is_tty < 0)
stdout_is_tty = isatty(1);
*colopts &= ~COL_ENABLE_MASK;
- if (stdout_is_tty)
+ if (stdout_is_tty || pager_in_use())
*colopts |= COL_ENABLED;
}
return 0;
int run_column_filter(int colopts, const struct column_options *opts)
{
- struct argv_array *argv;
+ struct strvec *argv;
if (fd_out != -1)
return -1;
child_process_init(&column_process);
argv = &column_process.args;
- argv_array_push(argv, "column");
- argv_array_pushf(argv, "--raw-mode=%d", colopts);
+ strvec_push(argv, "column");
+ strvec_pushf(argv, "--raw-mode=%d", colopts);
if (opts && opts->width)
- argv_array_pushf(argv, "--width=%d", opts->width);
+ strvec_pushf(argv, "--width=%d", opts->width);
if (opts && opts->indent)
- argv_array_pushf(argv, "--indent=%s", opts->indent);
+ strvec_pushf(argv, "--indent=%s", opts->indent);
if (opts && opts->padding)
- argv_array_pushf(argv, "--padding=%d", opts->padding);
+ strvec_pushf(argv, "--padding=%d", opts->padding);
fflush(stdout);
column_process.in = -1;