From: Thibaut M. <tma...@us...> - 2003-09-11 23:05:43
|
Update of /cvsroot/xine/xine-lib/src/xine-utils In directory sc8-pr-cvs1:/tmp/cvs-serv24036 Modified Files: xmlparser.c Log Message: Better xml_parser_free_tree() faster and uses less memory fix a segfault with >30Mo files. ok, it's a bit stupid to parse 30Mo xml file, but a crazy tried to parse a 30Mo asx file and he was not happy with the parser. ;) Index: xmlparser.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/xine-utils/xmlparser.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- xmlparser.c 27 Jul 2003 12:47:23 -0000 1.5 +++ xmlparser.c 11 Sep 2003 23:05:39 -0000 1.6 @@ -105,7 +105,12 @@ } } -void xml_parser_free_tree(xml_node_t *current_node) { +static void xml_parser_free_tree_rec(xml_node_t *current_node, int free_next) { + +#ifdef LOG + printf("xml_parser: xml_parser_free_tree_rec: %s\n", current_node->name); +#endif + if (current_node) { /* propertys */ if (current_node->props) { @@ -114,15 +119,36 @@ /* child nodes */ if (current_node->child) { - xml_parser_free_tree(current_node->child); +#ifdef LOG + printf("xml_parser: xml_parser_free_tree_rec: child\n"); +#endif + xml_parser_free_tree_rec(current_node->child, 1); } - if (current_node->next) { - xml_parser_free_tree(current_node->next); + /* next nodes */ + if (free_next) { + xml_node_t *next_node = current_node->next; + xml_node_t *next_next_node; + + while (next_node) { + next_next_node = next_node->next; +#ifdef LOG + printf("xml_parser: xml_parser_free_tree_rec: next\n"); +#endif + xml_parser_free_tree_rec(next_node, 0); + next_node = next_next_node; + } } free_xml_node(current_node); } +} + +void xml_parser_free_tree(xml_node_t *current_node) { +#ifdef LOG + printf("xml_parser: xml_parser_free_tree\n"); +#endif + xml_parser_free_tree_rec(current_node, 1); } #define STATE_IDLE 0 |