]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libsmartcols: implement SCOLS_FL_WRAP
authorIgor Gnatenko <i.gnatenko.brain@gmail.com>
Thu, 21 Jan 2016 08:57:31 +0000 (09:57 +0100)
committerIgor Gnatenko <i.gnatenko.brain@gmail.com>
Fri, 22 Jan 2016 11:51:45 +0000 (12:51 +0100)
Reference: https://github.com/karelzak/util-linux/issues/257
Signed-off-by: Igor Gnatenko <i.gnatenko.brain@gmail.com>
libsmartcols/src/column.c
libsmartcols/src/libsmartcols.h.in
libsmartcols/src/libsmartcols.sym
libsmartcols/src/table_print.c

index b31b39063fed0221edc7c1d50adad70a31f96f95..a9891d7f5961c692c8a478b7afb76c994bc92cfc 100644 (file)
@@ -350,3 +350,17 @@ int scols_column_is_noextremes(struct libscols_column *cl)
                return -EINVAL;
        return cl->flags & SCOLS_FL_NOEXTREMES;
 }
+/**
+ * scols_column_is_wrap:
+ * @cl: a pointer to a struct libscols_column instance
+ *
+ * Gets the value of @cl's flag wrap.
+ *
+ * Returns: wrap flag value, negative value in case of an error.
+ */
+int scols_column_is_wrap(struct libscols_column *cl)
+{
+       if (!cl)
+               return -EINVAL;
+       return cl->flags & SCOLS_FL_WRAP;
+}
index 0331f3713ff6ad05fe87a4a40fc3bb619b9b10da..607086a929213a6c44124f1af06534143303d2d1 100644 (file)
@@ -84,6 +84,7 @@ enum {
        SCOLS_FL_STRICTWIDTH = (1 << 3),   /* don't reduce width if column is empty */
        SCOLS_FL_NOEXTREMES  = (1 << 4),   /* ignore extreme fields when count column width*/
        SCOLS_FL_HIDDEN      = (1 << 5),   /* maintain data, but don't print */
+       SCOLS_FL_WRAP        = (1 << 6),   /* wrap long cells across lines */
 };
 
 extern struct libscols_iter *scols_new_iter(int direction);
@@ -129,6 +130,7 @@ extern int scols_column_is_right(struct libscols_column *cl);
 extern int scols_column_is_strict_width(struct libscols_column *cl);
 extern int scols_column_is_hidden(struct libscols_column *cl);
 extern int scols_column_is_noextremes(struct libscols_column *cl);
+extern int scols_column_is_wrap(struct libscols_column *cl);
 
 extern int scols_column_set_flags(struct libscols_column *cl, int flags);
 extern int scols_column_get_flags(struct libscols_column *cl);
index e1e4382eb3fb34b440e3cfe3b835e3b2c131a440..b90cefabe7a5f41d6f7d45ba4c73ae5f36226d61 100644 (file)
@@ -124,6 +124,7 @@ global:
 
 SMARTCOLS_2.28 {
 global:
+       scols_column_is_wrap;
        scols_line_refer_column_data;
        scols_line_set_column_data;
        scols_table_enable_nowrap;
index 8c08e502604ee6fe433d2b7d7fb9ce2d97e60af9..f1b0d5965f04109b99cea0c510424ce76c66c73d 100644 (file)
@@ -327,7 +327,8 @@ static int print_data(struct libscols_table *tb,
        if (is_last_column(tb, cl)
            && len < width
            && !scols_table_is_maxout(tb)
-           && !scols_column_is_right(cl))
+           && !scols_column_is_right(cl)
+           && !scols_column_is_wrap(cl))
                width = len;
 
        /* truncate data */
@@ -351,6 +352,17 @@ static int print_data(struct libscols_table *tb,
                        if (color)
                                fputs(UL_COLOR_RESET, tb->out);
                        len = width;
+               } else if (scols_column_is_wrap(cl)) {
+                       char *p = data;
+
+                       while (*p) {
+                               fprintf(tb->out, "%.*s", (int) width, p);
+                               p += width;
+                               if (*p)
+                                       for (i = 0; i < cl->seqnum; i++)
+                                               print_empty_cell (tb, scols_table_get_column(tb, i),
+                                                                 NULL, buf->bufsz);
+                       }
                } else if (color) {
                        char *p = data;
                        size_t art = buffer_get_safe_art_size(buf);