packaging: Add contrib installation
[platform/upstream/git.git] / column.c
index ca878bc..1261e18 100644 (file)
--- a/column.c
+++ b/column.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "config.h"
 #include "column.h"
 #include "string-list.h"
 #include "parse-options.h"
@@ -20,20 +21,9 @@ struct column_data {
 };
 
 /* 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);
 }
 
 /*
@@ -81,8 +71,7 @@ static void compute_column_width(struct column_data *data)
  */
 static void shrink_columns(struct column_data *data)
 {
-       data->width = xrealloc(data->width,
-                              sizeof(*data->width) * data->cols);
+       REALLOC_ARRAY(data->width, data->cols);
        while (data->rows > 1) {
                int x, total_width, cols, rows;
                rows = data->rows;
@@ -91,8 +80,7 @@ static void shrink_columns(struct column_data *data)
                data->rows--;
                data->cols = DIV_ROUND_UP(data->list->nr, data->rows);
                if (data->cols != cols)
-                       data->width = xrealloc(data->width,
-                                              sizeof(*data->width) * data->cols);
+                       REALLOC_ARRAY(data->width, data->cols);
                compute_column_width(data);
 
                total_width = strlen(data->opts.indent);
@@ -119,7 +107,7 @@ static void display_plain(const struct string_list *list,
                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)
 {
@@ -166,18 +154,17 @@ static void display_table(const struct string_list *list,
        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))
@@ -216,7 +203,7 @@ void print_columns(const struct string_list *list, unsigned int colopts,
                display_table(list, colopts, &nopts);
                break;
        default:
-               die("BUG: invalid layout mode %d", COL_LAYOUT(colopts));
+               BUG("invalid layout mode %d", COL_LAYOUT(colopts));
        }
 }
 
@@ -226,7 +213,7 @@ int finalize_colopts(unsigned int *colopts, int stdout_is_tty)
                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;
@@ -367,26 +354,26 @@ int parseopt_column_callback(const struct option *opt,
 }
 
 static int fd_out = -1;
-static struct child_process column_process;
+static struct child_process column_process = CHILD_PROCESS_INIT;
 
 int run_column_filter(int colopts, const struct column_options *opts)
 {
-       struct argv_array *argv;
+       struct strvec *argv;
 
        if (fd_out != -1)
                return -1;
 
-       memset(&column_process, 0, sizeof(column_process));
+       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;