|
From: Ilya M. <m_...@us...> - 2003-03-23 18:19:32
|
Update of /cvsroot/perl-xml/XML-LibXML-XPathContext
In directory sc8-pr-cvs1:/tmp/cvs-serv14288
Modified Files:
XPathContext.xs
Log Message:
Move common code from LibXML_generic_variable_lookup and
LibXML_generic_extension_function to LibXML_perldata_to_LibXMLdata
Index: XPathContext.xs
===================================================================
RCS file: /cvsroot/perl-xml/XML-LibXML-XPathContext/XPathContext.xs,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- XPathContext.xs 21 Mar 2003 20:11:03 -0000 1.16
+++ XPathContext.xs 23 Mar 2003 18:19:29 -0000 1.17
@@ -112,72 +112,23 @@
}
}
-/* ****************************************************************
- * Variable Lookup
- * **************************************************************** */
-/* Much of the code is borrowed from Matt Sergeant's XML::LibXSLT */
-static xmlXPathObjectPtr
-LibXML_generic_variable_lookup(void* varLookupData,
- const xmlChar *name,
- const xmlChar *ns_uri)
-{
+/* convert perl result structures to LibXML structures */
+xmlXPathObjectPtr
+LibXML_perldata_to_LibXMLdata(xmlXPathParserContextPtr ctxt,
+ SV* perl_result) {
xmlXPathObjectPtr ret;
- SV ** lookup_func;
- SV ** lookup_data;
- I32 count;
- STRLEN n_a;
- SV * perl_result;
- AV * array_result;
- xmlNodePtr tmp_node, tmp_node1;
- dSP;
- char * tmp_string;
- double tmp_double;
- int tmp_int;
- SV * data;
- SV ** fetch;
- data = (SV *) varLookupData;
- if (varLookupData == NULL || !SvROK(data) ||
- SvTYPE(SvRV(data)) != SVt_PVAV) {
- croak("XPathContext: lost variable lookup data structure!\n");
- }
-
- lookup_func = av_fetch((AV *) SvRV(data),0,0 );
- if ( lookup_func == NULL || !SvROK(*lookup_func) || SvTYPE(SvRV(*lookup_func)) != SVt_PVCV ) {
- croak("XPathContext: lost variable lookup function!\n");
- }
- lookup_data = av_fetch((AV *) SvRV(data),1,0 );
-
- ENTER;
- SAVETMPS;
- PUSHMARK(SP);
-
- XPUSHs( (lookup_data != NULL) ? *lookup_data : &PL_sv_undef );
- XPUSHs(sv_2mortal(C2Sv(name,NULL)));
- XPUSHs(sv_2mortal(C2Sv(ns_uri,NULL)));
- PUTBACK ;
-
- count = perl_call_sv(*lookup_func, G_SCALAR|G_EVAL);
-
- SPAGAIN;
- if (SvTRUE(ERRSV)) {
- POPs;
- croak("XPathContext: error coming back from variable lookup function. %s\n", SvPV(ERRSV, n_a));
- }
- if (count != 1) croak("XPathContext: variable lookup function returned more than one argument!\n");
-
- perl_result = POPs;
if (!SvOK(perl_result)) {
ret = (xmlXPathObjectPtr)xmlXPathNewCString("");
goto FINISH;
}
- /* convert perl result structures to LibXML structures */
if (SvROK(perl_result) &&
SvTYPE(SvRV(perl_result)) == SVt_PVAV) {
/* consider any array ref to be a nodelist */
int i = 0;
int length;
SV ** pnode;
+ AV * array_result;
/* warn("result is a node list\n"); */
ret = (xmlXPathObjectPtr) xmlXPathNewNodeSet((xmlNodePtr) NULL);
@@ -189,6 +140,10 @@
sv_derived_from(*pnode,"XML::LibXML::Node")) {
xmlXPathNodeSetAdd(ret->nodesetval,
(xmlNodePtr)PmmSvNode(*pnode));
+ if(ctxt) {
+ LibXML_XPathContext_pool(ctxt->context,
+ (int) PmmSvNode(*pnode), *pnode);
+ }
} else {
warn("XPathContext: ignoring non-node member of a nodelist");
}
@@ -198,25 +153,38 @@
(SvTYPE(SvRV(perl_result)) == SVt_PVMG))
{
if (sv_derived_from(perl_result, "XML::LibXML::Node")) {
+ xmlNodePtr tmp_node;
+
/* warn("result is a node\n"); */
ret = (xmlXPathObjectPtr)xmlXPathNewNodeSet(NULL);
tmp_node = (xmlNodePtr)PmmSvNode(perl_result);
xmlXPathNodeSetAdd(ret->nodesetval,tmp_node);
+ if(ctxt) {
+ LibXML_XPathContext_pool(ctxt->context, (int) PmmSvNode(perl_result),
+ perl_result);
+ }
goto FINISH;
}
else if (sv_isa(perl_result, "XML::LibXML::Boolean")) {
+ int tmp_int;
+
/* warn("result is a boolean\n"); */
tmp_int = SvIV(SvRV(perl_result));
ret = (xmlXPathObjectPtr)xmlXPathNewBoolean(tmp_int);
goto FINISH;
}
else if (sv_isa(perl_result, "XML::LibXML::Literal")) {
+ char * tmp_string;
+ STRLEN n_a;
+
/* warn("result is a literal\n"); */
tmp_string = SvPV(SvRV(perl_result), n_a);
ret = (xmlXPathObjectPtr)xmlXPathNewCString(tmp_string);
goto FINISH;
}
else if (sv_isa(perl_result, "XML::LibXML::Number")) {
+ double tmp_double;
+
/* warn("result is a number\n"); */
tmp_double = SvNV(SvRV(perl_result));
ret = (xmlXPathObjectPtr)xmlXPathNewFloat(tmp_double);
@@ -227,11 +195,72 @@
ret = (xmlXPathObjectPtr)xmlXPathNewFloat(SvNV(perl_result));
} else {
/* warn("result is an unblessed string\n"); */
+ STRLEN n_a;
ret = (xmlXPathObjectPtr)xmlXPathNewCString(SvPV(perl_result, n_a));
}
FINISH:
+ return ret;
+}
+
+
+/* ****************************************************************
+ * Variable Lookup
+ * **************************************************************** */
+/* Much of the code is borrowed from Matt Sergeant's XML::LibXSLT */
+static xmlXPathObjectPtr
+LibXML_generic_variable_lookup(void* varLookupData,
+ const xmlChar *name,
+ const xmlChar *ns_uri)
+{
+ xmlXPathObjectPtr ret;
+ SV ** lookup_func;
+ SV ** lookup_data;
+ I32 count;
+ STRLEN n_a;
+ SV * perl_result;
+ AV * array_result;
+ xmlNodePtr tmp_node, tmp_node1;
+ dSP;
+ char * tmp_string;
+ double tmp_double;
+ int tmp_int;
+ SV * data;
+ SV ** fetch;
+
+ data = (SV *) varLookupData;
+ if (varLookupData == NULL || !SvROK(data) ||
+ SvTYPE(SvRV(data)) != SVt_PVAV) {
+ croak("XPathContext: lost variable lookup data structure!\n");
+ }
+
+ lookup_func = av_fetch((AV *) SvRV(data),0,0 );
+ if ( lookup_func == NULL || !SvROK(*lookup_func) || SvTYPE(SvRV(*lookup_func)) != SVt_PVCV ) {
+ croak("XPathContext: lost variable lookup function!\n");
+ }
+ lookup_data = av_fetch((AV *) SvRV(data),1,0 );
+
+ ENTER;
+ SAVETMPS;
+ PUSHMARK(SP);
+
+ XPUSHs( (lookup_data != NULL) ? *lookup_data : &PL_sv_undef );
+ XPUSHs(sv_2mortal(C2Sv(name,NULL)));
+ XPUSHs(sv_2mortal(C2Sv(ns_uri,NULL)));
+ PUTBACK ;
+
+ count = perl_call_sv(*lookup_func, G_SCALAR|G_EVAL);
+
+ SPAGAIN;
+ if (SvTRUE(ERRSV)) {
+ POPs;
+ croak("XPathContext: error coming back from variable lookup function. %s\n", SvPV(ERRSV, n_a));
+ }
+ if (count != 1) croak("XPathContext: variable lookup function returned more than one argument!\n");
+
+ perl_result = POPs;
+ ret = LibXML_perldata_to_LibXMLdata(NULL, perl_result);
PUTBACK;
FREETMPS;
@@ -391,75 +420,8 @@
if (count != 1) croak("XPathContext: perl-dispatcher in pm file returned more than one argument!\n");
perl_result = POPs;
- if (!SvOK(perl_result)) {
- /* warn("result is a empty\n"); */
- ret = (xmlXPathObjectPtr)xmlXPathNewCString("");
- goto FINISH;
- }
-
- /* convert perl result structures to LibXML structures */
- if (SvROK(perl_result) &&
- SvTYPE(SvRV(perl_result)) == SVt_PVAV) {
- /* consider any array ref to be a nodelist */
- int length = 0;
- SV ** pnode;
-
- /* warn("result is a node list\n"); */
- ret = (xmlXPathObjectPtr) xmlXPathNewNodeSet((xmlNodePtr) NULL);
- array_result = (AV*)SvRV(perl_result);
- length = av_len(array_result);
- for( i=0 ; i <= length ; i++ ) {
- pnode = av_fetch(array_result,i,0);
- if (pnode != NULL && sv_isobject(*pnode) &&
- sv_derived_from(*pnode,"XML::LibXML::Node")) {
- xmlXPathNodeSetAdd(ret->nodesetval,
- (xmlNodePtr)PmmSvNode(*pnode));
- LibXML_XPathContext_pool(ctxt->context,
- (int) PmmSvNode(*pnode), *pnode);
- } else {
- warn("XPathContext: ignoring non-node member of a nodelist");
- }
- }
- goto FINISH;
- } else if (sv_isobject(perl_result) &&
- (SvTYPE(SvRV(perl_result)) == SVt_PVMG))
- {
- if (sv_derived_from(perl_result, "XML::LibXML::Node")) {
- /* warn("result is a node\n"); */
- ret = (xmlXPathObjectPtr)xmlXPathNewNodeSet(NULL);
- tmp_node = (xmlNodePtr)PmmSvNode(perl_result);
- xmlXPathNodeSetAdd(ret->nodesetval,tmp_node);
- LibXML_XPathContext_pool(ctxt->context, (int) PmmSvNode(perl_result),
- perl_result);
- goto FINISH;
- }
- else if (sv_isa(perl_result, "XML::LibXML::Boolean")) {
- /* warn("result is a boolean\n"); */
- tmp_int = SvIV(SvRV(perl_result));
- ret = (xmlXPathObjectPtr)xmlXPathNewBoolean(tmp_int);
- goto FINISH;
- }
- else if (sv_isa(perl_result, "XML::LibXML::Literal")) {
- /* warn("result is a literal\n"); */
- tmp_string = SvPV(SvRV(perl_result), len);
- ret = (xmlXPathObjectPtr)xmlXPathNewCString(tmp_string);
- goto FINISH;
- }
- else if (sv_isa(perl_result, "XML::LibXML::Number")) {
- /* warn("result is a number\n"); */
- tmp_double = SvNV(SvRV(perl_result));
- ret = (xmlXPathObjectPtr)xmlXPathNewFloat(tmp_double);
- goto FINISH;
- }
- } else if (SvNOK(perl_result) || SvIOK(perl_result)) {
- /* warn("result is an unblessed number\n"); */
- ret = (xmlXPathObjectPtr)xmlXPathNewFloat(SvNV(perl_result));
- } else {
- /* warn("result is an unblessed string\n"); */
- ret = (xmlXPathObjectPtr)xmlXPathNewCString(SvPV(perl_result, n_a));
- }
+ ret = LibXML_perldata_to_LibXMLdata(ctxt, perl_result);
- FINISH:
valuePush(ctxt, ret);
PUTBACK;
FREETMPS;
|