[pacman-dev] [PATCH 1/2][RFC] pacman/util: add methods to create a divider for tables
This creates a dashed line underneath the header for each column in the table, e.g.: Name Old Version New Version Size ----- ------------ ------------ ----- at-spi2-core 2.0.2-1 0.18 MiB dconf 0.8.0-1 0.08 MiB at-spi2-atk 2.0.2-1 0.05 MiB gsettings-desktop-schemas 3.0.1-2 0.04 MiB Inspired-by: Pat Brisbin <pbrisbin@gmail.com> Signed-off-by: Dave Reisner <dreisner@archlinux.org> --- I think it's a nice touch, and it's not a hugely invasive patch. src/pacman/util.c | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/pacman/util.c b/src/pacman/util.c index 91625a1..0c83020 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -555,6 +555,40 @@ static alpm_list_t *table_create_format(const alpm_list_t *header, return formats; } +static char *string_create_filled(const unsigned int fill, size_t len) +{ + char *filled; + + filled = malloc(len + 1); + if(!filled) { + return NULL; + } + + memset(filled, fill, len); + filled[len] = '\0'; + + return filled; +} + +static alpm_list_t *table_create_divider(const alpm_list_t *header, + const unsigned int fill) +{ + const alpm_list_t *i; + alpm_list_t *divider = NULL; + + for(i = header; i; i = alpm_list_next(i)) { + const char *header = alpm_list_getdata(i); + char *div = string_create_filled(fill, string_length(header) + 1); + if(!div) { + FREELIST(divider); + return NULL; + } + divider = alpm_list_add(divider, div); + } + + return divider; +} + /** Displays the list in table format * * @param title the tables title @@ -569,7 +603,7 @@ int table_display(const char *title, const alpm_list_t *header, const alpm_list_t *rows) { const alpm_list_t *i; - alpm_list_t *formats; + alpm_list_t *formats, *divider; if(rows == NULL || header == NULL) { return 0; @@ -580,17 +614,24 @@ int table_display(const char *title, const alpm_list_t *header, return -1; } + divider = table_create_divider(header, '-'); + if(divider == NULL) { + FREELIST(formats); + return -1; + } + if(title != NULL) { printf("%s\n\n", title); } table_print_line(header, formats); - printf("\n"); + table_print_line(divider, formats); for(i = rows; i; i = alpm_list_next(i)) { table_print_line(alpm_list_getdata(i), formats); } + FREELIST(divider); FREELIST(formats); return 0; } -- 1.7.6
This is measuring strings that are potentially localized, so we need a multibyte aware function to count characters instead of bytes. Signed-off-by: Dave Reisner <dreisner@archlinux.org> --- assuming you didn't already get this one, Dan... src/pacman/util.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/src/pacman/util.c b/src/pacman/util.c index 0c83020..d154e84 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -533,7 +533,7 @@ static alpm_list_t *table_create_format(const alpm_list_t *header, /* now use the column width info to generate format strings */ for(i = longest_strs; i; i = alpm_list_next(i)) { const char *display; - colwidth = strlen(alpm_list_getdata(i)) + padding; + colwidth = string_length(alpm_list_getdata(i)) + padding; totalwidth += colwidth; /* right align the last column for a cleaner table display */ -- 1.7.6
participants (1)
-
Dave Reisner