mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-01 17:35:17 +00:00
qemu: qapi: Add helpers for virQEMUQAPISchemaTraverseContext
Rather than modifying the context struct add a helpers that does this. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
cea3ed3bb1
commit
0b49f891be
@ -71,11 +71,38 @@ virQEMUQAPISchemaObjectGet(const char *field,
|
||||
|
||||
struct virQEMUQAPISchemaTraverseContext {
|
||||
virHashTablePtr schema;
|
||||
char **query;
|
||||
char **queries;
|
||||
virJSONValuePtr returnType;
|
||||
};
|
||||
|
||||
|
||||
static void
|
||||
virQEMUQAPISchemaTraverseContextInit(struct virQEMUQAPISchemaTraverseContext *ctxt,
|
||||
char **queries,
|
||||
virHashTablePtr schema)
|
||||
{
|
||||
memset(ctxt, 0, sizeof(*ctxt));
|
||||
ctxt->schema = schema;
|
||||
ctxt->queries = queries;
|
||||
}
|
||||
|
||||
|
||||
static const char *
|
||||
virQEMUQAPISchemaTraverseContextNextQuery(struct virQEMUQAPISchemaTraverseContext *ctxt)
|
||||
{
|
||||
const char *query = ctxt->queries[0];
|
||||
ctxt->queries++;
|
||||
return query;
|
||||
}
|
||||
|
||||
|
||||
static bool
|
||||
virQEMUQAPISchemaTraverseContextHasNextQuery(struct virQEMUQAPISchemaTraverseContext *ctxt)
|
||||
{
|
||||
return !!ctxt->queries[0];
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
virQEMUQAPISchemaTraverse(const char *baseName,
|
||||
struct virQEMUQAPISchemaTraverseContext *ctxt);
|
||||
@ -86,7 +113,7 @@ virQEMUQAPISchemaTraverseObject(virJSONValuePtr cur,
|
||||
struct virQEMUQAPISchemaTraverseContext *ctxt)
|
||||
{
|
||||
virJSONValuePtr obj;
|
||||
const char *query = *ctxt->query;
|
||||
const char *query = virQEMUQAPISchemaTraverseContextNextQuery(ctxt);
|
||||
char modifier = *query;
|
||||
|
||||
if (!c_isalpha(modifier))
|
||||
@ -105,8 +132,6 @@ virQEMUQAPISchemaTraverseObject(virJSONValuePtr cur,
|
||||
if (!obj)
|
||||
return 0;
|
||||
|
||||
ctxt->query++;
|
||||
|
||||
return virQEMUQAPISchemaTraverse(virJSONValueObjectGetString(obj, "type"), ctxt);
|
||||
}
|
||||
|
||||
@ -129,13 +154,12 @@ static int
|
||||
virQEMUQAPISchemaTraverseCommand(virJSONValuePtr cur,
|
||||
struct virQEMUQAPISchemaTraverseContext *ctxt)
|
||||
{
|
||||
const char *query = virQEMUQAPISchemaTraverseContextNextQuery(ctxt);
|
||||
const char *querytype;
|
||||
|
||||
if (!(querytype = virJSONValueObjectGetString(cur, *ctxt->query)))
|
||||
if (!(querytype = virJSONValueObjectGetString(cur, query)))
|
||||
return 0;
|
||||
|
||||
ctxt->query++;
|
||||
|
||||
return virQEMUQAPISchemaTraverse(querytype, ctxt);
|
||||
}
|
||||
|
||||
@ -150,7 +174,7 @@ virQEMUQAPISchemaTraverse(const char *baseName,
|
||||
if (!(cur = virHashLookup(ctxt->schema, baseName)))
|
||||
return 0;
|
||||
|
||||
if (!ctxt->query[0]) {
|
||||
if (!virQEMUQAPISchemaTraverseContextHasNextQuery(ctxt)) {
|
||||
ctxt->returnType = cur;
|
||||
return 1;
|
||||
}
|
||||
@ -214,7 +238,7 @@ virQEMUQAPISchemaPathGet(const char *query,
|
||||
virJSONValuePtr *entry)
|
||||
{
|
||||
VIR_AUTOSTRINGLIST elems = NULL;
|
||||
struct virQEMUQAPISchemaTraverseContext ctxt = { .schema = schema };
|
||||
struct virQEMUQAPISchemaTraverseContext ctxt;
|
||||
int rc;
|
||||
|
||||
if (entry)
|
||||
@ -228,9 +252,9 @@ virQEMUQAPISchemaPathGet(const char *query,
|
||||
return -1;
|
||||
}
|
||||
|
||||
ctxt.query = elems + 1;
|
||||
virQEMUQAPISchemaTraverseContextInit(&ctxt, elems, schema);
|
||||
|
||||
rc = virQEMUQAPISchemaTraverse(elems[0], &ctxt);
|
||||
rc = virQEMUQAPISchemaTraverse(virQEMUQAPISchemaTraverseContextNextQuery(&ctxt), &ctxt);
|
||||
|
||||
if (entry)
|
||||
*entry = ctxt.returnType;
|
||||
|
Loading…
x
Reference in New Issue
Block a user