]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libsmartcols: cleanup line separator usage
authorKarel Zak <kzak@redhat.com>
Fri, 16 Sep 2016 11:00:47 +0000 (13:00 +0200)
committerKarel Zak <kzak@redhat.com>
Fri, 16 Sep 2016 11:00:47 +0000 (13:00 +0200)
 * use line separator only to separate lines, not after last line
 * explicitly print \n after table in scols_print_table()
 * don't terminate table by \n or line separator in scols_print_table_to_string()

Note that the patch is little bit trick due to impact to the trees
printing. Now print_tree_line() should be more readable.

Signed-off-by: Karel Zak <kzak@redhat.com>
libsmartcols/src/table.c
libsmartcols/src/table_print.c

index c0cf24636f57f6e62f5d1444abdf0b6e15209368..6a0f8303d901a1f9d1dce528bae564272b8adc56 100644 (file)
@@ -725,7 +725,7 @@ int scols_table_set_symbols(struct libscols_table *tb,
  *
  * Enable/disable line separator printing. This is useful if you want to
  * re-printing the same line more than once (e.g. progress bar). Don't use it
- * if you're not sure.
+ * if you're not sure. This option may be ignored for JSON output.
  *
  * Returns: 0 on success, negative number in case of an error.
  */
index 4c9eaed65c0c95967ecef6458d8328d5667f7a4f..e8a4aa361526268c9ac4aaf0a209ca8ce32a2295 100644 (file)
@@ -637,7 +637,6 @@ static void fput_table_close(struct libscols_table *tb)
                tb->indent--;
                fputs(linesep(tb), tb->out);
                fputc('}', tb->out);
-               fputs(linesep(tb), tb->out);
                tb->indent_last_sep = 1;
        }
 }
@@ -678,16 +677,18 @@ static void fput_line_open(struct libscols_table *tb)
        tb->indent++;
 }
 
-static void fput_line_close(struct libscols_table *tb, int last)
+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->indent_last_sep = 1;
 }
 
@@ -867,9 +868,11 @@ static int print_range(    struct libscols_table *tb,
 
        while (rc == 0 && scols_table_next_line(tb, itr, &ln) == 0) {
 
+               int last = scols_iter_is_last(itr);
+
                fput_line_open(tb);
                rc = print_line(tb, ln, buf);
-               fput_line_close(tb, scols_iter_is_last(itr));
+               fput_line_close(tb, last, last);
 
                if (end && ln == end)
                        break;
@@ -891,38 +894,39 @@ static int print_table(struct libscols_table *tb, struct libscols_buffer *buf)
 static int print_tree_line(struct libscols_table *tb,
                           struct libscols_line *ln,
                           struct libscols_buffer *buf,
-                          int last)
+                          int last,
+                          int last_in_table)
 {
        int rc;
-       struct list_head *p;
 
+       /* print the line */
        fput_line_open(tb);
-
        rc = print_line(tb, ln, buf);
        if (rc)
                goto done;
 
-       if (list_empty(&ln->ln_branch)) {
-               fput_line_close(tb, last);
-               return 0;
-       }
+       /* print children */
+       if (!list_empty(&ln->ln_branch)) {
+               struct list_head *p;
 
-       fput_children_open(tb);
+               fput_children_open(tb);
 
-       /* print all children */
-       list_for_each(p, &ln->ln_branch) {
-               struct libscols_line *chld =
-                               list_entry(p, struct libscols_line, ln_children);
+               /* print all children */
+               list_for_each(p, &ln->ln_branch) {
+                       struct libscols_line *chld =
+                                       list_entry(p, struct libscols_line, ln_children);
+                       int last_child = p->next == &ln->ln_branch;
 
-               rc = print_tree_line(tb, chld, buf, p->next == &ln->ln_branch);
-               if (rc)
-                       goto done;
-       }
+                       rc = print_tree_line(tb, chld, buf, last_child, last_in_table && last_child);
+                       if (rc)
+                               goto done;
+               }
 
-       fput_children_close(tb);
+               fput_children_close(tb);
+       }
 
-       if (scols_table_is_json(tb))
-               fput_line_close(tb, last);
+       if (list_empty(&ln->ln_branch) || scols_table_is_json(tb))
+               fput_line_close(tb, last, last_in_table);
 done:
        return rc;
 }
@@ -947,7 +951,7 @@ static int print_tree(struct libscols_table *tb, struct libscols_buffer *buf)
        while (rc == 0 && scols_table_next_line(tb, &itr, &ln) == 0) {
                if (ln->parent)
                        continue;
-               rc = print_tree_line(tb, ln, buf, ln == last);
+               rc = print_tree_line(tb, ln, buf, ln == last, ln == last);
        }
 
        return rc;
@@ -1515,15 +1519,7 @@ int scols_table_print_range_to_string(   struct libscols_table *tb,
 #endif
 }
 
-/**
- * scols_print_table:
- * @tb: table
- *
- * Prints the table to the output stream.
- *
- * Returns: 0, a negative value in case of an error.
- */
-int scols_print_table(struct libscols_table *tb)
+static int __scols_print_table(struct libscols_table *tb)
 {
        int rc = 0;
        struct libscols_buffer *buf;
@@ -1563,6 +1559,23 @@ done:
        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 rc = __scols_print_table(tb);
+
+       if (rc == 0)
+               fputc('\n', tb->out);
+       return rc;
+}
+
 /**
  * scols_print_table_to_string:
  * @tb: table
@@ -1591,7 +1604,7 @@ int scols_print_table_to_string(struct libscols_table *tb, char **data)
 
        old_stream = scols_table_get_stream(tb);
        scols_table_set_stream(tb, stream);
-       rc = scols_print_table(tb);
+       rc = __scols_print_table(tb);
        fclose(stream);
        scols_table_set_stream(tb, old_stream);