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@xxxxxxxxxx> --- 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