1b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
2b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   See the file COPYING for copying permission.
3b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
4b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <stddef.h>
6b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
72c4085a68c6cc84362eccc3a7bcc588700955c17Paul Duffin#ifdef COMPILED_FROM_DSP
8b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "winconfig.h"
9b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#elif defined(MACOS_CLASSIC)
10b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "macconfig.h"
1135e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#elif defined(__amigaos__)
12b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "amigaconfig.h"
13d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#elif defined(__WATCOMC__)
14d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#include "watcomconfig.h"
15b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
16b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef HAVE_EXPAT_CONFIG_H
17b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <expat_config.h>
18b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
192c4085a68c6cc84362eccc3a7bcc588700955c17Paul Duffin#endif /* ndef COMPILED_FROM_DSP */
20b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
21b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "expat_external.h"
22b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "internal.h"
23b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "xmltok.h"
24b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "nametab.h"
25b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
26b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_DTD
27b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define IGNORE_SECTION_TOK_VTABLE , PREFIX(ignoreSectionTok)
28b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
29b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define IGNORE_SECTION_TOK_VTABLE /* as nothing */
30b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
31b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
32b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define VTABLE1 \
33b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  { PREFIX(prologTok), PREFIX(contentTok), \
34b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    PREFIX(cdataSectionTok) IGNORE_SECTION_TOK_VTABLE }, \
35b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  { PREFIX(attributeValueTok), PREFIX(entityValueTok) }, \
36b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  PREFIX(sameName), \
37b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  PREFIX(nameMatchesAscii), \
38b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  PREFIX(nameLength), \
39b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  PREFIX(skipS), \
40b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  PREFIX(getAtts), \
41b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  PREFIX(charRefNumber), \
42b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  PREFIX(predefinedEntityName), \
43b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  PREFIX(updatePosition), \
44b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  PREFIX(isPublicId)
45b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
46b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define VTABLE VTABLE1, PREFIX(toUtf8), PREFIX(toUtf16)
47b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
48b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define UCS2_GET_NAMING(pages, hi, lo) \
49ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin   (namingBitmap[(pages[hi] << 3) + ((lo) >> 5)] & (1u << ((lo) & 0x1F)))
50b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
51b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* A 2 byte UTF-8 representation splits the characters 11 bits between
52b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   the bottom 5 and 6 bits of the bytes.  We need 8 bits to index into
53b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   pages, 3 bits to add to that index and 5 bits to generate the mask.
54b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
55b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define UTF8_GET_NAMING2(pages, byte) \
56b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    (namingBitmap[((pages)[(((byte)[0]) >> 2) & 7] << 3) \
57b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                      + ((((byte)[0]) & 3) << 1) \
58b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                      + ((((byte)[1]) >> 5) & 1)] \
59ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin         & (1u << (((byte)[1]) & 0x1F)))
60b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
61b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* A 3 byte UTF-8 representation splits the characters 16 bits between
62b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   the bottom 4, 6 and 6 bits of the bytes.  We need 8 bits to index
63b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   into pages, 3 bits to add to that index and 5 bits to generate the
64b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   mask.
65b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
66b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define UTF8_GET_NAMING3(pages, byte) \
67b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  (namingBitmap[((pages)[((((byte)[0]) & 0xF) << 4) \
68b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                             + ((((byte)[1]) >> 2) & 0xF)] \
69b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                       << 3) \
70b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                      + ((((byte)[1]) & 3) << 1) \
71b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                      + ((((byte)[2]) >> 5) & 1)] \
72ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin         & (1u << (((byte)[2]) & 0x1F)))
73b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
74b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define UTF8_GET_NAMING(pages, p, n) \
75b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ((n) == 2 \
76b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ? UTF8_GET_NAMING2(pages, (const unsigned char *)(p)) \
77b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  : ((n) == 3 \
78b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     ? UTF8_GET_NAMING3(pages, (const unsigned char *)(p)) \
79b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     : 0))
80b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
81b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Detection of invalid UTF-8 sequences is based on Table 3.1B
82b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   of Unicode 3.2: http://www.unicode.org/unicode/reports/tr28/
83b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   with the additional restriction of not allowing the Unicode
84b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   code points 0xFFFF and 0xFFFE (sequences EF,BF,BF and EF,BF,BE).
85b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   Implementation details:
86b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     (A & 0x80) == 0     means A < 0x80
87b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   and
88b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project     (A & 0xC0) == 0xC0  means A > 0xBF
89b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
90b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
91b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define UTF8_INVALID2(p) \
92b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ((*p) < 0xC2 || ((p)[1] & 0x80) == 0 || ((p)[1] & 0xC0) == 0xC0)
93b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
94b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define UTF8_INVALID3(p) \
95b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  (((p)[2] & 0x80) == 0 \
96b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  || \
97b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ((*p) == 0xEF && (p)[1] == 0xBF \
98b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ? \
99b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    (p)[2] > 0xBD \
100b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    : \
101b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ((p)[2] & 0xC0) == 0xC0) \
102b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  || \
103b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ((*p) == 0xE0 \
104b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ? \
105b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    (p)[1] < 0xA0 || ((p)[1] & 0xC0) == 0xC0 \
106b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    : \
107b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ((p)[1] & 0x80) == 0 \
108b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    || \
109b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ((*p) == 0xED ? (p)[1] > 0x9F : ((p)[1] & 0xC0) == 0xC0)))
110b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
111b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define UTF8_INVALID4(p) \
112b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  (((p)[3] & 0x80) == 0 || ((p)[3] & 0xC0) == 0xC0 \
113b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  || \
114b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ((p)[2] & 0x80) == 0 || ((p)[2] & 0xC0) == 0xC0 \
115b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  || \
116b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ((*p) == 0xF0 \
117b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ? \
118b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    (p)[1] < 0x90 || ((p)[1] & 0xC0) == 0xC0 \
119b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    : \
120b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ((p)[1] & 0x80) == 0 \
121b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    || \
122b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ((*p) == 0xF4 ? (p)[1] > 0x8F : ((p)[1] & 0xC0) == 0xC0)))
123b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
124b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRFASTCALL
125ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul DuffinisNever(const ENCODING *UNUSED_P(enc), const char *UNUSED_P(p))
126b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
127b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return 0;
128b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
129b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
130b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRFASTCALL
131ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffinutf8_isName2(const ENCODING *UNUSED_P(enc), const char *p)
132b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
133b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return UTF8_GET_NAMING2(namePages, (const unsigned char *)p);
134b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
135b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
136b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRFASTCALL
137ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffinutf8_isName3(const ENCODING *UNUSED_P(enc), const char *p)
138b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
139b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return UTF8_GET_NAMING3(namePages, (const unsigned char *)p);
140b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
141b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
142b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define utf8_isName4 isNever
143b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
144b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRFASTCALL
145ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffinutf8_isNmstrt2(const ENCODING *UNUSED_P(enc), const char *p)
146b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
147b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return UTF8_GET_NAMING2(nmstrtPages, (const unsigned char *)p);
148b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
149b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
150b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRFASTCALL
151ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffinutf8_isNmstrt3(const ENCODING *UNUSED_P(enc), const char *p)
152b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
153b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return UTF8_GET_NAMING3(nmstrtPages, (const unsigned char *)p);
154b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
155b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
156b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define utf8_isNmstrt4 isNever
157b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
158b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRFASTCALL
159ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffinutf8_isInvalid2(const ENCODING *UNUSED_P(enc), const char *p)
160b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
161b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return UTF8_INVALID2((const unsigned char *)p);
162b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
163b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
164b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRFASTCALL
165ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffinutf8_isInvalid3(const ENCODING *UNUSED_P(enc), const char *p)
166b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
167b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return UTF8_INVALID3((const unsigned char *)p);
168b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
169b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
170b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRFASTCALL
171ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffinutf8_isInvalid4(const ENCODING *UNUSED_P(enc), const char *p)
172b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
173b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return UTF8_INVALID4((const unsigned char *)p);
174b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
175b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
176b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstruct normal_encoding {
177b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ENCODING enc;
178b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  unsigned char type[256];
179b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_MIN_SIZE
180b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int (PTRFASTCALL *byteType)(const ENCODING *, const char *);
181b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int (PTRFASTCALL *isNameMin)(const ENCODING *, const char *);
182b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int (PTRFASTCALL *isNmstrtMin)(const ENCODING *, const char *);
183b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int (PTRFASTCALL *byteToAscii)(const ENCODING *, const char *);
184b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int (PTRCALL *charMatches)(const ENCODING *, const char *, int);
185b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_MIN_SIZE */
186b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int (PTRFASTCALL *isName2)(const ENCODING *, const char *);
187b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int (PTRFASTCALL *isName3)(const ENCODING *, const char *);
188b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int (PTRFASTCALL *isName4)(const ENCODING *, const char *);
189b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int (PTRFASTCALL *isNmstrt2)(const ENCODING *, const char *);
190b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int (PTRFASTCALL *isNmstrt3)(const ENCODING *, const char *);
191b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int (PTRFASTCALL *isNmstrt4)(const ENCODING *, const char *);
192b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int (PTRFASTCALL *isInvalid2)(const ENCODING *, const char *);
193b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int (PTRFASTCALL *isInvalid3)(const ENCODING *, const char *);
194b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int (PTRFASTCALL *isInvalid4)(const ENCODING *, const char *);
195b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
196b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
197b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define AS_NORMAL_ENCODING(enc)   ((const struct normal_encoding *) (enc))
198b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
199b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_MIN_SIZE
200b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
201b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define STANDARD_VTABLE(E) \
202b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project E ## byteType, \
203b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project E ## isNameMin, \
204b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project E ## isNmstrtMin, \
205b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project E ## byteToAscii, \
206b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project E ## charMatches,
207b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
208b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
209b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
210b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define STANDARD_VTABLE(E) /* as nothing */
211b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
212b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
213b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
214b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define NORMAL_VTABLE(E) \
215b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project E ## isName2, \
216b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project E ## isName3, \
217b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project E ## isName4, \
218b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project E ## isNmstrt2, \
219b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project E ## isNmstrt3, \
220b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project E ## isNmstrt4, \
221b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project E ## isInvalid2, \
222b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project E ## isInvalid3, \
223b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project E ## isInvalid4
224b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
225ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin#define NULL_VTABLE \
226ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin /* isName2 */ NULL, \
227ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin /* isName3 */ NULL, \
228ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin /* isName4 */ NULL, \
229ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin /* isNmstrt2 */ NULL, \
230ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin /* isNmstrt3 */ NULL, \
231ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin /* isNmstrt4 */ NULL, \
232ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin /* isInvalid2 */ NULL, \
233ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin /* isInvalid3 */ NULL, \
234ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin /* isInvalid4 */ NULL
235ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin
236b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int FASTCALL checkCharRefNumber(int);
237b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
238b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "xmltok_impl.h"
239b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "ascii.h"
240b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
241b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_MIN_SIZE
242b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define sb_isNameMin isNever
243b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define sb_isNmstrtMin isNever
244b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
245b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
246b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_MIN_SIZE
247b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define MINBPC(enc) ((enc)->minBytesPerChar)
248b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
249b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* minimum bytes per character */
250b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define MINBPC(enc) 1
251b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
252b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
253b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define SB_BYTE_TYPE(enc, p) \
254b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  (((struct normal_encoding *)(enc))->type[(unsigned char)*(p)])
255b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
256b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_MIN_SIZE
257b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRFASTCALL
258b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectsb_byteType(const ENCODING *enc, const char *p)
259b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
260b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return SB_BYTE_TYPE(enc, p);
261b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
262b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define BYTE_TYPE(enc, p) \
263b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project (AS_NORMAL_ENCODING(enc)->byteType(enc, p))
264b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
265b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define BYTE_TYPE(enc, p) SB_BYTE_TYPE(enc, p)
266b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
267b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
268b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_MIN_SIZE
269b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define BYTE_TO_ASCII(enc, p) \
270b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project (AS_NORMAL_ENCODING(enc)->byteToAscii(enc, p))
271b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRFASTCALL
272b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectsb_byteToAscii(const ENCODING *enc, const char *p)
273b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
274b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return *p;
275b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
276b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
277b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define BYTE_TO_ASCII(enc, p) (*(p))
278b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
279b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
280b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define IS_NAME_CHAR(enc, p, n) \
281b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project (AS_NORMAL_ENCODING(enc)->isName ## n(enc, p))
282b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define IS_NMSTRT_CHAR(enc, p, n) \
283b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project (AS_NORMAL_ENCODING(enc)->isNmstrt ## n(enc, p))
284b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define IS_INVALID_CHAR(enc, p, n) \
285b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project (AS_NORMAL_ENCODING(enc)->isInvalid ## n(enc, p))
286b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
287b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_MIN_SIZE
288b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define IS_NAME_CHAR_MINBPC(enc, p) \
289b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project (AS_NORMAL_ENCODING(enc)->isNameMin(enc, p))
290b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define IS_NMSTRT_CHAR_MINBPC(enc, p) \
291b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project (AS_NORMAL_ENCODING(enc)->isNmstrtMin(enc, p))
292b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
293b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define IS_NAME_CHAR_MINBPC(enc, p) (0)
294b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define IS_NMSTRT_CHAR_MINBPC(enc, p) (0)
295b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
296b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
297b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_MIN_SIZE
298b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define CHAR_MATCHES(enc, p, c) \
299b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project (AS_NORMAL_ENCODING(enc)->charMatches(enc, p, c))
300b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRCALL
301b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectsb_charMatches(const ENCODING *enc, const char *p, int c)
302b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
303b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return *p == c;
304b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
305b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
306b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* c is an ASCII character */
307b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define CHAR_MATCHES(enc, p, c) (*(p) == c)
308b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
309b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
310b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define PREFIX(ident) normal_ ## ident
311d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#define XML_TOK_IMPL_C
312b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "xmltok_impl.c"
313d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#undef XML_TOK_IMPL_C
314b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
315b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef MINBPC
316b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef BYTE_TYPE
317b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef BYTE_TO_ASCII
318b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef CHAR_MATCHES
319b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef IS_NAME_CHAR
320b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef IS_NAME_CHAR_MINBPC
321b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef IS_NMSTRT_CHAR
322b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef IS_NMSTRT_CHAR_MINBPC
323b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef IS_INVALID_CHAR
324b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
325b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectenum {  /* UTF8_cvalN is value of masked first byte of N byte sequence */
326b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  UTF8_cval1 = 0x00,
327b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  UTF8_cval2 = 0xc0,
328b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  UTF8_cval3 = 0xe0,
329b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  UTF8_cval4 = 0xf0
330b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
331b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
332ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffinvoid
333ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffinalign_limit_to_full_utf8_characters(const char * from, const char ** fromLimRef)
334ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin{
335ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin  const char * fromLim = *fromLimRef;
336ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin  size_t walked = 0;
337ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin  for (; fromLim > from; fromLim--, walked++) {
338ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin    const unsigned char prev = (unsigned char)fromLim[-1];
339ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin    if ((prev & 0xf8u) == 0xf0u) { /* 4-byte character, lead by 0b11110xxx byte */
340ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin      if (walked + 1 >= 4) {
341ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin        fromLim += 4 - 1;
342ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin        break;
343ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin      } else {
344ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin        walked = 0;
345ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin      }
346ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin    } else if ((prev & 0xf0u) == 0xe0u) { /* 3-byte character, lead by 0b1110xxxx byte */
347ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin      if (walked + 1 >= 3) {
348ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin        fromLim += 3 - 1;
349ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin        break;
350ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin      } else {
351ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin        walked = 0;
352ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin      }
353ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin    } else if ((prev & 0xe0u) == 0xc0u) { /* 2-byte character, lead by 0b110xxxxx byte */
354ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin      if (walked + 1 >= 2) {
355ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin        fromLim += 2 - 1;
356ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin        break;
357ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin      } else {
358ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin        walked = 0;
359ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin      }
360ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin    } else if ((prev & 0x80u) == 0x00u) { /* 1-byte character, matching 0b0xxxxxxx */
361ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin      break;
362ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin    }
363ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin  }
364ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin  *fromLimRef = fromLim;
365ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin}
366ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin
3677b64b72da916c9c9c285939c11f81de938268fa9Paul Duffinstatic enum XML_Convert_Result PTRCALL
368ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffinutf8_toUtf8(const ENCODING *UNUSED_P(enc),
369b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            const char **fromP, const char *fromLim,
370b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            char **toP, const char *toLim)
371b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
3727b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  enum XML_Convert_Result res = XML_CONVERT_COMPLETED;
373b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  char *to;
374b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *from;
375b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (fromLim - *fromP > toLim - *toP) {
376b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* Avoid copying partial characters. */
3777b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin    res = XML_CONVERT_OUTPUT_EXHAUSTED;
378ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin    fromLim = *fromP + (toLim - *toP);
379ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin    align_limit_to_full_utf8_characters(*fromP, &fromLim);
380b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
3817b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  for (to = *toP, from = *fromP; (from < fromLim) && (to < toLim); from++, to++)
382b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *to = *from;
383b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  *fromP = from;
384b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  *toP = to;
3857b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin
3867b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  if ((to == toLim) && (from < fromLim))
3877b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin    return XML_CONVERT_OUTPUT_EXHAUSTED;
3887b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  else
3897b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin    return res;
390b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
391b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
3927b64b72da916c9c9c285939c11f81de938268fa9Paul Duffinstatic enum XML_Convert_Result PTRCALL
393b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectutf8_toUtf16(const ENCODING *enc,
394b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             const char **fromP, const char *fromLim,
395b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             unsigned short **toP, const unsigned short *toLim)
396b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
3977b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  enum XML_Convert_Result res = XML_CONVERT_COMPLETED;
398b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  unsigned short *to = *toP;
399b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *from = *fromP;
4007b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  while (from < fromLim && to < toLim) {
401b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    switch (((struct normal_encoding *)enc)->type[(unsigned char)*from]) {
402b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case BT_LEAD2:
4037b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin      if (fromLim - from < 2) {
4047b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin        res = XML_CONVERT_INPUT_INCOMPLETE;
4057b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin        break;
4067b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin      }
407b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *to++ = (unsigned short)(((from[0] & 0x1f) << 6) | (from[1] & 0x3f));
408b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      from += 2;
409b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
410b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case BT_LEAD3:
4117b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin      if (fromLim - from < 3) {
4127b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin        res = XML_CONVERT_INPUT_INCOMPLETE;
4137b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin        break;
4147b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin      }
415b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *to++ = (unsigned short)(((from[0] & 0xf) << 12)
416b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                               | ((from[1] & 0x3f) << 6) | (from[2] & 0x3f));
417b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      from += 3;
418b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
419b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case BT_LEAD4:
420b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      {
421b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        unsigned long n;
4227b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin        if (toLim - to < 2) {
4237b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin          res = XML_CONVERT_OUTPUT_EXHAUSTED;
424b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          goto after;
4257b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin        }
4267b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin        if (fromLim - from < 4) {
4277b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin          res = XML_CONVERT_INPUT_INCOMPLETE;
4287b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin          goto after;
4297b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin        }
430b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        n = ((from[0] & 0x7) << 18) | ((from[1] & 0x3f) << 12)
431b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            | ((from[2] & 0x3f) << 6) | (from[3] & 0x3f);
432b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        n -= 0x10000;
433b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        to[0] = (unsigned short)((n >> 10) | 0xD800);
434b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        to[1] = (unsigned short)((n & 0x3FF) | 0xDC00);
435b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        to += 2;
436b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        from += 4;
437b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
438b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
439b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    default:
440b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *to++ = *from++;
441b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
442b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
443b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
444b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectafter:
445b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  *fromP = from;
446b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  *toP = to;
4477b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  return res;
448b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
449b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
450b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_NS
451b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const struct normal_encoding utf8_encoding_ns = {
452b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 },
453b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  {
454b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "asciitab.h"
455b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "utf8tab.h"
456b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  },
457b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_)
458b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
459b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
460b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
461b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const struct normal_encoding utf8_encoding = {
462b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 },
463b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  {
464b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define BT_COLON BT_NMSTRT
465b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "asciitab.h"
466b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef BT_COLON
467b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "utf8tab.h"
468b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  },
469b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_)
470b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
471b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
472b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_NS
473b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
474b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const struct normal_encoding internal_utf8_encoding_ns = {
475b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 },
476b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  {
477b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "iasciitab.h"
478b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "utf8tab.h"
479b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  },
480b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_)
481b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
482b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
483b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
484b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
485b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const struct normal_encoding internal_utf8_encoding = {
486b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 },
487b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  {
488b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define BT_COLON BT_NMSTRT
489b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "iasciitab.h"
490b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef BT_COLON
491b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "utf8tab.h"
492b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  },
493b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_)
494b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
495b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4967b64b72da916c9c9c285939c11f81de938268fa9Paul Duffinstatic enum XML_Convert_Result PTRCALL
497ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffinlatin1_toUtf8(const ENCODING *UNUSED_P(enc),
498b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              const char **fromP, const char *fromLim,
499b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              char **toP, const char *toLim)
500b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
501b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;;) {
502b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    unsigned char c;
503b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (*fromP == fromLim)
5047b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin      return XML_CONVERT_COMPLETED;
505b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    c = (unsigned char)**fromP;
506b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (c & 0x80) {
507b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (toLim - *toP < 2)
5087b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin        return XML_CONVERT_OUTPUT_EXHAUSTED;
509b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *(*toP)++ = (char)((c >> 6) | UTF8_cval2);
510b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *(*toP)++ = (char)((c & 0x3f) | 0x80);
511b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      (*fromP)++;
512b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
513b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else {
514b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (*toP == toLim)
5157b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin        return XML_CONVERT_OUTPUT_EXHAUSTED;
516b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *(*toP)++ = *(*fromP)++;
517b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
518b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
519b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
520b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5217b64b72da916c9c9c285939c11f81de938268fa9Paul Duffinstatic enum XML_Convert_Result PTRCALL
522ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffinlatin1_toUtf16(const ENCODING *UNUSED_P(enc),
523b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const char **fromP, const char *fromLim,
524b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               unsigned short **toP, const unsigned short *toLim)
525b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
5267b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  while (*fromP < fromLim && *toP < toLim)
527b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *(*toP)++ = (unsigned char)*(*fromP)++;
5287b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin
5297b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  if ((*toP == toLim) && (*fromP < fromLim))
5307b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin    return XML_CONVERT_OUTPUT_EXHAUSTED;
5317b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  else
5327b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin    return XML_CONVERT_COMPLETED;
533b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
534b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
535b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_NS
536b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
537b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const struct normal_encoding latin1_encoding_ns = {
538b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 },
539b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  {
540b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "asciitab.h"
541b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "latin1tab.h"
542b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  },
543ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin  STANDARD_VTABLE(sb_) NULL_VTABLE
544b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
545b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
546b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
547b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
548b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const struct normal_encoding latin1_encoding = {
549b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 },
550b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  {
551b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define BT_COLON BT_NMSTRT
552b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "asciitab.h"
553b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef BT_COLON
554b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "latin1tab.h"
555b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  },
556ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin  STANDARD_VTABLE(sb_) NULL_VTABLE
557b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
558b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
5597b64b72da916c9c9c285939c11f81de938268fa9Paul Duffinstatic enum XML_Convert_Result PTRCALL
560ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffinascii_toUtf8(const ENCODING *UNUSED_P(enc),
561b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             const char **fromP, const char *fromLim,
562b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             char **toP, const char *toLim)
563b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
5647b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  while (*fromP < fromLim && *toP < toLim)
565b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *(*toP)++ = *(*fromP)++;
5667b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin
5677b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  if ((*toP == toLim) && (*fromP < fromLim))
5687b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin    return XML_CONVERT_OUTPUT_EXHAUSTED;
5697b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  else
5707b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin    return XML_CONVERT_COMPLETED;
571b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
572b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
573b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_NS
574b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
575b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const struct normal_encoding ascii_encoding_ns = {
576b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 },
577b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  {
578b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "asciitab.h"
579b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* BT_NONXML == 0 */
580b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  },
581ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin  STANDARD_VTABLE(sb_) NULL_VTABLE
582b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
583b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
584b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
585b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
586b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const struct normal_encoding ascii_encoding = {
587b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 },
588b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  {
589b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define BT_COLON BT_NMSTRT
590b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "asciitab.h"
591b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef BT_COLON
592b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* BT_NONXML == 0 */
593b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  },
594ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin  STANDARD_VTABLE(sb_) NULL_VTABLE
595b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
596b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
597b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRFASTCALL
598b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectunicode_byte_type(char hi, char lo)
599b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
600b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  switch ((unsigned char)hi) {
601b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case 0xD8: case 0xD9: case 0xDA: case 0xDB:
602b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return BT_LEAD4;
603b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case 0xDC: case 0xDD: case 0xDE: case 0xDF:
604b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return BT_TRAIL;
605b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case 0xFF:
606b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    switch ((unsigned char)lo) {
607b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case 0xFF:
608b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case 0xFE:
609b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return BT_NONXML;
610b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
611b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    break;
612b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
613b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return BT_NONASCII;
614b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
615b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
616b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define DEFINE_UTF16_TO_UTF8(E) \
6177b64b72da916c9c9c285939c11f81de938268fa9Paul Duffinstatic enum XML_Convert_Result  PTRCALL \
618ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul DuffinE ## toUtf8(const ENCODING *UNUSED_P(enc), \
619b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            const char **fromP, const char *fromLim, \
620b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            char **toP, const char *toLim) \
621b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{ \
6227b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  const char *from = *fromP; \
6237b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  fromLim = from + (((fromLim - from) >> 1) << 1);  /* shrink to even */ \
6247b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  for (; from < fromLim; from += 2) { \
625b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int plane; \
626b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    unsigned char lo2; \
627b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    unsigned char lo = GET_LO(from); \
628b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    unsigned char hi = GET_HI(from); \
629b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    switch (hi) { \
630b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case 0: \
631b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (lo < 0x80) { \
632b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (*toP == toLim) { \
633b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          *fromP = from; \
6347b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin          return XML_CONVERT_OUTPUT_EXHAUSTED; \
635b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        } \
636b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *(*toP)++ = lo; \
637b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        break; \
638b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      } \
639b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* fall through */ \
640b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case 0x1: case 0x2: case 0x3: \
641b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case 0x4: case 0x5: case 0x6: case 0x7: \
642b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (toLim -  *toP < 2) { \
643b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *fromP = from; \
6447b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin        return XML_CONVERT_OUTPUT_EXHAUSTED; \
645b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      } \
646b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *(*toP)++ = ((lo >> 6) | (hi << 2) |  UTF8_cval2); \
647b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *(*toP)++ = ((lo & 0x3f) | 0x80); \
648b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break; \
649b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    default: \
650b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (toLim -  *toP < 3)  { \
651b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *fromP = from; \
6527b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin        return XML_CONVERT_OUTPUT_EXHAUSTED; \
653b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      } \
654b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* 16 bits divided 4, 6, 6 amongst 3 bytes */ \
655b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *(*toP)++ = ((hi >> 4) | UTF8_cval3); \
656b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *(*toP)++ = (((hi & 0xf) << 2) | (lo >> 6) | 0x80); \
657b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *(*toP)++ = ((lo & 0x3f) | 0x80); \
658b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break; \
659b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case 0xD8: case 0xD9: case 0xDA: case 0xDB: \
660b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (toLim -  *toP < 4) { \
661b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *fromP = from; \
6627b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin        return XML_CONVERT_OUTPUT_EXHAUSTED; \
6637b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin      } \
6647b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin      if (fromLim - from < 4) { \
6657b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin        *fromP = from; \
6667b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin        return XML_CONVERT_INPUT_INCOMPLETE; \
667b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      } \
668b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      plane = (((hi & 0x3) << 2) | ((lo >> 6) & 0x3)) + 1; \
669b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *(*toP)++ = ((plane >> 2) | UTF8_cval4); \
670b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *(*toP)++ = (((lo >> 2) & 0xF) | ((plane & 0x3) << 4) | 0x80); \
671b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      from += 2; \
672b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      lo2 = GET_LO(from); \
673b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *(*toP)++ = (((lo & 0x3) << 4) \
674b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   | ((GET_HI(from) & 0x3) << 2) \
675b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   | (lo2 >> 6) \
676b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   | 0x80); \
677b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *(*toP)++ = ((lo2 & 0x3f) | 0x80); \
678b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break; \
679b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    } \
680b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  } \
681b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  *fromP = from; \
6827b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  if (from < fromLim) \
6837b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin    return XML_CONVERT_INPUT_INCOMPLETE; \
6847b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  else \
6857b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin    return XML_CONVERT_COMPLETED; \
686b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
687b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
688b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define DEFINE_UTF16_TO_UTF16(E) \
6897b64b72da916c9c9c285939c11f81de938268fa9Paul Duffinstatic enum XML_Convert_Result  PTRCALL \
690ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul DuffinE ## toUtf16(const ENCODING *UNUSED_P(enc), \
691b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             const char **fromP, const char *fromLim, \
692b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             unsigned short **toP, const unsigned short *toLim) \
693b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{ \
6947b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  enum XML_Convert_Result res = XML_CONVERT_COMPLETED; \
6957b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  fromLim = *fromP + (((fromLim - *fromP) >> 1) << 1);  /* shrink to even */ \
696b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* Avoid copying first half only of surrogate */ \
697b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (fromLim - *fromP > ((toLim - *toP) << 1) \
6987b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin      && (GET_HI(fromLim - 2) & 0xF8) == 0xD8) { \
699b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    fromLim -= 2; \
7007b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin    res = XML_CONVERT_INPUT_INCOMPLETE; \
7017b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  } \
7027b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  for (; *fromP < fromLim && *toP < toLim; *fromP += 2) \
703b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *(*toP)++ = (GET_HI(*fromP) << 8) | GET_LO(*fromP); \
7047b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  if ((*toP == toLim) && (*fromP < fromLim)) \
7057b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin    return XML_CONVERT_OUTPUT_EXHAUSTED; \
7067b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  else \
7077b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin    return res; \
708b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
709b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
710b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define SET2(ptr, ch) \
711b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  (((ptr)[0] = ((ch) & 0xff)), ((ptr)[1] = ((ch) >> 8)))
712b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define GET_LO(ptr) ((unsigned char)(ptr)[0])
713b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define GET_HI(ptr) ((unsigned char)(ptr)[1])
714b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
715b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectDEFINE_UTF16_TO_UTF8(little2_)
716b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectDEFINE_UTF16_TO_UTF16(little2_)
717b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
718b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef SET2
719b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef GET_LO
720b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef GET_HI
721b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
722b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define SET2(ptr, ch) \
723b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  (((ptr)[0] = ((ch) >> 8)), ((ptr)[1] = ((ch) & 0xFF)))
724b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define GET_LO(ptr) ((unsigned char)(ptr)[1])
725b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define GET_HI(ptr) ((unsigned char)(ptr)[0])
726b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
727b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectDEFINE_UTF16_TO_UTF8(big2_)
728b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectDEFINE_UTF16_TO_UTF16(big2_)
729b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
730b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef SET2
731b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef GET_LO
732b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef GET_HI
733b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
734b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define LITTLE2_BYTE_TYPE(enc, p) \
735b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project ((p)[1] == 0 \
736b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ? ((struct normal_encoding *)(enc))->type[(unsigned char)*(p)] \
737b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  : unicode_byte_type((p)[1], (p)[0]))
738b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define LITTLE2_BYTE_TO_ASCII(enc, p) ((p)[1] == 0 ? (p)[0] : -1)
739b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define LITTLE2_CHAR_MATCHES(enc, p, c) ((p)[1] == 0 && (p)[0] == c)
740b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) \
741b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  UCS2_GET_NAMING(namePages, (unsigned char)p[1], (unsigned char)p[0])
742b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) \
743b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[1], (unsigned char)p[0])
744b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
745b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_MIN_SIZE
746b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
747b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRFASTCALL
748b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectlittle2_byteType(const ENCODING *enc, const char *p)
749b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
750b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return LITTLE2_BYTE_TYPE(enc, p);
751b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
752b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
753b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRFASTCALL
754b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectlittle2_byteToAscii(const ENCODING *enc, const char *p)
755b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
756b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return LITTLE2_BYTE_TO_ASCII(enc, p);
757b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
758b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
759b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRCALL
760b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectlittle2_charMatches(const ENCODING *enc, const char *p, int c)
761b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
762b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return LITTLE2_CHAR_MATCHES(enc, p, c);
763b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
764b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
765b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRFASTCALL
766b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectlittle2_isNameMin(const ENCODING *enc, const char *p)
767b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
768b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return LITTLE2_IS_NAME_CHAR_MINBPC(enc, p);
769b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
770b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
771b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRFASTCALL
772b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectlittle2_isNmstrtMin(const ENCODING *enc, const char *p)
773b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
774b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p);
775b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
776b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
777b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef VTABLE
778b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define VTABLE VTABLE1, little2_toUtf8, little2_toUtf16
779b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
780b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else /* not XML_MIN_SIZE */
781b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
782b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef PREFIX
783b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define PREFIX(ident) little2_ ## ident
784b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define MINBPC(enc) 2
785b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */
786b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define BYTE_TYPE(enc, p) LITTLE2_BYTE_TYPE(enc, p)
787b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define BYTE_TO_ASCII(enc, p) LITTLE2_BYTE_TO_ASCII(enc, p)
788b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define CHAR_MATCHES(enc, p, c) LITTLE2_CHAR_MATCHES(enc, p, c)
789b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define IS_NAME_CHAR(enc, p, n) 0
790b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define IS_NAME_CHAR_MINBPC(enc, p) LITTLE2_IS_NAME_CHAR_MINBPC(enc, p)
791b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define IS_NMSTRT_CHAR(enc, p, n) (0)
792b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define IS_NMSTRT_CHAR_MINBPC(enc, p) LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p)
793b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
794d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#define XML_TOK_IMPL_C
795b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "xmltok_impl.c"
796d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#undef XML_TOK_IMPL_C
797b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
798b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef MINBPC
799b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef BYTE_TYPE
800b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef BYTE_TO_ASCII
801b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef CHAR_MATCHES
802b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef IS_NAME_CHAR
803b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef IS_NAME_CHAR_MINBPC
804b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef IS_NMSTRT_CHAR
805b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef IS_NMSTRT_CHAR_MINBPC
806b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef IS_INVALID_CHAR
807b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
808b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* not XML_MIN_SIZE */
809b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
810b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_NS
811b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
812b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const struct normal_encoding little2_encoding_ns = {
813b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  { VTABLE, 2, 0,
814b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#if BYTEORDER == 1234
815b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    1
816b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
817b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    0
818b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
819b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  },
820b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  {
821b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "asciitab.h"
822b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "latin1tab.h"
823b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  },
824ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin  STANDARD_VTABLE(little2_) NULL_VTABLE
825b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
826b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
827b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
828b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
829b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const struct normal_encoding little2_encoding = {
830b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  { VTABLE, 2, 0,
831b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#if BYTEORDER == 1234
832b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    1
833b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
834b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    0
835b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
836b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  },
837b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  {
838b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define BT_COLON BT_NMSTRT
839b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "asciitab.h"
840b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef BT_COLON
841b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "latin1tab.h"
842b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  },
843ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin  STANDARD_VTABLE(little2_) NULL_VTABLE
844b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
845b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
846b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#if BYTEORDER != 4321
847b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
848b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_NS
849b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
850b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const struct normal_encoding internal_little2_encoding_ns = {
851b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  { VTABLE, 2, 0, 1 },
852b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  {
853b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "iasciitab.h"
854b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "latin1tab.h"
855b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  },
856ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin  STANDARD_VTABLE(little2_) NULL_VTABLE
857b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
858b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
859b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
860b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
861b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const struct normal_encoding internal_little2_encoding = {
862b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  { VTABLE, 2, 0, 1 },
863b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  {
864b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define BT_COLON BT_NMSTRT
865b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "iasciitab.h"
866b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef BT_COLON
867b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "latin1tab.h"
868b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  },
869ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin  STANDARD_VTABLE(little2_) NULL_VTABLE
870b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
871b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
872b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
873b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
874b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
875b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define BIG2_BYTE_TYPE(enc, p) \
876b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project ((p)[0] == 0 \
877b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ? ((struct normal_encoding *)(enc))->type[(unsigned char)(p)[1]] \
878b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  : unicode_byte_type((p)[0], (p)[1]))
879b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define BIG2_BYTE_TO_ASCII(enc, p) ((p)[0] == 0 ? (p)[1] : -1)
880b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define BIG2_CHAR_MATCHES(enc, p, c) ((p)[0] == 0 && (p)[1] == c)
881b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define BIG2_IS_NAME_CHAR_MINBPC(enc, p) \
882b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  UCS2_GET_NAMING(namePages, (unsigned char)p[0], (unsigned char)p[1])
883b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) \
884b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[0], (unsigned char)p[1])
885b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
886b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_MIN_SIZE
887b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
888b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRFASTCALL
889b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectbig2_byteType(const ENCODING *enc, const char *p)
890b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
891b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return BIG2_BYTE_TYPE(enc, p);
892b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
893b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
894b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRFASTCALL
895b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectbig2_byteToAscii(const ENCODING *enc, const char *p)
896b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
897b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return BIG2_BYTE_TO_ASCII(enc, p);
898b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
899b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
900b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRCALL
901b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectbig2_charMatches(const ENCODING *enc, const char *p, int c)
902b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
903b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return BIG2_CHAR_MATCHES(enc, p, c);
904b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
905b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
906b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRFASTCALL
907b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectbig2_isNameMin(const ENCODING *enc, const char *p)
908b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
909b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return BIG2_IS_NAME_CHAR_MINBPC(enc, p);
910b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
911b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
912b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRFASTCALL
913b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectbig2_isNmstrtMin(const ENCODING *enc, const char *p)
914b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
915b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p);
916b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
917b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
918b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef VTABLE
919b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define VTABLE VTABLE1, big2_toUtf8, big2_toUtf16
920b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
921b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else /* not XML_MIN_SIZE */
922b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
923b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef PREFIX
924b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define PREFIX(ident) big2_ ## ident
925b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define MINBPC(enc) 2
926b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */
927b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define BYTE_TYPE(enc, p) BIG2_BYTE_TYPE(enc, p)
928b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define BYTE_TO_ASCII(enc, p) BIG2_BYTE_TO_ASCII(enc, p)
929b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define CHAR_MATCHES(enc, p, c) BIG2_CHAR_MATCHES(enc, p, c)
930b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define IS_NAME_CHAR(enc, p, n) 0
931b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define IS_NAME_CHAR_MINBPC(enc, p) BIG2_IS_NAME_CHAR_MINBPC(enc, p)
932b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define IS_NMSTRT_CHAR(enc, p, n) (0)
933b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define IS_NMSTRT_CHAR_MINBPC(enc, p) BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p)
934b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
935d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#define XML_TOK_IMPL_C
936b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "xmltok_impl.c"
937d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#undef XML_TOK_IMPL_C
938b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
939b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef MINBPC
940b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef BYTE_TYPE
941b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef BYTE_TO_ASCII
942b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef CHAR_MATCHES
943b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef IS_NAME_CHAR
944b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef IS_NAME_CHAR_MINBPC
945b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef IS_NMSTRT_CHAR
946b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef IS_NMSTRT_CHAR_MINBPC
947b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef IS_INVALID_CHAR
948b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
949b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* not XML_MIN_SIZE */
950b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
951b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_NS
952b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
953b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const struct normal_encoding big2_encoding_ns = {
954b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  { VTABLE, 2, 0,
955b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#if BYTEORDER == 4321
956b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  1
957b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
958b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  0
959b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
960b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  },
961b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  {
962b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "asciitab.h"
963b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "latin1tab.h"
964b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  },
965ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin  STANDARD_VTABLE(big2_) NULL_VTABLE
966b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
967b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
968b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
969b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
970b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const struct normal_encoding big2_encoding = {
971b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  { VTABLE, 2, 0,
972b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#if BYTEORDER == 4321
973b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  1
974b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
975b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  0
976b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
977b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  },
978b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  {
979b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define BT_COLON BT_NMSTRT
980b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "asciitab.h"
981b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef BT_COLON
982b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "latin1tab.h"
983b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  },
984ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin  STANDARD_VTABLE(big2_) NULL_VTABLE
985b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
986b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
987b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#if BYTEORDER != 1234
988b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
989b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_NS
990b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
991b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const struct normal_encoding internal_big2_encoding_ns = {
992b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  { VTABLE, 2, 0, 1 },
993b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  {
994b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "iasciitab.h"
995b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "latin1tab.h"
996b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  },
997ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin  STANDARD_VTABLE(big2_) NULL_VTABLE
998b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
999b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1000b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
1001b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1002b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const struct normal_encoding internal_big2_encoding = {
1003b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  { VTABLE, 2, 0, 1 },
1004b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  {
1005b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define BT_COLON BT_NMSTRT
1006b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "iasciitab.h"
1007b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef BT_COLON
1008b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "latin1tab.h"
1009b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  },
1010ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul Duffin  STANDARD_VTABLE(big2_) NULL_VTABLE
1011b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
1012b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1013b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
1014b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1015b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef PREFIX
1016b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1017b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int FASTCALL
1018b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstreqci(const char *s1, const char *s2)
1019b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1020b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;;) {
1021b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char c1 = *s1++;
1022b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char c2 = *s2++;
1023b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (ASCII_a <= c1 && c1 <= ASCII_z)
1024b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      c1 += ASCII_A - ASCII_a;
1025b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (ASCII_a <= c2 && c2 <= ASCII_z)
1026b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      c2 += ASCII_A - ASCII_a;
1027b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (c1 != c2)
1028b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return 0;
1029b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!c1)
1030b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
1031b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1032b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return 1;
1033b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1034b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1035b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void PTRCALL
1036ba34a0c0eeed7538bd405826bf3ac25cecf71c90Paul DuffininitUpdatePosition(const ENCODING *UNUSED_P(enc), const char *ptr,
1037b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   const char *end, POSITION *pos)
1038b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1039b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  normal_updatePosition(&utf8_encoding.enc, ptr, end, pos);
1040b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1041b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1042b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int
1043b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjecttoAscii(const ENCODING *enc, const char *ptr, const char *end)
1044b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1045b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  char buf[1];
1046b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  char *p = buf;
1047b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XmlUtf8Convert(enc, &ptr, end, &p, p + 1);
1048b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (p == buf)
1049b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return -1;
1050b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else
1051b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return buf[0];
1052b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1053b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1054b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int FASTCALL
1055b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectisSpace(int c)
1056b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1057b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  switch (c) {
1058b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case 0x20:
1059b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case 0xD:
1060b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case 0xA:
1061b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case 0x9:
1062b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 1;
1063b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1064b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return 0;
1065b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1066b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1067b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Return 1 if there's just optional white space or there's an S
1068b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   followed by name=val.
1069b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
1070b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int
1071b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectparsePseudoAttribute(const ENCODING *enc,
1072b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                     const char *ptr,
1073b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                     const char *end,
1074b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                     const char **namePtr,
1075b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                     const char **nameEndPtr,
1076b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                     const char **valPtr,
1077b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                     const char **nextTokPtr)
1078b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1079b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int c;
1080b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  char open;
1081b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (ptr == end) {
1082b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *namePtr = NULL;
1083b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 1;
1084b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1085b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!isSpace(toAscii(enc, ptr, end))) {
1086b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *nextTokPtr = ptr;
1087b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 0;
1088b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1089b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  do {
1090b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ptr += enc->minBytesPerChar;
1091b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  } while (isSpace(toAscii(enc, ptr, end)));
1092b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (ptr == end) {
1093b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *namePtr = NULL;
1094b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 1;
1095b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1096b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  *namePtr = ptr;
1097b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;;) {
1098b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    c = toAscii(enc, ptr, end);
1099b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (c == -1) {
1100b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *nextTokPtr = ptr;
1101b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return 0;
1102b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1103b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (c == ASCII_EQUALS) {
1104b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *nameEndPtr = ptr;
1105b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
1106b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1107b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (isSpace(c)) {
1108b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *nameEndPtr = ptr;
1109b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      do {
1110b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        ptr += enc->minBytesPerChar;
1111b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      } while (isSpace(c = toAscii(enc, ptr, end)));
1112b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (c != ASCII_EQUALS) {
1113b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *nextTokPtr = ptr;
1114b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return 0;
1115b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
1116b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
1117b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1118b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ptr += enc->minBytesPerChar;
1119b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1120b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (ptr == *namePtr) {
1121b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *nextTokPtr = ptr;
1122b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 0;
1123b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1124b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ptr += enc->minBytesPerChar;
1125b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  c = toAscii(enc, ptr, end);
1126b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  while (isSpace(c)) {
1127b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ptr += enc->minBytesPerChar;
1128b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    c = toAscii(enc, ptr, end);
1129b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1130b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (c != ASCII_QUOT && c != ASCII_APOS) {
1131b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *nextTokPtr = ptr;
1132b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 0;
1133b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1134b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  open = (char)c;
1135b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ptr += enc->minBytesPerChar;
1136b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  *valPtr = ptr;
1137b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;; ptr += enc->minBytesPerChar) {
1138b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    c = toAscii(enc, ptr, end);
1139b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (c == open)
1140b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
1141b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!(ASCII_a <= c && c <= ASCII_z)
1142b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        && !(ASCII_A <= c && c <= ASCII_Z)
1143b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        && !(ASCII_0 <= c && c <= ASCII_9)
1144b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        && c != ASCII_PERIOD
1145b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        && c != ASCII_MINUS
1146b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        && c != ASCII_UNDERSCORE) {
1147b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *nextTokPtr = ptr;
1148b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return 0;
1149b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1150b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1151b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  *nextTokPtr = ptr + enc->minBytesPerChar;
1152b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return 1;
1153b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1154b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1155b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const char KW_version[] = {
1156b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ASCII_v, ASCII_e, ASCII_r, ASCII_s, ASCII_i, ASCII_o, ASCII_n, '\0'
1157b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
1158b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1159b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const char KW_encoding[] = {
1160b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ASCII_e, ASCII_n, ASCII_c, ASCII_o, ASCII_d, ASCII_i, ASCII_n, ASCII_g, '\0'
1161b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
1162b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1163b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const char KW_standalone[] = {
1164b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ASCII_s, ASCII_t, ASCII_a, ASCII_n, ASCII_d, ASCII_a, ASCII_l, ASCII_o,
1165b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ASCII_n, ASCII_e, '\0'
1166b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
1167b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1168b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const char KW_yes[] = {
1169b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ASCII_y, ASCII_e, ASCII_s,  '\0'
1170b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
1171b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1172b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const char KW_no[] = {
1173b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ASCII_n, ASCII_o,  '\0'
1174b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
1175b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1176b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int
1177b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectdoParseXmlDecl(const ENCODING *(*encodingFinder)(const ENCODING *,
1178b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                                 const char *,
1179b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                                 const char *),
1180b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               int isGeneralTextEntity,
1181b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const ENCODING *enc,
1182b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const char *ptr,
1183b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const char *end,
1184b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const char **badPtr,
1185b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const char **versionPtr,
1186b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const char **versionEndPtr,
1187b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const char **encodingName,
1188b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const ENCODING **encoding,
1189b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               int *standalone)
1190b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1191b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *val = NULL;
1192b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *name = NULL;
1193b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const char *nameEnd = NULL;
1194b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ptr += 5 * enc->minBytesPerChar;
1195b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  end -= 2 * enc->minBytesPerChar;
1196b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)
1197b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      || !name) {
1198b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *badPtr = ptr;
1199b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 0;
1200b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1201b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_version)) {
1202b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!isGeneralTextEntity) {
1203b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *badPtr = name;
1204b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return 0;
1205b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1206b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1207b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
1208b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (versionPtr)
1209b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *versionPtr = val;
1210b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (versionEndPtr)
1211b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *versionEndPtr = ptr;
1212b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) {
1213b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *badPtr = ptr;
1214b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return 0;
1215b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1216b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!name) {
1217b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (isGeneralTextEntity) {
1218b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* a TextDecl must have an EncodingDecl */
1219b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *badPtr = ptr;
1220b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return 0;
1221b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
1222b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return 1;
1223b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1224b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1225b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (XmlNameMatchesAscii(enc, name, nameEnd, KW_encoding)) {
1226b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int c = toAscii(enc, val, end);
1227b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!(ASCII_a <= c && c <= ASCII_z) && !(ASCII_A <= c && c <= ASCII_Z)) {
1228b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *badPtr = val;
1229b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return 0;
1230b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1231b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (encodingName)
1232b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *encodingName = val;
1233b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (encoding)
1234b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *encoding = encodingFinder(enc, val, ptr - enc->minBytesPerChar);
1235b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) {
1236b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *badPtr = ptr;
1237b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return 0;
1238b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1239b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!name)
1240b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return 1;
1241b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1242b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_standalone)
1243b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      || isGeneralTextEntity) {
1244b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *badPtr = name;
1245b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 0;
1246b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1247b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_yes)) {
1248b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (standalone)
1249b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *standalone = 1;
1250b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1251b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_no)) {
1252b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (standalone)
1253b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *standalone = 0;
1254b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1255b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
1256b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *badPtr = val;
1257b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 0;
1258b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1259b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  while (isSpace(toAscii(enc, ptr, end)))
1260b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ptr += enc->minBytesPerChar;
1261b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (ptr != end) {
1262b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *badPtr = ptr;
1263b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 0;
1264b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1265b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return 1;
1266b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1267b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1268b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int FASTCALL
1269b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectcheckCharRefNumber(int result)
1270b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1271b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  switch (result >> 8) {
1272b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case 0xD8: case 0xD9: case 0xDA: case 0xDB:
1273b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case 0xDC: case 0xDD: case 0xDE: case 0xDF:
1274b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return -1;
1275b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case 0:
1276b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (latin1_encoding.type[result] == BT_NONXML)
1277b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return -1;
1278b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    break;
1279b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  case 0xFF:
1280b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (result == 0xFFFE || result == 0xFFFF)
1281b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return -1;
1282b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    break;
1283b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1284b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return result;
1285b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1286b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1287b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectint FASTCALL
1288b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXmlUtf8Encode(int c, char *buf)
1289b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1290b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  enum {
1291b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* minN is minimum legal resulting value for N byte sequence */
1292b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    min2 = 0x80,
1293b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    min3 = 0x800,
1294b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    min4 = 0x10000
1295b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  };
1296b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1297b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (c < 0)
1298b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 0;
1299b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (c < min2) {
1300b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    buf[0] = (char)(c | UTF8_cval1);
1301b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 1;
1302b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1303b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (c < min3) {
1304b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    buf[0] = (char)((c >> 6) | UTF8_cval2);
1305b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    buf[1] = (char)((c & 0x3f) | 0x80);
1306b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 2;
1307b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1308b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (c < min4) {
1309b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    buf[0] = (char)((c >> 12) | UTF8_cval3);
1310b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    buf[1] = (char)(((c >> 6) & 0x3f) | 0x80);
1311b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    buf[2] = (char)((c & 0x3f) | 0x80);
1312b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 3;
1313b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1314b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (c < 0x110000) {
1315b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    buf[0] = (char)((c >> 18) | UTF8_cval4);
1316b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    buf[1] = (char)(((c >> 12) & 0x3f) | 0x80);
1317b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    buf[2] = (char)(((c >> 6) & 0x3f) | 0x80);
1318b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    buf[3] = (char)((c & 0x3f) | 0x80);
1319b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 4;
1320b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1321b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return 0;
1322b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1323b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1324b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectint FASTCALL
1325b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXmlUtf16Encode(int charNum, unsigned short *buf)
1326b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1327b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (charNum < 0)
1328b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 0;
1329b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (charNum < 0x10000) {
1330b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    buf[0] = (unsigned short)charNum;
1331b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 1;
1332b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1333b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (charNum < 0x110000) {
1334b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    charNum -= 0x10000;
1335b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    buf[0] = (unsigned short)((charNum >> 10) + 0xD800);
1336b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    buf[1] = (unsigned short)((charNum & 0x3FF) + 0xDC00);
1337b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 2;
1338b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1339b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return 0;
1340b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1341b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1342b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstruct unknown_encoding {
1343b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  struct normal_encoding normal;
1344b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  CONVERTER convert;
1345b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  void *userData;
1346b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  unsigned short utf16[256];
1347b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  char utf8[256][4];
1348b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
1349b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1350b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define AS_UNKNOWN_ENCODING(enc)  ((const struct unknown_encoding *) (enc))
1351b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1352b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectint
1353b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXmlSizeOfUnknownEncoding(void)
1354b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1355b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return sizeof(struct unknown_encoding);
1356b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1357b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1358b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRFASTCALL
1359b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectunknown_isName(const ENCODING *enc, const char *p)
1360b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1361b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc);
1362b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int c = uenc->convert(uenc->userData, p);
1363b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (c & ~0xFFFF)
1364b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 0;
1365b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return UCS2_GET_NAMING(namePages, c >> 8, c & 0xFF);
1366b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1367b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1368b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRFASTCALL
1369b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectunknown_isNmstrt(const ENCODING *enc, const char *p)
1370b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1371b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc);
1372b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int c = uenc->convert(uenc->userData, p);
1373b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (c & ~0xFFFF)
1374b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 0;
1375b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xFF);
1376b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1377b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1378b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int PTRFASTCALL
1379b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectunknown_isInvalid(const ENCODING *enc, const char *p)
1380b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1381b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc);
1382b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int c = uenc->convert(uenc->userData, p);
1383b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return (c & ~0xFFFF) || checkCharRefNumber(c) < 0;
1384b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1385b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
13867b64b72da916c9c9c285939c11f81de938268fa9Paul Duffinstatic enum XML_Convert_Result PTRCALL
1387b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectunknown_toUtf8(const ENCODING *enc,
1388b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               const char **fromP, const char *fromLim,
1389b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               char **toP, const char *toLim)
1390b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1391b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc);
1392b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  char buf[XML_UTF8_ENCODE_MAX];
1393b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (;;) {
1394b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    const char *utf8;
1395b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int n;
1396b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (*fromP == fromLim)
13977b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin      return XML_CONVERT_COMPLETED;
1398b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    utf8 = uenc->utf8[(unsigned char)**fromP];
1399b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    n = *utf8++;
1400b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (n == 0) {
1401b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      int c = uenc->convert(uenc->userData, *fromP);
1402b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      n = XmlUtf8Encode(c, buf);
1403b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (n > toLim - *toP)
14047b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin        return XML_CONVERT_OUTPUT_EXHAUSTED;
1405b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      utf8 = buf;
1406b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP]
1407b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                 - (BT_LEAD2 - 2));
1408b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1409b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else {
1410b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (n > toLim - *toP)
14117b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin        return XML_CONVERT_OUTPUT_EXHAUSTED;
1412b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      (*fromP)++;
1413b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1414b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    do {
1415b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *(*toP)++ = *utf8++;
1416b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    } while (--n != 0);
1417b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1418b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1419b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
14207b64b72da916c9c9c285939c11f81de938268fa9Paul Duffinstatic enum XML_Convert_Result PTRCALL
1421b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectunknown_toUtf16(const ENCODING *enc,
1422b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                const char **fromP, const char *fromLim,
1423b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                unsigned short **toP, const unsigned short *toLim)
1424b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1425b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc);
14267b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  while (*fromP < fromLim && *toP < toLim) {
1427b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    unsigned short c = uenc->utf16[(unsigned char)**fromP];
1428b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (c == 0) {
1429b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      c = (unsigned short)
1430b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          uenc->convert(uenc->userData, *fromP);
1431b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP]
1432b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                 - (BT_LEAD2 - 2));
1433b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1434b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else
1435b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      (*fromP)++;
1436b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    *(*toP)++ = c;
1437b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
14387b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin
14397b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  if ((*toP == toLim) && (*fromP < fromLim))
14407b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin    return XML_CONVERT_OUTPUT_EXHAUSTED;
14417b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  else
14427b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin    return XML_CONVERT_COMPLETED;
1443b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1444b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1445b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectENCODING *
1446b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXmlInitUnknownEncoding(void *mem,
1447b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                       int *table,
144835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes                       CONVERTER convert,
1449b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                       void *userData)
1450b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1451b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int i;
1452b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  struct unknown_encoding *e = (struct unknown_encoding *)mem;
1453b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (i = 0; i < (int)sizeof(struct normal_encoding); i++)
1454b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ((char *)mem)[i] = ((char *)&latin1_encoding)[i];
1455b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (i = 0; i < 128; i++)
1456b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (latin1_encoding.type[i] != BT_OTHER
1457b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        && latin1_encoding.type[i] != BT_NONXML
1458b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        && table[i] != i)
1459b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return 0;
1460b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (i = 0; i < 256; i++) {
1461b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int c = table[i];
1462b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (c == -1) {
1463b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      e->normal.type[i] = BT_MALFORM;
1464b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* This shouldn't really get used. */
1465b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      e->utf16[i] = 0xFFFF;
1466b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      e->utf8[i][0] = 1;
1467b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      e->utf8[i][1] = 0;
1468b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1469b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else if (c < 0) {
1470b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (c < -4)
1471b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return 0;
1472b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      e->normal.type[i] = (unsigned char)(BT_LEAD2 - (c + 2));
1473b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      e->utf8[i][0] = 0;
1474b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      e->utf16[i] = 0;
1475b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1476b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else if (c < 0x80) {
1477b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (latin1_encoding.type[c] != BT_OTHER
1478b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          && latin1_encoding.type[c] != BT_NONXML
1479b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          && c != i)
1480b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return 0;
1481b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      e->normal.type[i] = latin1_encoding.type[c];
1482b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      e->utf8[i][0] = 1;
1483b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      e->utf8[i][1] = (char)c;
1484b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      e->utf16[i] = (unsigned short)(c == 0 ? 0xFFFF : c);
1485b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1486b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else if (checkCharRefNumber(c) < 0) {
1487b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      e->normal.type[i] = BT_NONXML;
1488b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* This shouldn't really get used. */
1489b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      e->utf16[i] = 0xFFFF;
1490b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      e->utf8[i][0] = 1;
1491b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      e->utf8[i][1] = 0;
1492b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1493b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else {
1494b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (c > 0xFFFF)
1495b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return 0;
1496b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xff))
1497b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        e->normal.type[i] = BT_NMSTRT;
1498b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      else if (UCS2_GET_NAMING(namePages, c >> 8, c & 0xff))
1499b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        e->normal.type[i] = BT_NAME;
1500b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      else
1501b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        e->normal.type[i] = BT_OTHER;
1502b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      e->utf8[i][0] = (char)XmlUtf8Encode(c, e->utf8[i] + 1);
1503b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      e->utf16[i] = (unsigned short)c;
1504b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1505b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1506b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  e->userData = userData;
1507b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  e->convert = convert;
1508b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (convert) {
1509b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    e->normal.isName2 = unknown_isName;
1510b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    e->normal.isName3 = unknown_isName;
1511b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    e->normal.isName4 = unknown_isName;
1512b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    e->normal.isNmstrt2 = unknown_isNmstrt;
1513b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    e->normal.isNmstrt3 = unknown_isNmstrt;
1514b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    e->normal.isNmstrt4 = unknown_isNmstrt;
1515b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    e->normal.isInvalid2 = unknown_isInvalid;
1516b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    e->normal.isInvalid3 = unknown_isInvalid;
1517b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    e->normal.isInvalid4 = unknown_isInvalid;
1518b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1519b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  e->normal.enc.utf8Convert = unknown_toUtf8;
1520b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  e->normal.enc.utf16Convert = unknown_toUtf16;
1521b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return &(e->normal.enc);
1522b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1523b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1524b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* If this enumeration is changed, getEncodingIndex and encodings
1525b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectmust also be changed. */
1526b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectenum {
1527b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  UNKNOWN_ENC = -1,
1528b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ISO_8859_1_ENC = 0,
1529b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  US_ASCII_ENC,
1530b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  UTF_8_ENC,
1531b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  UTF_16_ENC,
1532b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  UTF_16BE_ENC,
1533b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  UTF_16LE_ENC,
1534b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  /* must match encodingNames up to here */
1535b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  NO_ENC
1536b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
1537b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1538b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const char KW_ISO_8859_1[] = {
1539b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ASCII_I, ASCII_S, ASCII_O, ASCII_MINUS, ASCII_8, ASCII_8, ASCII_5, ASCII_9,
1540b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ASCII_MINUS, ASCII_1, '\0'
1541b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
1542b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const char KW_US_ASCII[] = {
1543b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ASCII_U, ASCII_S, ASCII_MINUS, ASCII_A, ASCII_S, ASCII_C, ASCII_I, ASCII_I,
1544b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  '\0'
1545b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
1546b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const char KW_UTF_8[] =  {
1547b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_8, '\0'
1548b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
1549b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const char KW_UTF_16[] = {
1550b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, '\0'
1551b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
1552b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const char KW_UTF_16BE[] = {
1553b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_B, ASCII_E,
1554b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  '\0'
1555b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
1556b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic const char KW_UTF_16LE[] = {
1557b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_L, ASCII_E,
1558b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  '\0'
1559b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project};
1560b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1561b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int FASTCALL
1562b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectgetEncodingIndex(const char *name)
1563b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1564b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  static const char * const encodingNames[] = {
1565b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    KW_ISO_8859_1,
1566b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    KW_US_ASCII,
1567b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    KW_UTF_8,
1568b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    KW_UTF_16,
1569b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    KW_UTF_16BE,
1570b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    KW_UTF_16LE,
1571b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  };
1572b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int i;
1573b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (name == NULL)
1574b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return NO_ENC;
1575b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (i = 0; i < (int)(sizeof(encodingNames)/sizeof(encodingNames[0])); i++)
1576b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (streqci(name, encodingNames[i]))
1577b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return i;
1578b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return UNKNOWN_ENC;
1579b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1580b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1581b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* For binary compatibility, we store the index of the encoding
1582b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   specified at initialization in the isUtf16 member.
1583b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
1584b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1585b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define INIT_ENC_INDEX(enc) ((int)(enc)->initEnc.isUtf16)
1586b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define SET_INIT_ENC_INDEX(enc, i) ((enc)->initEnc.isUtf16 = (char)i)
1587b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1588b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* This is what detects the encoding.  encodingTable maps from
1589b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   encoding indices to encodings; INIT_ENC_INDEX(enc) is the index of
1590b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   the external (protocol) specified encoding; state is
1591b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   XML_CONTENT_STATE if we're parsing an external text entity, and
1592b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   XML_PROLOG_STATE otherwise.
1593b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
1594b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1595b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1596b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int
1597b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectinitScan(const ENCODING * const *encodingTable,
1598b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         const INIT_ENCODING *enc,
1599b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         int state,
1600b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         const char *ptr,
1601b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         const char *end,
1602b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         const char **nextTokPtr)
1603b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1604b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  const ENCODING **encPtr;
1605b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
16067b64b72da916c9c9c285939c11f81de938268fa9Paul Duffin  if (ptr >= end)
1607b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_TOK_NONE;
1608b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  encPtr = enc->encPtr;
1609b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (ptr + 1 == end) {
1610b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* only a single byte available for auto-detection */
1611b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifndef XML_DTD /* FIXME */
1612b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* a well-formed document entity must have more than one byte */
1613b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (state != XML_CONTENT_STATE)
1614b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_TOK_PARTIAL;
1615b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
1616b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* so we're parsing an external text entity... */
1617b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* if UTF-16 was externally specified, then we need at least 2 bytes */
1618b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    switch (INIT_ENC_INDEX(enc)) {
1619b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case UTF_16_ENC:
1620b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case UTF_16LE_ENC:
1621b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case UTF_16BE_ENC:
1622b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_TOK_PARTIAL;
1623b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1624b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    switch ((unsigned char)*ptr) {
1625b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case 0xFE:
1626b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case 0xFF:
1627b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case 0xEF: /* possibly first byte of UTF-8 BOM */
1628b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC
1629b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          && state == XML_CONTENT_STATE)
1630b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        break;
1631b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* fall through */
1632b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case 0x00:
1633b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case 0x3C:
1634b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_TOK_PARTIAL;
1635b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1636b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1637b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  else {
1638b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    switch (((unsigned char)ptr[0] << 8) | (unsigned char)ptr[1]) {
1639b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case 0xFEFF:
1640b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC
1641b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          && state == XML_CONTENT_STATE)
1642b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        break;
1643b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *nextTokPtr = ptr + 2;
1644b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *encPtr = encodingTable[UTF_16BE_ENC];
1645b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_TOK_BOM;
1646b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* 00 3C is handled in the default case */
1647b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case 0x3C00:
1648b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if ((INIT_ENC_INDEX(enc) == UTF_16BE_ENC
1649b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           || INIT_ENC_INDEX(enc) == UTF_16_ENC)
1650b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          && state == XML_CONTENT_STATE)
1651b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        break;
1652b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *encPtr = encodingTable[UTF_16LE_ENC];
1653b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XmlTok(*encPtr, state, ptr, end, nextTokPtr);
1654b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case 0xFFFE:
1655b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC
1656b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          && state == XML_CONTENT_STATE)
1657b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        break;
1658b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *nextTokPtr = ptr + 2;
1659b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      *encPtr = encodingTable[UTF_16LE_ENC];
1660b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return XML_TOK_BOM;
1661b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    case 0xEFBB:
1662b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* Maybe a UTF-8 BOM (EF BB BF) */
1663b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      /* If there's an explicitly specified (external) encoding
1664b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         of ISO-8859-1 or some flavour of UTF-16
1665b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         and this is an external text entity,
1666b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         don't look for the BOM,
1667b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project         because it might be a legal data.
1668b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      */
1669b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (state == XML_CONTENT_STATE) {
1670b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        int e = INIT_ENC_INDEX(enc);
1671b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (e == ISO_8859_1_ENC || e == UTF_16BE_ENC
1672b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            || e == UTF_16LE_ENC || e == UTF_16_ENC)
1673b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          break;
1674b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
1675b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (ptr + 2 == end)
1676b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_TOK_PARTIAL;
1677b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if ((unsigned char)ptr[2] == 0xBF) {
1678b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *nextTokPtr = ptr + 3;
1679b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *encPtr = encodingTable[UTF_8_ENC];
1680b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_TOK_BOM;
1681b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
1682b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
1683b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    default:
1684b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      if (ptr[0] == '\0') {
1685b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* 0 isn't a legal data character. Furthermore a document
1686b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           entity can only start with ASCII characters.  So the only
1687b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           way this can fail to be big-endian UTF-16 if it it's an
1688b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           external parsed general entity that's labelled as
1689b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           UTF-16LE.
1690b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        */
1691b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (state == XML_CONTENT_STATE && INIT_ENC_INDEX(enc) == UTF_16LE_ENC)
1692b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          break;
1693b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *encPtr = encodingTable[UTF_16BE_ENC];
1694b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XmlTok(*encPtr, state, ptr, end, nextTokPtr);
1695b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
1696b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      else if (ptr[1] == '\0') {
1697b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* We could recover here in the case:
1698b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            - parsing an external entity
1699b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            - second byte is 0
1700b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            - no externally specified encoding
1701b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            - no encoding declaration
1702b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           by assuming UTF-16LE.  But we don't, because this would mean when
1703b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           presented just with a single byte, we couldn't reliably determine
1704b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           whether we needed further bytes.
1705b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        */
1706b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (state == XML_CONTENT_STATE)
1707b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          break;
1708b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        *encPtr = encodingTable[UTF_16LE_ENC];
1709b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XmlTok(*encPtr, state, ptr, end, nextTokPtr);
1710b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      }
1711b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      break;
1712b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1713b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  }
1714b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  *encPtr = encodingTable[INIT_ENC_INDEX(enc)];
1715b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return XmlTok(*encPtr, state, ptr, end, nextTokPtr);
1716b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1717b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1718b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1719b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define NS(x) x
1720b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define ns(x) x
1721d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#define XML_TOK_NS_C
1722b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "xmltok_ns.c"
1723d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#undef XML_TOK_NS_C
1724b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef NS
1725b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef ns
1726b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1727b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_NS
1728b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1729b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define NS(x) x ## NS
1730b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define ns(x) x ## _ns
1731b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1732d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#define XML_TOK_NS_C
1733b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "xmltok_ns.c"
1734d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#undef XML_TOK_NS_C
1735b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1736b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef NS
1737b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#undef ns
1738b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1739b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectENCODING *
1740b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectXmlInitUnknownEncodingNS(void *mem,
1741b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                         int *table,
174235e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes                         CONVERTER convert,
1743b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                         void *userData)
1744b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1745b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  ENCODING *enc = XmlInitUnknownEncoding(mem, table, convert, userData);
1746b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  if (enc)
1747b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    ((struct normal_encoding *)enc)->type[ASCII_COLON] = BT_COLON;
1748b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return enc;
1749b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1750b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1751b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif /* XML_NS */
1752