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

📄 xmlparse.c

📁 一个很好用的解析
💻 C
📖 第 1 页 / 共 5 页
字号:
}voidxmlrpc_XML_SetUnparsedEntityDeclHandler(XML_Parser parser,                                        XML_UnparsedEntityDeclHandler handler){  unparsedEntityDeclHandler = handler;}voidxmlrpc_XML_SetExternalParsedEntityDeclHandler(    XML_Parser parser,    XML_ExternalParsedEntityDeclHandler handler){  externalParsedEntityDeclHandler = handler;}voidxmlrpc_XML_SetInternalParsedEntityDeclHandler(    XML_Parser parser,    XML_InternalParsedEntityDeclHandler handler){  internalParsedEntityDeclHandler = handler;}voidxmlrpc_XML_SetNotationDeclHandler(XML_Parser parser,                                  XML_NotationDeclHandler handler){  notationDeclHandler = handler;}voidxmlrpc_XML_SetNamespaceDeclHandler(XML_Parser parser,                                   XML_StartNamespaceDeclHandler start,                                   XML_EndNamespaceDeclHandler end){  startNamespaceDeclHandler = start;  endNamespaceDeclHandler = end;}voidxmlrpc_XML_SetNotStandaloneHandler(XML_Parser parser,                                   XML_NotStandaloneHandler handler){  notStandaloneHandler = handler;}voidxmlrpc_XML_SetExternalEntityRefHandler(XML_Parser parser,                                       XML_ExternalEntityRefHandler handler){  externalEntityRefHandler = handler;}voidxmlrpc_XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg){  if (arg)    externalEntityRefHandlerArg = arg;  else    externalEntityRefHandlerArg = parser;}voidxmlrpc_XML_SetUnknownEncodingHandler(XML_Parser parser,                                     XML_UnknownEncodingHandler handler,                                     void *data){  unknownEncodingHandler = handler;  unknownEncodingHandlerData = data;}intxmlrpc_XML_SetParamEntityParsing(    XML_Parser                  const parser  ATTR_UNUSED,    enum XML_ParamEntityParsing const parsing) {        int retval;#ifdef XML_DTD    paramEntityParsing = parsing;    retval = 1;#else    retval = parsing == XML_PARAM_ENTITY_PARSING_NEVER;#endif    return retval;}intxmlrpc_XML_Parse(XML_Parser parser, const char *s, int len, int isFinal){  if (len == 0) {    if (!isFinal)      return 1;    positionPtr = bufferPtr;    errorCode = processor(parser, bufferPtr, parseEndPtr = bufferEnd, 0);    if (errorCode == XML_ERROR_NONE)      return 1;    eventEndPtr = eventPtr;    processor = errorProcessor;    return 0;  }  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 1;      eventEndPtr = eventPtr;      processor = errorProcessor;      return 0;    }    errorCode = processor(parser, s, parseEndPtr = s + len, &end);    if (errorCode != XML_ERROR_NONE) {      eventEndPtr = eventPtr;      processor = errorProcessor;      return 0;    }    XmlUpdatePosition(encoding, positionPtr, end, &position);    nLeftOver = s + len - end;    if (nLeftOver) {      if (buffer == 0 || nLeftOver > bufferLim - buffer) {        /* FIXME avoid integer overflow */        buffer = buffer == 0 ? malloc(len * 2) : realloc(buffer, len * 2);        /* FIXME storage leak if realloc fails */        if (!buffer) {          errorCode = XML_ERROR_NO_MEMORY;          eventPtr = eventEndPtr = 0;          processor = errorProcessor;          return 0;        }        bufferLim = buffer + len * 2;      }      memcpy(buffer, end, nLeftOver);      bufferPtr = buffer;      bufferEnd = buffer + nLeftOver;    }    return 1;  }  else {    memcpy(xmlrpc_XML_GetBuffer(parser, len), s, len);    return xmlrpc_XML_ParseBuffer(parser, len, isFinal);  }}intxmlrpc_XML_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 **)0 : &bufferPtr);  if (errorCode == XML_ERROR_NONE) {    if (!isFinal)      XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position);    return 1;  }  else {    eventEndPtr = eventPtr;    processor = errorProcessor;    return 0;  }}void *xmlrpc_XML_GetBuffer(XML_Parser parser, int len){  if (len > bufferLim - bufferEnd) {    /* FIXME avoid integer overflow */    int neededSize = len + (bufferEnd - bufferPtr);    if (neededSize  <= bufferLim - buffer) {      memmove(buffer, bufferPtr, bufferEnd - bufferPtr);      bufferEnd = buffer + (bufferEnd - bufferPtr);      bufferPtr = buffer;    }    else {      char *newBuf;      int bufferSize = bufferLim - bufferPtr;      if (bufferSize == 0)        bufferSize = INIT_BUFFER_SIZE;      do {        bufferSize *= 2;      } while (bufferSize < neededSize);      newBuf = malloc(bufferSize);      if (newBuf == 0) {        errorCode = XML_ERROR_NO_MEMORY;        return 0;      }      bufferLim = newBuf + bufferSize;      if (bufferPtr) {        memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr);        free(buffer);      }      bufferEnd = newBuf + (bufferEnd - bufferPtr);      bufferPtr = buffer = newBuf;    }  }  return bufferEnd;}enum XML_Errorxmlrpc_XML_GetErrorCode(XML_Parser parser){  return errorCode;}longxmlrpc_XML_GetCurrentByteIndex(XML_Parser parser){  if (eventPtr)    return parseEndByteIndex - (parseEndPtr - eventPtr);  return -1;}intxmlrpc_XML_GetCurrentByteCount(XML_Parser parser){  if (eventEndPtr && eventPtr)    return eventEndPtr - eventPtr;  return 0;}intxmlrpc_XML_GetCurrentLineNumber(XML_Parser parser){  if (eventPtr) {    XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);    positionPtr = eventPtr;  }  return position.lineNumber + 1;}intxmlrpc_XML_GetCurrentColumnNumber(XML_Parser parser){  if (eventPtr) {    XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);    positionPtr = eventPtr;  }  return position.columnNumber;}voidxmlrpc_XML_DefaultCurrent(XML_Parser parser){  if (defaultHandler) {    if (openInternalEntities)      reportDefault(parser,                    internalEncoding,                    openInternalEntities->internalEventPtr,                    openInternalEntities->internalEventEndPtr);    else      reportDefault(parser, encoding, eventPtr, eventEndPtr);  }}const XML_LChar *xmlrpc_XML_ErrorString(int const code) {    static const XML_LChar * const message[] = {        NULL,        XML_T("out of memory"),        XML_T("syntax error"),        XML_T("no element found"),        XML_T("not well-formed"),        XML_T("unclosed token"),        XML_T("unclosed token"),        XML_T("mismatched tag"),        XML_T("duplicate attribute"),        XML_T("junk after document element"),        XML_T("illegal parameter entity reference"),        XML_T("undefined entity"),        XML_T("recursive entity reference"),        XML_T("asynchronous entity"),        XML_T("reference to invalid character number"),        XML_T("reference to binary entity"),        XML_T("reference to external entity in attribute"),        XML_T("xml processing instruction not at start of external entity"),        XML_T("unknown encoding"),        XML_T("encoding specified in XML declaration is incorrect"),        XML_T("unclosed CDATA section"),        XML_T("error in processing external entity reference"),        XML_T("document is not standalone")    };    const XML_LChar * retval;    if (code > 0 && (unsigned)code < ARRAY_SIZE(message))        retval = message[code];    else        retval = NULL;        return retval;}staticenum XML_Error contentProcessor(XML_Parser parser,                                const char *start,                                const char *end,                                const char **endPtr){  return doContent(parser, 0, encoding, start, end, endPtr);}staticenum XML_Error externalEntityInitProcessor(XML_Parser parser,                                           const char *start,                                           const char *end,                                           const char **endPtr){  enum XML_Error result = initializeEncoding(parser);  if (result != XML_ERROR_NONE)    return result;  processor = externalEntityInitProcessor2;  return externalEntityInitProcessor2(parser, start, end, endPtr);}staticenum XML_Error externalEntityInitProcessor2(XML_Parser parser,                                            const char *start,                                            const char *end,                                            const char **endPtr){  const char *next;  int tok = XmlContentTok(encoding, start, end, &next);  switch (tok) {  case XML_TOK_BOM:    start = next;    break;  case XML_TOK_PARTIAL:    if (endPtr) {      *endPtr = start;      return XML_ERROR_NONE;    }    eventPtr = start;    return XML_ERROR_UNCLOSED_TOKEN;  case XML_TOK_PARTIAL_CHAR:    if (endPtr) {      *endPtr = start;      return XML_ERROR_NONE;    }    eventPtr = start;    return XML_ERROR_PARTIAL_CHAR;  }  processor = externalEntityInitProcessor3;  return externalEntityInitProcessor3(parser, start, end, endPtr);}staticenum XML_Error externalEntityInitProcessor3(XML_Parser parser,                                            const char *start,                                            const char *end,                                            const char **endPtr){  const char *next;  int tok = XmlContentTok(encoding, start, end, &next);  switch (tok) {  case XML_TOK_XML_DECL:    {      enum XML_Error result = processXmlDecl(parser, 1, start, next);      if (result != XML_ERROR_NONE)        return result;      start = next;    }    break;  case XML_TOK_PARTIAL:    if (endPtr) {      *endPtr = start;      return XML_ERROR_NONE;    }    eventPtr = start;    return XML_ERROR_UNCLOSED_TOKEN;  case XML_TOK_PARTIAL_CHAR:    if (endPtr) {      *endPtr = start;      return XML_ERROR_NONE;    }    eventPtr = start;    return XML_ERROR_PARTIAL_CHAR;  }  processor = externalEntityContentProcessor;  tagLevel = 1;  return doContent(parser, 1, encoding, start, end, endPtr);}staticenum XML_Error externalEntityContentProcessor(XML_Parser parser,                                              const char *start,                                              const char *end,                                              const char **endPtr){  return doContent(parser, 1, encoding, start, end, endPtr);}static enum XML_ErrordoContent(XML_Parser parser,          int startTagLevel,          const ENCODING *enc,          const char *s,          const char *end,          const char **nextPtr){  const char **eventPP;  const char **eventEndPP;  if (enc == encoding) {    eventPP = &eventPtr;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -