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

📄 xmlparse.cpp

📁 C++ class libraries for network-centric, portable applications, integrated perfectly with the C++ St
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  if (eventEndPtr && eventPtr)    return (int)(eventEndPtr - eventPtr);  return 0;}const char * XMLCALLXML_GetInputContext(XML_Parser parser, int *offset, int *size){#ifdef XML_CONTEXT_BYTES  if (eventPtr && buffer) {    *offset = (int)(eventPtr - buffer);    *size   = (int)(bufferEnd - buffer);    return buffer;  }#endif /* defined XML_CONTEXT_BYTES */  return (char *) 0;}XML_Size XMLCALLXML_GetCurrentLineNumber(XML_Parser parser){  if (eventPtr && eventPtr >= positionPtr) {    XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);    positionPtr = eventPtr;  }  return position.lineNumber + 1;}XML_Size XMLCALLXML_GetCurrentColumnNumber(XML_Parser parser){  if (eventPtr && eventPtr >= positionPtr) {    XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);    positionPtr = eventPtr;  }  return position.columnNumber;}void XMLCALLXML_FreeContentModel(XML_Parser parser, XML_Content *model){  FREE(model);}void * XMLCALLXML_MemMalloc(XML_Parser parser, size_t size){  return MALLOC(size);}void * XMLCALLXML_MemRealloc(XML_Parser parser, void *ptr, size_t size){  return REALLOC(ptr, size);}void XMLCALLXML_MemFree(XML_Parser parser, void *ptr){  FREE(ptr);}void XMLCALLXML_DefaultCurrent(XML_Parser parser){  if (defaultHandler) {    if (openInternalEntities)      reportDefault(parser,                    internalEncoding,                    openInternalEntities->internalEventPtr,                    openInternalEntities->internalEventEndPtr);    else      reportDefault(parser, encoding, eventPtr, eventEndPtr);  }}const XML_LChar * XMLCALLXML_ErrorString(enum XML_Error code){  static const XML_LChar* const 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 or text declaration not at start of 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"),    XML_L("unbound prefix"),    XML_L("must not undeclare prefix"),    XML_L("incomplete markup in parameter entity"),    XML_L("XML declaration not well-formed"),    XML_L("text declaration not well-formed"),    XML_L("illegal character(s) in public id"),    XML_L("parser suspended"),    XML_L("parser not suspended"),    XML_L("parsing aborted"),    XML_L("parsing finished"),    XML_L("cannot suspend in external parameter entity"),    XML_L("reserved prefix (xml) must not be undeclared or bound to another namespace name"),    XML_L("reserved prefix (xmlns) must not be declared or undeclared"),    XML_L("prefix must not be bound to one of the reserved namespace names")  };  if (code > 0 && code < sizeof(message)/sizeof(message[0]))    return message[code];  return NULL;}const XML_LChar * XMLCALLXML_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_Version XMLCALLXML_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 * XMLCALLXML_GetFeatureList(void){  static const XML_Feature features[] = {    {XML_FEATURE_SIZEOF_XML_CHAR,  XML_L("sizeof(XML_Char)"),     sizeof(XML_Char)},    {XML_FEATURE_SIZEOF_XML_LCHAR, XML_L("sizeof(XML_LChar)"),     sizeof(XML_LChar)},#ifdef XML_UNICODE    {XML_FEATURE_UNICODE,          XML_L("XML_UNICODE"), 0},#endif#ifdef XML_UNICODE_WCHAR_T    {XML_FEATURE_UNICODE_WCHAR_T,  XML_L("XML_UNICODE_WCHAR_T"), 0},#endif#ifdef XML_DTD    {XML_FEATURE_DTD,              XML_L("XML_DTD"), 0},#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"), 0},#endif#ifdef XML_NS    {XML_FEATURE_NS,               XML_L("XML_NS"), 0},#endif    {XML_FEATURE_END,              NULL, 0}  };  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.    */    if (tag->rawName == rawNameBuf)      break;    /* For re-use purposes we need to ensure that the       size of tag->buf is a multiple of sizeof(XML_Char).    */    bufSize = nameLen + ROUND_UP(tag->rawNameLength, sizeof(XML_Char));    if (bufSize > tag->bufEnd - tag->buf) {      char *temp = (char *)REALLOC(tag->buf, bufSize);      if (temp == NULL)        return XML_FALSE;      /* if tag->name.str points to tag->buf (only when namespace         processing is off) then we have to update it      */      if (tag->name.str == (XML_Char *)tag->buf)        tag->name.str = (XML_Char *)temp;      /* if tag->name.localPart is set (when namespace processing is on)         then update it as well, since it will always point into tag->buf      */      if (tag->name.localPart)        tag->name.localPart = (XML_Char *)temp + (tag->name.localPart -                                                  (XML_Char *)tag->buf);      tag->buf = temp;      tag->bufEnd = temp + bufSize;      rawNameBuf = temp + nameLen;    }    memcpy(rawNameBuf, tag->rawName, tag->rawNameLength);    tag->rawName = rawNameBuf;    tag = tag->parent;  }  return XML_TRUE;}static enum XML_Error PTRCALLcontentProcessor(XML_Parser parser,                 const char *start,                 const char *end,                 const char **endPtr){  enum XML_Error result = doContent(parser, 0, encoding, start, end,                                     endPtr, (XML_Bool)!ps_finalBuffer);  if (result == XML_ERROR_NONE) {    if (!storeRawNames(parser))      return XML_ERROR_NO_MEMORY;  }  return result;}static enum XML_Error PTRCALLexternalEntityInitProcessor(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);}static enum XML_Error PTRCALLexternalEntityInitProcessor2(XML_Parser parser,                             const char *start,                             const char *end,                             const char **endPtr){  const char *next = start; /* XmlContentTok doesn't always set the last arg */  int tok = XmlContentTok(encoding, start, end, &next);  switch (tok) {  case XML_TOK_BOM:    /* If we are at the end of the buffer, this would cause the next stage,       i.e. externalEntityInitProcessor3, to pass control directly to       doContent (by detecting XML_TOK_NONE) without processing any xml text       declaration - causing the error XML_ERROR_MISPLACED_XML_PI in doContent.    */    if (next == end && !ps_finalBuffer) {      *endPtr = next;      return XML_ERROR_NONE;    }    start = next;    break;  case XML_TOK_PARTIAL:    if (!ps_finalBuffer) {      *endPtr = start;      return XML_ERROR_NONE;    }    eventPtr = start;    return XML_ERROR_UNCLOSED_TOKEN;  case XML_TOK_PARTIAL_CHAR:    if (!ps_finalBuffer) {      *endPtr = start;      return XML_ERROR_NONE;    }    eventPtr = start;    return XML_ERROR_PARTIAL_CHAR;  }  processor = externalEntityInitProcessor3;  return externalEntityInitProcessor3(parser, start, end, endPtr);}static enum XML_Error PTRCALLexternalEntityInitProcessor3(XML_Parser parser,                             const char *start,                             const char *end,                             const char **endPtr){  int tok;  const char *next = start; /* XmlContentTok doesn't always set the last arg */  eventPtr = start;  tok = XmlContentTok(encoding, start, end, &next);  eventEndPtr = next;  switch (tok) {  case XML_TOK_XML_DECL:    {      enum XML_Error result;      result = processXmlDecl(parser, 1, start, next);      if (result != XML_ERROR_NONE)        return result;      switch (ps_parsing) {      case XML_SUSPENDED:         *endPtr = next;        return XML_ERROR_NONE;      case XML_FINISHED:        return XML_ERROR_ABORTED;      default:        start = next;      }    }    break;  case XML_TOK_PARTIAL:    if (!ps_finalBuffer) {      *endPtr = start;      return XML_ERROR_NONE;    }    return XML_ERROR_UNCLOSED_TOKEN;  case XML_TOK_PARTIAL_CHAR:    if (!ps_finalBuffer) {      *endPtr = start;      return XML_ERROR_NONE;    }    return XML_ERROR_PARTIAL_CHAR;  }  processor = externalEntityContentProcessor;  tagLevel = 1;  return externalEntityContentProcessor(parser, start, end, endPtr);}static enum XML_Error PTRCALLexternalEntityContentProcessor(XML_Parser parser,                               const char *start,                               const char *end,                               const char **endPtr){  enum XML_Error result = doContent(parser, 1, encoding, start, end,                                     endPtr, (XML_Bool)!ps_finalBuffer);  if (result == XML_ERROR_NONE) {    if (!storeRawNames(parser))      return XML_ERROR_NO_MEMORY;  }  return result;}static enum XML_ErrordoContent(XML_Parser parser,          int startTagLevel,          const ENCODING *enc,          const char *s,          const char *end,          const char **nextPtr,          XML_Bool haveMore){  /* save one level of indirection */  DTD * const dtd = _dtd;    const char **eventPP;  const char **eventEndPP;  if (enc == encoding) {    eventPP = &eventPtr;    eventEndPP = &eventEndPtr;  }  else {    eventPP = &(openInternalEntities->internalEventPtr);    eventEndPP = &(openInternalEntities->internalEventEndPtr);  }  *eventPP = s;  for (;;) {    const char *next = s; /* XmlContentTok doesn't always set the last arg */    int tok = XmlContentTok(enc, s, end, &next);    *eventEndPP = next;    switch (tok) {    case XML_TOK_TRAILING_CR:      if (haveMore) {        *nextPtr = s;        return XML_ERROR_NONE;      }      *eventEndPP = end;      if (characterDataHandler) {        XML_Char c = 0xA;        characterDataHandler(handlerArg, &c, 1);      }      else if (defaultHandler)        reportDefault(parser, enc, s, end);      /* We are at the end of the final buffer, should we check for          XML_SUSPENDED, XML_FINISHED?       */      if (startTagLevel == 0)        return XML_ERROR_NO_ELEMENTS;      if (tagLevel != startTagLevel)        return XML_ERROR_ASYNC_ENTITY;      *nextPtr = end;      return XML_ERROR_NONE;    case XML_TOK_NONE:      if (haveMore) {        *nextPtr = s;        return XML_ERROR_NONE;      }      if (startTagLevel > 0) {        if (tagLevel != startTagLevel)          return XML_ERROR_ASYNC_ENTITY;        *nextPtr = s;        return XML_ERROR_NONE;      }      return XML_ERROR_NO_ELEMENTS;    case XML_TOK_INVALID:      *eventPP = next;      return XML_ERROR_INVALID_TOKEN;    case XML_TOK_PARTIAL:      if (haveMore) 

⌨️ 快捷键说明

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