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