Counter Strike : Global Offensive Source Code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

463 lines
15 KiB

/*===========================================================================
xmldef.h
definitions, macros and function prototypes for parsifal.c
see parsifal.h for copyright info
===========================================================================*/
#ifndef XMLDEF__H
#define XMLDEF__H
#include <assert.h>
#ifdef _MSC_VER
#ifdef _DEBUG
#include <crtdbg.h>
#define _CRTDBG_MAP_ALLOC
#endif
#define vsnprintf _vsnprintf
#endif
#define TOK_XMLNS "xmlns"
#define TOK_XML "xml"
#define UTF8_2BYTES 0xc0
#define UTF8_3BYTES 0xe0
#define UTF8_4BYTES 0xf0
#define UTF8LEN(c,o) \
if (!(*c & 0x80)) o = 1; \
else if ((unsigned int)*c <= 0xdf) o = 2; \
else if ((unsigned int)*c <= 0xef) o = 3; \
else if ((unsigned int)*c <= 0xf7) o = 4; \
else if ((unsigned int)*c <= 0xfb) o = 5; \
else o = 6;
#define XMLATT_NORMAL 0
#define XMLATT_WITHNS 1
#define XMLATT_PREFIXDECL 2
#define XMLATT_DEFAULTDECL 3
#define XMLATT_XMLPREFIXDECL 4
/* isspace gives us trouble trimming some utf-8 trailbytes... */
#ifdef isspace
#undef isspace
#endif
#define isspace(c) (ISMAPCH(whitespace, (c)))
#define SAFE_FREESTR(s) if (s) { free(s); s = (XMLCH*)NULL; }
/* BUFTOSTR. similar to BufferedIStream_ToString, but modifies
(nul terminates) actual buffer. There's no bounds checking like in _ToString,
also must be sure that returned string stays valid (no _Read operations)
Note that like in _ToString, last param is endPos, not length.
macro can be used when BufferedIStream is in pos ?> for example
and we can replace ? with \0 and use buffer as a string and
avoid memory/time consuming _ToString call. */
#define BUFTOSTR(buf,startPos,endPos) \
((!(startPos)) ? (*((buf)+(endPos))='\0', (buf)) : \
(*((buf)+(endPos))='\0', ((buf)+(startPos))) )
/* ISMAPCH macro for comparing ascii map char */
#define ISMAPCH(map, byte) ((map)[(byte) >> 3] & (1 << ((byte) & 7)))
#define ISILLBYTE(c) (c < 32 && ISMAPCH(illByte, (c)))
/*
The code points U+D800 to U+DFFF will never be assigned to characters.
Other invalid sequences are code points 0xFFFF and 0xFFFE
(EF,BF,BF and EF,BF,BE)
5.1 Single UTF-16 surrogates
5.1.1 U+D800 = ed a0 80
5.1.2 U+DB7F = ed ad bf
5.1.3 U+DB80 = ed ae 80
5.1.4 U+DBFF = ed af bf
5.1.5 U+DC00 = ed b0 80
5.1.6 U+DF80 = ed be 80
5.1.7 U+DFFF = ed bf bf
5.3 Other illegal code positions
5.3.1 U+FFFE = ef bf be
5.3.2 U+FFFF = ef bf bf
note:
sequence bytes c[1]-c[3] can never be < 0x80 (10000000)
and last byte can never be > 0xBF (10111111)
these are ensured in UTF-8 conversion */
#define UTF8_ISILL3(c) \
((*c) == 0xEF && (c)[1] == 0xBF ? (c)[2] > 0xBD : \
(*c) == 0xED && (c)[1] > 0x9F)
/* see http://www.unicode.org/unicode/reports/tr28/ table 3.1B */
#define UTF8_ISILL4(c) ((*c) == 0xF4 && (c)[1] > 0x8F)
/* BISREADERDATA is put into parser->reader->userdata.
Each parsed entity has its own reader and its own
BISREADERDATA. The "main parser"'s
BISREADERDATA is allocated in Parser_Create and
initialized in Parser_Parse (see also InitEntityReader) */
typedef struct tagBISREADERDATA
{
LPXMLPARSER parser;
LPXMLENTITY curEnt; /* current entity (NULL for doc entity and internal entities) */
int iCurPE;
int line;
int col;
int stackLevel;
int lEndian; /* flag to indicate that parser's using little-endian encoding, might
not be correct when byte order mark isn't present */
int context; /* reader specific context flags */
XMLCH EncodingName[20];
} BISREADERDATA, *LPBISREADERDATA;
#define XMLREADERCTX_PE_SPACE 0x1
/* DECLATT represents DTD declared attribute. Array of DECLATTs
is stored in declAttTable hashtable for expansion of default attribute
values (value member !NULL) or special normalization rules; if type
isn't CDATA normalization follow rules specified in XMLSPEC
3.3.3 Attribute-Value Normalization */
struct tagDECLATT
{
XMLCH *name, *value;
int nameLen, prefixLen, valueLen, type, defaultDecl;
};
struct tagDTD
{
int expandPEs, expandPEsaved, inLiteral, inclSect;
LPXMLVECTOR peStack;
XMLSTRINGBUF sbuf;
XMLRUNTIMEATT att;
LPBUFFEREDISTREAM refReader;
LPXMLPOOL pePool;
};
/* STACK macro wrapper around Vector; can be used as tag stack in our
case, even though Vector is optimized for sequential index access.
Tag stack isn't likely to grow/shrink that much in xml parsing when
using CapacityIncrement 16 x RUNTIMETAG (tag nesting level).
STACK_POP always removes last item from Vector and that is efficient
too. Note: Vector handles bounds checking in _Get and in _Remove */
#define STACK_PUSH(stack,item) (XMLVector_Append((stack), (item)))
#define STACK_PEEK(stack) (XMLVector_Get((stack),(stack)->length-1))
#define STACK_REMOVE(stack) (XMLVector_Remove((stack), (stack)->length-1))
#define STACK_POP(stack,item) \
( ((stack)->length) ? (memcpy((item), STACK_PEEK((stack)), (stack)->itemSize), \
STACK_REMOVE((stack)), (item)) : NULL)
extern size_t Latin1ToUtf8 (LPBUFFEREDISTREAM r, const BYTE **inbuf, size_t *inbytesleft, BYTE **outbuf, size_t *outbytesleft);
extern size_t Utf8ToUtf8 (LPBUFFEREDISTREAM r, const BYTE **inbuf, size_t *inbytesleft, BYTE **outbuf, size_t *outbytesleft);
#ifdef ICONV_SUPPORT
extern size_t iconvWrapper (LPBUFFEREDISTREAM r, const BYTE **inbuf, size_t *inbytesleft, BYTE **outbuf, size_t *outbytesleft);
#endif
static XMLCH EmptyStr[1] = {'\0'};
static XMLCH *uriXMLNS = "http://www.w3.org/2000/xmlns/";
static XMLCH *uriXML = "http://www.w3.org/XML/1998/namespace";
#define EINPUT(r) (((r) < -2) ? (SetReaderFatal(((LPXMLPARSER)parser), (r)), 1) : 0)
#define ISXMLPREFIX(s) ((*(s) == 'x' && s[1] == 'm' && s[2] == 'l'))
#define ISXMLNSPREFIX(s) ((ISXMLPREFIX((s)) && s[3] == 'n' && s[4] == 's'))
#define ISQUOTE(c) ((c)=='\"' || (c)=='\'')
#define REQUIRE_WS(r) (((r = SkipWS(parser))==0) ? \
ErP_(parser, ERR_XMLP_WS_REQUIRED, 0) : ((r==-1) ? 0 : r))
#define DPOS(bytes) \
PREADER->pos-=(bytes); \
PREADERDATA->col-=(bytes);
#define IPOS(bytes) \
PREADER->pos+=(bytes); \
PREADERDATA->col+=(bytes);
#define DPOS_LF(bytes) \
if (PREADER->buf[PREADER->pos-1] == 0x0A) \
PREADERDATA->line--; \
DPOS(bytes);
#define DTDTOK_START(PEs) (\
RT->dtd->expandPEsaved = RT->dtd->expandPEs, \
RT->dtd->expandPEs = PEs \
)
#define DTDTOK_END \
if (RT->dtd->expandPEs != RT->dtd->expandPEsaved) \
RT->dtd->expandPEs = RT->dtd->expandPEsaved
/* some shortcuts: */
#define RT parser->prt
#define PREADER ((LPBUFFEREDISTREAM)parser->reader)
#define PREADERDATA ((LPBISREADERDATA)PREADER->userdata)
#define HANDLER(n) parser->n##Handler
#define PEEKINPUT(str,len) BufferedIStream_Peek(PREADER,(str),(len),0)
#define CURCHAR (assert(PREADER->pos<PREADER->bytesavail), PREADER->buf[PREADER->pos])
/* programmatically generated trie tables (reTRIEval algorithm). Trie algo
suits our needs very well - brute force strcmp can infact
be more efficient for small dictionarys (usually strcmp is well optimized and
fast) but since we must use ReadCh (in TrieTok()) and memcmp (in TrieRaw()
via BufferedIStream_Peek) we're getting perfomance gain. Especially DTD token
parsing benefits from tries - no excessive ReadCh calls and UTF-8 checks
anymore etc. See TrieTok and TrieRaw */
struct trie {
const char c; /* current char to test */
const struct trie *n; /* next char/trie or token number if c is '\0' */
const struct trie *sib; /* choice or NULL if there is none */
};
#define T_N_ TRxmlTok
static struct trie const T_N_[] = {
/* 0 */ {'!', T_N_+1, T_N_+9},
/* 1 */ {'[', T_N_+2, T_N_+11},
/* 2 */ {'C', T_N_+3, NULL},
/* 3 */ {'D', T_N_+4, NULL},
/* 4 */ {'A', T_N_+5, NULL},
/* 5 */ {'T', T_N_+6, NULL},
/* 6 */ {'A', T_N_+7, NULL},
/* 7 */ {'[', T_N_+8, NULL},
/* 8 */ {'\0', (struct trie*)1, NULL},
/* 9 */ {'?', T_N_+10, T_N_+14},
/* 10 */ {'\0', (struct trie*)2, NULL},
/* 11 */ {'-', T_N_+12, T_N_+16},
/* 12 */ {'-', T_N_+13, NULL},
/* 13 */ {'\0', (struct trie*)3, NULL},
/* 14 */ {'/', T_N_+15, NULL},
/* 15 */ {'\0', (struct trie*)4, NULL},
/* 16 */ {'D', T_N_+17, NULL},
/* 17 */ {'O', T_N_+18, NULL},
/* 18 */ {'C', T_N_+19, NULL},
/* 19 */ {'T', T_N_+20, NULL},
/* 20 */ {'Y', T_N_+21, NULL},
/* 21 */ {'P', T_N_+22, NULL},
/* 22 */ {'E', T_N_+23, NULL},
/* 23 */ {'\0', (struct trie*)5, NULL}
};
#undef T_N_
#define T_N_ TRstdEnt
static struct trie const T_N_[] = {
/* 0 */ {'g', T_N_+1, T_N_+4},
/* 1 */ {'t', T_N_+2, NULL},
/* 2 */ {';', T_N_+3, NULL},
/* 3 */ {'\0', (struct trie*)1, NULL},
/* 4 */ {'l', T_N_+5, T_N_+8},
/* 5 */ {'t', T_N_+6, NULL},
/* 6 */ {';', T_N_+7, NULL},
/* 7 */ {'\0', (struct trie*)2, NULL},
/* 8 */ {'a', T_N_+9, T_N_+18},
/* 9 */ {'m', T_N_+10, T_N_+13},
/* 10 */ {'p', T_N_+11, NULL},
/* 11 */ {';', T_N_+12, NULL},
/* 12 */ {'\0', (struct trie*)3, NULL},
/* 13 */ {'p', T_N_+14, NULL},
/* 14 */ {'o', T_N_+15, NULL},
/* 15 */ {'s', T_N_+16, NULL},
/* 16 */ {';', T_N_+17, NULL},
/* 17 */ {'\0', (struct trie*)4, NULL},
/* 18 */ {'q', T_N_+19, NULL},
/* 19 */ {'u', T_N_+20, NULL},
/* 20 */ {'o', T_N_+21, NULL},
/* 21 */ {'t', T_N_+22, NULL},
/* 22 */ {';', T_N_+23, NULL},
/* 23 */ {'\0', (struct trie*)5, NULL}
};
#undef T_N_
#define T_N_ TRxmlDecl
static struct trie const T_N_[] = {
/* 0 */ {'v', T_N_+1, T_N_+8},
/* 1 */ {'e', T_N_+2, NULL},
/* 2 */ {'r', T_N_+3, NULL},
/* 3 */ {'s', T_N_+4, NULL},
/* 4 */ {'i', T_N_+5, NULL},
/* 5 */ {'o', T_N_+6, NULL},
/* 6 */ {'n', T_N_+7, NULL},
/* 7 */ {'\0', (struct trie*)1, NULL},
/* 8 */ {'e', T_N_+9, T_N_+17},
/* 9 */ {'n', T_N_+10, NULL},
/* 10 */ {'c', T_N_+11, NULL},
/* 11 */ {'o', T_N_+12, NULL},
/* 12 */ {'d', T_N_+13, NULL},
/* 13 */ {'i', T_N_+14, NULL},
/* 14 */ {'n', T_N_+15, NULL},
/* 15 */ {'g', T_N_+16, NULL},
/* 16 */ {'\0', (struct trie*)2, NULL},
/* 17 */ {'s', T_N_+18, NULL},
/* 18 */ {'t', T_N_+19, NULL},
/* 19 */ {'a', T_N_+20, NULL},
/* 20 */ {'n', T_N_+21, NULL},
/* 21 */ {'d', T_N_+22, NULL},
/* 22 */ {'a', T_N_+23, NULL},
/* 23 */ {'l', T_N_+24, NULL},
/* 24 */ {'o', T_N_+25, NULL},
/* 25 */ {'n', T_N_+26, NULL},
/* 26 */ {'e', T_N_+27, NULL},
/* 27 */ {'\0', (struct trie*)3, NULL}
};
#undef T_N_
#define T_N_ TRexternalID
struct trie T_N_[] = {
/* 0 */ {'P', T_N_+1, T_N_+7},
/* 1 */ {'U', T_N_+2, NULL},
/* 2 */ {'B', T_N_+3, NULL},
/* 3 */ {'L', T_N_+4, NULL},
/* 4 */ {'I', T_N_+5, NULL},
/* 5 */ {'C', T_N_+6, NULL},
/* 6 */ {'\0', (struct trie*)1, NULL},
/* 7 */ {'S', T_N_+8, NULL},
/* 8 */ {'Y', T_N_+9, NULL},
/* 9 */ {'S', T_N_+10, NULL},
/* 10 */ {'T', T_N_+11, NULL},
/* 11 */ {'E', T_N_+12, NULL},
/* 12 */ {'M', T_N_+13, NULL},
/* 13 */ {'\0', (struct trie*)2, NULL}
};
#undef T_N_
#ifdef DTD_SUPPORT
#define T_N_ TRdtdTok
static struct trie const T_N_[] = {
/* 0 */ {'<', T_N_+1, NULL},
/* 1 */ {'!', T_N_+2, T_N_+7},
/* 2 */ {'-', T_N_+3, T_N_+5},
/* 3 */ {'-', T_N_+4, NULL},
/* 4 */ {'\0', (struct trie*)1, NULL},
/* 5 */ {'[', T_N_+6, T_N_+9},
/* 6 */ {'\0', (struct trie*)2, NULL},
/* 7 */ {'?', T_N_+8, NULL},
/* 8 */ {'\0', (struct trie*)3, NULL},
/* 9 */ {'E', T_N_+10, T_N_+23},
/* 10 */ {'N', T_N_+11, T_N_+16},
/* 11 */ {'T', T_N_+12, NULL},
/* 12 */ {'I', T_N_+13, NULL},
/* 13 */ {'T', T_N_+14, NULL},
/* 14 */ {'Y', T_N_+15, NULL},
/* 15 */ {'\0', (struct trie*)4, NULL},
/* 16 */ {'L', T_N_+17, NULL},
/* 17 */ {'E', T_N_+18, NULL},
/* 18 */ {'M', T_N_+19, NULL},
/* 19 */ {'E', T_N_+20, NULL},
/* 20 */ {'N', T_N_+21, NULL},
/* 21 */ {'T', T_N_+22, NULL},
/* 22 */ {'\0', (struct trie*)5, NULL},
/* 23 */ {'A', T_N_+24, T_N_+31},
/* 24 */ {'T', T_N_+25, NULL},
/* 25 */ {'T', T_N_+26, NULL},
/* 26 */ {'L', T_N_+27, NULL},
/* 27 */ {'I', T_N_+28, NULL},
/* 28 */ {'S', T_N_+29, NULL},
/* 29 */ {'T', T_N_+30, NULL},
/* 30 */ {'\0', (struct trie*)6, NULL},
/* 31 */ {'N', T_N_+32, NULL},
/* 32 */ {'O', T_N_+33, NULL},
/* 33 */ {'T', T_N_+34, NULL},
/* 34 */ {'A', T_N_+35, NULL},
/* 35 */ {'T', T_N_+36, NULL},
/* 36 */ {'I', T_N_+37, NULL},
/* 37 */ {'O', T_N_+38, NULL},
/* 38 */ {'N', T_N_+39, NULL},
/* 39 */ {'\0', (struct trie*)7, NULL}
};
#undef T_N_
#define T_N_ TRattType
static struct trie const T_N_[] = {
/* 0 */ {'C', T_N_+1, T_N_+6},
/* 1 */ {'D', T_N_+2, NULL},
/* 2 */ {'A', T_N_+3, NULL},
/* 3 */ {'T', T_N_+4, NULL},
/* 4 */ {'A', T_N_+5, NULL},
/* 5 */ {'\0', (struct trie*)1, NULL},
/* 6 */ {'I', T_N_+7, T_N_+15},
/* 7 */ {'D', T_N_+8, NULL},
/* 8 */ {'\0', (struct trie*)2, T_N_+9},
/* 9 */ {'R', T_N_+10, NULL},
/* 10 */ {'E', T_N_+11, NULL},
/* 11 */ {'F', T_N_+12, NULL},
/* 12 */ {'\0', (struct trie*)3, T_N_+13},
/* 13 */ {'S', T_N_+14, NULL},
/* 14 */ {'\0', (struct trie*)4, NULL},
/* 15 */ {'E', T_N_+16, T_N_+26},
/* 16 */ {'N', T_N_+17, NULL},
/* 17 */ {'T', T_N_+18, NULL},
/* 18 */ {'I', T_N_+19, NULL},
/* 19 */ {'T', T_N_+20, NULL},
/* 20 */ {'Y', T_N_+21, T_N_+22},
/* 21 */ {'\0', (struct trie*)5, NULL},
/* 22 */ {'I', T_N_+23, NULL},
/* 23 */ {'E', T_N_+24, NULL},
/* 24 */ {'S', T_N_+25, NULL},
/* 25 */ {'\0', (struct trie*)6, NULL},
/* 26 */ {'N', T_N_+27, NULL},
/* 27 */ {'M', T_N_+28, T_N_+36},
/* 28 */ {'T', T_N_+29, NULL},
/* 29 */ {'O', T_N_+30, NULL},
/* 30 */ {'K', T_N_+31, NULL},
/* 31 */ {'E', T_N_+32, NULL},
/* 32 */ {'N', T_N_+33, NULL},
/* 33 */ {'\0', (struct trie*)7, T_N_+34},
/* 34 */ {'S', T_N_+35, NULL},
/* 35 */ {'\0', (struct trie*)8, NULL},
/* 36 */ {'O', T_N_+37, NULL},
/* 37 */ {'T', T_N_+38, NULL},
/* 38 */ {'A', T_N_+39, NULL},
/* 39 */ {'T', T_N_+40, NULL},
/* 40 */ {'I', T_N_+41, NULL},
/* 41 */ {'O', T_N_+42, NULL},
/* 42 */ {'N', T_N_+43, NULL},
/* 43 */ {'\0', (struct trie*)9, NULL}
};
#undef T_N_
#define T_N_ TRdefDecls
static struct trie const T_N_[] = {
/* 0 */ {'#', T_N_+1, NULL},
/* 1 */ {'F', T_N_+2, T_N_+7},
/* 2 */ {'I', T_N_+3, NULL},
/* 3 */ {'X', T_N_+4, NULL},
/* 4 */ {'E', T_N_+5, NULL},
/* 5 */ {'D', T_N_+6, NULL},
/* 6 */ {'\0', (struct trie*)1, NULL},
/* 7 */ {'R', T_N_+8, T_N_+16},
/* 8 */ {'E', T_N_+9, NULL},
/* 9 */ {'Q', T_N_+10, NULL},
/* 10 */ {'U', T_N_+11, NULL},
/* 11 */ {'I', T_N_+12, NULL},
/* 12 */ {'R', T_N_+13, NULL},
/* 13 */ {'E', T_N_+14, NULL},
/* 14 */ {'D', T_N_+15, NULL},
/* 15 */ {'\0', (struct trie*)2, NULL},
/* 16 */ {'I', T_N_+17, NULL},
/* 17 */ {'M', T_N_+18, NULL},
/* 18 */ {'P', T_N_+19, NULL},
/* 19 */ {'L', T_N_+20, NULL},
/* 20 */ {'I', T_N_+21, NULL},
/* 21 */ {'E', T_N_+22, NULL},
/* 22 */ {'D', T_N_+23, NULL},
/* 23 */ {'\0', (struct trie*)3, NULL}
};
#undef T_N_
#define T_N_ TRelTypes
static struct trie const T_N_[] = {
/* 0 */ {'E', T_N_+1, T_N_+6},
/* 1 */ {'M', T_N_+2, NULL},
/* 2 */ {'P', T_N_+3, NULL},
/* 3 */ {'T', T_N_+4, NULL},
/* 4 */ {'Y', T_N_+5, NULL},
/* 5 */ {'\0', (struct trie*)1, NULL},
/* 6 */ {'A', T_N_+7, T_N_+10},
/* 7 */ {'N', T_N_+8, NULL},
/* 8 */ {'Y', T_N_+9, NULL},
/* 9 */ {'\0', (struct trie*)2, NULL},
/* 10 */ {'(', T_N_+11, NULL},
/* 11 */ {'\0', (struct trie*)3, NULL}
};
#undef T_N_
#endif /* ifdef DTD_SUPPORT */
#endif /* XMLDEF__H */