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

📄 xmlparse.c

📁 《unix/Linux下的Curses库开发指南》综合示例程序
💻 C
📖 第 1 页 / 共 5 页
字号:
	            ns ? XmlGetInternalEncodingNS() : XmlGetInternalEncoding(),		    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 ENCODING *internalEnc = ns ? XmlGetInternalEncodingNS() : XmlGetInternalEncoding();  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,			       internalEnc,			       (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,					  dtd.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);	}	break;      }    case XML_TOK_EMPTY_ELEMENT_WITH_ATTS:      if (!startElementHandler) {	enum XML_Error result = storeAtts(parser, enc, s, 0, 0);	if (result)	  return result;      }      /* fall through */    case XML_TOK_EMPTY_ELEMENT_NO_ATTS:      if (startElementHandler || endElementHandler) {	const char *rawName = s + enc->minBytesPerChar;	enum XML_Error result;	BINDING *bindings = 0;	TAG_NAME name;	name.str = poolStoreString(&tempPool, enc, rawName,				   rawName + XmlNameLength(enc, rawName));	if (!name.str)	  return XML_ERROR_NO_MEMORY;	poolFinish(&tempPool);	result = storeAtts(parser, enc, s, &name, &bindings);	if (result)	  return result;	poolFinish(&tempPool);	if (startElementHandler)	  startElementHandler(handlerArg, name.str, (const XML_Char **)atts);	if (endElementHandler) {	  if (startElementHandler)	    *eventPP = *eventEndPP;	  endElementHandler(handlerArg, name.str);	}	poolClear(&tempPool);	while (bindings) {	  BINDING *b = bindings;	  if (endNamespaceDeclHandler)	    endNamespaceDeclHandler(handlerArg, b->prefix->name);	  bindings = bindings->nextTagBinding;	  b->nextTagBinding = freeBindingList;	  freeBindingList = b;	  b->prefix->binding = b->prevPrefixBinding;	}      }      else if (defaultHandler)	reportDefault(parser, enc, s, next);      if (tagLevel == 0)	return epilogProcessor(parser, next, end, nextPtr);      break;    case XML_TOK_END_TAG:      if (tagLevel == startTagLevel)        return XML_ERROR_ASYNC_ENTITY;      else {	int len;	const char *rawName;	TAG *tag = tagStack;	tagStack = tag->parent;	tag->parent = freeTagList;	freeTagList = tag;	rawName = s + enc->minBytesPerChar*2;	len = XmlNameLength(enc, rawName);	if (len != tag->rawNameLength	    || memcmp(tag->rawName, rawName, len) != 0) {	  *eventPP = rawName;	  return XML_ERROR_TAG_MISMATCH;	}	--tagLevel;	if (endElementHandler && tag->name.str) {	  if (tag->name.localPart) {	    XML_Char *to = (XML_Char *)tag->name.str + tag->name.uriLen;	    const XML_Char *from = tag->name.localPart;	    while ((*to++ = *from++) != 0)	      ;	  }	  endElementHandler(handlerArg, tag->name.str);	}	else if (defaultHandler)	  reportDefault(parser, enc, s, next);	while (tag->bindings) {	  BINDING *b = tag->bindings;	  if (endNamespaceDeclHandler)	    endNamespaceDeclHandler(handlerArg, b->prefix->name);	  tag->bindings = tag->bindings->nextTagBinding;	  b->nextTagBinding = freeBindingList;	  freeBindingList = b;	  b->prefix->binding = b->prevPrefixBinding;	}	if (tagLevel == 0)	  return epilogProcessor(parser, next, end, nextPtr);      }

⌨️ 快捷键说明

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