⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlparse.c

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 C
📖 第 1 页 / 共 5 页
字号:
}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 + -