/** * @brief Creates a tech group from an XML node. */ tech_group_t *tech_groupCreateXML( xmlNodePtr node ) { tech_group_t *tech; /* Load data. */ tech = tech_groupCreate(); tech_parseNodeData( tech, node ); return tech; }
/** * @brief Creates a tech group. */ tech_group_t *tech_groupCreate( xmlNodePtr node ) { tech_group_t *tech; /* Load data. */ tech = calloc( sizeof(tech_group_t), 1 ); tech_parseNodeData( tech, node ); return tech; }
/** * @brief Creates a tech group from an XML node. */ tech_group_t *tech_groupCreateXML( xmlNodePtr node ) { tech_group_t *tech; /* Load data. */ tech = tech_groupCreate(); tech_parseNodeData( tech, node ); if (tech->items == NULL) { tech_groupDestroy(tech); tech = NULL; } return tech; }
/** * @brief Loads the tech information. */ int tech_load (void) { int i, ret, s; uint32_t bufsize; char *buf, *data; xmlNodePtr node, parent; xmlDocPtr doc; tech_group_t *tech; /* Load the data. */ data = ndata_read( TECH_DATA, &bufsize ); if (data == NULL) return -1; /* Load the document. */ doc = xmlParseMemory( data, bufsize ); if (doc == NULL) { WARN("'%s' is not a valid XML file.", TECH_DATA); return -1; } /* Load root element. */ parent = doc->xmlChildrenNode; if (!xml_isNode(parent,XML_TECH_ID)) { WARN("Malformed "TECH_DATA" file: missing root element '"XML_TECH_ID"'"); return -1; } /* Get first node. */ node = parent->xmlChildrenNode; if (node == NULL) { WARN("Malformed "TECH_DATA" file: does not contain elements"); return -1; } /* Create the array. */ tech_groups = array_create( tech_group_t ); /* First pass create the groups - needed to reference them later. */ ret = 0; tech = NULL; do { xml_onlyNodes(node); /* Must match tag. */ if (!xml_isNode(node, XML_TECH_TAG)) { WARN("'"XML_TECH_ID"' has unknown node '%s'.", node->name); continue; } if (ret==0) /* Write over failures. */ tech = &array_grow( &tech_groups ); ret = tech_parseNode( tech, node ); } while (xml_nextNode(node)); array_shrink( &tech_groups ); /* Now we load the data. */ node = parent->xmlChildrenNode; s = array_size( tech_groups ); do { /* Must match tag. */ if (!xml_isNode(node, XML_TECH_TAG)) continue; /* Must avoid warning by checking explicit NULL. */ xmlr_attr( node, "name", buf ); if (buf == NULL) continue; /* Load next tech. */ for (i=0; i<s; i++) { tech = &tech_groups[i]; if (strcmp(tech->name, buf)==0) tech_parseNodeData( tech, node ); } /* Free memory. */ free(buf); } while (xml_nextNode(node)); /* Info. */ DEBUG("Loaded %d tech group%s", s, (s == 1) ? "" : "s" ); /* Free memory. */ free(data); xmlFreeDoc(doc); return 0; }