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

📄 xmltok_impl.c

📁 最新apache的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
      if (tok == XML_TOK_NMTOKEN)  {	*nextTokPtr = ptr;	return XML_TOK_INVALID;      }      *nextTokPtr = ptr + MINBPC(enc);      return XML_TOK_NAME_QUESTION;    default:      *nextTokPtr = ptr;      return XML_TOK_INVALID;    }  }  return -tok;}staticint PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,			      const char **nextTokPtr){  const char *start;  if (ptr == end)    return XML_TOK_NONE;  start = ptr;  while (ptr != end) {    switch (BYTE_TYPE(enc, ptr)) {#define LEAD_CASE(n) \    case BT_LEAD ## n: ptr += n; break;    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)#undef LEAD_CASE    case BT_AMP:      if (ptr == start)	return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);      *nextTokPtr = ptr;      return XML_TOK_DATA_CHARS;    case BT_LT:      /* this is for inside entity references */      *nextTokPtr = ptr;      return XML_TOK_INVALID;    case BT_LF:      if (ptr == start) {	*nextTokPtr = ptr + MINBPC(enc);	return XML_TOK_DATA_NEWLINE;      }      *nextTokPtr = ptr;      return XML_TOK_DATA_CHARS;    case BT_CR:      if (ptr == start) {	ptr += MINBPC(enc);	if (ptr == end)	  return XML_TOK_TRAILING_CR;	if (BYTE_TYPE(enc, ptr) == BT_LF)	  ptr += MINBPC(enc);	*nextTokPtr = ptr;	return XML_TOK_DATA_NEWLINE;      }      *nextTokPtr = ptr;      return XML_TOK_DATA_CHARS;    case BT_S:      if (ptr == start) {	*nextTokPtr = ptr + MINBPC(enc);	return XML_TOK_ATTRIBUTE_VALUE_S;      }      *nextTokPtr = ptr;      return XML_TOK_DATA_CHARS;    default:      ptr += MINBPC(enc);      break;    }  }  *nextTokPtr = ptr;  return XML_TOK_DATA_CHARS;}staticint PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, const char *end,			   const char **nextTokPtr){  const char *start;  if (ptr == end)    return XML_TOK_NONE;  start = ptr;  while (ptr != end) {    switch (BYTE_TYPE(enc, ptr)) {#define LEAD_CASE(n) \    case BT_LEAD ## n: ptr += n; break;    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)#undef LEAD_CASE    case BT_AMP:      if (ptr == start)	return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);      *nextTokPtr = ptr;      return XML_TOK_DATA_CHARS;    case BT_PERCNT:      if (ptr == start) {	int tok =  PREFIX(scanPercent)(enc, ptr + MINBPC(enc),				       end, nextTokPtr);	return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok;      }      *nextTokPtr = ptr;      return XML_TOK_DATA_CHARS;    case BT_LF:      if (ptr == start) {	*nextTokPtr = ptr + MINBPC(enc);	return XML_TOK_DATA_NEWLINE;      }      *nextTokPtr = ptr;      return XML_TOK_DATA_CHARS;    case BT_CR:      if (ptr == start) {	ptr += MINBPC(enc);	if (ptr == end)	  return XML_TOK_TRAILING_CR;	if (BYTE_TYPE(enc, ptr) == BT_LF)	  ptr += MINBPC(enc);	*nextTokPtr = ptr;	return XML_TOK_DATA_NEWLINE;      }      *nextTokPtr = ptr;      return XML_TOK_DATA_CHARS;    default:      ptr += MINBPC(enc);      break;    }  }  *nextTokPtr = ptr;  return XML_TOK_DATA_CHARS;}#ifdef XML_DTDstaticint PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, const char *end,			     const char **nextTokPtr){  int level = 0;  if (MINBPC(enc) > 1) {    size_t n = end - ptr;    if (n & (MINBPC(enc) - 1)) {      n &= ~(MINBPC(enc) - 1);      end = ptr + n;    }  }  while (ptr != end) {    switch (BYTE_TYPE(enc, ptr)) {    INVALID_CASES(ptr, nextTokPtr)    case BT_LT:      if ((ptr += MINBPC(enc)) == end)	return XML_TOK_PARTIAL;      if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) {	if ((ptr += MINBPC(enc)) == end)	  return XML_TOK_PARTIAL;	if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) {	  ++level;	  ptr += MINBPC(enc);	}      }      break;    case BT_RSQB:      if ((ptr += MINBPC(enc)) == end)	return XML_TOK_PARTIAL;      if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {	if ((ptr += MINBPC(enc)) == end)	  return XML_TOK_PARTIAL;	if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {	  ptr += MINBPC(enc);	  if (level == 0) {	    *nextTokPtr = ptr;	    return XML_TOK_IGNORE_SECT;	  }	  --level;	}      }      break;    default:      ptr += MINBPC(enc);      break;    }  }  return XML_TOK_PARTIAL;}#endif /* XML_DTD */staticint PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end,		       const char **badPtr){  ptr += MINBPC(enc);  end -= MINBPC(enc);  for (; ptr != end; ptr += MINBPC(enc)) {    switch (BYTE_TYPE(enc, ptr)) {    case BT_DIGIT:    case BT_HEX:    case BT_MINUS:    case BT_APOS:    case BT_LPAR:    case BT_RPAR:    case BT_PLUS:    case BT_COMMA:    case BT_SOL:    case BT_EQUALS:    case BT_QUEST:    case BT_CR:    case BT_LF:    case BT_SEMI:    case BT_EXCL:    case BT_AST:    case BT_PERCNT:    case BT_NUM:#ifdef XML_NS    case BT_COLON:#endif      break;    case BT_S:      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {	*badPtr = ptr;	return 0;      }      break;    case BT_NAME:    case BT_NMSTRT:      if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f))	break;    default:      switch (BYTE_TO_ASCII(enc, ptr)) {      case 0x24: /* $ */      case 0x40: /* @ */	break;      default:	*badPtr = ptr;	return 0;      }      break;    }  }  return 1;}/* This must only be called for a well-formed start-tag or empty element tag.Returns the number of attributes.  Pointers to the first attsMax attributes are stored in atts. */staticint PREFIX(getAtts)(const ENCODING *enc, const char *ptr,		    int attsMax, ATTRIBUTE *atts){  enum { other, inName, inValue } state = inName;  int nAtts = 0;  int open = 0; /* defined when state == inValue;		   initialization just to shut up compilers */  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {    switch (BYTE_TYPE(enc, ptr)) {#define START_NAME \      if (state == other) { \	if (nAtts < attsMax) { \	  atts[nAtts].name = ptr; \	  atts[nAtts].normalized = 1; \	} \	state = inName; \      }#define LEAD_CASE(n) \    case BT_LEAD ## n: START_NAME ptr += (n - MINBPC(enc)); break;    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)#undef LEAD_CASE    case BT_NONASCII:    case BT_NMSTRT:    case BT_HEX:      START_NAME      break;#undef START_NAME    case BT_QUOT:      if (state != inValue) {	if (nAtts < attsMax)	  atts[nAtts].valuePtr = ptr + MINBPC(enc);        state = inValue;        open = BT_QUOT;      }      else if (open == BT_QUOT) {        state = other;	if (nAtts < attsMax)	  atts[nAtts].valueEnd = ptr;	nAtts++;      }      break;    case BT_APOS:      if (state != inValue) {	if (nAtts < attsMax)	  atts[nAtts].valuePtr = ptr + MINBPC(enc);        state = inValue;        open = BT_APOS;      }      else if (open == BT_APOS) {        state = other;	if (nAtts < attsMax)	  atts[nAtts].valueEnd = ptr;	nAtts++;      }      break;    case BT_AMP:      if (nAtts < attsMax)	atts[nAtts].normalized = 0;      break;    case BT_S:      if (state == inName)        state = other;      else if (state == inValue	       && nAtts < attsMax	       && atts[nAtts].normalized	       && (ptr == atts[nAtts].valuePtr		   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE		   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE	           || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))	atts[nAtts].normalized = 0;      break;    case BT_CR: case BT_LF:      /* This case ensures that the first attribute name is counted         Apart from that we could just change state on the quote. */      if (state == inName)        state = other;      else if (state == inValue && nAtts < attsMax)	atts[nAtts].normalized = 0;      break;    case BT_GT:    case BT_SOL:      if (state != inValue)	return nAtts;      break;    default:      break;    }  }  /* not reached */}staticint PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr){  int result = 0;  /* skip &# */  ptr += 2*MINBPC(enc);  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {    for (ptr += MINBPC(enc); !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {      int c = BYTE_TO_ASCII(enc, ptr);      switch (c) {      case ASCII_0: case ASCII_1: case ASCII_2: case ASCII_3: case ASCII_4:      case ASCII_5: case ASCII_6: case ASCII_7: case ASCII_8: case ASCII_9:	result <<= 4;	result |= (c - ASCII_0);	break;      case ASCII_A: case ASCII_B: case ASCII_C: case ASCII_D: case ASCII_E: case ASCII_F:	result <<= 4;	result += 10 + (c - ASCII_A);	break;      case ASCII_a: case ASCII_b: case ASCII_c: case ASCII_d: case ASCII_e: case ASCII_f:	result <<= 4;	result += 10 + (c - ASCII_a);	break;      }      if (result >= 0x110000)	return -1;    }  }  else {    for (; !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {      int c = BYTE_TO_ASCII(enc, ptr);      result *= 10;      result += (c - ASCII_0);      if (result >= 0x110000)	return -1;    }  }  return checkCharRefNumber(result);}staticint PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr, const char *end){  switch ((end - ptr)/MINBPC(enc)) {  case 2:    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {      switch (BYTE_TO_ASCII(enc, ptr)) {      case ASCII_l:	return ASCII_LT;      case ASCII_g:	return ASCII_GT;      }    }    break;  case 3:    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {      ptr += MINBPC(enc);      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {	ptr += MINBPC(enc);	if (CHAR_MATCHES(enc, ptr, ASCII_p))	  return ASCII_AMP;      }    }    break;  case 4:    switch (BYTE_TO_ASCII(enc, ptr)) {    case ASCII_q:      ptr += MINBPC(enc);      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {	ptr += MINBPC(enc);	if (CHAR_MATCHES(enc, ptr, ASCII_o)) {	  ptr += MINBPC(enc);  	  if (CHAR_MATCHES(enc, ptr, ASCII_t))	    return ASCII_QUOT;	}      }      break;    case ASCII_a:      ptr += MINBPC(enc);      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {	ptr += MINBPC(enc);	if (CHAR_MATCHES(enc, ptr, ASCII_o)) {	  ptr += MINBPC(enc);  	  if (CHAR_MATCHES(enc, ptr, ASCII_s))	    return ASCII_APOS;	}      }      break;    }  }  return 0;}staticint PREFIX(sameName)(const ENCODING *enc, const char *ptr1, const char *ptr2){  for (;;) {    switch (BYTE_TYPE(enc, ptr1)) {#define LEAD_CASE(n) \    case BT_LEAD ## n: \      if (*ptr1++ != *ptr2++) \	return 0;    LEAD_CASE(4) LEAD_CASE(3) LEAD_CASE(2)#undef LEAD_CASE      /* fall through */      if (*ptr1++ != *ptr2++)	return 0;      break;    case BT_NONASCII:    case BT_NMSTRT:#ifdef XML_NS    case BT_COLON:#endif    case BT_HEX:    case BT_DIGIT:    case BT_NAME:    case BT_MINUS:      if (*ptr2++ != *ptr1++)	return 0;      if (MINBPC(enc) > 1) {	if (*ptr2++ != *ptr1++)	  return 0;	if (MINBPC(enc) > 2) {	  if (*ptr2++ != *ptr1++)	    return 0;          if (MINBPC(enc) > 3) {	    if (*ptr2++ != *ptr1++)      	      return 0;	  }	}      }      break;    default:      if (MINBPC(enc) == 1 && *ptr1 == *ptr2)	return 1;      switch (BYTE_TYPE(enc, ptr2)) {      case BT_LEAD2:      case BT_LEAD3:      case BT_LEAD4:      case BT_NONASCII:      case BT_NMSTRT:#ifdef XML_NS      case BT_COLON:#endif      case BT_HEX:      case BT_DIGIT:      case BT_NAME:      case BT_MINUS:	return 0;      default:	return 1;      }    }  }  /* not reached */}staticint PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1,			     const char *end1, const char *ptr2){  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {    if (ptr1 == end1)      return 0;    if (!CHAR_MATCHES(enc, ptr1, *ptr2))      return 0;  }  return ptr1 == end1;}staticint PREFIX(nameLength)(const ENCODING *enc, const char *ptr){  const char *start = ptr;  for (;;) {    switch (BYTE_TYPE(enc, ptr)) {#define LEAD_CASE(n) \    case BT_LEAD ## n: ptr += n; break;    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)#undef LEAD_CASE    case BT_NONASCII:    case BT_NMSTRT:#ifdef XML_NS    case BT_COLON:#endif    case BT_HEX:    case BT_DIGIT:    case BT_NAME:    case BT_MINUS:      ptr += MINBPC(enc);      break;    default:      return ptr - start;    }  }}staticconst char *PREFIX(skipS)(const ENCODING *enc, const char *ptr){  for (;;) {    switch (BYTE_TYPE(enc, ptr)) {    case BT_LF:    case BT_CR:    case BT_S:      ptr += MINBPC(enc);      break;    default:      return ptr;    }  }}staticvoid PREFIX(updatePosition)(const ENCODING *enc,			    const char *ptr,			    const char *end,			    POSITION *pos){  while (ptr != end) {    switch (BYTE_TYPE(enc, ptr)) {#define LEAD_CASE(n) \    case BT_LEAD ## n: \      ptr += n; \      break;    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)#undef LEAD_CASE    case BT_LF:      pos->columnNumber = (unsigned)-1;      pos->lineNumber++;      ptr += MINBPC(enc);      break;    case BT_CR:      pos->lineNumber++;      ptr += MINBPC(enc);      if (ptr != end && BYTE_TYPE(enc, ptr) == BT_LF)	ptr += MINBPC(enc);      pos->columnNumber = (unsigned)-1;      break;    default:      ptr += MINBPC(enc);      break;    }    pos->columnNumber++;  }}#undef DO_LEAD_CASE#undef MULTIBYTE_CASES#undef INVALID_CASES#undef CHECK_NAME_CASE#undef CHECK_NAME_CASES#undef CHECK_NMSTRT_CASE#undef CHECK_NMSTRT_CASES

⌨️ 快捷键说明

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