xref: /aosp_15_r20/external/expat/expat/lib/xmltok_ns.c (revision 6be67779651aebaf20f11e5663acd1ae59e93f66)
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