Your two errors are caused because you are attempting to use the xml2
library functions xmlMemRealloc and xmlMemoryStrdup within your
"personal" routines. This kind of "mixing" may not be done. Within your
function "xml2_realloc" you should only call upon realloc, and you should
provide "your own" version of strdup (probably calling xml2_alloc and
memcpy).
Bill
Marco Spinetti wrote:
> 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:
>
>
> [EMAIL PROTECTED] 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
>>
>>
>
> _______________________________________________
> xml mailing list, project page http://xmlsoft.org/
> [email protected]
> http://mail.gnome.org/mailman/listinfo/xml
>
_______________________________________________
xml mailing list, project page http://xmlsoft.org/
[email protected]
http://mail.gnome.org/mailman/listinfo/xml