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