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

📄 xmlparse.c

📁 www工具包. 这是W3C官方支持的www支撑库. 其中提供通用目的的客户端的WebAPI: complete HTTP/1.1 (with caching, pipelining, PUT, POS
💻 C
📖 第 1 页 / 共 5 页
字号:
			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 *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_Error XML_GetErrorCode(XML_Parser parser){  return errorCode;}long XML_GetCurrentByteIndex(XML_Parser parser){  if (eventPtr)    return parseEndByteIndex - (parseEndPtr - eventPtr);  return -1;}int XML_GetCurrentByteCount(XML_Parser parser){  if (eventEndPtr && eventPtr)    return eventEndPtr - eventPtr;  return 0;}int XML_GetCurrentLineNumber(XML_Parser parser){  if (eventPtr) {    XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);    positionPtr = eventPtr;  }  return position.lineNumber + 1;}int XML_GetCurrentColumnNumber(XML_Parser parser){  if (eventPtr) {    XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);    positionPtr = eventPtr;  }  return position.columnNumber;}void 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 *XML_ErrorString(int code){  static const XML_LChar *message[] = {    0,    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")  };  if (code > 0 && code < sizeof(message)/sizeof(message[0]))    return message[code];  return 0;}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;    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 (nextPtr) {	*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);      if (startTagLevel == 0)	return XML_ERROR_NO_ELEMENTS;      if (tagLevel != startTagLevel)	return XML_ERROR_ASYNC_ENTITY;      return XML_ERROR_NONE;    case XML_TOK_NONE:      if (nextPtr) {	*nextPtr = s;	return XML_ERROR_NONE;      }      if (startTagLevel > 0) {	if (tagLevel != startTagLevel)	  return XML_ERROR_ASYNC_ENTITY;	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 (nextPtr) {	*nextPtr = s;	return XML_ERROR_NONE;      }      return XML_ERROR_UNCLOSED_TOKEN;    case XML_TOK_PARTIAL_CHAR:      if (nextPtr) {	*nextPtr = s;	return XML_ERROR_NONE;      }      return XML_ERROR_PARTIAL_CHAR;    case XML_TOK_ENTITY_REF:      {	const XML_Char *name;	ENTITY *entity;	XML_Char ch = XmlPredefinedEntityName(enc,					      s + enc->minBytesPerChar,					      next - enc->minBytesPerChar);	if (ch) {	  if (characterDataHandler)	    characterDataHandler(handlerArg, &ch, 1);	  else if (defaultHandler)	    reportDefault(parser, enc, s, next);	  break;	}	name = poolStoreString(&dtd.pool, enc,				s + enc->minBytesPerChar,				next - enc->minBytesPerChar);	if (!name)	  return XML_ERROR_NO_MEMORY;	entity = (ENTITY *)lookup(&dtd.generalEntities, name, 0);	poolDiscard(&dtd.pool);	if (!entity) {	  if (dtd.complete || dtd.standalone)	    return XML_ERROR_UNDEFINED_ENTITY;	  if (defaultHandler)	    reportDefault(parser, enc, s, next);	  break;	}	if (entity->open)	  return XML_ERROR_RECURSIVE_ENTITY_REF;	if (entity->notation)	  return XML_ERROR_BINARY_ENTITY_REF;	if (entity) {	  if (entity->textPtr) {	    enum XML_Error result;	    OPEN_INTERNAL_ENTITY openEntity;	    if (defaultHandler && !defaultExpandInternalEntities) {	      reportDefault(parser, enc, s, next);	      break;	    }	    entity->open = 1;	    openEntity.next = openInternalEntities;	    openInternalEntities = &openEntity;	    openEntity.entity = entity;	    openEntity.internalEventPtr = 0;	    openEntity.internalEventEndPtr = 0;	    result = doContent(parser,			       tagLevel,			       internalEncoding,			       (char *)entity->textPtr,			       (char *)(entity->textPtr + entity->textLen),			       0);	    entity->open = 0;	    openInternalEntities = openEntity.next;	    if (result)	      return result;	  }	  else if (externalEntityRefHandler) {	    const XML_Char *context;	    entity->open = 1;	    context = getContext(parser);	    entity->open = 0;	    if (!context)	      return XML_ERROR_NO_MEMORY;	    if (!externalEntityRefHandler(externalEntityRefHandlerArg,				          context,					  entity->base,					  entity->systemId,					  entity->publicId))	      return XML_ERROR_EXTERNAL_ENTITY_HANDLING;	    poolDiscard(&tempPool);	  }	  else if (defaultHandler)	    reportDefault(parser, enc, s, next);	}	break;      }    case XML_TOK_START_TAG_WITH_ATTS:      if (!startElementHandler) {	enum XML_Error result = storeAtts(parser, enc, s, 0, 0);	if (result)	  return result;      }      /* fall through */    case XML_TOK_START_TAG_NO_ATTS:      {	TAG *tag;	if (freeTagList) {	  tag = freeTagList;	  freeTagList = freeTagList->parent;	}	else {	  tag = malloc(sizeof(TAG));	  if (!tag)	    return XML_ERROR_NO_MEMORY;	  tag->buf = malloc(INIT_TAG_BUF_SIZE);	  if (!tag->buf)	    return XML_ERROR_NO_MEMORY;	  tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE;	}	tag->bindings = 0;	tag->parent = tagStack;	tagStack = tag;	tag->name.localPart = 0;	tag->rawName = s + enc->minBytesPerChar;	tag->rawNameLength = XmlNameLength(enc, tag->rawName);	if (nextPtr) {	  /* Need to guarantee that:	     tag->buf + ROUND_UP(tag->rawNameLength, sizeof(XML_Char)) <= tag->bufEnd - sizeof(XML_Char) */	  if (tag->rawNameLength + (int)(sizeof(XML_Char) - 1) + (int)sizeof(XML_Char) > tag->bufEnd - tag->buf) {	    int bufSize = tag->rawNameLength * 4;	    bufSize = ROUND_UP(bufSize, sizeof(XML_Char));	    tag->buf = realloc(tag->buf, bufSize);	    if (!tag->buf)	      return XML_ERROR_NO_MEMORY;	    tag->bufEnd = tag->buf + bufSize;	  }	  memcpy(tag->buf, tag->rawName, tag->rawNameLength);	  tag->rawName = tag->buf;	}	++tagLevel;	if (startElementHandler) {	  enum XML_Error result;	  XML_Char *toPtr;	  for (;;) {	    const char *rawNameEnd = tag->rawName + tag->rawNameLength;	    const char *fromPtr = tag->rawName;	    int bufSize;	    if (nextPtr)	      toPtr = (XML_Char *)(tag->buf + ROUND_UP(tag->rawNameLength, sizeof(XML_Char)));	    else	      toPtr = (XML_Char *)tag->buf;	    tag->name.str = toPtr;	    XmlConvert(enc,		       &fromPtr, rawNameEnd,		       (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1);	    if (fromPtr == rawNameEnd)	      break;	    bufSize = (tag->bufEnd - tag->buf) << 1;	    tag->buf = realloc(tag->buf, bufSize);	    if (!tag->buf)	      return XML_ERROR_NO_MEMORY;	    tag->bufEnd = tag->buf + bufSize;	    if (nextPtr)	      tag->rawName = tag->buf;	  }	  *toPtr = XML_T('\0');	  result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings));	  if (result)	    return result;	  startElementHandler(handlerArg, tag->name.str, (const XML_Char **)atts);	  poolClear(&tempPool);	}	else {	  tag->name.str = 0;	  if (defaultHandler)	    reportDefault(parser, enc, s, next);

⌨️ 快捷键说明

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