static gboolean xml_free_func(GNode *node, gpointer data) { XMLNode *xmlnode = node->data; xml_free_node(xmlnode); return FALSE; }
/** free node */ void xml_free_node( XML_NODE* node ) { XML_NODE* n; if (node == NULL) return; n = node->first_child; while (n != NULL) { XML_NODE* m; m = n->next_sibl; xml_free_node(n); n = m; } xml_free_attr(node->attr_list); if (node->data != NULL) { BMSfreeMemoryArray(&node->data); } assert(node->name != NULL); BMSfreeMemoryArray(&node->name); BMSfreeMemory(&node); #if 0 if (n != NULL) { xml_free_node(n->first_child); xml_free_node(n->next_sibl); xml_free_attr(n->attr_list); if (n->data != NULL) { BMSfreeMemoryArray(&n->data); } assert(n->name != NULL); BMSfreeMemoryArray(&n->name); BMSfreeMemory(&n); } #endif }
/** Parse file */ XML_NODE* xml_process( const char* filename /**< XML file name */ ) { PPOS ppos; XML_NODE* node = NULL; XML_ATTR* attr; int result = FALSE; char* myfilename; ALLOC_FALSE( BMSduplicateMemoryArray(&myfilename, filename, strlen(filename) + 5) ); #ifdef WITH_ZLIB if (access(filename, R_OK) != 0) { strcat(myfilename, ".gz"); /* If .gz also does not work, revert to the old name * to get a better error message. */ if (access(myfilename, R_OK) != 0) strcpy(myfilename, filename); } #endif ppos.fp = FOPEN(myfilename, "r"); if ( ppos.fp == NULL ) perror(myfilename); else { ppos.filename = myfilename; ppos.buf[0] = '\0'; ppos.pos = 0; ppos.lineno = 1; ppos.nextsym = 0; ppos.lastsym = 0; ppos.state = STATE_BEFORE; ppos.top = NULL; node = xml_new_node("#ROOT", ppos.lineno); if ( node == NULL ) { xml_error(&ppos, "Can't create new node"); } else { attr = xml_new_attr("filename", myfilename); if ( attr == NULL ) xml_error(&ppos, "Can't create new attribute"); else { xml_add_attr(node, attr); /* push root node on stack and start to process */ if ( push_pstack(&ppos, node) ) { result = xml_parse(&ppos); clear_pstack(&ppos); } } } if ( ! result && (node != NULL) ) { xml_errmsg(&ppos, "Parsing error, processing stopped", TRUE, __FILE__, __LINE__); xml_free_node(node); node = NULL; } if (FCLOSE(ppos.fp)) perror(myfilename); } BMSfreeMemoryArray(&myfilename); return node; }