On Mon, Nov 10, 2025 at 09:39:50 +0100, Michal Privoznik via Devel wrote:
> From: Michal Privoznik <[email protected]>
> 
> Domain capabilities XML is formatted (mostly) using
> FORMAT_PROLOGUE and FORMAT_EPILOGUE macros. These format opening
> and closing stanzas for given element. The FORMAT_PROLOGUE macro
> even tries to be clever and format element onto one line (if the
> element isn't supported), but that's not enough. Fortunately, we
> have virXMLFormatElement() which formats elements properly, so
> let's switch macros into using that.
> 
> Signed-off-by: Michal Privoznik <[email protected]>
> ---
>  src/conf/domain_capabilities.c              | 25 ++++++++++-----------
>  tests/domaincapsdata/bhyve_basic.x86_64.xml |  3 +--
>  tests/domaincapsdata/bhyve_fbuf.x86_64.xml  |  3 +--
>  tests/domaincapsdata/bhyve_uefi.x86_64.xml  |  3 +--
>  4 files changed, 15 insertions(+), 19 deletions(-)
> 
> diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c
> index 78a5b1f56a..be3c4002ab 100644
> --- a/src/conf/domain_capabilities.c
> +++ b/src/conf/domain_capabilities.c
> @@ -374,26 +374,25 @@ virDomainCapsStringValuesFormat(virBuffer *buf,
>  
>  
>  #define FORMAT_PROLOGUE(item) \
> +    g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf); \
> +    g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER; \

Hmm, this isn't great as it pollutes the parent scope.

>      do { \

And this bit is then definitely pointless as you definitely won't be
using this macro as a body of e.g. an 'if' without an explicit block.


>          if (!item || item->supported == VIR_TRISTATE_BOOL_ABSENT) \
>              return; \
> -        virBufferAsprintf(buf, "<" #item " supported='%s'%s\n", \
> -                (item->supported == VIR_TRISTATE_BOOL_YES) ? "yes" : "no", \
> -                (item->supported == VIR_TRISTATE_BOOL_YES) ? ">" : "/>"); \
> -        if (item->supported == VIR_TRISTATE_BOOL_NO) \
> +        virBufferAsprintf(&attrBuf, " supported='%s'", \
> +                          (item->supported == VIR_TRISTATE_BOOL_YES) ? "yes" 
> : "no"); \
> +        if (item->supported == VIR_TRISTATE_BOOL_NO) { \
> +            virXMLFormatElement(buf, #item, &attrBuf, NULL); \
>              return; \
> -        virBufferAdjustIndent(buf, 2); \
> +        } \
>      } while (0)
>  
>  #define FORMAT_EPILOGUE(item) \
> -    do { \
> -        virBufferAdjustIndent(buf, -2); \
> -        virBufferAddLit(buf, "</" #item ">\n"); \
> -    } while (0)
> +    virXMLFormatElement(buf, #item, &attrBuf, &childBuf)
>  

But I do like this change.

I wonder if adding some documentation about the expected usage would be
worth it.

Reviewed-by: Peter Krempa <[email protected]>

Reply via email to