On Fri, Mar 30, 2007 at 11:01:25AM +0100, Mark McLoughlin wrote: > Hi Daniel, > Nice stuff ! > > On Fri, 2007-03-30 at 05:38 -0400, Daniel Veillard wrote: > > > +char * > > +virXPathString(const char *xpath, xmlXPathContextPtr ctxt) { > ... > > + ret = (char *) obj->stringval; > > + obj->stringval = NULL; > > > +int > > +virXPathNodeSet(const char *xpath, xmlXPathContextPtr ctxt, xmlNodePtr **list) { > ... > > + if (list != NULL) { > > + *list = obj->nodesetval->nodeTab; > > + obj->nodesetval->nodeTab = NULL; > > + } > > This is all a little voodooish to me - e.g. you're assuming that > libxml2 allocated these with malloc() and you're also kind of breaking > the abstraction of xmlXPathObject by manipulating the structure like > this. Right, sorry I just wanted to make the API and code as less dependant from libxml2 idioms as possible, but you raise good point ;-) > i.e. you know this works, because you wrote libxml2, but you're not > using the abstraction very cleanly. > > I'd suggest either: > > - copy the memory from the xmlXPathObject and return that > > - make the functions return "libxml memory" and use xmlFree() in the > callers I prefer to copy and limit the libxml2 expertise needed to understand the normal parsing code, so I will implement #1, there is no harm is doing a few extra malloc()/free() at that point there. Daniel -- Red Hat Virtualization group http://redhat.com/virtualization/ Daniel Veillard | virtualization library http://libvirt.org/ veillard@xxxxxxxxxx | libxml GNOME XML XSLT toolkit http://xmlsoft.org/ http://veillard.com/ | Rpmfind RPM search engine http://rpmfind.net/