Blame bindings/utils.c

Packit 228f82
/*
Packit 228f82
 * In this file we put utility functions shared by all bindings.
Packit 228f82
 *
Packit 228f82
 * They usually are data structure manipulation or conversion functions.
Packit 228f82
 */
Packit 228f82
#include <libxml/tree.h>
Packit 228f82
#include "../lasso/utils.h"
Packit 228f82
Packit 228f82
/**
Packit 228f82
 * lasso_string_fragment_to_xmlnode:
Packit 228f82
 * @fragment: a fragment of an XML document
Packit 228f82
 * @size: 
Packit 228f82
 *
Packit 228f82
 * Try to get one and only one node from a string, the node can be a simple string or a single node.
Packit 228f82
 *
Packit 228f82
 * Return value: a newly allocated xmlNode* or NULL if parsing fails.
Packit 228f82
 */
Packit 228f82
static xmlNode*
Packit 228f82
lasso_string_fragment_to_xmlnode(const char *fragment, int size) {
Packit 228f82
	xmlDoc *doc = NULL;
Packit 228f82
	xmlNode *node = NULL;
Packit 228f82
	xmlNode *list = NULL, *ref = NULL;
Packit 228f82
	xmlParserErrors errors;
Packit 228f82
Packit 228f82
	if (size == 0) {
Packit 228f82
		size = strlen(fragment);
Packit 228f82
	}
Packit 228f82
Packit 228f82
	/* single node case, with preceding or following spaces */
Packit 228f82
	doc = xmlReadMemory(fragment, size, NULL, NULL, XML_PARSE_NONET);
Packit 228f82
	if (doc) {
Packit 228f82
		node = xmlDocGetRootElement(doc);
Packit 228f82
		if (node != NULL) {
Packit 228f82
			node = xmlCopyNode(node, 1);
Packit 228f82
			goto cleanup;
Packit 228f82
		}
Packit 228f82
		lasso_release_doc(doc);
Packit 228f82
	}
Packit 228f82
	/* simple string */
Packit 228f82
	doc = xmlNewDoc(BAD_CAST "1.0");
Packit 228f82
	ref = xmlNewNode(NULL, BAD_CAST "root");
Packit 228f82
Packit 228f82
	xmlDocSetRootElement(doc, ref);
Packit 228f82
	errors  = xmlParseInNodeContext(ref, fragment, size,
Packit 228f82
		XML_PARSE_NONET, &list);
Packit 228f82
	if (errors == XML_ERR_OK && list != NULL && list->next == NULL) {
Packit 228f82
		node = xmlCopyNode(list, 1);
Packit 228f82
	}
Packit 228f82
cleanup:
Packit 228f82
	lasso_release_doc(doc);
Packit 228f82
	lasso_release_xml_node_list(list);
Packit 228f82
	return node;
Packit 228f82
}