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

📄 xmlparse.c

📁 《unix/Linux下的Curses库开发指南》综合示例程序
💻 C
📖 第 1 页 / 共 5 页
字号:
    case XML_TOK_PARTIAL_CHAR:      if (nextPtr) {	*nextPtr = s;	return XML_ERROR_NONE;      }      return XML_ERROR_PARTIAL_CHAR;    case XML_TOK_PARTIAL:    case XML_TOK_NONE:      if (nextPtr) {	*nextPtr = s;	return XML_ERROR_NONE;      }      return XML_ERROR_UNCLOSED_CDATA_SECTION;    default:      abort();    }    *eventPP = s = next;  }  /* not reached */}static enum XML_ErrorinitializeEncoding(XML_Parser parser){  const char *s;#ifdef XML_UNICODE  char encodingBuf[128];  if (!protocolEncodingName)    s = 0;  else {    int i;    for (i = 0; protocolEncodingName[i]; i++) {      if (i == sizeof(encodingBuf) - 1	  || protocolEncodingName[i] >= 0x80	  || protocolEncodingName[i] < 0) {	encodingBuf[0] = '\0';	break;      }      encodingBuf[i] = (char)protocolEncodingName[i];    }    encodingBuf[i] = '\0';    s = encodingBuf;  }#else  s = protocolEncodingName;#endif  if ((ns ? XmlInitEncodingNS : XmlInitEncoding)(&initEncoding, &encoding, s))    return XML_ERROR_NONE;  return handleUnknownEncoding(parser, protocolEncodingName);}static enum XML_ErrorprocessXmlDecl(XML_Parser parser, int isGeneralTextEntity,	       const char *s, const char *next){  const char *encodingName = 0;  const ENCODING *newEncoding = 0;  const char *version;  int standalone = -1;  if (!(ns        ? XmlParseXmlDeclNS	: XmlParseXmlDecl)(isGeneralTextEntity,		           encoding,		           s,		           next,		           &eventPtr,		           &version,		           &encodingName,		           &newEncoding,		           &standalone))    return XML_ERROR_SYNTAX;  if (!isGeneralTextEntity && standalone == 1)    dtd.standalone = 1;  if (defaultHandler)    reportDefault(parser, encoding, s, next);  if (!protocolEncodingName) {    if (newEncoding) {      if (newEncoding->minBytesPerChar != encoding->minBytesPerChar) {	eventPtr = encodingName;	return XML_ERROR_INCORRECT_ENCODING;      }      encoding = newEncoding;    }    else if (encodingName) {      enum XML_Error result;      const XML_Char *s = poolStoreString(&tempPool,					  encoding,					  encodingName,					  encodingName					  + XmlNameLength(encoding, encodingName));      if (!s)	return XML_ERROR_NO_MEMORY;      result = handleUnknownEncoding(parser, s);      poolDiscard(&tempPool);      if (result == XML_ERROR_UNKNOWN_ENCODING)	eventPtr = encodingName;      return result;    }  }  return XML_ERROR_NONE;}static enum XML_ErrorhandleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName){  if (unknownEncodingHandler) {    XML_Encoding info;    int i;    for (i = 0; i < 256; i++)      info.map[i] = -1;    info.convert = 0;    info.data = 0;    info.release = 0;    if (unknownEncodingHandler(unknownEncodingHandlerData, encodingName, &info)) {      ENCODING *enc;      unknownEncodingMem = malloc(XmlSizeOfUnknownEncoding());      if (!unknownEncodingMem) {	if (info.release)	  info.release(info.data);	return XML_ERROR_NO_MEMORY;      }      enc = (ns	     ? XmlInitUnknownEncodingNS	     : XmlInitUnknownEncoding)(unknownEncodingMem,				       info.map,				       info.convert,				       info.data);      if (enc) {	unknownEncodingData = info.data;	unknownEncodingRelease = info.release;	encoding = enc;	return XML_ERROR_NONE;      }    }    if (info.release)      info.release(info.data);  }  return XML_ERROR_UNKNOWN_ENCODING;}static enum XML_ErrorprologInitProcessor(XML_Parser parser,		    const char *s,		    const char *end,		    const char **nextPtr){  enum XML_Error result = initializeEncoding(parser);  if (result != XML_ERROR_NONE)    return result;  processor = prologProcessor;  return prologProcessor(parser, s, end, nextPtr);}static enum XML_ErrorprologProcessor(XML_Parser parser,		const char *s,		const char *end,		const char **nextPtr){  for (;;) {    const char *next;    int tok = XmlPrologTok(encoding, s, end, &next);    if (tok <= 0) {      if (nextPtr != 0 && tok != XML_TOK_INVALID) {	*nextPtr = s;	return XML_ERROR_NONE;      }      switch (tok) {      case XML_TOK_INVALID:	eventPtr = next;	return XML_ERROR_INVALID_TOKEN;      case XML_TOK_NONE:	return XML_ERROR_NO_ELEMENTS;      case XML_TOK_PARTIAL:	return XML_ERROR_UNCLOSED_TOKEN;      case XML_TOK_PARTIAL_CHAR:	return XML_ERROR_PARTIAL_CHAR;      case XML_TOK_TRAILING_CR:	eventPtr = s + encoding->minBytesPerChar;	return XML_ERROR_NO_ELEMENTS;      default:	abort();      }    }    switch (XmlTokenRole(&prologState, tok, s, next, encoding)) {    case XML_ROLE_XML_DECL:      {	enum XML_Error result = processXmlDecl(parser, 0, s, next);	if (result != XML_ERROR_NONE)	  return result;      }      break;    case XML_ROLE_DOCTYPE_SYSTEM_ID:      if (!dtd.standalone	  && notStandaloneHandler	  && !notStandaloneHandler(handlerArg))	return XML_ERROR_NOT_STANDALONE;      hadExternalDoctype = 1;      break;    case XML_ROLE_DOCTYPE_PUBLIC_ID:    case XML_ROLE_ENTITY_PUBLIC_ID:      if (!XmlIsPublicId(encoding, s, next, &eventPtr))	return XML_ERROR_SYNTAX;      if (declEntity) {	XML_Char *tem = poolStoreString(&dtd.pool,	                                encoding,					s + encoding->minBytesPerChar,	  				next - encoding->minBytesPerChar);	if (!tem)	  return XML_ERROR_NO_MEMORY;	normalizePublicId(tem);	declEntity->publicId = tem;	poolFinish(&dtd.pool);      }      break;    case XML_ROLE_INSTANCE_START:      processor = contentProcessor;      if (hadExternalDoctype)	dtd.complete = 0;      return contentProcessor(parser, s, end, nextPtr);    case XML_ROLE_ATTLIST_ELEMENT_NAME:      {	const XML_Char *name = poolStoreString(&dtd.pool, encoding, s, next);	if (!name)	  return XML_ERROR_NO_MEMORY;	declElementType = (ELEMENT_TYPE *)lookup(&dtd.elementTypes, name, sizeof(ELEMENT_TYPE));	if (!declElementType)	  return XML_ERROR_NO_MEMORY;	if (declElementType->name != name)	  poolDiscard(&dtd.pool);	else {	  poolFinish(&dtd.pool);	  if (!setElementTypePrefix(parser, declElementType))            return XML_ERROR_NO_MEMORY;	}	break;      }    case XML_ROLE_ATTRIBUTE_NAME:      declAttributeId = getAttributeId(parser, encoding, s, next);      if (!declAttributeId)	return XML_ERROR_NO_MEMORY;      declAttributeIsCdata = 0;      break;    case XML_ROLE_ATTRIBUTE_TYPE_CDATA:      declAttributeIsCdata = 1;      break;    case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE:    case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE:      if (dtd.complete	  && !defineAttribute(declElementType, declAttributeId, declAttributeIsCdata, 0))	return XML_ERROR_NO_MEMORY;      break;    case XML_ROLE_DEFAULT_ATTRIBUTE_VALUE:    case XML_ROLE_FIXED_ATTRIBUTE_VALUE:      {	const XML_Char *attVal;	enum XML_Error result	  = storeAttributeValue(parser, encoding, declAttributeIsCdata,				s + encoding->minBytesPerChar,			        next - encoding->minBytesPerChar,			        &dtd.pool);	if (result)	  return result;	attVal = poolStart(&dtd.pool);	poolFinish(&dtd.pool);	if (dtd.complete	    && !defineAttribute(declElementType, declAttributeId, declAttributeIsCdata, attVal))	  return XML_ERROR_NO_MEMORY;	break;      }    case XML_ROLE_ENTITY_VALUE:      {	enum XML_Error result = storeEntityValue(parser, s, next);	if (result != XML_ERROR_NONE)	  return result;      }      break;    case XML_ROLE_ENTITY_SYSTEM_ID:      if (declEntity) {	declEntity->systemId = poolStoreString(&dtd.pool, encoding,	                                       s + encoding->minBytesPerChar,	  				       next - encoding->minBytesPerChar);	if (!declEntity->systemId)	  return XML_ERROR_NO_MEMORY;	declEntity->base = dtd.base;	poolFinish(&dtd.pool);      }      break;    case XML_ROLE_ENTITY_NOTATION_NAME:      if (declEntity) {	declEntity->notation = poolStoreString(&dtd.pool, encoding, s, next);	if (!declEntity->notation)	  return XML_ERROR_NO_MEMORY;	poolFinish(&dtd.pool);	if (unparsedEntityDeclHandler) {	  eventPtr = eventEndPtr = s;	  unparsedEntityDeclHandler(handlerArg,				    declEntity->name,				    declEntity->base,				    declEntity->systemId,				    declEntity->publicId,				    declEntity->notation);	}      }      break;    case XML_ROLE_GENERAL_ENTITY_NAME:      {	const XML_Char *name;	if (XmlPredefinedEntityName(encoding, s, next)) {	  declEntity = 0;	  break;	}	name = poolStoreString(&dtd.pool, encoding, s, next);	if (!name)	  return XML_ERROR_NO_MEMORY;	if (dtd.complete) {	  declEntity = (ENTITY *)lookup(&dtd.generalEntities, name, sizeof(ENTITY));	  if (!declEntity)	    return XML_ERROR_NO_MEMORY;	  if (declEntity->name != name) {	    poolDiscard(&dtd.pool);	    declEntity = 0;	  }	  else	    poolFinish(&dtd.pool);	}	else {	  poolDiscard(&dtd.pool);	  declEntity = 0;	}      }      break;    case XML_ROLE_PARAM_ENTITY_NAME:      declEntity = 0;      break;    case XML_ROLE_NOTATION_NAME:      declNotationPublicId = 0;      declNotationName = 0;      if (notationDeclHandler) {	declNotationName = poolStoreString(&tempPool, encoding, s, next);	if (!declNotationName)	  return XML_ERROR_NO_MEMORY;	poolFinish(&tempPool);      }      break;    case XML_ROLE_NOTATION_PUBLIC_ID:      if (!XmlIsPublicId(encoding, s, next, &eventPtr))	return XML_ERROR_SYNTAX;      if (declNotationName) {	XML_Char *tem = poolStoreString(&tempPool,	                                encoding,					s + encoding->minBytesPerChar,	  				next - encoding->minBytesPerChar);	if (!tem)	  return XML_ERROR_NO_MEMORY;	normalizePublicId(tem);	declNotationPublicId = tem;	poolFinish(&tempPool);      }      break;    case XML_ROLE_NOTATION_SYSTEM_ID:      if (declNotationName && notationDeclHandler) {	const XML_Char *systemId	  = poolStoreString(&tempPool, encoding,			    s + encoding->minBytesPerChar,	  		    next - encoding->minBytesPerChar);	if (!systemId)	  return XML_ERROR_NO_MEMORY;	eventPtr = eventEndPtr = s;	notationDeclHandler(handlerArg,			    declNotationName,			    dtd.base,			    systemId,			    declNotationPublicId);      }      poolClear(&tempPool);      break;    case XML_ROLE_NOTATION_NO_SYSTEM_ID:      if (declNotationPublicId && notationDeclHandler) {	eventPtr = eventEndPtr = s;	notationDeclHandler(handlerArg,			    declNotationName,			    dtd.base,			    0,			    declNotationPublicId);      }      poolClear(&tempPool);      break;    case XML_ROLE_ERROR:      eventPtr = s;      switch (tok) {      case XML_TOK_PARAM_ENTITY_REF:	return XML_ERROR_PARAM_ENTITY_REF;      case XML_TOK_XML_DECL:	return XML_ERROR_MISPLACED_XML_PI;      default:	return XML_ERROR_SYNTAX;      }    case XML_ROLE_GROUP_OPEN:      if (prologState.level >= groupSize) {	if (groupSize)	  groupConnector = realloc(groupConnector, groupSize *= 2);	else	  groupConnector = malloc(groupSize = 32);	if (!groupConnector)	  return XML_ERROR_NO_MEMORY;      }      groupConnector[prologState.level] = 0;      break;    case XML_ROLE_GROUP_SEQUENCE:      if (groupConnector[prologState.level] == '|') {	eventPtr = s;	return XML_ERROR_SYNTAX;      }      groupConnector[prologState.level] = ',';      break;    case XML_ROLE_GROUP_CHOICE:      if (groupConnector[prologState.level] == ',') {	eventPtr = s;	return XML_ERROR_SYNTAX;      }      groupConnector[prologState.level] = '|';      break;    case XML_ROLE_PARAM_ENTITY_REF:      if (!dtd.standalone	  && notStandaloneHandler	  && !notStandaloneHandler(handlerArg))	return XML_ERROR_NOT_STANDALONE;      dtd.complete = 0;      break;    case XML_ROLE_NONE:      switch (tok) {      case XML_TOK_PI:	eventPtr = s;	eventEndPtr = next;	if (!reportProcessingInstruction(parser, encoding, s, next))	  return XML_ERROR_NO_MEMORY;	break;      case XML_TOK_COMMENT:	eventPtr = s;	eventEndPtr = next;	if (!reportComment(parser, encoding, s, next))	  return XML_ERROR_NO_MEMORY;	break;      }      break;    }    if (defaultHandler) {      switch (tok) {      case XML_TOK_PI:      case XML_TOK_COMMENT:      ca

⌨️ 快捷键说明

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