📄 expat.xs
字号:
intXML_ParsePartial(parser, sv) XML_Parser parser SV * sv CODE: { STRLEN len; char *s = SvPV(sv, len); CallbackVector * cbv = (CallbackVector *) XML_GetUserData(parser); RETVAL = XML_Parse(parser, s, len, 0); if (! RETVAL) append_error(parser, NULL); } OUTPUT: RETVALintXML_ParseDone(parser) XML_Parser parser CODE: { RETVAL = XML_Parse(parser, "", 0, 1); if (! RETVAL) append_error(parser, NULL); } OUTPUT: RETVALSV *XML_SetStartElementHandler(parser, start_sv) XML_Parser parser SV * start_sv CODE: { CallbackVector * cbv = (CallbackVector*) XML_GetUserData(parser); XMLP_UPD(start_sv); PUSHRET; }SV *XML_SetEndElementHandler(parser, end_sv) XML_Parser parser SV * end_sv CODE: { CallbackVector *cbv = (CallbackVector*) XML_GetUserData(parser); XMLP_UPD(end_sv); PUSHRET; }SV *XML_SetCharacterDataHandler(parser, char_sv) XML_Parser parser SV * char_sv CODE: { XML_CharacterDataHandler charhndl = (XML_CharacterDataHandler) 0; CallbackVector * cbv = (CallbackVector*) XML_GetUserData(parser); XMLP_UPD(char_sv); if (SvTRUE(char_sv)) charhndl = characterData; XML_SetCharacterDataHandler(parser, charhndl); PUSHRET; }SV *XML_SetProcessingInstructionHandler(parser, proc_sv) XML_Parser parser SV * proc_sv CODE: { XML_ProcessingInstructionHandler prochndl = (XML_ProcessingInstructionHandler) 0; CallbackVector* cbv = (CallbackVector*) XML_GetUserData(parser); XMLP_UPD(proc_sv); if (SvTRUE(proc_sv)) prochndl = processingInstruction; XML_SetProcessingInstructionHandler(parser, prochndl); PUSHRET; }SV *XML_SetCommentHandler(parser, cmnt_sv) XML_Parser parser SV * cmnt_sv CODE: { XML_CommentHandler cmnthndl = (XML_CommentHandler) 0; CallbackVector * cbv = (CallbackVector*) XML_GetUserData(parser); XMLP_UPD(cmnt_sv); if (SvTRUE(cmnt_sv)) cmnthndl = commenthandle; XML_SetCommentHandler(parser, cmnthndl); PUSHRET; }SV *XML_SetDefaultHandler(parser, dflt_sv) XML_Parser parser SV * dflt_sv CODE: { XML_DefaultHandler dflthndl = (XML_DefaultHandler) 0; CallbackVector * cbv = (CallbackVector*) XML_GetUserData(parser); XMLP_UPD(dflt_sv); if (SvTRUE(dflt_sv)) dflthndl = defaulthandle; if (cbv->no_expand) XML_SetDefaultHandler(parser, dflthndl); else XML_SetDefaultHandlerExpand(parser, dflthndl); PUSHRET; }SV *XML_SetUnparsedEntityDeclHandler(parser, unprsd_sv) XML_Parser parser SV * unprsd_sv CODE: { XML_UnparsedEntityDeclHandler unprsdhndl = (XML_UnparsedEntityDeclHandler) 0; CallbackVector * cbv = (CallbackVector*) XML_GetUserData(parser); XMLP_UPD(unprsd_sv); if (SvTRUE(unprsd_sv)) unprsdhndl = unparsedEntityDecl; XML_SetUnparsedEntityDeclHandler(parser, unprsdhndl); PUSHRET; }SV *XML_SetNotationDeclHandler(parser, notation_sv) XML_Parser parser SV * notation_sv CODE: { XML_NotationDeclHandler nothndlr = (XML_NotationDeclHandler) 0; CallbackVector * cbv = (CallbackVector*) XML_GetUserData(parser); XMLP_UPD(notation_sv); if (SvTRUE(notation_sv)) nothndlr = notationDecl; XML_SetNotationDeclHandler(parser, nothndlr); PUSHRET; }SV *XML_SetExternalEntityRefHandler(parser, extent_sv) XML_Parser parser SV * extent_sv CODE: { XML_ExternalEntityRefHandler exthndlr = (XML_ExternalEntityRefHandler) 0; CallbackVector * cbv = (CallbackVector*) XML_GetUserData(parser); XMLP_UPD(extent_sv); if (SvTRUE(extent_sv)) exthndlr = externalEntityRef; XML_SetExternalEntityRefHandler(parser, exthndlr); PUSHRET; }SV *XML_SetExtEntFinishHandler(parser, extfin_sv) XML_Parser parser SV * extfin_sv CODE: { CallbackVector * cbv = (CallbackVector *) XML_GetUserData(parser); /* There is no corresponding handler for this in expat. This is called from the externalEntityRef function above after parsing the external entity. */ XMLP_UPD(extfin_sv); PUSHRET; } SV *XML_SetEntityDeclHandler(parser, entdcl_sv) XML_Parser parser SV * entdcl_sv CODE: { XML_EntityDeclHandler enthndlr = (XML_EntityDeclHandler) 0; CallbackVector * cbv = (CallbackVector*) XML_GetUserData(parser); XMLP_UPD(entdcl_sv); if (SvTRUE(entdcl_sv)) enthndlr = entityDecl; XML_SetEntityDeclHandler(parser, enthndlr); PUSHRET; }SV *XML_SetElementDeclHandler(parser, eledcl_sv) XML_Parser parser SV * eledcl_sv CODE: { XML_ElementDeclHandler eldeclhndlr = (XML_ElementDeclHandler) 0; CallbackVector * cbv = (CallbackVector*) XML_GetUserData(parser); XMLP_UPD(eledcl_sv); if (SvTRUE(eledcl_sv)) eldeclhndlr = elementDecl; XML_SetElementDeclHandler(parser, eldeclhndlr); PUSHRET; }SV *XML_SetAttListDeclHandler(parser, attdcl_sv) XML_Parser parser SV * attdcl_sv CODE: { XML_AttlistDeclHandler attdeclhndlr = (XML_AttlistDeclHandler) 0; CallbackVector * cbv = (CallbackVector*) XML_GetUserData(parser); XMLP_UPD(attdcl_sv); if (SvTRUE(attdcl_sv)) attdeclhndlr = attributeDecl; XML_SetAttlistDeclHandler(parser, attdeclhndlr); PUSHRET; }SV *XML_SetDoctypeHandler(parser, doctyp_sv) XML_Parser parser SV * doctyp_sv CODE: { XML_StartDoctypeDeclHandler dtsthndlr = (XML_StartDoctypeDeclHandler) 0; CallbackVector * cbv = (CallbackVector*) XML_GetUserData(parser); int set = 0; XMLP_UPD(doctyp_sv); if (SvTRUE(doctyp_sv)) dtsthndlr = doctypeStart; XML_SetStartDoctypeDeclHandler(parser, dtsthndlr); PUSHRET; }SV *XML_SetEndDoctypeHandler(parser, doctypfin_sv) XML_Parser parser SV * doctypfin_sv CODE: { XML_EndDoctypeDeclHandler dtendhndlr = (XML_EndDoctypeDeclHandler) 0; CallbackVector * cbv = (CallbackVector*) XML_GetUserData(parser); XMLP_UPD(doctypfin_sv); if (SvTRUE(doctypfin_sv)) dtendhndlr = doctypeEnd; XML_SetEndDoctypeDeclHandler(parser, dtendhndlr); PUSHRET; }SV *XML_SetXMLDeclHandler(parser, xmldec_sv) XML_Parser parser SV * xmldec_sv CODE: { XML_XmlDeclHandler xmldechndlr = (XML_XmlDeclHandler) 0; CallbackVector * cbv = (CallbackVector *) XML_GetUserData(parser); XMLP_UPD(xmldec_sv); if (SvTRUE(xmldec_sv)) xmldechndlr = xmlDecl; XML_SetXmlDeclHandler(parser, xmldechndlr); PUSHRET; }voidXML_SetBase(parser, base) XML_Parser parser SV * base CODE: { char * b; if (! SvOK(base)) { b = (char *) 0; } else { b = SvPV(base, PL_na); } XML_SetBase(parser, b); } SV *XML_GetBase(parser) XML_Parser parser CODE: { const char *ret = XML_GetBase(parser); if (ret) { ST(0) = sv_newmortal(); sv_setpv(ST(0), ret); } else { ST(0) = &PL_sv_undef; } }voidXML_PositionContext(parser, lines) XML_Parser parser int lines PREINIT: int parsepos; int size; const char *pos = XML_GetInputContext(parser, &parsepos, &size); const char *markbeg; const char *limit; const char *markend; int length, relpos; int cnt; PPCODE: if (! pos) return; for (markbeg = &pos[parsepos], cnt = 0; markbeg >= pos; markbeg--) { if (*markbeg == '\n') { cnt++; if (cnt > lines) break; } } markbeg++; relpos = 0; limit = &pos[size]; for (markend = &pos[parsepos + 1], cnt = 0; markend < limit; markend++) { if (*markend == '\n') { if (cnt == 0) relpos = (markend - markbeg) + 1; cnt++; if (cnt > lines) { markend++; break; } } } length = markend - markbeg; if (relpos == 0) relpos = length; EXTEND(sp, 2); PUSHs(sv_2mortal(newSVpvn((char *) markbeg, length))); PUSHs(sv_2mortal(newSViv(relpos)));SV *GenerateNSName(name, namespace, table, list) SV * name SV * namespace SV * table SV * list CODE: { STRLEN nmlen, nslen; char * nmstr; char * nsstr; char * buff; char * bp; char * blim; nmstr = SvPV(name, nmlen); nsstr = SvPV(namespace, nslen); /* Form a namespace-name string that looks like expat's */ New(321, buff, nmlen + nslen + 2, char); bp = buff; blim = bp + nslen; while (bp < blim) *bp++ = *nsstr++; *bp++ = NSDELIM; blim = bp + nmlen; while (bp < blim) *bp++ = *nmstr++; *bp = '\0'; RETVAL = gen_ns_name(buff, (HV *) SvRV(table), (AV *) SvRV(list)); Safefree(buff); } OUTPUT: RETVALvoidXML_DefaultCurrent(parser) XML_Parser parser CODE: { CallbackVector * cbv = (CallbackVector *) XML_GetUserData(parser); XML_DefaultCurrent(parser); }SV *XML_RecognizedString(parser) XML_Parser parser CODE: { XML_DefaultHandler dflthndl = (XML_DefaultHandler) 0; CallbackVector * cbv = (CallbackVector *) XML_GetUserData(parser); if (cbv->dflt_sv) { dflthndl = defaulthandle; } if (cbv->recstring) { sv_setpvn(cbv->recstring, "", 0); } if (cbv->no_expand) XML_SetDefaultHandler(parser, recString); else XML_SetDefaultHandlerExpand(parser, recString); XML_DefaultCurrent(parser); if (cbv->no_expand) XML_SetDefaultHandler(parser, dflthndl); else XML_SetDefaultHandlerExpand(parser, dflthndl); RETVAL = newSVsv(cbv->recstring); } OUTPUT: RETVALintXML_GetErrorCode(parser) XML_Parser parserintXML_GetCurrentLineNumber(parser) XML_Parser parserintXML_GetCurrentColumnNumber(parser) XML_Parser parserlongXML_GetCurrentByteIndex(parser) XML_Parser parserintXML_GetSpecifiedAttributeCount(parser) XML_Parser parserchar *XML_ErrorString(code) int code CODE: const char *ret = XML_ErrorString(code); ST(0) = sv_newmortal(); sv_setpv((SV*)ST(0), ret);SV *XML_LoadEncoding(data, size) char * data int size CODE: { Encmap_Header *emh = (Encmap_Header *) data; unsigned pfxsize, bmsize; if (size < sizeof(Encmap_Header) || ntohl(emh->magic) != ENCMAP_MAGIC) { RETVAL = &PL_sv_undef; } else { Encinfo *entry; SV *sv; PrefixMap *pfx; unsigned short *bm; int namelen; int i; pfxsize = ntohs(emh->pfsize); bmsize = ntohs(emh->bmsize); if (size != (sizeof(Encmap_Header) + pfxsize * sizeof(PrefixMap) + bmsize * sizeof(unsigned short))) { RETVAL = &PL_sv_undef; } else { /* Convert to uppercase and get name length */ for (i = 0; i < sizeof(emh->name); i++) { char c = emh->name[i]; if (c == (char) 0) break; if (c >= 'a' && c <= 'z') emh->name[i] -= 'a' - 'A'; } namelen = i; RETVAL = newSVpvn(emh->name, namelen); New(322, entry, 1, Encinfo); entry->prefixes_size = pfxsize; entry->bytemap_size = bmsize; for (i = 0; i < 256; i++) { entry->firstmap[i] = ntohl(emh->map[i]); } pfx = (PrefixMap *) &data[sizeof(Encmap_Header)]; bm = (unsigned short *) (((char *) pfx) + sizeof(PrefixMap) * pfxsize); New(323, entry->prefixes, pfxsize, PrefixMap); New(324, entry->bytemap, bmsize, unsigned short); for (i = 0; i < pfxsize; i++, pfx++) { PrefixMap *dest = &entry->prefixes[i]; dest->min = pfx->min; dest->len = pfx->len; dest->bmap_start = ntohs(pfx->bmap_start); Copy(pfx->ispfx, dest->ispfx, sizeof(pfx->ispfx) + sizeof(pfx->ischar), unsigned char); } for (i = 0; i < bmsize; i++) entry->bytemap[i] = ntohs(bm[i]); sv = newSViv(0); sv_setref_pv(sv, "XML::Parser::Encinfo", (void *) entry); if (! EncodingTable) { EncodingTable = perl_get_hv("XML::Parser::Expat::Encoding_Table", FALSE); if (! EncodingTable) croak("Can't find XML::Parser::Expat::Encoding_Table"); } hv_store(EncodingTable, emh->name, namelen, sv, 0); } } } OUTPUT: RETVALvoidXML_FreeEncoding(enc) Encinfo * enc CODE: Safefree(enc->bytemap); Safefree(enc->prefixes); Safefree(enc);SV *XML_OriginalString(parser) XML_Parser parser CODE: { int parsepos, size; const char *buff = XML_GetInputContext(parser, &parsepos, &size); if (buff) { RETVAL = newSVpvn((char *) &buff[parsepos], XML_GetCurrentByteCount(parser)); } else { RETVAL = newSVpv("", 0); } } OUTPUT: RETVALSV *XML_SetStartCdataHandler(parser, startcd_sv) XML_Parser parser SV * startcd_sv CODE: { CallbackVector * cbv = (CallbackVector *) XML_GetUserData(parser); XML_StartCdataSectionHandler scdhndl = (XML_StartCdataSectionHandler) 0; XMLP_UPD(startcd_sv); if (SvTRUE(startcd_sv)) scdhndl = startCdata; XML_SetStartCdataSectionHandler(parser, scdhndl); PUSHRET; }SV *XML_SetEndCdataHandler(parser, endcd_sv) XML_Parser parser SV * endcd_sv CODE: { CallbackVector * cbv = (CallbackVector *) XML_GetUserData(parser); XML_EndCdataSectionHandler ecdhndl = (XML_EndCdataSectionHandler) 0; XMLP_UPD(endcd_sv); if (SvTRUE(endcd_sv)) ecdhndl = endCdata; XML_SetEndCdataSectionHandler(parser, ecdhndl); PUSHRET; }voidXML_UnsetAllHandlers(parser) XML_Parser parser CODE: { CallbackVector * cbv = (CallbackVector *) XML_GetUserData(parser); suspend_callbacks(cbv); if (cbv->ns) { XML_SetNamespaceDeclHandler(cbv->p, (XML_StartNamespaceDeclHandler) 0, (XML_EndNamespaceDeclHandler) 0); } XML_SetElementHandler(parser, (XML_StartElementHandler) 0, (XML_EndElementHandler) 0); XML_SetUnknownEncodingHandler(parser, (XML_UnknownEncodingHandler) 0, (void *) 0); }intXML_ElementIndex(parser) XML_Parser parser CODE: { CallbackVector * cbv = (CallbackVector *) XML_GetUserData(parser); RETVAL = cbv->st_serial_stack[cbv->st_serial_stackptr]; } OUTPUT: RETVALvoidXML_SkipUntil(parser, index) XML_Parser parser unsigned int index CODE: { CallbackVector * cbv = (CallbackVector *) XML_GetUserData(parser); if (index <= cbv->st_serial) return; cbv->skip_until = index; suspend_callbacks(cbv); }intXML_Do_External_Parse(parser, result) XML_Parser parser SV * result CODE: { int type; CallbackVector * cbv = (CallbackVector *) XML_GetUserData(parser); if (SvROK(result) && SvOBJECT(SvRV(result))) { RETVAL = parse_stream(parser, result); } else if (isGV(result)) { RETVAL = parse_stream(parser, sv_2mortal(newRV((SV*) GvIOp(result)))); } else if (SvPOK(result)) { STRLEN eslen; int pret; char *entstr = SvPV(result, eslen); RETVAL = XML_Parse(parser, entstr, eslen, 1); } } OUTPUT: RETVAL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -