perl-XML-LibXML / Devel.xs

ElDiabolo 189b088 





























































Aaron Crane c7644f7 
ElDiabolo 189b088 

Aaron Crane c7644f7 
ElDiabolo 189b088 






Aaron Crane c7644f7 

ElDiabolo 189b088 







Aaron Crane c7644f7 

ElDiabolo 189b088 





Aaron Crane c7644f7 

ElDiabolo 189b088 




ElDiabolo 9967285 


Aaron Crane c7644f7 

ElDiabolo 9967285 




ElDiabolo 189b088 



Aaron Crane c7644f7 
ElDiabolo 189b088 

Aaron Crane c7644f7 
ElDiabolo 189b088 










/* $Id: Devel.xs 20 2011-10-11 02:05:01Z jo $
 *
 * This is free software, you may use it and distribute it under the same terms as
 * Perl itself.
 *
 * Copyright 2011 Joachim Zobel
 * 
 * This module gives external access to the functions needed to create 
 * and use XML::LibXML::Nodes from C functions. These functions are made 
 * accessible from Perl to have cleaner dependencies.
 * The idea is to pass xmlNode * pointers (as typemapped void *) to and 
 * from Perl and call the functions that turns them to and from  
 * XML::LibXML::Nodes there.  
 *
 * Be aware that using this module gives you the ability to easily create
 * segfaults and memory leaks.
 */

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"

#include <stdlib.h>

/* XML::LibXML stuff */
#include <libxml/xmlmemory.h>
#include "perl-libxml-mm.h"

#undef NDEBUG
#include <assert.h>

static void *	xmlMemMallocAtomic(size_t size)
{
    return xmlMallocAtomicLoc(size, "none", 0);
}

static int debug_memory()
{
    return xmlGcMemSetup( xmlMemFree,
                          xmlMemMalloc,
                          xmlMemMallocAtomic,
                          xmlMemRealloc,
                          xmlMemStrdup);
}

MODULE = XML::LibXML::Devel		PACKAGE = XML::LibXML::Devel		

PROTOTYPES: DISABLE

BOOT:
    if (getenv("DEBUG_MEMORY")) {
        debug_memory();
    }



SV*
node_to_perl( n, o = NULL )
        void * n
        void * o
    PREINIT:
        xmlNode *node = n;
        xmlNode *owner = o;
    CODE:
        RETVAL = PmmNodeToSv(node , owner?owner->_private:NULL );
    OUTPUT:
        RETVAL

void *
node_from_perl( sv )
        SV *sv
    PREINIT:
        xmlNode *n = PmmSvNodeExt(sv, 0);
    CODE:
        RETVAL = n;
    OUTPUT:
        RETVAL

void 
refcnt_inc( n )
        void *n
    PREINIT:
        xmlNode *node = n;
    CODE:
        PmmREFCNT_inc(((ProxyNode *)(node->_private)));

int 
refcnt_dec( n )
        void *n
    PREINIT:
        xmlNode *node = n;
    CODE:
        RETVAL = PmmREFCNT_dec(((ProxyNode *)(node->_private)));
    OUTPUT:
        RETVAL

int 
refcnt( n )
        void *n
    PREINIT:
        xmlNode *node = n;
    CODE:
        RETVAL = PmmREFCNT(((ProxyNode *)(node->_private)));
    OUTPUT:
        RETVAL

int
fix_owner( n, p )
        void * n
        void * p
    PREINIT:
        xmlNode *node = n;
        xmlNode *parent = p;
    CODE:
        RETVAL = PmmFixOwner(node->_private , parent->_private);
    OUTPUT:
        RETVAL

int
mem_used()
    CODE:
        RETVAL = xmlMemUsed();
    OUTPUT:
        RETVAL
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.