1*6be67779SAndroid Build Coastguard Worker /* This file is included!
2*6be67779SAndroid Build Coastguard Worker __ __ _
3*6be67779SAndroid Build Coastguard Worker ___\ \/ /_ __ __ _| |_
4*6be67779SAndroid Build Coastguard Worker / _ \\ /| '_ \ / _` | __|
5*6be67779SAndroid Build Coastguard Worker | __// \| |_) | (_| | |_
6*6be67779SAndroid Build Coastguard Worker \___/_/\_\ .__/ \__,_|\__|
7*6be67779SAndroid Build Coastguard Worker |_| XML parser
8*6be67779SAndroid Build Coastguard Worker
9*6be67779SAndroid Build Coastguard Worker Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
10*6be67779SAndroid Build Coastguard Worker Copyright (c) 2000 Clark Cooper <[email protected]>
11*6be67779SAndroid Build Coastguard Worker Copyright (c) 2002 Greg Stein <[email protected]>
12*6be67779SAndroid Build Coastguard Worker Copyright (c) 2002 Fred L. Drake, Jr. <[email protected]>
13*6be67779SAndroid Build Coastguard Worker Copyright (c) 2002-2006 Karl Waclawek <[email protected]>
14*6be67779SAndroid Build Coastguard Worker Copyright (c) 2017-2021 Sebastian Pipping <[email protected]>
15*6be67779SAndroid Build Coastguard Worker Licensed under the MIT license:
16*6be67779SAndroid Build Coastguard Worker
17*6be67779SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining
18*6be67779SAndroid Build Coastguard Worker a copy of this software and associated documentation files (the
19*6be67779SAndroid Build Coastguard Worker "Software"), to deal in the Software without restriction, including
20*6be67779SAndroid Build Coastguard Worker without limitation the rights to use, copy, modify, merge, publish,
21*6be67779SAndroid Build Coastguard Worker distribute, sublicense, and/or sell copies of the Software, and to permit
22*6be67779SAndroid Build Coastguard Worker persons to whom the Software is furnished to do so, subject to the
23*6be67779SAndroid Build Coastguard Worker following conditions:
24*6be67779SAndroid Build Coastguard Worker
25*6be67779SAndroid Build Coastguard Worker The above copyright notice and this permission notice shall be included
26*6be67779SAndroid Build Coastguard Worker in all copies or substantial portions of the Software.
27*6be67779SAndroid Build Coastguard Worker
28*6be67779SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
29*6be67779SAndroid Build Coastguard Worker EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
30*6be67779SAndroid Build Coastguard Worker MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
31*6be67779SAndroid Build Coastguard Worker NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
32*6be67779SAndroid Build Coastguard Worker DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
33*6be67779SAndroid Build Coastguard Worker OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
34*6be67779SAndroid Build Coastguard Worker USE OR OTHER DEALINGS IN THE SOFTWARE.
35*6be67779SAndroid Build Coastguard Worker */
36*6be67779SAndroid Build Coastguard Worker
37*6be67779SAndroid Build Coastguard Worker #ifdef XML_TOK_NS_C
38*6be67779SAndroid Build Coastguard Worker
39*6be67779SAndroid Build Coastguard Worker const ENCODING *
NS(XmlGetUtf8InternalEncoding)40*6be67779SAndroid Build Coastguard Worker NS(XmlGetUtf8InternalEncoding)(void) {
41*6be67779SAndroid Build Coastguard Worker return &ns(internal_utf8_encoding).enc;
42*6be67779SAndroid Build Coastguard Worker }
43*6be67779SAndroid Build Coastguard Worker
44*6be67779SAndroid Build Coastguard Worker const ENCODING *
NS(XmlGetUtf16InternalEncoding)45*6be67779SAndroid Build Coastguard Worker NS(XmlGetUtf16InternalEncoding)(void) {
46*6be67779SAndroid Build Coastguard Worker # if BYTEORDER == 1234
47*6be67779SAndroid Build Coastguard Worker return &ns(internal_little2_encoding).enc;
48*6be67779SAndroid Build Coastguard Worker # elif BYTEORDER == 4321
49*6be67779SAndroid Build Coastguard Worker return &ns(internal_big2_encoding).enc;
50*6be67779SAndroid Build Coastguard Worker # else
51*6be67779SAndroid Build Coastguard Worker const short n = 1;
52*6be67779SAndroid Build Coastguard Worker return (*(const char *)&n ? &ns(internal_little2_encoding).enc
53*6be67779SAndroid Build Coastguard Worker : &ns(internal_big2_encoding).enc);
54*6be67779SAndroid Build Coastguard Worker # endif
55*6be67779SAndroid Build Coastguard Worker }
56*6be67779SAndroid Build Coastguard Worker
57*6be67779SAndroid Build Coastguard Worker static const ENCODING *const NS(encodings)[] = {
58*6be67779SAndroid Build Coastguard Worker &ns(latin1_encoding).enc, &ns(ascii_encoding).enc,
59*6be67779SAndroid Build Coastguard Worker &ns(utf8_encoding).enc, &ns(big2_encoding).enc,
60*6be67779SAndroid Build Coastguard Worker &ns(big2_encoding).enc, &ns(little2_encoding).enc,
61*6be67779SAndroid Build Coastguard Worker &ns(utf8_encoding).enc /* NO_ENC */
62*6be67779SAndroid Build Coastguard Worker };
63*6be67779SAndroid Build Coastguard Worker
64*6be67779SAndroid Build Coastguard Worker static int PTRCALL
NS(initScanProlog)65*6be67779SAndroid Build Coastguard Worker NS(initScanProlog)(const ENCODING *enc, const char *ptr, const char *end,
66*6be67779SAndroid Build Coastguard Worker const char **nextTokPtr) {
67*6be67779SAndroid Build Coastguard Worker return initScan(NS(encodings), (const INIT_ENCODING *)enc, XML_PROLOG_STATE,
68*6be67779SAndroid Build Coastguard Worker ptr, end, nextTokPtr);
69*6be67779SAndroid Build Coastguard Worker }
70*6be67779SAndroid Build Coastguard Worker
71*6be67779SAndroid Build Coastguard Worker static int PTRCALL
NS(initScanContent)72*6be67779SAndroid Build Coastguard Worker NS(initScanContent)(const ENCODING *enc, const char *ptr, const char *end,
73*6be67779SAndroid Build Coastguard Worker const char **nextTokPtr) {
74*6be67779SAndroid Build Coastguard Worker return initScan(NS(encodings), (const INIT_ENCODING *)enc, XML_CONTENT_STATE,
75*6be67779SAndroid Build Coastguard Worker ptr, end, nextTokPtr);
76*6be67779SAndroid Build Coastguard Worker }
77*6be67779SAndroid Build Coastguard Worker
78*6be67779SAndroid Build Coastguard Worker int
NS(XmlInitEncoding)79*6be67779SAndroid Build Coastguard Worker NS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr,
80*6be67779SAndroid Build Coastguard Worker const char *name) {
81*6be67779SAndroid Build Coastguard Worker int i = getEncodingIndex(name);
82*6be67779SAndroid Build Coastguard Worker if (i == UNKNOWN_ENC)
83*6be67779SAndroid Build Coastguard Worker return 0;
84*6be67779SAndroid Build Coastguard Worker SET_INIT_ENC_INDEX(p, i);
85*6be67779SAndroid Build Coastguard Worker p->initEnc.scanners[XML_PROLOG_STATE] = NS(initScanProlog);
86*6be67779SAndroid Build Coastguard Worker p->initEnc.scanners[XML_CONTENT_STATE] = NS(initScanContent);
87*6be67779SAndroid Build Coastguard Worker p->initEnc.updatePosition = initUpdatePosition;
88*6be67779SAndroid Build Coastguard Worker p->encPtr = encPtr;
89*6be67779SAndroid Build Coastguard Worker *encPtr = &(p->initEnc);
90*6be67779SAndroid Build Coastguard Worker return 1;
91*6be67779SAndroid Build Coastguard Worker }
92*6be67779SAndroid Build Coastguard Worker
93*6be67779SAndroid Build Coastguard Worker static const ENCODING *
NS(findEncoding)94*6be67779SAndroid Build Coastguard Worker NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end) {
95*6be67779SAndroid Build Coastguard Worker # define ENCODING_MAX 128
96*6be67779SAndroid Build Coastguard Worker char buf[ENCODING_MAX] = "";
97*6be67779SAndroid Build Coastguard Worker char *p = buf;
98*6be67779SAndroid Build Coastguard Worker int i;
99*6be67779SAndroid Build Coastguard Worker XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1);
100*6be67779SAndroid Build Coastguard Worker if (ptr != end)
101*6be67779SAndroid Build Coastguard Worker return 0;
102*6be67779SAndroid Build Coastguard Worker *p = 0;
103*6be67779SAndroid Build Coastguard Worker if (streqci(buf, KW_UTF_16) && enc->minBytesPerChar == 2)
104*6be67779SAndroid Build Coastguard Worker return enc;
105*6be67779SAndroid Build Coastguard Worker i = getEncodingIndex(buf);
106*6be67779SAndroid Build Coastguard Worker if (i == UNKNOWN_ENC)
107*6be67779SAndroid Build Coastguard Worker return 0;
108*6be67779SAndroid Build Coastguard Worker return NS(encodings)[i];
109*6be67779SAndroid Build Coastguard Worker }
110*6be67779SAndroid Build Coastguard Worker
111*6be67779SAndroid Build Coastguard Worker int
NS(XmlParseXmlDecl)112*6be67779SAndroid Build Coastguard Worker NS(XmlParseXmlDecl)(int isGeneralTextEntity, const ENCODING *enc,
113*6be67779SAndroid Build Coastguard Worker const char *ptr, const char *end, const char **badPtr,
114*6be67779SAndroid Build Coastguard Worker const char **versionPtr, const char **versionEndPtr,
115*6be67779SAndroid Build Coastguard Worker const char **encodingName, const ENCODING **encoding,
116*6be67779SAndroid Build Coastguard Worker int *standalone) {
117*6be67779SAndroid Build Coastguard Worker return doParseXmlDecl(NS(findEncoding), isGeneralTextEntity, enc, ptr, end,
118*6be67779SAndroid Build Coastguard Worker badPtr, versionPtr, versionEndPtr, encodingName,
119*6be67779SAndroid Build Coastguard Worker encoding, standalone);
120*6be67779SAndroid Build Coastguard Worker }
121*6be67779SAndroid Build Coastguard Worker
122*6be67779SAndroid Build Coastguard Worker #endif /* XML_TOK_NS_C */
123