]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libsmartcols: search also by normalized column names (aka 'shellvar' name)
authorKarel Zak <kzak@redhat.com>
Tue, 26 Sep 2023 12:44:02 +0000 (14:44 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 20 Nov 2023 21:25:46 +0000 (22:25 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
libsmartcols/src/column.c
libsmartcols/src/filter-param.c
libsmartcols/src/libsmartcols.h.in
libsmartcols/src/libsmartcols.sym
libsmartcols/src/table.c

index 669568c6c84a3bcec68a6cf86bab97b1c8e12f5a..f0a395373da4d25fd865ecadef3dea394d0727f6 100644 (file)
@@ -279,6 +279,58 @@ const char *scols_column_get_name(struct libscols_column *cl)
        return scols_cell_get_data(&cl->header);
 }
 
+/**
+ * scols_shellvar_name:
+ * @name: raw (column) name
+ * @schellvar: returns normalized name
+ *
+ * Converts @name to a name compatible with shell. The buffer is reallocated if
+ * not large enough.
+ *
+ * Returns: 0 in case of conversion, 1 if conversion unnecessary, <0 on error.
+ *
+ * Since: 2.40
+ */
+int scols_shellvar_name(const char *name, char **buf, size_t *bufsz)
+{
+       char *p;
+       const char *s;
+       size_t sz;
+
+       if (!name || !*name || !buf || !bufsz)
+               return -EINVAL;
+
+       /* size to convert "1FOO%" --> "_1FOO_PCT */
+       sz = strlen(name) + 1 + 3;
+       if (sz + 1 > *bufsz) {
+               char *tmp;
+
+               *bufsz = sz + 1;
+               tmp = realloc(*buf, *bufsz);
+               if (!tmp)
+                       return -ENOMEM;
+               *buf = tmp;
+       }
+       memset(*buf, 0, *bufsz);
+       p = *buf;
+
+        /* convert "1FOO" to "_1FOO" */
+       if (!isalpha(*name))
+               *p++ = '_';
+
+       /* replace all "bad" chars with "_" */
+       for (s = name; *s; s++)
+               *p++ = !isalnum(*s) ? '_' : *s;
+
+       if (!*s && *(s - 1) == '%') {
+               *p++ = 'P';
+               *p++ = 'C';
+               *p++ = 'T';
+       }
+
+       return strcmp(name, *buf) == 0;
+}
+
 /**
  * scols_column_get_name_as_shellvar
  * @cl: a pointer to a struct libscols_column instance
@@ -291,32 +343,13 @@ const char *scols_column_get_name(struct libscols_column *cl)
 const char *scols_column_get_name_as_shellvar(struct libscols_column *cl)
 {
        if (!cl->shellvar) {
-               const char *s, *name = scols_column_get_name(cl);
-               char *p;
-               size_t sz;
+               const char *name = scols_column_get_name(cl);
+               size_t sz = 0;
 
                if (!name || !*name)
                        return NULL;
-
-               /* "1FOO%" --> "_1FOO_PCT */
-               sz = strlen(name) + 1 + 3;
-               p = cl->shellvar = calloc(1, sz + 1);
-               if (!cl->shellvar)
+               if (scols_shellvar_name(name, &cl->shellvar, &sz) < 0)
                        return NULL;
-
-                /* convert "1FOO" to "_1FOO" */
-               if (!isalpha(*name))
-                       *p++ = '_';
-
-               /* replace all "bad" chars with "_" */
-               for (s = name; *s; s++)
-                       *p++ = !isalnum(*s) ? '_' : *s;
-
-               if (!*s && *(s - 1) == '%') {
-                       *p++ = 'P';
-                       *p++ = 'C';
-                       *p++ = 'T';
-               }
        }
        return cl->shellvar;
 }
index f0cb99ac56103ec28d43ce6ecbd681feb47014d0..669dbc82559a43e47ba6ee88454d1f30bf97566d 100644 (file)
@@ -782,7 +782,8 @@ int scols_filter_assign_column(struct libscols_filter *fltr,
                if (n->col)
                        scols_unref_column(n->col);
 
-               DBG(FPARAM, ul_debugobj(n, "assing %s to column", name));
+               DBG(FPARAM, ul_debugobj(n, "assing %s to column %s", name,
+                                       scols_column_get_name(col)));
                n->col = col;
                scols_ref_column(col);
        }
index bca08a869d1d4ee5458bf3e41c3b4d7fb2a786dc..ab585da2233c60689a94f4153ab8a3c45129a9c9 100644 (file)
@@ -222,6 +222,7 @@ extern struct libscols_table *scols_column_get_table(const struct libscols_colum
 extern int scols_column_set_name(struct libscols_column *cl, const char *name);
 extern const char *scols_column_get_name(struct libscols_column *cl);
 extern const char *scols_column_get_name_as_shellvar(struct libscols_column *cl);
+extern int scols_shellvar_name(const char *name, char **buf, size_t *bufsz);
 
 extern int scols_column_set_properties(struct libscols_column *cl, const char *opts);
 
index f5a08f140cc317e43054366a62a6ce53453f51dc..5e11ba19b33f814bafa00ded2168d9a9497ab0b0 100644 (file)
@@ -238,4 +238,5 @@ SMARTCOLS_2.40 {
        scols_counter_get_result;
        scols_counter_get_name;
        scols_filter_next_counter;
+       scols_shellvar_name;
 } SMARTCOLS_2.39;
index 0be68f2b835bde657e50a6f450eb03343587d451..3d23da8d9b96796e1739a39fe97b21752bf35f86 100644 (file)
@@ -676,6 +676,15 @@ struct libscols_column *scols_table_get_column_by_name(
                if (cn && strcmp(cn, name) == 0)
                        return cl;
        }
+
+       scols_reset_iter(&itr, SCOLS_ITER_FORWARD);
+       while (scols_table_next_column(tb, &itr, &cl) == 0) {
+               const char *cn = scols_column_get_name_as_shellvar(cl);
+
+               if (cn && strcmp(cn, name) == 0)
+                       return cl;
+       }
+
        return NULL;
 }