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

📄 xmlparse.c

📁 GNU/Linux程序开发指南书的所有例子源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
void XML_SetProcessingInstructionHandler(XML_Parser parser,					 XML_ProcessingInstructionHandler handler){  processingInstructionHandler = handler;}void XML_SetDefaultHandler(XML_Parser parser,			   XML_DefaultHandler handler){  defaultHandler = handler;}void XML_SetUnparsedEntityDeclHandler(XML_Parser parser,				      XML_UnparsedEntityDeclHandler handler){  unparsedEntityDeclHandler = handler;}void XML_SetNotationDeclHandler(XML_Parser parser,				XML_NotationDeclHandler handler){  notationDeclHandler = handler;}void XML_SetExternalEntityRefHandler(XML_Parser parser,				     XML_ExternalEntityRefHandler handler){  externalEntityRefHandler = handler;}void XML_SetUnknownEncodingHandler(XML_Parser parser,				   XML_UnknownEncodingHandler handler,				   void *data){  unknownEncodingHandler = handler;  unknownEncodingHandlerData = data;}int XML_Parse(XML_Parser parser, const char *s, int len, int isFinal){  if (len == 0) {    if (!isFinal)      return 1;    errorCode = processor(parser, bufferPtr, parseEndPtr = bufferEnd, 0);    if (errorCode == XML_ERROR_NONE)      return 1;    eventEndPtr = eventPtr;    return 0;  }  else if (bufferPtr == bufferEnd) {    const char *end;    int nLeftOver;    parseEndByteIndex += len;    positionPtr = s;    if (isFinal) {      errorCode = processor(parser, s, parseEndPtr = s + len, 0);      if (errorCode == XML_ERROR_NONE)	return 1;      eventEndPtr = eventPtr;      return 0;    }    errorCode = processor(parser, s, parseEndPtr = s + len, &end);    if (errorCode != XML_ERROR_NONE) {      eventEndPtr = eventPtr;      return 0;    }    XmlUpdatePosition(encoding, positionPtr, end, &position);    nLeftOver = s + len - end;    if (nLeftOver) {      if (buffer == 0 || nLeftOver > bufferLim - buffer) {	/* FIXME avoid integer overflow */	buffer = buffer == 0 ? malloc(len * 2) : realloc(buffer, len * 2);	if (!buffer) {	  errorCode = XML_ERROR_NO_MEMORY;	  eventPtr = eventEndPtr = 0;	  return 0;	}	bufferLim = buffer + len * 2;      }      memcpy(buffer, end, nLeftOver);      bufferPtr = buffer;      bufferEnd = buffer + nLeftOver;    }    return 1;  }  else {    memcpy(XML_GetBuffer(parser, len), s, len);    return XML_ParseBuffer(parser, len, isFinal);  }}int XML_ParseBuffer(XML_Parser parser, int len, int isFinal){  const char *start = bufferPtr;  positionPtr = start;  bufferEnd += len;  parseEndByteIndex += len;  errorCode = processor(parser, start, parseEndPtr = bufferEnd,			isFinal ? (const char **)0 : &bufferPtr);  if (errorCode == XML_ERROR_NONE) {    if (!isFinal)      XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position);    return 1;  }  else {    eventEndPtr = eventPtr;    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_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)    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")  };  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 = XmlGetInternalEncoding();  const char *dummy;  const char **eventPP;  const char **eventEndPP;  if (enc == encoding) {    eventPP = &eventPtr;    *eventPP = s;    eventEndPP = &eventEndPtr;  }  else    eventPP = eventEndPP = &dummy;  for (;;) {    const char *next;    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 = XML_T('\n');	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;	    if (defaultHandler) {	      reportDefault(parser, enc, s, next);	      break;	    }	    /* Protect against the possibility that somebody sets	       the defaultHandler from inside another handler. */	    *eventEndPP = *eventPP;	    entity->open = 1;	    result = doContent(parser,			       tagLevel,			       internalEnc,			       (char *)entity->textPtr,			       (char *)(entity->textPtr + entity->textLen),			       0);	    entity->open = 0;	    if (result)	      return result;	  }	  else if (externalEntityRefHandler) {	    const XML_Char *openEntityNames;	    entity->open = 1;	    openEntityNames = getOpenEntityNames(parser);	    entity->open = 0;	    if (!openEntityNames)	      return XML_ERROR_NO_MEMORY;	    if (!externalEntityRefHandler(parser, openEntityNames, 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, 0, s);	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->parent = tagStack;	tagStack = tag;	tag->rawName = s + enc->minBytesPerChar;	tag->rawNameLength = XmlNameLength(enc, tag->rawName);	if (nextPtr) {	  if (tag->rawNameLength > tag->bufEnd - tag->buf) {	    int bufSize = tag->rawNameLength * 4;	    bufSize = ROUND_UP(bufSize, sizeof(XML_Char));	    tag->buf = realloc(tag->buf, bufSize);

⌨️ 快捷键说明

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