Re: [xml] xmlGcMemSetup & xmlMemSetup



I tried to use xmlMemSetup and libxml2 gives me an error.
Probably I'm missing something.
This is a simple main I wrote:

#include <libxml/parser.h>
#include <libxml/xmlmemory.h>
#include <libxml/encoding.h>
#include <stdlib.h>

const unsigned int mgc = 0x88DEFEA7;

static void *xml2_alloc(size_t sz)
{
   void *mem = malloc(sz + sizeof(int));
   const unsigned int *mark = mem;
   *mark = mgc;
   return (char *) mem + sizeof(int);
}
static void xml2_free(void *emem)
{
   void *mem = (char *)emem - sizeof(int);
   const unsigned int *mark = mem;
   if (*mark == mgc) {
       free(mem);
   }
}

static void *xml2_realloc(void * emem, size_t sz)
{
   void *mem = (char *)emem - sizeof(int);
   void *mem_re = xmlMemRealloc(mem, sz);
   if (mem_re != NULL)
       return (char *) mem_re + sizeof(int);
   else
       return NULL;
}

xmlDocPtr
parseDoc(char *xmlfile)
{
   xmlDocPtr doc;
   xmlNodePtr root;

   doc = xmlParseFile(xmlfile);

   if (doc == NULL ) {
       fprintf(stderr,"Document not parsed successfully. \n");
       xmlFreeDoc(doc);
       return (NULL);
   }

   root = xmlDocGetRootElement(doc);

   if (root == NULL) {
       fprintf(stderr,"empty document\n");
       xmlFreeDoc(doc);
       return (NULL);
   }

   return doc;

}

int
main(int argc, char **argv) {
   xmlDocPtr doc;
   xmlChar *bufptr;
   int size = 0;
   char *xmlfile = "/usr/local/apache/conf/conf_prova.xml";
xmlMemSetup(xml2_free, xml2_alloc, xml2_realloc, xmlMemoryStrdup);
   xmlInitParser();
doc = parseDoc (xmlfile); if (doc == NULL) {
       fprintf(stderr,"[ERRORE] ParseDoc ha ritornato NULL\n");
       return -1;
   }
fprintf(stderr,"[OK] ParseDoc Ok\n"); xmlFreeDoc(doc);
   xmlCleanupParser();

   return 0;
}

The xml document is very simple:

<?xml version="1.0" encoding="ISO-8859-1"?>
<CONFIGURAZIONE>
       <Q>3</Q>
       <S>
               <H>e</H>
               <P>80</P>
               <L>p.l</L>
               <PAR>
                       <AD>on</AD>
                       <S>off</S>
                       <C>r</C>
                       <N>0</N>
                       <W>1</W>
               </PAR>
       </S>
       .....
</CONFIGURAZIONE>

this is the error I get:


[siteadm sms-lt01 test]$ ./main
xmlMallocBreakpoint reached on block 0
Memory tag error occurs :0x805c140
        bye
Memory tag error occurs :0x805c158
        bye
/usr/local/apache/conf/conf_prova.xml:1: parser error : Memory allocation failed
<?xml version="1.0" encoding="ISO-8859-1"?>
                                      ^
Document not parsed successfully.
[ERRORE] ParseDoc ha ritornato NULL

What am I missing?

Marco


Daniel Veillard ha scritto:
On Tue, Aug 07, 2007 at 12:09:05PM +0200, Marco Spinetti wrote:
Reading the docs, I don't understand the difference between xmlMemSetup and xmlGcMemSetup. I need to overwrite libxml2 memory allocation and I don't understand if I have to use xmlGcMemSetup or xmlMemSetup.
Any hints?

  http://xmlsoft.org/html/libxml-xmlmemory.html#xmlGcMemSetup
the later has an extra function allowing a special function for
allocation of atomic area (i.e. areas which will never be grown).
In doubt use xmlMemSetup()

Other question: is xmlInitMemory(9 should be called before use xmlGcMemSetup or xmlMemSetup?

  no, xmlMemSetup must be the very first call to libxml2 then call
xmlInitParser(). Don't call xmlInitMemory by yourself, xmlInitParser
will do it.

Daniel





[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]