172
|
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 */
|