From: Peter Krempa Date: Fri, 16 Sep 2022 15:19:44 +0000 (+0200) Subject: util: xml: Introduce VIR_XPATH_NODE_AUTORESTORE_NAME X-Git-Tag: v8.9.0-rc1~158 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ad29c254b67737756283c5e37cf2d81464c67c95;p=thirdparty%2Flibvirt.git util: xml: Introduce VIR_XPATH_NODE_AUTORESTORE_NAME 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 Reviewed-by: Ján Tomko --- diff --git a/src/util/virxml.h b/src/util/virxml.h index d1427e4978..af58d44835 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);