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(a)redhat.com>
---
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] = ¶ms[i];
- n++;
- }
+ if (STRNEQ(params[i].field, name))
+ continue;
+
+ if (type != 0 &&
+ params[i].type != type)
+ continue;
+
+ (*ret)[n++] = ¶ms[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] != ¶ms[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