Update of /cvsroot/perl-xml/XML-LibXML-XPathContext
In directory sc8-pr-cvs1:/tmp/cvs-serv10387
Modified Files:
XPathContext.xs
Log Message:
- changed #include "xpathInternals.h" to
#include <libxml/xpathInternals.h>
- allow XML::LibXML::XPathContext->new() without a node or document
Index: XPathContext.xs
===================================================================
RCS file: /cvsroot/perl-xml/XML-LibXML-XPathContext/XPathContext.xs,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -d -r1.26 -r1.27
--- XPathContext.xs 29 Mar 2003 15:43:54 -0000 1.26
+++ XPathContext.xs 2 Apr 2003 14:07:08 -0000 1.27
@@ -12,12 +12,12 @@
/* libxml2 stuff */
#include <libxml/xpath.h>
+#include <libxml/xpathInternals.h>
/* XML::LibXML stuff */
#include "perl-libxml-mm.h"
#include "xpath.h"
-#include "xpathInternals.h"
#ifdef __cplusplus
}
@@ -418,7 +418,11 @@
LibXML_configure_xpathcontext( xmlXPathContextPtr ctxt ) {
xmlNodePtr node = PmmSvNode(XPathContextDATA(ctxt)->node);
- ctxt->doc = node->doc;
+ if (node != NULL) {
+ ctxt->doc = node->doc;
+ } else {
+ ctxt->doc = NULL;
+ }
ctxt->node = node;
LibXML_configure_namespaces(ctxt);
@@ -429,18 +433,25 @@
PROTOTYPES: DISABLE
SV*
-new( CLASS, pnode )
+new( CLASS, ... )
const char * CLASS
- SV * pnode
+ PREINIT:
+ SV * pnode = &PL_sv_undef;
INIT:
xmlXPathContextPtr ctxt;
- CODE:
+ CODE:
+ if( items > 1 )
+ pnode = ST(1);
+
ctxt = xmlXPathNewContext( NULL );
New(0, ctxt->user, sizeof(XPathContextData), XPathContextData);
if (ctxt->user == NULL) {
croak("XPathContext: failed to allocate proxy object");
}
- XPathContextDATA(ctxt)->node = SvREFCNT_inc(pnode);
+
+ if (SvOK(pnode)) {
+ XPathContextDATA(ctxt)->node = SvREFCNT_inc(pnode);
+ }
XPathContextDATA(ctxt)->lock = 0;
XPathContextDATA(ctxt)->pool = NULL;
@@ -464,10 +475,12 @@
xs_warn( "DESTROY XPATH CONTEXT" );
if (ctxt) {
if (XPathContextDATA(ctxt) != NULL) {
- if (XPathContextDATA(ctxt)->node != NULL) {
+ if (XPathContextDATA(ctxt)->node != NULL &&
+ SvOK(XPathContextDATA(ctxt)->node)) {
SvREFCNT_dec(XPathContextDATA(ctxt)->node);
}
- if (XPathContextDATA(ctxt)->pool != NULL) {
+ if (XPathContextDATA(ctxt)->pool != NULL &&
+ SvOK(XPathContextDATA(ctxt)->pool)) {
SvREFCNT_dec((SV *)XPathContextDATA(ctxt)->pool);
}
Safefree(XPathContextDATA(ctxt));
@@ -503,7 +516,7 @@
PmmOWNERPO( PmmPROXYNODE(ctxt->node)));
} else {
- croak("XPathContext: lost context node");
+ /* croak("XPathContext: lost context node"); */
RETVAL = &PL_sv_undef;
}
OUTPUT:
@@ -519,11 +532,13 @@
croak("XPathContext: missing xpath context");
}
PPCODE:
- if (XPathContextDATA(ctxt)->node) {
+ if (XPathContextDATA(ctxt)->node && SvOK(XPathContextDATA(ctxt)->node)) {
SvREFCNT_dec(XPathContextDATA(ctxt)->node);
}
XPathContextDATA(ctxt)->node = pnode;
- SvREFCNT_inc(pnode);
+ if (SvOK(pnode)) {
+ SvREFCNT_inc(pnode);
+ }
void
registerNs( pxpath_context, prefix, ns_uri )
|