/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the XML::Sablotron::DOM module.
*
* The Initial Developer of the Original Code is Ginfer Alliance Ltd.
* Portions created by Ginger Alliance are
* Copyright (C) 1999-2000 Ginger Alliance Ltd..
* All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the
* terms of the GNU General Public License Version 2 or later (the
* "GPL"), in which case the provisions of the GPL are applicable
* instead of those above. If you wish to allow use of your
* version of this file only under the terms of the GPL and not to
* allow others to use your version of this file under the MPL,
* indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by
* the GPL. If you do not delete the provisions above, a recipient
* may use your version of this file under either the MPL or the
* GPL.
*/
/*
*
* ../Sablotron.xs includes this file
*
*/
#include "DOMhandler_stubs.h"
DOMHandler DOMH_handler_vector = {
NULL, /* DOMH_getNodeType */
NULL, /* DOMH_getNodeName */
NULL, /* DOMH_getNodeNameURI */
NULL, /* DOMH_getNodeNameLocal */
NULL, /* DOMH_getNodeValue */
NULL, /* DOMH_getNextSibling */
NULL, /* DOMH_getPreviousSibling */
NULL, /* DOMH_getNextAttrNS */
NULL, /* DOMH_getPreviousAttrNS */
NULL, /* DOMH_getChildCount */
NULL, /* DOMH_getAttributeCount */
NULL, /* DOMH_getNamespaceCount */
NULL, /* DOMH_getChildNo */
NULL, /* DOMH_getAttributeNo */
NULL, /* DOMH_getNamespaceNo */
NULL, /* DOMH_getParent */
NULL, /* DOMH_getOwnerDocument */
NULL, /* DOMH_compareNodes */
NULL, /* DOMH_retrieveDocument */
NULL, /* DOMH_getNodeWithID */
/* optional entries - driven by sxpOptions */
NULL, /* DOMH_freeBuffer */
/* entries with userData acces */
DOMHandlerGetNodeTypeStub, /* DOMH_getNodeTypeExt */
DOMHandlerGetNodeNameStub, /* DOMH_getNodeNameExt */
DOMHandlerGetNodeNameURIStub, /* DOMH_getNodeNameURIExt */
DOMHandlerGetNodeNameLocalStub, /* DOMH_getNodeNameLocalExt */
DOMHandlerGetNodeValueStub, /* DOMH_getNodeValueExt */
DOMHandlerGetNextSiblingStub, /* DOMH_getNextSiblingExt */
DOMHandlerGetPreviousSiblingStub, /* DOMH_getPreviousSiblingExt */
DOMHandlerGetNextAttrNSStub, /* DOMH_getNextAttrNSExt */
DOMHandlerGetPreviousAttrNSStub, /* DOMH_getPreviousAttrNSExt */
DOMHandlerGetChildCountStub, /* DOMH_getChildCountExt */
DOMHandlerGetAttributeCountStub, /* DOMH_getAttributeCountExt */
DOMHandlerGetNamespaceCountStub, /* DOMH_getNamespaceCountExt */
DOMHandlerGetChildNoStub, /* DOMH_getChildNoExt */
DOMHandlerGetAttributeNoStub, /* DOMH_getAttributeNoExt */
DOMHandlerGetNamespaceNoStub, /* DOMH_getNamespaceNoExt */
DOMHandlerGetParentStub, /* DOMH_getParentExt */
DOMHandlerGetOwnerDocumentStub, /* DOMH_getOwnerDocumentExt */
DOMHandlerCompareNodesStub, /* DOMH_compareNodesExt */
DOMHandlerRetrieveDocumentStub, /* DOMH_retrieveDocumentExt */
DOMHandlerGetNodeWithIDStub, /* DOMH_getNodeWithIDExt */
/*optional entries - driven by sxpOptions */
DOMHandlerFreeBufferStub /* DOMH_freeBufferExt */
};
/*************************************************************
*
* stubs for all DOMHandler
*
* In functions returning other values than integers or chars,
* it might be necessary to define some macros retrieving those
* values from the SV.
*
*************************************************************/
static SXP_Node _SV2SXP_Node(SV * sv)
{
SXP_Node ret = NULL;
#if SIT_DEBUG
int retIsSv = 0;
#endif
if (sv) {
#if SIT_DEBUG
fprintf(stderr, "Situation.h::_SV2SXP_Node: sv %p (%d) ",sv,SvREFCNT(sv));
#endif
if (! SvROK(sv)) {
ret = (SXP_Node) SvIV(sv);
#if SIT_DEBUG
fprintf(stderr, "ret int=%p\n", ret);
#endif
} else {
ret = SvRV(sv);
#if SIT_DEBUG
retIsSv = 1;
#endif
}
SvREFCNT_dec(sv);
#if SIT_DEBUG
if( retIsSv )
fprintf(stderr, "ret %p (%d)\n", ret, SvREFCNT((SV*)ret));
#endif
}
#if SIT_DEBUG
else
{
fprintf(stderr, "Situation.h::_SV2SXP_Node: sv=NULL\n");
}
#endif
return ret;
}
#define XPUSH_WRAPPER_AND_SIT( userData ) \
do{ \
XPUSHs( *hv_fetch((HV*) (userData), "DOMHandler", 10, 0) ); \
XPUSHs( sv_2mortal(newRV_inc((SV*) (userData) )) ); \
}while(0)
SXP_NodeType
DOMHandlerGetNodeTypeStub( SXP_Node node, void *userData )
{
SV *node_obj;
SXP_NodeType ret = (SXP_NodeType) SXP_NONE;
node_obj = (SV*) node;
{
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSH_WRAPPER_AND_SIT( userData );
if (node_obj)
XPUSHs(sv_2mortal(newRV_inc(node_obj)));
else
XPUSHs(&PL_sv_undef);
PUTBACK;
perl_call_method("DHGetNodeType", G_SCALAR);
SPAGAIN;
ret = (SXP_NodeType) POPi;
PUTBACK;
FREETMPS;
LEAVE;
}
return ret;
}
const SXP_char*
DOMHandlerGetNodeNameStub( SXP_Node node, void *userData )
{
SV *node_obj;
SV *retsv;
SXP_char* ret = NULL;
node_obj = (SV*) node;
{
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSH_WRAPPER_AND_SIT( userData );
if (node_obj)
XPUSHs(sv_2mortal(newRV_inc(node_obj)));
else
XPUSHs(&PL_sv_undef);
PUTBACK;
perl_call_method("DHGetNodeName", G_SCALAR);
SPAGAIN;
/* ??? Do we keep the memory reserved for the string ??? */
retsv = POPs;
if ( SvPOK(retsv) )
ret = savepv( SvPV_nolen(retsv) );
PUTBACK;
FREETMPS;
LEAVE;
}
return ret;
}
const SXP_char*
DOMHandlerGetNodeNameURIStub( SXP_Node node, void *userData )
{
SV *node_obj;
SV *retsv;
SXP_char* ret = NULL;
node_obj = (SV*) node;
{
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSH_WRAPPER_AND_SIT( userData );
if (node_obj)
XPUSHs(sv_2mortal(newRV_inc(node_obj)));
else
XPUSHs(&PL_sv_undef);
PUTBACK;
perl_call_method("DHGetNodeNameURI", G_SCALAR);
SPAGAIN;
retsv = POPs;
if ( SvPOK(retsv) )
ret = savepv( SvPV_nolen(retsv) );
PUTBACK;
FREETMPS;
LEAVE;
}
return ret;
}
const SXP_char*
DOMHandlerGetNodeNameLocalStub( SXP_Node node, void *userData )
{
SV *node_obj;
SV *retsv;
SXP_char* ret = NULL;
node_obj = (SV*) node;
{
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSH_WRAPPER_AND_SIT( userData );
if (node_obj)
XPUSHs(sv_2mortal(newRV_inc(node_obj)));
else
XPUSHs(&PL_sv_undef);
PUTBACK;
perl_call_method("DHGetNodeNameLocal", G_SCALAR);
SPAGAIN;
retsv = POPs;
if ( SvPOK(retsv) )
ret = savepv( SvPV_nolen(retsv) );
PUTBACK;
FREETMPS;
LEAVE;
}
return ret;
}
const SXP_char*
DOMHandlerGetNodeValueStub( SXP_Node node, void *userData )
{
SV *node_obj;
SV *retsv;
SXP_char* ret = NULL;
node_obj = (SV*) node;
{
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSH_WRAPPER_AND_SIT( userData );
if (node_obj)
XPUSHs(sv_2mortal(newRV_inc(node_obj)));
else
XPUSHs(&PL_sv_undef);
PUTBACK;
perl_call_method("DHGetNodeValue", G_SCALAR);
SPAGAIN;
retsv = POPs;
if ( SvPOK(retsv) )
ret = savepv( SvPV_nolen(retsv) );
PUTBACK;
FREETMPS;
LEAVE;
}
return ret;
}
SXP_Node
DOMHandlerGetNextSiblingStub( SXP_Node node, void *userData )
{
SV *node_obj;
SV *retsv;
node_obj = (SV*) node;
{
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSH_WRAPPER_AND_SIT( userData );
if (node_obj)
XPUSHs(sv_2mortal(newRV_inc(node_obj)));
else
XPUSHs(&PL_sv_undef);
PUTBACK;
perl_call_method("DHGetNextSibling", G_SCALAR);
SPAGAIN;
retsv = POPs;
retsv = SvOK(retsv) ? SvREFCNT_inc(retsv) : NULL;
PUTBACK;
FREETMPS;
LEAVE;
}
return _SV2SXP_Node( retsv );
}
SXP_Node
DOMHandlerGetPreviousSiblingStub( SXP_Node node, void *userData )
{
SV *node_obj;
SV *retsv;
node_obj = (SV*) node;
{
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSH_WRAPPER_AND_SIT( userData );
if (node_obj)
XPUSHs(sv_2mortal(newRV_inc(node_obj)));
else
XPUSHs(&PL_sv_undef);
PUTBACK;
perl_call_method("DHGetPreviousSibling", G_SCALAR);
SPAGAIN;
retsv = POPs;
retsv = SvOK(retsv) ? SvREFCNT_inc(retsv) : NULL;
PUTBACK;
FREETMPS;
LEAVE;
}
return _SV2SXP_Node( retsv );
}
SXP_Node
DOMHandlerGetNextAttrNSStub( SXP_Node node, void *userData )
{
SV *node_obj;
SV *retsv;
node_obj = (SV*) node;
{
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSH_WRAPPER_AND_SIT( userData );
if (node_obj)
XPUSHs(sv_2mortal(newRV_inc(node_obj)));
else
XPUSHs(&PL_sv_undef);
PUTBACK;
perl_call_method("DHGetNextAttrNS", G_SCALAR);
SPAGAIN;
retsv = POPs;
retsv = SvOK(retsv) ? SvREFCNT_inc(retsv) : NULL;
PUTBACK;
FREETMPS;
LEAVE;
}
return _SV2SXP_Node( retsv );
}
SXP_Node
DOMHandlerGetPreviousAttrNSStub( SXP_Node node, void *userData )
{
SV *node_obj;
SV *retsv;
node_obj = (SV*) node;
{
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSH_WRAPPER_AND_SIT( userData );
if (node_obj)
XPUSHs(sv_2mortal(newRV_inc(node_obj)));
else
XPUSHs(&PL_sv_undef);
PUTBACK;
perl_call_method("DHGetPreviousAttrNS", G_SCALAR);
SPAGAIN;
retsv = POPs;
retsv = SvOK(retsv) ? SvREFCNT_inc(retsv) : NULL;
PUTBACK;
FREETMPS;
LEAVE;
}
return _SV2SXP_Node( retsv );
}
int
DOMHandlerGetChildCountStub( SXP_Node node, void *userData )
{
SV *node_obj;
int ret = 0;
node_obj = (SV*) node;
{
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSH_WRAPPER_AND_SIT( userData );
if (node_obj)
XPUSHs(sv_2mortal(newRV_inc(node_obj)));
else
XPUSHs(&PL_sv_undef);
PUTBACK;
perl_call_method("DHGetChildCount", G_SCALAR);
SPAGAIN;
ret = POPi;
PUTBACK;
FREETMPS;
LEAVE;
}
return ret;
}
int
DOMHandlerGetAttributeCountStub( SXP_Node node, void *userData )
{
SV *node_obj;
int ret = 0;
node_obj = (SV*) node;
{
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSH_WRAPPER_AND_SIT( userData );
if (node_obj)
XPUSHs(sv_2mortal(newRV_inc(node_obj)));
else
XPUSHs(&PL_sv_undef);
PUTBACK;
perl_call_method("DHGetAttributeCount", G_SCALAR);
SPAGAIN;
ret = POPi;
PUTBACK;
FREETMPS;
LEAVE;
}
return ret;
}
int
DOMHandlerGetNamespaceCountStub( SXP_Node node, void *userData )
{
SV *node_obj;
int ret = 0;
node_obj = (SV*) node;
{
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSH_WRAPPER_AND_SIT( userData );
if (node_obj)
XPUSHs(sv_2mortal(newRV_inc(node_obj)));
else
XPUSHs(&PL_sv_undef);
PUTBACK;
perl_call_method("DHGetNamespaceCount", G_SCALAR);
SPAGAIN;
ret = POPi;
PUTBACK;
FREETMPS;
LEAVE;
}
return ret;
}
SXP_Node
DOMHandlerGetChildNoStub( SXP_Node node, int index, void *userData )
{
SV *node_obj;
SV *retsv;
node_obj = (SV*) node;
{
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSH_WRAPPER_AND_SIT( userData );
if (node_obj)
XPUSHs(sv_2mortal(newRV_inc(node_obj)));
else
XPUSHs(&PL_sv_undef);
XPUSHs(sv_2mortal(newSViv(index)));
PUTBACK;
perl_call_method("DHGetChildNo", G_SCALAR);
SPAGAIN;
retsv = POPs;
retsv = SvOK(retsv) ? SvREFCNT_inc(retsv) : NULL;
PUTBACK;
FREETMPS;
LEAVE;
}
return _SV2SXP_Node( retsv );
}
SXP_Node
DOMHandlerGetAttributeNoStub( SXP_Node node, int index, void *userData )
{
SV *node_obj;
SV *retsv;
node_obj = (SV*) node;
{
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSH_WRAPPER_AND_SIT( userData );
if (node_obj)
XPUSHs(sv_2mortal(newRV_inc(node_obj)));
else
XPUSHs(&PL_sv_undef);
XPUSHs(sv_2mortal(newSViv(index)));
PUTBACK;
perl_call_method("DHGetAttributeNo", G_SCALAR);
SPAGAIN;
retsv = POPs;
retsv = SvOK(retsv) ? SvREFCNT_inc(retsv) : NULL;
PUTBACK;
FREETMPS;
LEAVE;
}
return _SV2SXP_Node( retsv );
}
SXP_Node
DOMHandlerGetNamespaceNoStub( SXP_Node node, int index, void *userData )
{
SV *node_obj;
SV *retsv;
node_obj = (SV*) node;
{
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSH_WRAPPER_AND_SIT( userData );
if (node_obj)
XPUSHs(sv_2mortal(newRV_inc(node_obj)));
else
XPUSHs(&PL_sv_undef);
XPUSHs(sv_2mortal(newSViv(index)));
PUTBACK;
perl_call_method("DHGetNamespaceNo", G_SCALAR);
SPAGAIN;
retsv = POPs;
retsv = SvOK(retsv) ? SvREFCNT_inc(retsv) : NULL;
PUTBACK;
FREETMPS;
LEAVE;
}
return _SV2SXP_Node( retsv );
}
SXP_Node
DOMHandlerGetParentStub( SXP_Node node, void *userData )
{
SV *node_obj;
SV *retsv;
node_obj = (SV*) node;
{
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSH_WRAPPER_AND_SIT( userData );
if (node_obj)
XPUSHs(sv_2mortal(newRV_inc(node_obj)));
else
XPUSHs(&PL_sv_undef);
PUTBACK;
perl_call_method("DHGetParent", G_SCALAR);
SPAGAIN;
retsv = POPs;
retsv = SvOK(retsv) ? SvREFCNT_inc(retsv) : NULL;
PUTBACK;
FREETMPS;
LEAVE;
}
return _SV2SXP_Node( retsv );
}
SXP_Document
DOMHandlerGetOwnerDocumentStub( SXP_Node node, void *userData )
{
SV *node_obj;
SV *retsv;
node_obj = (SV*) node;
{
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSH_WRAPPER_AND_SIT( userData );
if (node_obj)
XPUSHs(sv_2mortal(newRV_inc(node_obj)));
else
XPUSHs(&PL_sv_undef);
PUTBACK;
perl_call_method("DHGetOwnerDocument", G_SCALAR);
SPAGAIN;
retsv = POPs;
retsv = SvOK(retsv) ? SvREFCNT_inc(retsv) : NULL;
PUTBACK;
FREETMPS;
LEAVE;
}
return (SXP_Document)_SV2SXP_Node( retsv );
}
int
DOMHandlerCompareNodesStub( SXP_Node node1, SXP_Node node2, void *userData )
{
SV *node1_obj;
SV *node2_obj;
int ret = 0;
node1_obj = (SV*) node1;
node2_obj = (SV*) node2;
{
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSH_WRAPPER_AND_SIT( userData );
if (node1_obj)
XPUSHs(sv_2mortal(newRV_inc(node1_obj)));
else
XPUSHs(&PL_sv_undef);
if (node2_obj)
XPUSHs(sv_2mortal(newRV_inc(node2_obj)));
else
XPUSHs(&PL_sv_undef);
PUTBACK;
perl_call_method("DHCompareNodes", G_SCALAR);
SPAGAIN;
ret = POPi;
PUTBACK;
FREETMPS;
LEAVE;
}
return ret;
}
SXP_Document
DOMHandlerRetrieveDocumentStub( const SXP_char *uri, const SXP_char *baseUri, void *userData )
{
SV *retsv;
if (!baseUri) baseUri = "";
{
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSH_WRAPPER_AND_SIT( userData );
/* !!! This can be a trap, if typedef of SXP_char changes !!! */
XPUSHs(sv_2mortal(newSVpv(uri, strlen(uri))));
XPUSHs(sv_2mortal(newSVpv(baseUri, strlen(baseUri))));
PUTBACK;
perl_call_method("DHRetrieveDocument", G_SCALAR);
SPAGAIN;
retsv = POPs;
retsv = SvOK(retsv) ? SvREFCNT_inc(retsv) : NULL;
PUTBACK;
FREETMPS;
LEAVE;
}
return (SXP_Document) _SV2SXP_Node( retsv );
}
SXP_Node
DOMHandlerGetNodeWithIDStub( SXP_Document doc, const SXP_char* id, void *userData )
{
SV *doc_obj;
SV *retsv;
doc_obj = (SV*) doc;
{
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSH_WRAPPER_AND_SIT( userData );
if (doc_obj)
XPUSHs(sv_2mortal(newRV_inc(doc_obj)));
else
XPUSHs(&PL_sv_undef);
/* !!! This can be a bad trap, if typedef of SXP_char changes !!! */
XPUSHs(sv_2mortal(newSVpv(id, strlen(id))));
PUTBACK;
perl_call_method("DHGetNodeWithID", G_SCALAR);
SPAGAIN;
retsv = POPs;
retsv = SvOK(retsv) ? SvREFCNT_inc(retsv) : NULL;
PUTBACK;
FREETMPS;
LEAVE;
}
return _SV2SXP_Node( retsv );
}
void
DOMHandlerFreeBufferStub( SXP_Node node, SXP_char *buff, void *userData )
{
SV *node_obj;
node_obj = (SV*) node;
if(0) {
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSH_WRAPPER_AND_SIT( userData );
if (node_obj)
XPUSHs(sv_2mortal(newRV_inc(node_obj)));
else
XPUSHs(&PL_sv_undef);
/* !!! This can be a trap, if typedef of SXP_char changes !!! */
XPUSHs(sv_2mortal(newSVpv(buff, 0)));
PUTBACK;
perl_call_method("DHFreeBuffer", G_SCALAR);
SPAGAIN;
PUTBACK;
FREETMPS;
LEAVE;
} else {
Safefree( buff );
}
}
#undef XPUSH_WRAPPER_AND_SIT