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