]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: qapi: Add helpers for virQEMUQAPISchemaTraverseContext
authorPeter Krempa <pkrempa@redhat.com>
Fri, 12 Apr 2019 13:59:10 +0000 (15:59 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 6 May 2019 07:46:06 +0000 (09:46 +0200)
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>
src/qemu/qemu_qapi.c

index ed2a4992ab795dd859b8a8accd3eccaa4fe21359..a03aab7f9bccda6658b4aa79bb62ae32318b0e03 100644 (file)
@@ -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;