diff options
Diffstat (limited to 'libsmartcols/src/print.c')
-rw-r--r-- | libsmartcols/src/print.c | 322 |
1 files changed, 10 insertions, 312 deletions
diff --git a/libsmartcols/src/print.c b/libsmartcols/src/print.c index 7e56f466e..dc6637cea 100644 --- a/libsmartcols/src/print.c +++ b/libsmartcols/src/print.c @@ -476,101 +476,6 @@ int __cell_to_buffer(struct libscols_table *tb, return rc; } -static void fput_indent(struct libscols_table *tb) -{ - int i; - - for (i = 0; i <= tb->indent; i++) - fputs(" ", tb->out); -} - -static void fput_table_open(struct libscols_table *tb) -{ - tb->indent = 0; - - if (scols_table_is_json(tb)) { - fputc('{', tb->out); - fputs(linesep(tb), tb->out); - - fput_indent(tb); - fputs_quoted(tb->name, tb->out); - fputs(": [", tb->out); - fputs(linesep(tb), tb->out); - - tb->indent++; - tb->indent_last_sep = 1; - } -} - -static void fput_table_close(struct libscols_table *tb) -{ - tb->indent--; - - if (scols_table_is_json(tb)) { - fput_indent(tb); - fputc(']', tb->out); - tb->indent--; - fputs(linesep(tb), tb->out); - fputc('}', tb->out); - tb->indent_last_sep = 1; - } -} - -static void fput_children_open(struct libscols_table *tb) -{ - if (scols_table_is_json(tb)) { - fputc(',', tb->out); - fputs(linesep(tb), tb->out); - fput_indent(tb); - fputs("\"children\": [", tb->out); - } - /* between parent and child is separator */ - fputs(linesep(tb), tb->out); - tb->indent_last_sep = 1; - tb->indent++; - tb->termlines_used++; -} - -static void fput_children_close(struct libscols_table *tb) -{ - tb->indent--; - - if (scols_table_is_json(tb)) { - fput_indent(tb); - fputc(']', tb->out); - fputs(linesep(tb), tb->out); - tb->indent_last_sep = 1; - } -} - -static void fput_line_open(struct libscols_table *tb) -{ - if (scols_table_is_json(tb)) { - fput_indent(tb); - fputc('{', tb->out); - tb->indent_last_sep = 0; - } - tb->indent++; -} - -static void fput_line_close(struct libscols_table *tb, int last, int last_in_table) -{ - tb->indent--; - if (scols_table_is_json(tb)) { - if (tb->indent_last_sep) - fput_indent(tb); - fputs(last ? "}" : "},", tb->out); - if (!tb->no_linesep) - fputs(linesep(tb), tb->out); - - } else if (tb->no_linesep == 0 && last_in_table == 0) { - fputs(linesep(tb), tb->out); - tb->termlines_used++; - } - - tb->indent_last_sep = 1; -} - /* * Prints data. Data can be printed in more formats (raw, NAME=xxx pairs), and * control and non-printable characters can be encoded in the \x?? encoding. @@ -622,7 +527,7 @@ static int print_line(struct libscols_table *tb, return 0; } -static int print_title(struct libscols_table *tb) +int __scols_print_title(struct libscols_table *tb) { int rc, color = 0; mbs_align_t align; @@ -724,7 +629,7 @@ done: return rc; } -static int print_header(struct libscols_table *tb, struct libscols_buffer *buf) +int __scols_print_header(struct libscols_table *tb, struct libscols_buffer *buf) { int rc = 0; struct libscols_column *cl; @@ -765,7 +670,7 @@ static int print_header(struct libscols_table *tb, struct libscols_buffer *buf) } -static int print_range( struct libscols_table *tb, +int __scols_print_range(struct libscols_table *tb, struct libscols_buffer *buf, struct libscols_iter *itr, struct libscols_line *end) @@ -788,19 +693,19 @@ static int print_range( struct libscols_table *tb, break; if (!last && want_repeat_header(tb)) - print_header(tb, buf); + __scols_print_header(tb, buf); } return rc; } -static int print_table(struct libscols_table *tb, struct libscols_buffer *buf) +int __scols_print_table(struct libscols_table *tb, struct libscols_buffer *buf) { struct libscols_iter itr; scols_reset_iter(&itr, SCOLS_ITER_FORWARD); - return print_range(tb, buf, &itr, NULL); + return __scols_print_range(tb, buf, &itr, NULL); } @@ -844,7 +749,7 @@ done: return rc; } -static int print_tree(struct libscols_table *tb, struct libscols_buffer *buf) +int __scols_print_tree(struct libscols_table *tb, struct libscols_buffer *buf) { int rc = 0; struct libscols_line *ln, *last = NULL; @@ -886,7 +791,7 @@ static size_t strlen_line(struct libscols_line *ln) return sz; } -static void cleanup_printing(struct libscols_table *tb, struct libscols_buffer *buf) +void __scols_cleanup_printing(struct libscols_table *tb, struct libscols_buffer *buf) { if (!tb) return; @@ -899,7 +804,7 @@ static void cleanup_printing(struct libscols_table *tb, struct libscols_buffer * } } -static int initialize_printing(struct libscols_table *tb, struct libscols_buffer **buf) +int __scols_initialize_printing(struct libscols_table *tb, struct libscols_buffer **buf) { size_t bufsz, extra_bufsz = 0; struct libscols_line *ln; @@ -996,214 +901,7 @@ static int initialize_printing(struct libscols_table *tb, struct libscols_buffer return 0; err: - cleanup_printing(tb, *buf); + __scols_cleanup_printing(tb, *buf); return rc; } -/** - * scola_table_print_range: - * @tb: table - * @start: first printed line or NULL to print from the begin of the table - * @end: last printed line or NULL to print all from start. - * - * If the start is the first line in the table than prints table header too. - * The header is printed only once. This does not work for trees. - * - * Returns: 0, a negative value in case of an error. - */ -int scols_table_print_range( struct libscols_table *tb, - struct libscols_line *start, - struct libscols_line *end) -{ - struct libscols_buffer *buf = NULL; - struct libscols_iter itr; - int rc; - - if (scols_table_is_tree(tb)) - return -EINVAL; - - DBG(TAB, ul_debugobj(tb, "printing range from API")); - - rc = initialize_printing(tb, &buf); - if (rc) - return rc; - - if (start) { - itr.direction = SCOLS_ITER_FORWARD; - itr.head = &tb->tb_lines; - itr.p = &start->ln_lines; - } else - scols_reset_iter(&itr, SCOLS_ITER_FORWARD); - - if (!start || itr.p == tb->tb_lines.next) { - rc = print_header(tb, buf); - if (rc) - goto done; - } - - rc = print_range(tb, buf, &itr, end); -done: - cleanup_printing(tb, buf); - return rc; -} - -/** - * scols_table_print_range_to_string: - * @tb: table - * @start: first printed line or NULL to print from the beginning of the table - * @end: last printed line or NULL to print all from start. - * @data: pointer to the beginning of a memory area to print to - * - * The same as scols_table_print_range(), but prints to @data instead of - * stream. - * - * Returns: 0, a negative value in case of an error. - */ -#ifdef HAVE_OPEN_MEMSTREAM -int scols_table_print_range_to_string( struct libscols_table *tb, - struct libscols_line *start, - struct libscols_line *end, - char **data) -{ - FILE *stream, *old_stream; - size_t sz; - int rc; - - if (!tb) - return -EINVAL; - - DBG(TAB, ul_debugobj(tb, "printing range to string")); - - /* create a stream for output */ - stream = open_memstream(data, &sz); - if (!stream) - return -ENOMEM; - - old_stream = scols_table_get_stream(tb); - scols_table_set_stream(tb, stream); - rc = scols_table_print_range(tb, start, end); - fclose(stream); - scols_table_set_stream(tb, old_stream); - - return rc; -} -#else -int scols_table_print_range_to_string( - struct libscols_table *tb __attribute__((__unused__)), - struct libscols_line *start __attribute__((__unused__)), - struct libscols_line *end __attribute__((__unused__)), - char **data __attribute__((__unused__))) -{ - return -ENOSYS; -} -#endif - -static int __scols_print_table(struct libscols_table *tb, int *is_empty) -{ - int rc = 0; - struct libscols_buffer *buf = NULL; - - if (!tb) - return -EINVAL; - - DBG(TAB, ul_debugobj(tb, "printing")); - if (is_empty) - *is_empty = 0; - - if (list_empty(&tb->tb_columns)) { - DBG(TAB, ul_debugobj(tb, "error -- no columns")); - return -EINVAL; - } - if (list_empty(&tb->tb_lines)) { - DBG(TAB, ul_debugobj(tb, "ignore -- no lines")); - if (is_empty) - *is_empty = 1; - return 0; - } - - tb->header_printed = 0; - rc = initialize_printing(tb, &buf); - if (rc) - return rc; - - fput_table_open(tb); - - if (tb->format == SCOLS_FMT_HUMAN) - print_title(tb); - - rc = print_header(tb, buf); - if (rc) - goto done; - - if (scols_table_is_tree(tb)) - rc = print_tree(tb, buf); - else - rc = print_table(tb, buf); - - fput_table_close(tb); -done: - cleanup_printing(tb, buf); - return rc; -} - -/** - * scols_print_table: - * @tb: table - * - * Prints the table to the output stream and terminate by \n. - * - * Returns: 0, a negative value in case of an error. - */ -int scols_print_table(struct libscols_table *tb) -{ - int empty = 0; - int rc = __scols_print_table(tb, &empty); - - if (rc == 0 && !empty) - fputc('\n', tb->out); - return rc; -} - -/** - * scols_print_table_to_string: - * @tb: table - * @data: pointer to the beginning of a memory area to print to - * - * Prints the table to @data. - * - * Returns: 0, a negative value in case of an error. - */ -#ifdef HAVE_OPEN_MEMSTREAM -int scols_print_table_to_string(struct libscols_table *tb, char **data) -{ - FILE *stream, *old_stream; - size_t sz; - int rc; - - if (!tb) - return -EINVAL; - - DBG(TAB, ul_debugobj(tb, "printing to string")); - - /* create a stream for output */ - stream = open_memstream(data, &sz); - if (!stream) - return -ENOMEM; - - old_stream = scols_table_get_stream(tb); - scols_table_set_stream(tb, stream); - rc = __scols_print_table(tb, NULL); - fclose(stream); - scols_table_set_stream(tb, old_stream); - - return rc; -} -#else -int scols_print_table_to_string( - struct libscols_table *tb __attribute__((__unused__)), - char **data __attribute__((__unused__))) -{ - return -ENOSYS; -} -#endif - |