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; |