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

📄 xmltok.c

📁 AnyQ服务端源代码(2004/10/28)源码
💻 C
📖 第 1 页 / 共 3 页
字号:
      if (toLim -  *toP < 2) { \        *fromP = from; \    return; \      } \      *(*toP)++ = ((lo >> 6) | (hi << 2) |  UTF8_cval2); \      *(*toP)++ = ((lo & 0x3f) | 0x80); \      break; \    default: \      if (toLim -  *toP < 3)  { \        *fromP = from; \    return; \      } \      /* 16 bits divided 4, 6, 6 amongst 3 bytes */ \      *(*toP)++ = ((hi >> 4) | UTF8_cval3); \      *(*toP)++ = (((hi & 0xf) << 2) | (lo >> 6) | 0x80); \      *(*toP)++ = ((lo & 0x3f) | 0x80); \      break; \    case 0xD8: case 0xD9: case 0xDA: case 0xDB: \      if (toLim -  *toP < 4) { \    *fromP = from; \    return; \      } \      plane = (((hi & 0x3) << 2) | ((lo >> 6) & 0x3)) + 1; \      *(*toP)++ = ((plane >> 2) | UTF8_cval4); \      *(*toP)++ = (((lo >> 2) & 0xF) | ((plane & 0x3) << 4) | 0x80); \      from += 2; \      lo2 = GET_LO(from); \      *(*toP)++ = (((lo & 0x3) << 4) \               | ((GET_HI(from) & 0x3) << 2) \           | (lo2 >> 6) \           | 0x80); \      *(*toP)++ = ((lo2 & 0x3f) | 0x80); \      break; \    } \  } \  *fromP = from; \}#define DEFINE_UTF16_TO_UTF16(E) \static \void E ## toUtf16(const ENCODING *enc, \          const char **fromP, const char *fromLim, \          unsigned short **toP, const unsigned short *toLim) \{ \  /* Avoid copying first half only of surrogate */ \  if (fromLim - *fromP > ((toLim - *toP) << 1) \      && (GET_HI(fromLim - 2) & 0xF8) == 0xD8) \    fromLim -= 2; \  for (; *fromP != fromLim && *toP != toLim; *fromP += 2) \    *(*toP)++ = (GET_HI(*fromP) << 8) | GET_LO(*fromP); \}#define SET2(ptr, ch) \  (((ptr)[0] = ((ch) & 0xff)), ((ptr)[1] = ((ch) >> 8)))#define GET_LO(ptr) ((unsigned char)(ptr)[0])#define GET_HI(ptr) ((unsigned char)(ptr)[1])DEFINE_UTF16_TO_UTF8(little2_)DEFINE_UTF16_TO_UTF16(little2_)#undef SET2#undef GET_LO#undef GET_HI#define SET2(ptr, ch) \  (((ptr)[0] = ((ch) >> 8)), ((ptr)[1] = ((ch) & 0xFF)))#define GET_LO(ptr) ((unsigned char)(ptr)[1])#define GET_HI(ptr) ((unsigned char)(ptr)[0])DEFINE_UTF16_TO_UTF8(big2_)DEFINE_UTF16_TO_UTF16(big2_)#undef SET2#undef GET_LO#undef GET_HI#define LITTLE2_BYTE_TYPE(enc, p) \ ((p)[1] == 0 \  ? ((struct normal_encoding *)(enc))->type[(unsigned char)*(p)] \  : unicode_byte_type((p)[1], (p)[0]))#define LITTLE2_BYTE_TO_ASCII(enc, p) ((p)[1] == 0 ? (p)[0] : -1)#define LITTLE2_CHAR_MATCHES(enc, p, c) ((p)[1] == 0 && (p)[0] == c)#define LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) \  UCS2_GET_NAMING(namePages, (unsigned char)p[1], (unsigned char)p[0])#define LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) \  UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[1], (unsigned char)p[0])#ifdef XML_MIN_SIZEstaticint little2_byteType(const ENCODING *enc, const char *p){    return LITTLE2_BYTE_TYPE(enc, p);}staticint little2_byteToAscii(const ENCODING *enc, const char *p){    return LITTLE2_BYTE_TO_ASCII(enc, p);}staticint little2_charMatches(const ENCODING *enc, const char *p, int c){    return LITTLE2_CHAR_MATCHES(enc, p, c);}staticint little2_isNameMin(const ENCODING *enc, const char *p){    return LITTLE2_IS_NAME_CHAR_MINBPC(enc, p);}staticint little2_isNmstrtMin(const ENCODING *enc, const char *p){    return LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p);}#undef VTABLE#define VTABLE VTABLE1, little2_toUtf8, little2_toUtf16#else /* not XML_MIN_SIZE */#undef PREFIX#define PREFIX(ident) little2_ ## ident#define MINBPC(enc) 2/* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */#define BYTE_TYPE(enc, p) LITTLE2_BYTE_TYPE(enc, p)#define BYTE_TO_ASCII(enc, p) LITTLE2_BYTE_TO_ASCII(enc, p) #define CHAR_MATCHES(enc, p, c) LITTLE2_CHAR_MATCHES(enc, p, c)#define IS_NAME_CHAR(enc, p, n) 0#define IS_NAME_CHAR_MINBPC(enc, p) LITTLE2_IS_NAME_CHAR_MINBPC(enc, p)#define IS_NMSTRT_CHAR(enc, p, n) (0)#define IS_NMSTRT_CHAR_MINBPC(enc, p) LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p)#include "xmltok_impl.c"#undef MINBPC#undef BYTE_TYPE#undef BYTE_TO_ASCII#undef CHAR_MATCHES#undef IS_NAME_CHAR#undef IS_NAME_CHAR_MINBPC#undef IS_NMSTRT_CHAR#undef IS_NMSTRT_CHAR_MINBPC#undef IS_INVALID_CHAR#endif /* not XML_MIN_SIZE */#ifdef XML_NSstatic const struct normal_encoding little2_encoding_ns = {            { VTABLE, 2, 0,#if XML_BYTE_ORDER == 12                1#else0#endif            },            {#include "asciitab.h"#include "latin1tab.h"            },            STANDARD_VTABLE(little2_)        };#endifstatic const struct normal_encoding little2_encoding = {            { VTABLE, 2, 0,#if XML_BYTE_ORDER == 12                1#else                0#endif            },            {#define BT_COLON BT_NMSTRT#include "asciitab.h"#undef BT_COLON#include "latin1tab.h"            },            STANDARD_VTABLE(little2_)        };#if XML_BYTE_ORDER != 21#ifdef XML_NSstatic const struct normal_encoding internal_little2_encoding_ns = {        { VTABLE, 2, 0, 1 },            {#include "iasciitab.h"#include "latin1tab.h"            },            STANDARD_VTABLE(little2_)        };#endifstatic const struct normal_encoding internal_little2_encoding = {        { VTABLE, 2, 0, 1 },            {#define BT_COLON BT_NMSTRT#include "iasciitab.h"#undef BT_COLON#include "latin1tab.h"            },            STANDARD_VTABLE(little2_)        };#endif#define BIG2_BYTE_TYPE(enc, p) \ ((p)[0] == 0 \  ? ((struct normal_encoding *)(enc))->type[(unsigned char)(p)[1]] \  : unicode_byte_type((p)[0], (p)[1]))#define BIG2_BYTE_TO_ASCII(enc, p) ((p)[0] == 0 ? (p)[1] : -1)#define BIG2_CHAR_MATCHES(enc, p, c) ((p)[0] == 0 && (p)[1] == c)#define BIG2_IS_NAME_CHAR_MINBPC(enc, p) \  UCS2_GET_NAMING(namePages, (unsigned char)p[0], (unsigned char)p[1])#define BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) \  UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[0], (unsigned char)p[1])#ifdef XML_MIN_SIZEstaticint big2_byteType(const ENCODING *enc, const char *p){    return BIG2_BYTE_TYPE(enc, p);}staticint big2_byteToAscii(const ENCODING *enc, const char *p){    return BIG2_BYTE_TO_ASCII(enc, p);}staticint big2_charMatches(const ENCODING *enc, const char *p, int c){    return BIG2_CHAR_MATCHES(enc, p, c);}staticint big2_isNameMin(const ENCODING *enc, const char *p){    return BIG2_IS_NAME_CHAR_MINBPC(enc, p);}staticint big2_isNmstrtMin(const ENCODING *enc, const char *p){    return BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p);}#undef VTABLE#define VTABLE VTABLE1, big2_toUtf8, big2_toUtf16#else /* not XML_MIN_SIZE */#undef PREFIX#define PREFIX(ident) big2_ ## ident#define MINBPC(enc) 2/* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */#define BYTE_TYPE(enc, p) BIG2_BYTE_TYPE(enc, p)#define BYTE_TO_ASCII(enc, p) BIG2_BYTE_TO_ASCII(enc, p) #define CHAR_MATCHES(enc, p, c) BIG2_CHAR_MATCHES(enc, p, c)#define IS_NAME_CHAR(enc, p, n) 0#define IS_NAME_CHAR_MINBPC(enc, p) BIG2_IS_NAME_CHAR_MINBPC(enc, p)#define IS_NMSTRT_CHAR(enc, p, n) (0)#define IS_NMSTRT_CHAR_MINBPC(enc, p) BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p)#include "xmltok_impl.c"#undef MINBPC#undef BYTE_TYPE#undef BYTE_TO_ASCII#undef CHAR_MATCHES#undef IS_NAME_CHAR#undef IS_NAME_CHAR_MINBPC#undef IS_NMSTRT_CHAR#undef IS_NMSTRT_CHAR_MINBPC#undef IS_INVALID_CHAR#endif /* not XML_MIN_SIZE */#ifdef XML_NSstatic const struct normal_encoding big2_encoding_ns = {            { VTABLE, 2, 0,#if XML_BYTE_ORDER == 21                1#else0#endif            },            {#include "asciitab.h"#include "latin1tab.h"            },            STANDARD_VTABLE(big2_)        };#endifstatic const struct normal_encoding big2_encoding = {            { VTABLE, 2, 0,#if XML_BYTE_ORDER == 21                1#else                0#endif            },            {#define BT_COLON BT_NMSTRT#include "asciitab.h"#undef BT_COLON#include "latin1tab.h"            },            STANDARD_VTABLE(big2_)        };#if XML_BYTE_ORDER != 12#ifdef XML_NSstatic const struct normal_encoding internal_big2_encoding_ns = {        { VTABLE, 2, 0, 1 },            {#include "iasciitab.h"#include "latin1tab.h"            },            STANDARD_VTABLE(big2_)        };#endifstatic const struct normal_encoding internal_big2_encoding = {        { VTABLE, 2, 0, 1 },            {#define BT_COLON BT_NMSTRT#include "iasciitab.h"#undef BT_COLON#include "latin1tab.h"            },            STANDARD_VTABLE(big2_)        };#endif#undef PREFIXstaticint streqci(const char *s1, const char *s2){    for (;;) {        char c1 = *s1++;        char c2 = *s2++;        if ('a' <= c1 && c1 <= 'z')            c1 += 'A' - 'a';        if ('a' <= c2 && c2 <= 'z')            c2 += 'A' - 'a';        if (c1 != c2)            return 0;        if (!c1)            break;    }    return 1;}staticvoid initUpdatePosition(const ENCODING *enc, const char *ptr,                        const char *end, POSITION *pos){    normal_updatePosition(&utf8_encoding.enc, ptr, end, pos);}staticint toAscii(const ENCODING *enc, const char *ptr, const char *end){    char buf[1];    char *p = buf;    XmlUtf8Convert(enc, &ptr, end, &p, p + 1);    if (p == buf)        return -1;    else        return buf[0];}staticint isSpace(int c){    switch (c) {    case 0x20:    case 0xD:    case 0xA:    case 0x9:        return 1;    }    return 0;}/* Return 1 if there's just optional white spaceor there's an S followed by name=val. */staticint parsePseudoAttribute(const ENCODING *enc,                         const char *ptr,                         const char *end,                         const char **namePtr,                         const char **valPtr,                         const char **nextTokPtr){    int c;    char open;    if (ptr == end) {        *namePtr = 0;        return 1;    }    if (!isSpace(toAscii(enc, ptr, end))) {        *nextTokPtr = ptr;        return 0;    }    do {        ptr += enc->minBytesPerChar;    } while (isSpace(toAscii(enc, ptr, end)));    if (ptr == end) {        *namePtr = 0;        return 1;    }    *namePtr = ptr;    for (;;) {        c = toAscii(enc, ptr, end);        if (c == -1) {            *nextTokPtr = ptr;            return 0;        }        if (c == '=')            break;        if (isSpace(c)) {            do {                ptr += enc->minBytesPerChar;            } while (isSpace(c = toAscii(enc, ptr, end)));            if (c != '=') {                *nextTokPtr = ptr;                return 0;            }            break;        }        ptr += enc->minBytesPerChar;    }    if (ptr == *namePtr) {        *nextTokPtr = ptr;        return 0;    }    ptr += enc->minBytesPerChar;    c = toAscii(enc, ptr, end);    while (isSpace(c)) {        ptr += enc->minBytesPerChar;        c = toAscii(enc, ptr, end);    }    if (c != '"' && c != '\'') {        *nextTokPtr = ptr;        return 0;    }    open = c;    ptr += enc->minBytesPerChar;    *valPtr = ptr;    for (;; ptr += enc->minBytesPerChar) {        c = toAscii(enc, ptr, end);        if (c == open)            break;        if (!('a' <= c && c <= 'z')                && !('A' <= c && c <= 'Z')                && !('0' <= c && c <= '9')                && c != '.'                && c != '-'                && c != '_') {            *nextTokPtr = ptr;            return 0;        }    }    *nextTokPtr = ptr + enc->minBytesPerChar;    return 1;}staticint doParseXmlDecl(const ENCODING *(*encodingFinder)(const ENCODING *,                   const char *,                   const char *),                   int isGeneralTextEntity,                   const ENCODING *enc,                   const char *ptr,                   const char *end,                   const char **badPtr,                   const char **versionPtr,                   const char **encodingName,                   const ENCODING **encoding,                   int *standalone){    const char *val = 0;    const char *name = 0;    ptr += 5 * enc->minBytesPerChar;    end -= 2 * enc->minBytesPerChar;    if (!parsePseudoAttribute(enc, ptr, end, &name, &val, &ptr) || !name) {

⌨️ 快捷键说明

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