1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/parser/expat/lib/moz_extensions.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,155 @@ 1.4 +/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#ifdef IS_LITTLE_ENDIAN 1.10 + 1.11 +#define PREFIX(ident) little2_ ## ident 1.12 +#define BYTE_TYPE(p) LITTLE2_BYTE_TYPE(XmlGetUtf16InternalEncodingNS(), p) 1.13 +#define IS_NAME_CHAR_MINBPC(p) LITTLE2_IS_NAME_CHAR_MINBPC(0, p) 1.14 +#define IS_NMSTRT_CHAR_MINBPC(p) LITTLE2_IS_NMSTRT_CHAR_MINBPC(0, p) 1.15 + 1.16 +#else 1.17 + 1.18 +#define PREFIX(ident) big2_ ## ident 1.19 +#define BYTE_TYPE(p) BIG2_BYTE_TYPE(XmlGetUtf16InternalEncodingNS(), p) 1.20 +#define IS_NAME_CHAR_MINBPC(p) BIG2_IS_NAME_CHAR_MINBPC(0, p) 1.21 +#define IS_NMSTRT_CHAR_MINBPC(p) BIG2_IS_NMSTRT_CHAR_MINBPC(0, p) 1.22 + 1.23 +#endif 1.24 + 1.25 +#define MOZ_EXPAT_VALID_QNAME (0) 1.26 +#define MOZ_EXPAT_EMPTY_QNAME (1 << 0) 1.27 +#define MOZ_EXPAT_INVALID_CHARACTER (1 << 1) 1.28 +#define MOZ_EXPAT_MALFORMED (1 << 2) 1.29 + 1.30 +int MOZ_XMLCheckQName(const char* ptr, const char* end, int ns_aware, 1.31 + const char** colon) 1.32 +{ 1.33 + int result = MOZ_EXPAT_VALID_QNAME; 1.34 + int nmstrt = 1; 1.35 + *colon = 0; 1.36 + if (ptr == end) { 1.37 + return MOZ_EXPAT_EMPTY_QNAME; 1.38 + } 1.39 + do { 1.40 + switch (BYTE_TYPE(ptr)) { 1.41 + case BT_COLON: 1.42 + /* We're namespace-aware and either first or last character is a colon 1.43 + or we've already seen a colon. */ 1.44 + if (ns_aware && (nmstrt || *colon || ptr + 2 == end)) { 1.45 + return MOZ_EXPAT_MALFORMED; 1.46 + } 1.47 + *colon = ptr; 1.48 + nmstrt = ns_aware; /* e.g. "a:0" should be valid if !ns_aware */ 1.49 + break; 1.50 + case BT_NONASCII: 1.51 + if (nmstrt && !IS_NMSTRT_CHAR_MINBPC(ptr)) { 1.52 + /* If this is a valid name character and we're namespace-aware, the 1.53 + QName is malformed. Otherwise, this character's invalid at the 1.54 + start of a name (or, if we're namespace-aware, at the start of a 1.55 + localpart). */ 1.56 + return (IS_NAME_CHAR_MINBPC(ptr) && ns_aware) ? 1.57 + MOZ_EXPAT_MALFORMED : 1.58 + MOZ_EXPAT_INVALID_CHARACTER; 1.59 + } 1.60 + if (!IS_NAME_CHAR_MINBPC(ptr)) { 1.61 + return MOZ_EXPAT_INVALID_CHARACTER; 1.62 + } 1.63 + nmstrt = 0; 1.64 + break; 1.65 + case BT_NMSTRT: 1.66 + case BT_HEX: 1.67 + nmstrt = 0; 1.68 + break; 1.69 + case BT_DIGIT: 1.70 + case BT_NAME: 1.71 + case BT_MINUS: 1.72 + if (nmstrt) { 1.73 + return MOZ_EXPAT_INVALID_CHARACTER; 1.74 + } 1.75 + break; 1.76 + default: 1.77 + return MOZ_EXPAT_INVALID_CHARACTER; 1.78 + } 1.79 + ptr += 2; 1.80 + } while (ptr != end); 1.81 + return result; 1.82 +} 1.83 + 1.84 +int MOZ_XMLIsLetter(const char* ptr) 1.85 +{ 1.86 + switch (BYTE_TYPE(ptr)) { 1.87 + case BT_NONASCII: 1.88 + if (!IS_NMSTRT_CHAR_MINBPC(ptr)) { 1.89 + return 0; 1.90 + } 1.91 + /* fall through */ 1.92 + case BT_NMSTRT: 1.93 + case BT_HEX: 1.94 + return 1; 1.95 + default: 1.96 + return 0; 1.97 + } 1.98 +} 1.99 + 1.100 +int MOZ_XMLIsNCNameChar(const char* ptr) 1.101 +{ 1.102 + switch (BYTE_TYPE(ptr)) { 1.103 + case BT_NONASCII: 1.104 + if (!IS_NAME_CHAR_MINBPC(ptr)) { 1.105 + return 0; 1.106 + } 1.107 + /* fall through */ 1.108 + case BT_NMSTRT: 1.109 + case BT_HEX: 1.110 + case BT_DIGIT: 1.111 + case BT_NAME: 1.112 + case BT_MINUS: 1.113 + return 1; 1.114 + default: 1.115 + return 0; 1.116 + } 1.117 +} 1.118 + 1.119 +int MOZ_XMLTranslateEntity(const char* ptr, const char* end, const char** next, 1.120 + XML_Char* result) 1.121 +{ 1.122 + const ENCODING* enc = XmlGetUtf16InternalEncodingNS(); 1.123 + int tok = PREFIX(scanRef)(enc, ptr, end, next); 1.124 + if (tok <= XML_TOK_INVALID) { 1.125 + return 0; 1.126 + } 1.127 + 1.128 + if (tok == XML_TOK_CHAR_REF) { 1.129 + int n = XmlCharRefNumber(enc, ptr); 1.130 + 1.131 + /* We could get away with just < 0, but better safe than sorry. */ 1.132 + if (n <= 0) { 1.133 + return 0; 1.134 + } 1.135 + 1.136 + return XmlUtf16Encode(n, (unsigned short*)result); 1.137 + } 1.138 + 1.139 + if (tok == XML_TOK_ENTITY_REF) { 1.140 + /* *next points to after the semicolon, so the entity ends at 1.141 + *next - enc->minBytesPerChar. */ 1.142 + XML_Char ch = 1.143 + (XML_Char)XmlPredefinedEntityName(enc, ptr, *next - enc->minBytesPerChar); 1.144 + if (!ch) { 1.145 + return 0; 1.146 + } 1.147 + 1.148 + *result = ch; 1.149 + return 1; 1.150 + } 1.151 + 1.152 + return 0; 1.153 +} 1.154 + 1.155 +#undef PREFIX 1.156 +#undef BYTE_TYPE 1.157 +#undef IS_NAME_CHAR_MINBPC 1.158 +#undef IS_NMSTRT_CHAR_MINBPC