* @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
virTypedParamsFilter(virTypedParameterPtr params,
int nparams,
const char *name,
+ int type,
virTypedParameterPtr **ret)
{
size_t i;
*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;
*values = NULL;
- nfiltered = virTypedParamsFilter(params, nparams, name, &filtered);
+ nfiltered = virTypedParamsFilter(params, nparams, name, 0, &filtered);
if (nfiltered == 0)
return 0;
{ .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;
VIR_FREE(filtered);
nfiltered = virTypedParamsFilter(params, G_N_ELEMENTS(params),
- "bar", &filtered);
+ "bar", VIR_TYPED_PARAM_UINT, &filtered);
if (nfiltered != 2)
goto cleanup;
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: