static xmlDocPtr hwloc__libxml2_prepare_export_diff(hwloc_topology_diff_t diff, const char *refname) { struct hwloc__xml_export_state_s state; hwloc__libxml_export_state_data_t data = (void *) state.data; xmlDocPtr doc = NULL; /* document pointer */ xmlNodePtr root_node = NULL; /* root pointer */ assert(sizeof(*data) <= sizeof(state.data)); LIBXML_TEST_VERSION; hwloc_libxml2_init_once(); /* Creates a new document, a node and set it as a root node. */ doc = xmlNewDoc(BAD_CAST "1.0"); root_node = xmlNewNode(NULL, BAD_CAST "topologydiff"); if (refname) xmlNewProp(root_node, BAD_CAST "refname", BAD_CAST refname); xmlDocSetRootElement(doc, root_node); /* Creates a DTD declaration. Isn't mandatory. */ (void) xmlCreateIntSubset(doc, BAD_CAST "topologydiff", NULL, BAD_CAST "hwloc.dtd"); state.new_child = hwloc__libxml_export_new_child; state.new_prop = hwloc__libxml_export_new_prop; state.add_content = hwloc__libxml_export_add_content; state.end_object = hwloc__libxml_export_end_object; data->current_node = root_node; hwloc__xml_export_diff (&state, diff); return doc; }
static size_t hwloc___nolibxml_prepare_export_diff(hwloc_topology_diff_t diff, const char *refname, char *xmlbuffer, int buflen) { struct hwloc__xml_export_state_s state, childstate; hwloc__nolibxml_export_state_data_t ndata = (void *) &state.data; int res; HWLOC_BUILD_ASSERT(sizeof(*ndata) <= sizeof(state.data)); state.new_child = hwloc__nolibxml_export_new_child; state.new_prop = hwloc__nolibxml_export_new_prop; state.add_content = hwloc__nolibxml_export_add_content; state.end_object = hwloc__nolibxml_export_end_object; state.global = NULL; ndata->indent = 0; ndata->written = 0; ndata->buffer = xmlbuffer; ndata->remaining = buflen; ndata->nr_children = 1; /* don't close a non-existing previous tag when opening the topology tag */ ndata->has_content = 0; res = hwloc_snprintf(ndata->buffer, ndata->remaining, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" "<!DOCTYPE topologydiff SYSTEM \"hwloc2-diff.dtd\">\n"); hwloc__nolibxml_export_update_buffer(ndata, res); hwloc__nolibxml_export_new_child(&state, &childstate, "topologydiff"); if (refname) hwloc__nolibxml_export_new_prop(&childstate, "refname", refname); hwloc__xml_export_diff (&childstate, diff); hwloc__nolibxml_export_end_object(&childstate, "topologydiff"); return ndata->written+1; }