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

📄 xmlparse.c

📁 www工具包. 这是W3C官方支持的www支撑库. 其中提供通用目的的客户端的WebAPI: complete HTTP/1.1 (with caching, pipelining, PUT, POS
💻 C
📖 第 1 页 / 共 5 页
字号:
  b->prevPrefixBinding = prefix->binding;  if (*uri == XML_T('\0') && prefix == &dtd.defaultPrefix)    prefix->binding = 0;  else    prefix->binding = b;  b->nextTagBinding = *bindingsPtr;  *bindingsPtr = b;  if (startNamespaceDeclHandler)    startNamespaceDeclHandler(handlerArg, prefix->name,			      prefix->binding ? uri : 0);  return 1;}/* The idea here is to avoid using stack for each CDATA section whenthe whole file is parsed with one call. */staticenum XML_Error cdataSectionProcessor(XML_Parser parser,				     const char *start,			    	     const char *end,				     const char **endPtr){  enum XML_Error result = doCdataSection(parser, encoding, &start, end, endPtr);  if (start) {    processor = contentProcessor;    return contentProcessor(parser, start, end, endPtr);  }  return result;}/* startPtr gets set to non-null is the section is closed, and to null ifthe section is not yet closed. */staticenum XML_Error doCdataSection(XML_Parser parser,			      const ENCODING *enc,			      const char **startPtr,			      const char *end,			      const char **nextPtr){  const char *s = *startPtr;  const char **eventPP;  const char **eventEndPP;  if (enc == encoding) {    eventPP = &eventPtr;    *eventPP = s;    eventEndPP = &eventEndPtr;  }  else {    eventPP = &(openInternalEntities->internalEventPtr);    eventEndPP = &(openInternalEntities->internalEventEndPtr);  }  *eventPP = s;  *startPtr = 0;  for (;;) {    const char *next;    int tok = XmlCdataSectionTok(enc, s, end, &next);    *eventEndPP = next;    switch (tok) {    case XML_TOK_CDATA_SECT_CLOSE:      if (endCdataSectionHandler)	endCdataSectionHandler(handlerArg);#if 0      /* see comment under XML_TOK_CDATA_SECT_OPEN */      else if (characterDataHandler)	characterDataHandler(handlerArg, dataBuf, 0);#endif      else if (defaultHandler)	reportDefault(parser, enc, s, next);      *startPtr = next;      return XML_ERROR_NONE;    case XML_TOK_DATA_NEWLINE:      if (characterDataHandler) {	XML_Char c = 0xA;	characterDataHandler(handlerArg, &c, 1);      }      else if (defaultHandler)	reportDefault(parser, enc, s, next);      break;    case XML_TOK_DATA_CHARS:      if (characterDataHandler) {	if (MUST_CONVERT(enc, s)) {	  for (;;) {  	    ICHAR *dataPtr = (ICHAR *)dataBuf;	    XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);	    *eventEndPP = next;	    characterDataHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf);	    if (s == next)	      break;	    *eventPP = s;	  }	}	else	  characterDataHandler(handlerArg,		  	       (XML_Char *)s,			       (XML_Char *)next - (XML_Char *)s);      }      else if (defaultHandler)	reportDefault(parser, enc, s, next);      break;    case XML_TOK_INVALID:      *eventPP = next;      return XML_ERROR_INVALID_TOKEN;    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 */}#ifdef XML_DTD/* The idea here is to avoid using stack for each IGNORE section whenthe whole file is parsed with one call. */staticenum XML_Error ignoreSectionProcessor(XML_Parser parser,				      const char *start,				      const char *end,				      const char **endPtr){  enum XML_Error result = doIgnoreSection(parser, encoding, &start, end, endPtr);  if (start) {    processor = prologProcessor;    return prologProcessor(parser, start, end, endPtr);  }  return result;}/* startPtr gets set to non-null is the section is closed, and to null ifthe section is not yet closed. */staticenum XML_Error doIgnoreSection(XML_Parser parser,			       const ENCODING *enc,			       const char **startPtr,			       const char *end,			       const char **nextPtr){  const char *next;  int tok;  const char *s = *startPtr;  const char **eventPP;  const char **eventEndPP;  if (enc == encoding) {    eventPP = &eventPtr;    *eventPP = s;    eventEndPP = &eventEndPtr;  }  else {    eventPP = &(openInternalEntities->internalEventPtr);    eventEndPP = &(openInternalEntities->internalEventEndPtr);  }  *eventPP = s;  *startPtr = 0;  tok = XmlIgnoreSectionTok(enc, s, end, &next);  *eventEndPP = next;  switch (tok) {  case XML_TOK_IGNORE_SECT:    if (defaultHandler)      reportDefault(parser, enc, s, next);    *startPtr = next;    return XML_ERROR_NONE;  case XML_TOK_INVALID:    *eventPP = next;    return XML_ERROR_INVALID_TOKEN;  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_SYNTAX; /* XML_ERROR_UNCLOSED_IGNORE_SECTION */  default:    abort();  }  /* not reached */}#endif /* XML_DTD */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;#ifdef XML_DTD    if (paramEntityParsing == XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE)      paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER;#endif /* XML_DTD */  }  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){  const char *next;  int tok = XmlPrologTok(encoding, s, end, &next);  return doProlog(parser, encoding, s, end, tok, next, nextPtr);}static enum XML_ErrordoProlog(XML_Parser parser,	 const ENCODING *enc,	 const char *s,	 const char *end,	 int tok,	 const char *next,	 const char **nextPtr){#ifdef XML_DTD  static const XML_Char externalSubsetName[] = { '#' , '\0' };#endif /* XML_DTD */  const char **eventPP;  const char **eventEndPP;  if (enc == encoding) {    eventPP = &eventPtr;    eventEndPP = &eventEndPtr;  }  else {    eventPP = &(openInternalEntities->internalEventPtr);    eventEndPP = &(openInternalEntities->internalEventEndPtr);  }  for (;;) {    int role;    *eventPP = s;    *eventEndPP = next;    if (tok <= 0) {      if (nextPtr != 0 && tok != XML_TOK_INVALID) {	*nextPtr = s;	return XML_ERROR_NONE;      }      switch (tok) {      case XML_TOK_INVALID:	*eventPP = next;	return XML_ERROR_INVALID_TOKEN;      case XML_TOK_PARTIAL:	return XML_ERROR_UNCLOSED_TOKEN;      case XML_TOK_PARTIAL_CHAR:	return XML_ERROR_PARTIAL_CHAR;      case XML_TOK_NONE:#ifdef XML_DTD	if (enc != encoding)	  return XML_ERROR_NONE;	if (parentParser) {	  if (XmlTokenRole(&prologState, XML_TOK_NONE, end, end, enc)	      == XML_ROLE_ERROR)	    return XML_ERROR_SYNTAX;	  hadExternalDoctype = 0;	  return XML_ERROR_NONE;	}#endif /* XML_DTD */	return XML_ERROR_NO_ELEMENTS;      default:	tok = -tok;	next = end;	break;      }    }    role = XmlTokenRole(&prologState, tok, s, next, enc);    switch (role) {    case XML_ROLE_XML_DECL:      {	enum XML_Error result = processXmlDecl(parser, 0, s, next);	if (result != XML_ERROR_NONE)	  return result;	enc = encoding;      }      break;    case XML_ROLE_DOCTYPE_NAME:      if (startDoctypeDeclHandler) {	const XML_Char *name = poolStoreString(&tempPool, enc, s, next);	if (!name)	  return XML_ERROR_NO_MEMORY;	startDoctypeDeclHandler(handlerArg, name);	poolClear(&tempPool);      }      break;#ifdef XML_DTD    case XML_ROLE_TEXT_DECL:      {	enum XML_Error result = processXmlDecl(parser, 1, s, next);	if (result != XML_ERROR_NONE)	  return result;	enc = encoding;      }      break;#endif /* XML_DTD */    case XML_ROLE_DOCTYPE_PUBLIC_ID:#ifdef XML_DTD      declEntity = (ENTITY *)lookup(&dtd.paramEntities,				    externalSubsetName,				    sizeof(ENTITY));      if (!declEntity)	return XML_ERROR_NO_MEMORY;#endif /* XML_DTD */      /* fall through */    case XML_ROLE_ENTITY_PUBLIC_ID:      if (!XmlIsPublicId(enc, s, next, eventPP))	return XML_ERROR_SYNTAX;      if (declEntity) {	XML_Char *tem = poolStoreString(&

⌨️ 快捷键说明

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