VIR_XPATH_NODE_AUTORESTORE_NAME is a more generic version of the
VIR_XPATH_NODE_AUTORESTORE macro used to save the 'node' inside a XPath
context struct. The new macro allows specifying the name of the variable
used to save the context so that it can be used multiple times inside a
function's nested scopes.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/util/virxml.h | 19 +++++++++++++++----
1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/src/util/virxml.h b/src/util/virxml.h
index 3b00d20ea9..09a8d89f1e 100644
--- a/src/util/virxml.h
+++ b/src/util/virxml.h
@@ -379,6 +379,20 @@ virXPathContextNodeRestore(virXPathContextNodeSave *save);
G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(virXPathContextNodeSave, virXPathContextNodeRestore);
+/**
+ * VIR_XPATH_NODE_AUTORESTORE_NAME:
+ * @name: name of the temporary variable used to save @ctxt
+ * @ctxt: XML XPath context pointer
+ *
+ * This macro ensures that when the scope where it's used ends, @ctxt's current
+ * node pointer is reset to the original value when this macro was used. The
+ * context is saved into a variable named @name;
+ */
+#define VIR_XPATH_NODE_AUTORESTORE_NAME(_name, _ctxt) \
+ VIR_WARNINGS_NO_UNUSED_VARIABLE \
+ g_auto(virXPathContextNodeSave) _name = { .ctxt = _ctxt,\
+ .node = _ctxt->node}; \
+ VIR_WARNINGS_RESET
/**
* VIR_XPATH_NODE_AUTORESTORE:
* @ctxt: XML XPath context pointer
@@ -387,10 +401,7 @@ G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(virXPathContextNodeSave,
virXPathContextNodeRes
* node pointer is reset to the original value when this macro was used.
*/
#define VIR_XPATH_NODE_AUTORESTORE(_ctxt) \
- VIR_WARNINGS_NO_UNUSED_VARIABLE \
- g_auto(virXPathContextNodeSave) _ctxt ## CtxtSave = { .ctxt = _ctxt,\
- .node = _ctxt->node}; \
- VIR_WARNINGS_RESET
+ VIR_XPATH_NODE_AUTORESTORE_NAME(_ctxt ## CtxtSave, _ctxt)
G_DEFINE_AUTOPTR_CLEANUP_FUNC(xmlDoc, xmlFreeDoc);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(xmlXPathContext, xmlXPathFreeContext);
--
2.37.1