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

📄 xmltok_impl.c

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 C
📖 第 1 页 / 共 3 页
字号:
      *nextTokPtr = ptr + MINBPC(enc);      return XML_TOK_NAME_QUESTION;    default:      *nextTokPtr = ptr;      return XML_TOK_INVALID;    }  }  return -tok;}static int PTRCALLPREFIX(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;}static int PTRCALLPREFIX(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_DTDstatic int PTRCALLPREFIX(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 */static int PTRCALLPREFIX(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.*/static int PTRCALLPREFIX(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 */}static int PTRFASTCALLPREFIX(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);}static int PTRCALLPREFIX(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;}static int PTRCALLPREFIX(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 */}static int PTRCALLPREFIX(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;}static int PTRFASTCALLPREFIX(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;    }  }}static const char * PTRFASTCALLPREFIX(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;    }  }}static void PTRCALLPREFIX(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 + -