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