XML-LibXML

 view release on metacpan or  search on metacpan

perl-libxml-sax.c  view on Meta::CPAN

        dSP;

        int len = xmlStrlen( ch );

        if (sax->joinchars)
        {
            PSaxCharactersFlush(ctxt, sax->charbuf);
        }

        ENTER;
        SAVETMPS;

        PUSHMARK(SP) ;
        XPUSHs(handler);
        element = PmmGenCharDataSV(aTHX_ sax, ch, len);

        rv = newRV_noinc((SV*)element);
        XPUSHs(rv);
        PUTBACK;

        call_method( "comment", G_SCALAR | G_EVAL | G_DISCARD );
        sv_2mortal(rv);

        if (SvTRUE(ERRSV)) {
            croak_obj;
        }

        FREETMPS ;
        LEAVE ;
    }
    CLEAR_SERROR_HANDLER
    return 1;
}

int
PSaxCDATABlock(void *ctx, const xmlChar * ch, int len) {
    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr)ctx;
    PmmSAXVectorPtr sax = (PmmSAXVectorPtr)ctxt->_private;
    dTHX;
    HV* element;
    SV * handler = sax->handler;
    SV * rv = NULL;

    PmmUpdateLocator(ctx);

    if ( ch != NULL && handler != NULL ) {
        dSP;

        if (sax->joinchars)
        {
            PSaxCharactersFlush(ctxt, sax->charbuf);
        }


        ENTER;
        SAVETMPS;

        PUSHMARK(SP) ;
        XPUSHs(handler);
        PUTBACK;
        call_method( "start_cdata", G_SCALAR | G_EVAL | G_DISCARD );
        if (SvTRUE(ERRSV)) {
            croak_obj;
        }

        SPAGAIN;
        PUSHMARK(SP) ;

        XPUSHs(handler);
        element = PmmGenCharDataSV(aTHX_ sax, ch, len);

        rv = newRV_noinc((SV*)element);
        XPUSHs(rv);
        PUTBACK;

        call_method( "characters", G_SCALAR | G_EVAL | G_DISCARD);
        if (SvTRUE(ERRSV)) {
            croak_obj;
        }

        SPAGAIN;
        PUSHMARK(SP) ;

        XPUSHs(handler);
        PUTBACK;

        call_method( "end_cdata", G_SCALAR | G_EVAL | G_DISCARD );
        sv_2mortal(rv);

        if (SvTRUE(ERRSV)) {
            croak_obj;
        }

        FREETMPS ;
        LEAVE ;

    }
    CLEAR_SERROR_HANDLER
    return 1;

}

int
PSaxProcessingInstruction( void * ctx, const xmlChar * target, const xmlChar * data )
{
    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr)ctx;
    PmmSAXVectorPtr sax   = (PmmSAXVectorPtr)ctxt->_private;
    dTHX;
    SV * handler          = sax->handler;
    SV * element;
    SV * rv = NULL;

    PmmUpdateLocator(ctx);

    if ( handler != NULL ) {
        dSP;

        if (sax->joinchars)
        {
            PSaxCharactersFlush(ctxt, sax->charbuf);
        }

        ENTER;
        SAVETMPS;

        PUSHMARK(SP) ;
        XPUSHs(handler);
        element = (SV*)PmmGenPISV(aTHX_ sax, (const xmlChar *)target, data);
        rv = newRV_noinc((SV*)element);
        XPUSHs(rv);

        PUTBACK;

        call_method( "processing_instruction", G_SCALAR | G_EVAL | G_DISCARD );

        sv_2mortal(rv);

        if (SvTRUE(ERRSV)) {
            croak_obj;
        }

        FREETMPS ;
        LEAVE ;
    }
    CLEAR_SERROR_HANDLER
    return 1;
}

perl-libxml-sax.c  view on Meta::CPAN

    svMessage = NEWSV(0,512);

    va_start(args, msg);
    sv_vsetpvfn(svMessage, msg, xmlStrlen((const xmlChar *)msg), &args, NULL, 0, NULL);
    va_end(args);

    ENTER;
    SAVETMPS;

    PUSHMARK(SP) ;
    XPUSHs(sax->parser);

    if (SvOK(sax->saved_error)) {
      sv_catsv( sax->saved_error, svMessage );
    } else {
      sv_setsv( sax->saved_error, svMessage );
    }

    XPUSHs(sv_2mortal(svMessage));
    XPUSHs(sv_2mortal(newSViv(ctxt->input->line)));
    XPUSHs(sv_2mortal(newSViv(ctxt->input->col)));

    PUTBACK;
    call_pv( "XML::LibXML::_SAXParser::fatal_error", G_SCALAR | G_EVAL | G_DISCARD );
    if (SvTRUE(ERRSV)) {
        croak_obj;
    }

    FREETMPS ;
    LEAVE ;
    CLEAR_SERROR_HANDLER
    return 1;
}

/* NOTE:
 * end document is not handled by the parser itself! use
 * XML::LibXML::SAX instead!
 */
xmlSAXHandlerPtr
PSaxGetHandler()
{
    xmlSAXHandlerPtr retval = (xmlSAXHandlerPtr)xmlMalloc(sizeof(xmlSAXHandler));
    memset(retval, 0, sizeof(xmlSAXHandler));

    retval->setDocumentLocator = (setDocumentLocatorSAXFunc)&PSaxSetDocumentLocator;

    retval->startDocument = (startDocumentSAXFunc)&PSaxStartDocument;

    /* libxml2 will not handle perls returnvalue correctly, so we have
     * to end the document ourselfes
     */
    retval->endDocument   = NULL; /* (endDocumentSAXFunc)&PSaxEndDocument; */

    retval->startElement  = (startElementSAXFunc)&PSaxStartElement;
    retval->endElement    = (endElementSAXFunc)&PSaxEndElement;

    retval->characters    = (charactersSAXFunc)&PSaxCharacters;
    retval->ignorableWhitespace = (ignorableWhitespaceSAXFunc)&PSaxCharacters;

    retval->comment       = (commentSAXFunc)&PSaxComment;
    retval->cdataBlock    = (cdataBlockSAXFunc)&PSaxCDATABlock;

    retval->processingInstruction = (processingInstructionSAXFunc)&PSaxProcessingInstruction;

    /* warning functions should be internal */
    retval->warning    = (warningSAXFunc)&PmmSaxWarning;
    retval->error      = (errorSAXFunc)&PmmSaxError;
    retval->fatalError = (fatalErrorSAXFunc)&PmmSaxFatalError;

    retval->externalSubset = (externalSubsetSAXFunc)&PSaxExternalSubset;

    /*
    retval->internalSubset = (internalSubsetSAXFunc)&PSaxInternalSubset;
    retval->elementDecl = (elementDeclSAXFunc)&PSaxElementDecl;
    retval->entityDecl  = (entityDeclSAXFunc)&PSaxEntityDecl;
    retval->notationDecl  = (notationDeclSAXFunc)&PSaxNotationDecl;
    retval->attributeDecl  = (attributeDeclSAXFunc)&PSaxAttributeDecl;
    retval->unparsedEntityDecl  = (unparsedEntityDeclSAXFunc)&PSaxUnparsedEntityDecl;
    */

    return retval;
}



( run in 1.132 second using v1.01-cache-2.11-cpan-39bf76dae61 )