📄 xmlparse.c
字号:
poolClear(&temp2Pool); parserInit(parser, encodingName); dtdReset(_dtd, &parser->m_mem); return setContext(parser, implicitContext);}enum XML_StatusXML_SetEncoding(XML_Parser parser, const XML_Char *encodingName){ /* Block after XML_Parse()/XML_ParseBuffer() has been called. XXX There's no way for the caller to determine which of the XXX possible error cases caused the XML_STATUS_ERROR return. */ if (parsing) return XML_STATUS_ERROR; if (encodingName == NULL) protocolEncodingName = NULL; else { protocolEncodingName = poolCopyString(&tempPool, encodingName); if (!protocolEncodingName) return XML_STATUS_ERROR; } return XML_STATUS_OK;}XML_ParserXML_ExternalEntityParserCreate(XML_Parser oldParser, const XML_Char *context, const XML_Char *encodingName){ XML_Parser parser = oldParser; DTD *newDtd = NULL; DTD *oldDtd = _dtd; XML_StartElementHandler oldStartElementHandler = startElementHandler; XML_EndElementHandler oldEndElementHandler = endElementHandler; XML_CharacterDataHandler oldCharacterDataHandler = characterDataHandler; XML_ProcessingInstructionHandler oldProcessingInstructionHandler = processingInstructionHandler; XML_CommentHandler oldCommentHandler = commentHandler; XML_StartCdataSectionHandler oldStartCdataSectionHandler = startCdataSectionHandler; XML_EndCdataSectionHandler oldEndCdataSectionHandler = endCdataSectionHandler; XML_DefaultHandler oldDefaultHandler = defaultHandler; XML_UnparsedEntityDeclHandler oldUnparsedEntityDeclHandler = unparsedEntityDeclHandler; XML_NotationDeclHandler oldNotationDeclHandler = notationDeclHandler; XML_StartNamespaceDeclHandler oldStartNamespaceDeclHandler = startNamespaceDeclHandler; XML_EndNamespaceDeclHandler oldEndNamespaceDeclHandler = endNamespaceDeclHandler; XML_NotStandaloneHandler oldNotStandaloneHandler = notStandaloneHandler; XML_ExternalEntityRefHandler oldExternalEntityRefHandler = externalEntityRefHandler; XML_SkippedEntityHandler oldSkippedEntityHandler = skippedEntityHandler; XML_UnknownEncodingHandler oldUnknownEncodingHandler = unknownEncodingHandler; XML_ElementDeclHandler oldElementDeclHandler = elementDeclHandler; XML_AttlistDeclHandler oldAttlistDeclHandler = attlistDeclHandler; XML_EntityDeclHandler oldEntityDeclHandler = entityDeclHandler; XML_XmlDeclHandler oldXmlDeclHandler = xmlDeclHandler; ELEMENT_TYPE * oldDeclElementType = declElementType; void *oldUserData = userData; void *oldHandlerArg = handlerArg; XML_Bool oldDefaultExpandInternalEntities = defaultExpandInternalEntities; XML_Parser oldExternalEntityRefHandlerArg = externalEntityRefHandlerArg;#ifdef XML_DTD enum XML_ParamEntityParsing oldParamEntityParsing = paramEntityParsing; int oldInEntityValue = prologState.inEntityValue;#endif XML_Bool oldns_triplets = ns_triplets;#ifdef XML_DTD if (!context) newDtd = oldDtd;#endif /* XML_DTD */ /* Note that the magical uses of the pre-processor to make field access look more like C++ require that `parser' be overwritten here. This makes this function more painful to follow than it would be otherwise. */ if (ns) { XML_Char tmp[2]; *tmp = namespaceSeparator; parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd); } else { parser = parserCreate(encodingName, &parser->m_mem, NULL, newDtd); } if (!parser) return NULL; startElementHandler = oldStartElementHandler; endElementHandler = oldEndElementHandler; characterDataHandler = oldCharacterDataHandler; processingInstructionHandler = oldProcessingInstructionHandler; commentHandler = oldCommentHandler; startCdataSectionHandler = oldStartCdataSectionHandler; endCdataSectionHandler = oldEndCdataSectionHandler; defaultHandler = oldDefaultHandler; unparsedEntityDeclHandler = oldUnparsedEntityDeclHandler; notationDeclHandler = oldNotationDeclHandler; startNamespaceDeclHandler = oldStartNamespaceDeclHandler; endNamespaceDeclHandler = oldEndNamespaceDeclHandler; notStandaloneHandler = oldNotStandaloneHandler; externalEntityRefHandler = oldExternalEntityRefHandler; skippedEntityHandler = oldSkippedEntityHandler; unknownEncodingHandler = oldUnknownEncodingHandler; elementDeclHandler = oldElementDeclHandler; attlistDeclHandler = oldAttlistDeclHandler; entityDeclHandler = oldEntityDeclHandler; xmlDeclHandler = oldXmlDeclHandler; declElementType = oldDeclElementType; userData = oldUserData; if (oldUserData == oldHandlerArg) handlerArg = userData; else handlerArg = parser; if (oldExternalEntityRefHandlerArg != oldParser) externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg; defaultExpandInternalEntities = oldDefaultExpandInternalEntities; ns_triplets = oldns_triplets; parentParser = oldParser;#ifdef XML_DTD paramEntityParsing = oldParamEntityParsing; prologState.inEntityValue = oldInEntityValue; if (context) {#endif /* XML_DTD */ if (!dtdCopy(_dtd, oldDtd, &parser->m_mem) || !setContext(parser, context)) { XML_ParserFree(parser); return NULL; } processor = externalEntityInitProcessor;#ifdef XML_DTD } else { /* The DTD instance referenced by _dtd is shared between the document's root parser and external PE parsers, therefore one does not need to call setContext. In addition, one also *must* not call setContext, because this would overwrite existing prefix->binding pointers in _dtd with ones that get destroyed with the external PE parser. This would leave those prefixes with dangling pointers. */ isParamEntity = XML_TRUE; XmlPrologStateInitExternalEntity(&prologState); processor = externalParEntInitProcessor; }#endif /* XML_DTD */ return parser;}static void FASTCALLdestroyBindings(BINDING *bindings, XML_Parser parser){ for (;;) { BINDING *b = bindings; if (!b) break; bindings = b->nextTagBinding; FREE(b->uri); FREE(b); }}voidXML_ParserFree(XML_Parser parser){ for (;;) { TAG *p; if (tagStack == NULL) { if (freeTagList == NULL) break; tagStack = freeTagList; freeTagList = NULL; } p = tagStack; tagStack = tagStack->parent; FREE(p->buf); destroyBindings(p->bindings, parser); FREE(p); } destroyBindings(freeBindingList, parser); destroyBindings(inheritedBindings, parser); poolDestroy(&tempPool); poolDestroy(&temp2Pool);#ifdef XML_DTD /* external parameter entity parsers share the DTD structure parser->m_dtd with the root parser, so we must not destroy it */ if (!isParamEntity && _dtd)#else if (_dtd)#endif /* XML_DTD */ dtdDestroy(_dtd, (XML_Bool)!parentParser, &parser->m_mem); FREE((void *)atts); if (groupConnector) FREE(groupConnector); if (buffer) FREE(buffer); FREE(dataBuf); if (unknownEncodingMem) FREE(unknownEncodingMem); if (unknownEncodingRelease) unknownEncodingRelease(unknownEncodingData); FREE(parser);}voidXML_UseParserAsHandlerArg(XML_Parser parser){ handlerArg = parser;}enum XML_ErrorXML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD){#ifdef XML_DTD /* block after XML_Parse()/XML_ParseBuffer() has been called */ if (parsing) return XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING; useForeignDTD = useDTD; return XML_ERROR_NONE;#else return XML_ERROR_FEATURE_REQUIRES_XML_DTD;#endif}voidXML_SetReturnNSTriplet(XML_Parser parser, int do_nst){ /* block after XML_Parse()/XML_ParseBuffer() has been called */ if (parsing) return; ns_triplets = do_nst ? XML_TRUE : XML_FALSE;}voidXML_SetUserData(XML_Parser parser, void *p){ if (handlerArg == userData) handlerArg = userData = p; else userData = p;}enum XML_StatusXML_SetBase(XML_Parser parser, const XML_Char *p){ if (p) { p = poolCopyString(&_dtd->pool, p); if (!p) return XML_STATUS_ERROR; curBase = p; } else curBase = NULL; return XML_STATUS_OK;}const XML_Char *XML_GetBase(XML_Parser parser){ return curBase;}intXML_GetSpecifiedAttributeCount(XML_Parser parser){ return nSpecifiedAtts;}intXML_GetIdAttributeIndex(XML_Parser parser){ return idAttIndex;}voidXML_SetElementHandler(XML_Parser parser, XML_StartElementHandler start, XML_EndElementHandler end){ startElementHandler = start; endElementHandler = end;}voidXML_SetStartElementHandler(XML_Parser parser, XML_StartElementHandler start) { startElementHandler = start;}voidXML_SetEndElementHandler(XML_Parser parser, XML_EndElementHandler end) { endElementHandler = end;}voidXML_SetCharacterDataHandler(XML_Parser parser, XML_CharacterDataHandler handler){ characterDataHandler = handler;}voidXML_SetProcessingInstructionHandler(XML_Parser parser, XML_ProcessingInstructionHandler handler){ processingInstructionHandler = handler;}voidXML_SetCommentHandler(XML_Parser parser, XML_CommentHandler handler){ commentHandler = handler;}voidXML_SetCdataSectionHandler(XML_Parser parser, XML_StartCdataSectionHandler start, XML_EndCdataSectionHandler end){ startCdataSectionHandler = start; endCdataSectionHandler = end;}voidXML_SetStartCdataSectionHandler(XML_Parser parser, XML_StartCdataSectionHandler start) { startCdataSectionHandler = start;}voidXML_SetEndCdataSectionHandler(XML_Parser parser, XML_EndCdataSectionHandler end) { endCdataSectionHandler = end;}voidXML_SetDefaultHandler(XML_Parser parser, XML_DefaultHandler handler){ defaultHandler = handler; defaultExpandInternalEntities = XML_FALSE;}voidXML_SetDefaultHandlerExpand(XML_Parser parser, XML_DefaultHandler handler){ defaultHandler = handler; defaultExpandInternalEntities = XML_TRUE;}voidXML_SetDoctypeDeclHandler(XML_Parser parser, XML_StartDoctypeDeclHandler start, XML_EndDoctypeDeclHandler end){ startDoctypeDeclHandler = start; endDoctypeDeclHandler = end;}voidXML_SetStartDoctypeDeclHandler(XML_Parser parser, XML_StartDoctypeDeclHandler start) { startDoctypeDeclHandler = start;}voidXML_SetEndDoctypeDeclHandler(XML_Parser parser, XML_EndDoctypeDeclHandler end) { endDoctypeDeclHandler = end;}voidXML_SetUnparsedEntityDeclHandler(XML_Parser parser, XML_UnparsedEntityDeclHandler handler){ unparsedEntityDeclHandler = handler;}voidXML_SetNotationDeclHandler(XML_Parser parser, XML_NotationDeclHandler handler){ notationDeclHandler = handler;}voidXML_SetNamespaceDeclHandler(XML_Parser parser, XML_StartNamespaceDeclHandler start, XML_EndNamespaceDeclHandler end){ startNamespaceDeclHandler = start; endNamespaceDeclHandler = end;}voidXML_SetStartNamespaceDeclHandler(XML_Parser parser, XML_StartNamespaceDeclHandler start) { startNamespaceDeclHandler = start;}voidXML_SetEndNamespaceDeclHandler(XML_Parser parser, XML_EndNamespaceDeclHandler end) { endNamespaceDeclHandler = end;}voidXML_SetNotStandaloneHandler(XML_Parser parser, XML_NotStandaloneHandler handler){ notStandaloneHandler = handler;}voidXML_SetExternalEntityRefHandler(XML_Parser parser, XML_ExternalEntityRefHandler handler){ externalEntityRefHandler = handler;}voidXML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg){ if (arg) externalEntityRefHandlerArg = (XML_Parser)arg; else externalEntityRefHandlerArg = parser;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -