[PATCH 04/13] virTypedParamsFilter: Introduce option to filter also by type

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The only caller of this function is doing some additional filtering so
it's useful if the filtering function was able to do so internally.

Introduce a 'type' parameter which will optionally filter the results by
type and extend the testsuite to cover this scenario.

Signed-off-by: Peter Krempa <pkrempa@xxxxxxxxxx>
---
 src/util/virtypedparam.c  | 19 +++++++++++++------
 src/util/virtypedparam.h  |  1 +
 tests/virtypedparamtest.c | 14 +++++++++++---
 3 files changed, 25 insertions(+), 9 deletions(-)

diff --git a/src/util/virtypedparam.c b/src/util/virtypedparam.c
index 86fbaf5e9d..a080d7ba0f 100644
--- a/src/util/virtypedparam.c
+++ b/src/util/virtypedparam.c
@@ -391,10 +391,12 @@ virTypedParamsCopy(virTypedParameterPtr *dst,
  * @params: array of typed parameters
  * @nparams: number of parameters in the @params array
  * @name: name of the parameter to find
+ * @type: type of fields to filter (ignored if 0 is passed)
  * @ret: pointer to the returned array
  *
  * Filters @params retaining only the parameters named @name in the
- * resulting array @ret.
+ * resulting array @ret. If @type is non-zero it also filters out parameters
+ * whose type doesn't match @type.
  *
  * Important Caller should free the @ret array but not the items since they are
  * pointing to the @params elements. I.e. callers must not use
@@ -406,6 +408,7 @@ size_t
 virTypedParamsFilter(virTypedParameterPtr params,
                      int nparams,
                      const char *name,
+                     int type,
                      virTypedParameterPtr **ret)
 {
     size_t i;
@@ -414,10 +417,14 @@ virTypedParamsFilter(virTypedParameterPtr params,
     *ret = g_new0(virTypedParameterPtr, nparams);

     for (i = 0; i < nparams; i++) {
-        if (STREQ(params[i].field, name)) {
-            (*ret)[n] = &params[i];
-            n++;
-        }
+        if (STRNEQ(params[i].field, name))
+            continue;
+
+        if (type != 0 &&
+            params[i].type != type)
+            continue;
+
+        (*ret)[n++] = &params[i];
     }

     return n;
@@ -453,7 +460,7 @@ virTypedParamsGetStringList(virTypedParameterPtr params,

     *values = NULL;

-    nfiltered = virTypedParamsFilter(params, nparams, name, &filtered);
+    nfiltered = virTypedParamsFilter(params, nparams, name, 0, &filtered);

     if (nfiltered == 0)
         return 0;
diff --git a/src/util/virtypedparam.h b/src/util/virtypedparam.h
index afd923aacb..774744244a 100644
--- a/src/util/virtypedparam.h
+++ b/src/util/virtypedparam.h
@@ -85,6 +85,7 @@ size_t
 virTypedParamsFilter(virTypedParameterPtr params,
                      int nparams,
                      const char *name,
+                     int type,
                      virTypedParameterPtr **ret)
     G_GNUC_WARN_UNUSED_RESULT;

diff --git a/tests/virtypedparamtest.c b/tests/virtypedparamtest.c
index 5ced453be5..1a8b49383f 100644
--- a/tests/virtypedparamtest.c
+++ b/tests/virtypedparamtest.c
@@ -91,13 +91,14 @@ testTypedParamsFilter(const void *opaque G_GNUC_UNUSED)
         { .field = "bar", .type = VIR_TYPED_PARAM_UINT },
         { .field = "foo", .type = VIR_TYPED_PARAM_INT },
         { .field = "foobar", .type = VIR_TYPED_PARAM_STRING },
-        { .field = "foo", .type = VIR_TYPED_PARAM_INT }
+        { .field = "foo", .type = VIR_TYPED_PARAM_INT },
+        { .field = "foobar", .type = VIR_TYPED_PARAM_INT },
     };
     virTypedParameterPtr *filtered = NULL;


     nfiltered = virTypedParamsFilter(params, G_N_ELEMENTS(params),
-                                     "foo", &filtered);
+                                     "foo", 0, &filtered);
     if (nfiltered != 3)
         goto cleanup;

@@ -108,7 +109,7 @@ testTypedParamsFilter(const void *opaque G_GNUC_UNUSED)
     VIR_FREE(filtered);

     nfiltered = virTypedParamsFilter(params, G_N_ELEMENTS(params),
-                                     "bar", &filtered);
+                                     "bar", VIR_TYPED_PARAM_UINT, &filtered);

     if (nfiltered != 2)
         goto cleanup;
@@ -117,6 +118,13 @@ testTypedParamsFilter(const void *opaque G_GNUC_UNUSED)
         if (filtered[i] != &params[i * 2])
             goto cleanup;
     }
+    VIR_FREE(filtered);
+
+    nfiltered = virTypedParamsFilter(params, G_N_ELEMENTS(params),
+                                     "foobar", VIR_TYPED_PARAM_STRING, &filtered);
+
+    if (nfiltered != 1)
+        goto cleanup;

     rv = 0;
  cleanup:
-- 
2.46.0




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux