[pacman-dev] [PATCH 5/6] Table formatted output functions
Jakob Gruber
jakob.gruber at gmail.com
Mon Feb 28 11:32:56 EST 2011
On 02/25/2011 04:21 PM, Dan McGee wrote:
> I had a real hard time following all this, but that might just be the
> morning brain not working well. Your reuse of curformat->data as first
> a immutable string holder and later a alloced format string holder is
> particularly hard to wrap the brain around until you see it. I'd
> highly recommend not mixing the two for clarity.
I made a few changes that should hopefully make this part clearer.
table_display now also takes a list of column headers,
and table_create_format uses them to determine the column count before
looking for the longest strings and creating the formats.
This gets rid of adding the NULL in display_targets (NULL was equal to
an empty line after the header) and the NULL in table_create_format
(which was an initial value which meant "assign the first string we get
to because there aren't any initial values to run strlen() on yet").
> input: a list of rows, each with a list of cols (cells)?
> output: a list of formats for each col?
Yeah, exactly.
>> +
>> + /* return NULL if terminal is not wide enough */
>> + if(neededcols> getcols()) {
>> + FREELIST(format);
>> + return NULL;
>> + }
> Hmm. Is this likely to happen? Seems odd to then not have anything
> printed at all. I think we should truncate strings as necessary, just
> like we do in the callback functions.
>
It shouldn't happen (often) for regular usage. On an 80 column terminal,
the current upgrade targets (which all have average length names and
versions) takes up about 2/3 of the width. I added an error message at
this spot, but I'm not sure about truncating strings? Currently, the
error is passed up through table_display, display_targets will unset
config->verbosepkglists and run itself again with the default list
display as fallback. Is that behavior acceptable?
>> +
>> + return format;
>> +}
>> +
>> +/** Displays the list in table format
>> + *
>> + * @param title the tables title
>> + * @param rows the rows to display as a list of lists of strings. the outer
>> + * list represents the rows, the inner list the cells (= columns)
>> + *
>> + * @return -1 if not enough terminal cols available, else 0
>> + */
>> +int table_display(const char *title, const alpm_list_t *rows)
>> +{
>> + alpm_list_t *i, *formats;
>> +
>> + if(rows == NULL)
>> + return 0;
>> +
>> + formats = table_create_format(rows);
>> + if(formats == NULL) {
>> + return -1;
>> + }
>> +
>> + if(title != NULL) {
>> + printf("%s\n\n", title);
>> + }
>> +
>> + for(i = alpm_list_first(rows); i; i = alpm_list_next(i)) {
>> + table_print_line(alpm_list_getdata(i), formats);
>> + }
>> +
>> + FREELIST(formats);
>> + return 0;
>> +}
>> +
>> void list_display(const char *title, const alpm_list_t *list)
>> {
>> const alpm_list_t *i;
>> diff --git a/src/pacman/util.h b/src/pacman/util.h
>> index ed03c13..494becf 100644
>> --- a/src/pacman/util.h
>> +++ b/src/pacman/util.h
>> @@ -56,6 +56,7 @@ char *size_to_human_string_mb(off_t bytes);
>> char *size_to_human_string_kb(off_t bytes);
>> char *size_to_human_string_short(off_t bytes);
>> void string_display(const char *title, const char *string);
>> +int table_display(const char *title, const alpm_list_t *rows);
>> void list_display(const char *title, const alpm_list_t *list);
>> void list_display_linebreak(const char *title, const alpm_list_t *list);
>> void display_targets(const alpm_list_t *pkgs, int install);
>> --
>> 1.7.4.1
>>
>>
>>
More information about the pacman-dev
mailing list