util: introduce virXMLFormatElement helper

This helper allows you to better structurize the code if some element
may or may not contains attributes and/or child elements.

Reviewed-by: John Ferlan <jferlan@redhat.com>
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
This commit is contained in:
Pavel Hrdina 2017-08-24 15:08:23 +02:00
parent ef3ea17f62
commit 4e56a3e793
3 changed files with 54 additions and 0 deletions

View File

@ -2956,6 +2956,7 @@ virVHBAPathExists;
virXMLCheckIllegalChars; virXMLCheckIllegalChars;
virXMLChildElementCount; virXMLChildElementCount;
virXMLExtractNamespaceXML; virXMLExtractNamespaceXML;
virXMLFormatElement;
virXMLNodeContentString; virXMLNodeContentString;
virXMLNodeNameEqual; virXMLNodeNameEqual;
virXMLNodeSanitizeNamespaces; virXMLNodeSanitizeNamespaces;

View File

@ -1354,3 +1354,50 @@ virXMLValidatorFree(virXMLValidatorPtr validator)
xmlRelaxNGFree(validator->rng); xmlRelaxNGFree(validator->rng);
VIR_FREE(validator); VIR_FREE(validator);
} }
/**
* virXMLFormatElement
* @buf: the parent buffer where the element will be placed
* @name: the name of the element
* @attrBuf: buffer with attributes for element, may be NULL
* @childBuf: buffer with child elements, may be NULL
*
* Helper to format element where attributes or child elements
* are optional and may not be formatted. If both @attrBuf and
* @childBuf are NULL or are empty buffers the element is not
* formatted.
*
* Returns 0 on success, -1 on error.
*/
int
virXMLFormatElement(virBufferPtr buf,
const char *name,
virBufferPtr attrBuf,
virBufferPtr childBuf)
{
if ((!attrBuf || virBufferUse(attrBuf) == 0) &&
(!childBuf || virBufferUse(childBuf) == 0)) {
return 0;
}
if ((attrBuf && virBufferCheckError(attrBuf) < 0) ||
(childBuf && virBufferCheckError(childBuf) < 0)) {
return -1;
}
virBufferAsprintf(buf, "<%s", name);
if (attrBuf && virBufferUse(attrBuf) > 0)
virBufferAddBuffer(buf, attrBuf);
if (childBuf && virBufferUse(childBuf) > 0) {
virBufferAddLit(buf, ">\n");
virBufferAddBuffer(buf, childBuf);
virBufferAsprintf(buf, "</%s>\n", name);
} else {
virBufferAddLit(buf, "/>\n");
}
return 0;
}

View File

@ -215,4 +215,10 @@ virXMLValidateAgainstSchema(const char *schemafile,
void void
virXMLValidatorFree(virXMLValidatorPtr validator); virXMLValidatorFree(virXMLValidatorPtr validator);
int
virXMLFormatElement(virBufferPtr buf,
const char *name,
virBufferPtr attrBuf,
virBufferPtr childBuf);
#endif /* __VIR_XML_H__ */ #endif /* __VIR_XML_H__ */