Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4818 | Serge | 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 */ |