📄 xmlparse.c
字号:
}voidXML_SetSkippedEntityHandler(XML_Parser parser, XML_SkippedEntityHandler handler){ skippedEntityHandler = handler;}voidXML_SetUnknownEncodingHandler(XML_Parser parser, XML_UnknownEncodingHandler handler, void *data){ unknownEncodingHandler = handler; unknownEncodingHandlerData = data;}voidXML_SetElementDeclHandler(XML_Parser parser, XML_ElementDeclHandler eldecl){ elementDeclHandler = eldecl;}voidXML_SetAttlistDeclHandler(XML_Parser parser, XML_AttlistDeclHandler attdecl){ attlistDeclHandler = attdecl;}voidXML_SetEntityDeclHandler(XML_Parser parser, XML_EntityDeclHandler handler){ entityDeclHandler = handler;}voidXML_SetXmlDeclHandler(XML_Parser parser, XML_XmlDeclHandler handler) { xmlDeclHandler = handler;}intXML_SetParamEntityParsing(XML_Parser parser, enum XML_ParamEntityParsing peParsing){ /* block after XML_Parse()/XML_ParseBuffer() has been called */ if (parsing) return 0;#ifdef XML_DTD paramEntityParsing = peParsing; return 1;#else return peParsing == XML_PARAM_ENTITY_PARSING_NEVER;#endif}enum XML_StatusXML_Parse(XML_Parser parser, const char *s, int len, int isFinal){ if (len == 0) { if (!isFinal) return XML_STATUS_OK; positionPtr = bufferPtr; errorCode = processor(parser, bufferPtr, parseEndPtr = bufferEnd, 0); if (errorCode == XML_ERROR_NONE) return XML_STATUS_OK; eventEndPtr = eventPtr; processor = errorProcessor; return XML_STATUS_ERROR; }#ifndef XML_CONTEXT_BYTES else if (bufferPtr == bufferEnd) { const char *end; int nLeftOver; parseEndByteIndex += len; positionPtr = s; if (isFinal) { errorCode = processor(parser, s, parseEndPtr = s + len, 0); if (errorCode == XML_ERROR_NONE) return XML_STATUS_OK; eventEndPtr = eventPtr; processor = errorProcessor; return XML_STATUS_ERROR; } errorCode = processor(parser, s, parseEndPtr = s + len, &end); if (errorCode != XML_ERROR_NONE) { eventEndPtr = eventPtr; processor = errorProcessor; return XML_STATUS_ERROR; } XmlUpdatePosition(encoding, positionPtr, end, &position); positionPtr = end; nLeftOver = s + len - end; if (nLeftOver) { if (buffer == NULL || nLeftOver > bufferLim - buffer) { /* FIXME avoid integer overflow */ char *temp; temp = (buffer == NULL ? (char *)MALLOC(len * 2) : (char *)REALLOC(buffer, len * 2)); if (temp == NULL) { errorCode = XML_ERROR_NO_MEMORY; return XML_STATUS_ERROR; } buffer = temp; if (!buffer) { errorCode = XML_ERROR_NO_MEMORY; eventPtr = eventEndPtr = NULL; processor = errorProcessor; return XML_STATUS_ERROR; } bufferLim = buffer + len * 2; } memcpy(buffer, end, nLeftOver); bufferPtr = buffer; bufferEnd = buffer + nLeftOver; } return XML_STATUS_OK; }#endif /* not defined XML_CONTEXT_BYTES */ else { void *buff = XML_GetBuffer(parser, len); if (buff == NULL) return XML_STATUS_ERROR; else { memcpy(buff, s, len); return XML_ParseBuffer(parser, len, isFinal); } }}enum XML_StatusXML_ParseBuffer(XML_Parser parser, int len, int isFinal){ const char *start = bufferPtr; positionPtr = start; bufferEnd += len; parseEndByteIndex += len; errorCode = processor(parser, start, parseEndPtr = bufferEnd, isFinal ? (const char **)NULL : &bufferPtr); if (errorCode == XML_ERROR_NONE) { if (!isFinal) { XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); positionPtr = bufferPtr; } return XML_STATUS_OK; } else { eventEndPtr = eventPtr; processor = errorProcessor; return XML_STATUS_ERROR; }}void *XML_GetBuffer(XML_Parser parser, int len){ if (len > bufferLim - bufferEnd) { /* FIXME avoid integer overflow */ int neededSize = len + (bufferEnd - bufferPtr);#ifdef XML_CONTEXT_BYTES int keep = bufferPtr - buffer; if (keep > XML_CONTEXT_BYTES) keep = XML_CONTEXT_BYTES; neededSize += keep;#endif /* defined XML_CONTEXT_BYTES */ if (neededSize <= bufferLim - buffer) {#ifdef XML_CONTEXT_BYTES if (keep < bufferPtr - buffer) { int offset = (bufferPtr - buffer) - keep; memmove(buffer, &buffer[offset], bufferEnd - bufferPtr + keep); bufferEnd -= offset; bufferPtr -= offset; }#else memmove(buffer, bufferPtr, bufferEnd - bufferPtr); bufferEnd = buffer + (bufferEnd - bufferPtr); bufferPtr = buffer;#endif /* not defined XML_CONTEXT_BYTES */ } else { char *newBuf; int bufferSize = bufferLim - bufferPtr; if (bufferSize == 0) bufferSize = INIT_BUFFER_SIZE; do { bufferSize *= 2; } while (bufferSize < neededSize); newBuf = (char *)MALLOC(bufferSize); if (newBuf == 0) { errorCode = XML_ERROR_NO_MEMORY; return NULL; } bufferLim = newBuf + bufferSize;#ifdef XML_CONTEXT_BYTES if (bufferPtr) { int keep = bufferPtr - buffer; if (keep > XML_CONTEXT_BYTES) keep = XML_CONTEXT_BYTES; memcpy(newBuf, &bufferPtr[-keep], bufferEnd - bufferPtr + keep); FREE(buffer); buffer = newBuf; bufferEnd = buffer + (bufferEnd - bufferPtr) + keep; bufferPtr = buffer + keep; } else { bufferEnd = newBuf + (bufferEnd - bufferPtr); bufferPtr = buffer = newBuf; }#else if (bufferPtr) { memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr); FREE(buffer); } bufferEnd = newBuf + (bufferEnd - bufferPtr); bufferPtr = buffer = newBuf;#endif /* not defined XML_CONTEXT_BYTES */ } } return bufferEnd;}enum XML_ErrorXML_GetErrorCode(XML_Parser parser){ return errorCode;}longXML_GetCurrentByteIndex(XML_Parser parser){ if (eventPtr) return parseEndByteIndex - (parseEndPtr - eventPtr); return -1;}intXML_GetCurrentByteCount(XML_Parser parser){ if (eventEndPtr && eventPtr) return eventEndPtr - eventPtr; return 0;}const char *XML_GetInputContext(XML_Parser parser, int *offset, int *size){#ifdef XML_CONTEXT_BYTES if (eventPtr && buffer) { *offset = eventPtr - buffer; *size = bufferEnd - buffer; return buffer; }#endif /* defined XML_CONTEXT_BYTES */ return (char *) 0;}intXML_GetCurrentLineNumber(XML_Parser parser){ if (eventPtr) { XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); positionPtr = eventPtr; } return position.lineNumber + 1;}intXML_GetCurrentColumnNumber(XML_Parser parser){ if (eventPtr) { XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); positionPtr = eventPtr; } return position.columnNumber;}voidXML_FreeContentModel(XML_Parser parser, XML_Content *model){ FREE(model);}void *XML_MemMalloc(XML_Parser parser, size_t size){ return MALLOC(size);}void *XML_MemRealloc(XML_Parser parser, void *ptr, size_t size){ return REALLOC(ptr, size);}voidXML_MemFree(XML_Parser parser, void *ptr){ FREE(ptr);}voidXML_DefaultCurrent(XML_Parser parser){ if (defaultHandler) { if (openInternalEntities) reportDefault(parser, internalEncoding, openInternalEntities->internalEventPtr, openInternalEntities->internalEventEndPtr); else reportDefault(parser, encoding, eventPtr, eventEndPtr); }}const XML_LChar *XML_ErrorString(enum XML_Error code){ static const XML_LChar *message[] = { 0, XML_L("out of memory"), XML_L("syntax error"), XML_L("no element found"), XML_L("not well-formed (invalid token)"), XML_L("unclosed token"), XML_L("partial character"), XML_L("mismatched tag"), XML_L("duplicate attribute"), XML_L("junk after document element"), XML_L("illegal parameter entity reference"), XML_L("undefined entity"), XML_L("recursive entity reference"), XML_L("asynchronous entity"), XML_L("reference to invalid character number"), XML_L("reference to binary entity"), XML_L("reference to external entity in attribute"), XML_L("xml declaration not at start of external entity"), XML_L("unknown encoding"), XML_L("encoding specified in XML declaration is incorrect"), XML_L("unclosed CDATA section"), XML_L("error in processing external entity reference"), XML_L("document is not standalone"), XML_L("unexpected parser state - please send a bug report"), XML_L("entity declared in parameter entity"), XML_L("requested feature requires XML_DTD support in Expat"), XML_L("cannot change setting once parsing has begun") }; if (code > 0 && code < sizeof(message)/sizeof(message[0])) return message[code]; return NULL;}const XML_LChar *XML_ExpatVersion(void) { /* V1 is used to string-ize the version number. However, it would string-ize the actual version macro *names* unless we get them substituted before being passed to V1. CPP is defined to expand a macro, then rescan for more expansions. Thus, we use V2 to expand the version macros, then CPP will expand the resulting V1() macro with the correct numerals. */ /* ### I'm assuming cpp is portable in this respect... */#define V1(a,b,c) XML_L(#a)XML_L(".")XML_L(#b)XML_L(".")XML_L(#c)#define V2(a,b,c) XML_L("expat_")V1(a,b,c) return V2(XML_MAJOR_VERSION, XML_MINOR_VERSION, XML_MICRO_VERSION);#undef V1#undef V2}XML_Expat_VersionXML_ExpatVersionInfo(void){ XML_Expat_Version version; version.major = XML_MAJOR_VERSION; version.minor = XML_MINOR_VERSION; version.micro = XML_MICRO_VERSION; return version;}const XML_Feature *XML_GetFeatureList(void){ static XML_Feature features[] = { {XML_FEATURE_SIZEOF_XML_CHAR, XML_L("sizeof(XML_Char)")}, {XML_FEATURE_SIZEOF_XML_LCHAR, XML_L("sizeof(XML_LChar)")},#ifdef XML_UNICODE {XML_FEATURE_UNICODE, XML_L("XML_UNICODE")},#endif#ifdef XML_UNICODE_WCHAR_T {XML_FEATURE_UNICODE_WCHAR_T, XML_L("XML_UNICODE_WCHAR_T")},#endif#ifdef XML_DTD {XML_FEATURE_DTD, XML_L("XML_DTD")},#endif#ifdef XML_CONTEXT_BYTES {XML_FEATURE_CONTEXT_BYTES, XML_L("XML_CONTEXT_BYTES"), XML_CONTEXT_BYTES},#endif#ifdef XML_MIN_SIZE {XML_FEATURE_MIN_SIZE, XML_L("XML_MIN_SIZE")},#endif {XML_FEATURE_END, NULL} }; features[0].value = sizeof(XML_Char); features[1].value = sizeof(XML_LChar); return features;}/* Initially tag->rawName always points into the parse buffer; for those TAG instances opened while the current parse buffer was processed, and not yet closed, we need to store tag->rawName in a more permanent location, since the parse buffer is about to be discarded.*/static XML_BoolstoreRawNames(XML_Parser parser){ TAG *tag = tagStack; while (tag) { int bufSize; int nameLen = sizeof(XML_Char) * (tag->name.strLen + 1); char *rawNameBuf = tag->buf + nameLen; /* Stop if already stored. Since tagStack is a stack, we can stop at the first entry that has already been copied; everything below it in the stack is already been accounted for in a previous call to this function. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -