1 const ENCODING *
NS(XmlGetUtf8InternalEncoding)2 NS(XmlGetUtf8InternalEncoding)(void)
3 {
4   return &ns(internal_utf8_encoding).enc;
5 }
6 
7 const ENCODING *
NS(XmlGetUtf16InternalEncoding)8 NS(XmlGetUtf16InternalEncoding)(void)
9 {
10 #if BYTEORDER == 1234
11   return &ns(internal_little2_encoding).enc;
12 #elif BYTEORDER == 4321
13   return &ns(internal_big2_encoding).enc;
14 #else
15   const short n = 1;
16   return (*(const char *)&n
17           ? &ns(internal_little2_encoding).enc
18           : &ns(internal_big2_encoding).enc);
19 #endif
20 }
21 
22 static const ENCODING *NS(encodings)[] = {
23   &ns(latin1_encoding).enc,
24   &ns(ascii_encoding).enc,
25   &ns(utf8_encoding).enc,
26   &ns(big2_encoding).enc,
27   &ns(big2_encoding).enc,
28   &ns(little2_encoding).enc,
29   &ns(utf8_encoding).enc /* NO_ENC */
30 };
31 
32 static int PTRCALL
NS(initScanProlog)33 NS(initScanProlog)(const ENCODING *enc, const char *ptr, const char *end,
34                    const char **nextTokPtr)
35 {
36   return initScan(NS(encodings), (const INIT_ENCODING *)enc,
37                   XML_PROLOG_STATE, ptr, end, nextTokPtr);
38 }
39 
40 static int PTRCALL
NS(initScanContent)41 NS(initScanContent)(const ENCODING *enc, const char *ptr, const char *end,
42                     const char **nextTokPtr)
43 {
44   return initScan(NS(encodings), (const INIT_ENCODING *)enc,
45                   XML_CONTENT_STATE, ptr, end, nextTokPtr);
46 }
47 
48 int
NS(XmlInitEncoding)49 NS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr,
50                     const char *name)
51 {
52   int i = getEncodingIndex(name);
53   if (i == UNKNOWN_ENC)
54     return 0;
55   SET_INIT_ENC_INDEX(p, i);
56   p->initEnc.scanners[XML_PROLOG_STATE] = NS(initScanProlog);
57   p->initEnc.scanners[XML_CONTENT_STATE] = NS(initScanContent);
58   p->initEnc.updatePosition = initUpdatePosition;
59   p->encPtr = encPtr;
60   *encPtr = &(p->initEnc);
61   return 1;
62 }
63 
64 static const ENCODING *
NS(findEncoding)65 NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end)
66 {
67 #define ENCODING_MAX 128
68   char buf[ENCODING_MAX];
69   char *p = buf;
70   int i;
71   XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1);
72   if (ptr != end)
73     return 0;
74   *p = 0;
75   if (streqci(buf, KW_UTF_16) && enc->minBytesPerChar == 2)
76     return enc;
77   i = getEncodingIndex(buf);
78   if (i == UNKNOWN_ENC)
79     return 0;
80   return NS(encodings)[i];
81 }
82 
83 int
NS(XmlParseXmlDecl)84 NS(XmlParseXmlDecl)(int isGeneralTextEntity,
85                     const ENCODING *enc,
86                     const char *ptr,
87                     const char *end,
88                     const char **badPtr,
89                     const char **versionPtr,
90                     const char **versionEndPtr,
91                     const char **encodingName,
92                     const ENCODING **encoding,
93                     int *standalone)
94 {
95   return doParseXmlDecl(NS(findEncoding),
96                         isGeneralTextEntity,
97                         enc,
98                         ptr,
99                         end,
100                         badPtr,
101                         versionPtr,
102                         versionEndPtr,
103                         encodingName,
104                         encoding,
105                         standalone);
106 }
107