1*6be67779SAndroid Build Coastguard Worker /* 2*6be67779SAndroid Build Coastguard Worker __ __ _ 3*6be67779SAndroid Build Coastguard Worker ___\ \/ /_ __ __ _| |_ 4*6be67779SAndroid Build Coastguard Worker / _ \\ /| '_ \ / _` | __| 5*6be67779SAndroid Build Coastguard Worker | __// \| |_) | (_| | |_ 6*6be67779SAndroid Build Coastguard Worker \___/_/\_\ .__/ \__,_|\__| 7*6be67779SAndroid Build Coastguard Worker |_| XML parser 8*6be67779SAndroid Build Coastguard Worker 9*6be67779SAndroid Build Coastguard Worker Copyright (c) 1997-2000 Thai Open Source Software Center Ltd 10*6be67779SAndroid Build Coastguard Worker Copyright (c) 2000 Clark Cooper <[email protected]> 11*6be67779SAndroid Build Coastguard Worker Copyright (c) 2000-2005 Fred L. Drake, Jr. <[email protected]> 12*6be67779SAndroid Build Coastguard Worker Copyright (c) 2001-2002 Greg Stein <[email protected]> 13*6be67779SAndroid Build Coastguard Worker Copyright (c) 2002-2016 Karl Waclawek <[email protected]> 14*6be67779SAndroid Build Coastguard Worker Copyright (c) 2016-2024 Sebastian Pipping <[email protected]> 15*6be67779SAndroid Build Coastguard Worker Copyright (c) 2016 Cristian Rodríguez <[email protected]> 16*6be67779SAndroid Build Coastguard Worker Copyright (c) 2016 Thomas Beutlich <[email protected]> 17*6be67779SAndroid Build Coastguard Worker Copyright (c) 2017 Rhodri James <[email protected]> 18*6be67779SAndroid Build Coastguard Worker Copyright (c) 2022 Thijs Schreijer <[email protected]> 19*6be67779SAndroid Build Coastguard Worker Copyright (c) 2023 Hanno Böck <[email protected]> 20*6be67779SAndroid Build Coastguard Worker Copyright (c) 2023 Sony Corporation / Snild Dolkow <[email protected]> 21*6be67779SAndroid Build Coastguard Worker Copyright (c) 2024 Taichi Haradaguchi <[email protected]> 22*6be67779SAndroid Build Coastguard Worker Licensed under the MIT license: 23*6be67779SAndroid Build Coastguard Worker 24*6be67779SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining 25*6be67779SAndroid Build Coastguard Worker a copy of this software and associated documentation files (the 26*6be67779SAndroid Build Coastguard Worker "Software"), to deal in the Software without restriction, including 27*6be67779SAndroid Build Coastguard Worker without limitation the rights to use, copy, modify, merge, publish, 28*6be67779SAndroid Build Coastguard Worker distribute, sublicense, and/or sell copies of the Software, and to permit 29*6be67779SAndroid Build Coastguard Worker persons to whom the Software is furnished to do so, subject to the 30*6be67779SAndroid Build Coastguard Worker following conditions: 31*6be67779SAndroid Build Coastguard Worker 32*6be67779SAndroid Build Coastguard Worker The above copyright notice and this permission notice shall be included 33*6be67779SAndroid Build Coastguard Worker in all copies or substantial portions of the Software. 34*6be67779SAndroid Build Coastguard Worker 35*6be67779SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 36*6be67779SAndroid Build Coastguard Worker EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 37*6be67779SAndroid Build Coastguard Worker MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN 38*6be67779SAndroid Build Coastguard Worker NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 39*6be67779SAndroid Build Coastguard Worker DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 40*6be67779SAndroid Build Coastguard Worker OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 41*6be67779SAndroid Build Coastguard Worker USE OR OTHER DEALINGS IN THE SOFTWARE. 42*6be67779SAndroid Build Coastguard Worker */ 43*6be67779SAndroid Build Coastguard Worker 44*6be67779SAndroid Build Coastguard Worker #ifndef Expat_INCLUDED 45*6be67779SAndroid Build Coastguard Worker #define Expat_INCLUDED 1 46*6be67779SAndroid Build Coastguard Worker 47*6be67779SAndroid Build Coastguard Worker #include <stdlib.h> 48*6be67779SAndroid Build Coastguard Worker #include "expat_external.h" 49*6be67779SAndroid Build Coastguard Worker 50*6be67779SAndroid Build Coastguard Worker #ifdef __cplusplus 51*6be67779SAndroid Build Coastguard Worker extern "C" { 52*6be67779SAndroid Build Coastguard Worker #endif 53*6be67779SAndroid Build Coastguard Worker 54*6be67779SAndroid Build Coastguard Worker struct XML_ParserStruct; 55*6be67779SAndroid Build Coastguard Worker typedef struct XML_ParserStruct *XML_Parser; 56*6be67779SAndroid Build Coastguard Worker 57*6be67779SAndroid Build Coastguard Worker typedef unsigned char XML_Bool; 58*6be67779SAndroid Build Coastguard Worker #define XML_TRUE ((XML_Bool)1) 59*6be67779SAndroid Build Coastguard Worker #define XML_FALSE ((XML_Bool)0) 60*6be67779SAndroid Build Coastguard Worker 61*6be67779SAndroid Build Coastguard Worker /* The XML_Status enum gives the possible return values for several 62*6be67779SAndroid Build Coastguard Worker API functions. The preprocessor #defines are included so this 63*6be67779SAndroid Build Coastguard Worker stanza can be added to code that still needs to support older 64*6be67779SAndroid Build Coastguard Worker versions of Expat 1.95.x: 65*6be67779SAndroid Build Coastguard Worker 66*6be67779SAndroid Build Coastguard Worker #ifndef XML_STATUS_OK 67*6be67779SAndroid Build Coastguard Worker #define XML_STATUS_OK 1 68*6be67779SAndroid Build Coastguard Worker #define XML_STATUS_ERROR 0 69*6be67779SAndroid Build Coastguard Worker #endif 70*6be67779SAndroid Build Coastguard Worker 71*6be67779SAndroid Build Coastguard Worker Otherwise, the #define hackery is quite ugly and would have been 72*6be67779SAndroid Build Coastguard Worker dropped. 73*6be67779SAndroid Build Coastguard Worker */ 74*6be67779SAndroid Build Coastguard Worker enum XML_Status { 75*6be67779SAndroid Build Coastguard Worker XML_STATUS_ERROR = 0, 76*6be67779SAndroid Build Coastguard Worker #define XML_STATUS_ERROR XML_STATUS_ERROR 77*6be67779SAndroid Build Coastguard Worker XML_STATUS_OK = 1, 78*6be67779SAndroid Build Coastguard Worker #define XML_STATUS_OK XML_STATUS_OK 79*6be67779SAndroid Build Coastguard Worker XML_STATUS_SUSPENDED = 2 80*6be67779SAndroid Build Coastguard Worker #define XML_STATUS_SUSPENDED XML_STATUS_SUSPENDED 81*6be67779SAndroid Build Coastguard Worker }; 82*6be67779SAndroid Build Coastguard Worker 83*6be67779SAndroid Build Coastguard Worker enum XML_Error { 84*6be67779SAndroid Build Coastguard Worker XML_ERROR_NONE, 85*6be67779SAndroid Build Coastguard Worker XML_ERROR_NO_MEMORY, 86*6be67779SAndroid Build Coastguard Worker XML_ERROR_SYNTAX, 87*6be67779SAndroid Build Coastguard Worker XML_ERROR_NO_ELEMENTS, 88*6be67779SAndroid Build Coastguard Worker XML_ERROR_INVALID_TOKEN, 89*6be67779SAndroid Build Coastguard Worker XML_ERROR_UNCLOSED_TOKEN, 90*6be67779SAndroid Build Coastguard Worker XML_ERROR_PARTIAL_CHAR, 91*6be67779SAndroid Build Coastguard Worker XML_ERROR_TAG_MISMATCH, 92*6be67779SAndroid Build Coastguard Worker XML_ERROR_DUPLICATE_ATTRIBUTE, 93*6be67779SAndroid Build Coastguard Worker XML_ERROR_JUNK_AFTER_DOC_ELEMENT, 94*6be67779SAndroid Build Coastguard Worker XML_ERROR_PARAM_ENTITY_REF, 95*6be67779SAndroid Build Coastguard Worker XML_ERROR_UNDEFINED_ENTITY, 96*6be67779SAndroid Build Coastguard Worker XML_ERROR_RECURSIVE_ENTITY_REF, 97*6be67779SAndroid Build Coastguard Worker XML_ERROR_ASYNC_ENTITY, 98*6be67779SAndroid Build Coastguard Worker XML_ERROR_BAD_CHAR_REF, 99*6be67779SAndroid Build Coastguard Worker XML_ERROR_BINARY_ENTITY_REF, 100*6be67779SAndroid Build Coastguard Worker XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF, 101*6be67779SAndroid Build Coastguard Worker XML_ERROR_MISPLACED_XML_PI, 102*6be67779SAndroid Build Coastguard Worker XML_ERROR_UNKNOWN_ENCODING, 103*6be67779SAndroid Build Coastguard Worker XML_ERROR_INCORRECT_ENCODING, 104*6be67779SAndroid Build Coastguard Worker XML_ERROR_UNCLOSED_CDATA_SECTION, 105*6be67779SAndroid Build Coastguard Worker XML_ERROR_EXTERNAL_ENTITY_HANDLING, 106*6be67779SAndroid Build Coastguard Worker XML_ERROR_NOT_STANDALONE, 107*6be67779SAndroid Build Coastguard Worker XML_ERROR_UNEXPECTED_STATE, 108*6be67779SAndroid Build Coastguard Worker XML_ERROR_ENTITY_DECLARED_IN_PE, 109*6be67779SAndroid Build Coastguard Worker XML_ERROR_FEATURE_REQUIRES_XML_DTD, 110*6be67779SAndroid Build Coastguard Worker XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING, 111*6be67779SAndroid Build Coastguard Worker /* Added in 1.95.7. */ 112*6be67779SAndroid Build Coastguard Worker XML_ERROR_UNBOUND_PREFIX, 113*6be67779SAndroid Build Coastguard Worker /* Added in 1.95.8. */ 114*6be67779SAndroid Build Coastguard Worker XML_ERROR_UNDECLARING_PREFIX, 115*6be67779SAndroid Build Coastguard Worker XML_ERROR_INCOMPLETE_PE, 116*6be67779SAndroid Build Coastguard Worker XML_ERROR_XML_DECL, 117*6be67779SAndroid Build Coastguard Worker XML_ERROR_TEXT_DECL, 118*6be67779SAndroid Build Coastguard Worker XML_ERROR_PUBLICID, 119*6be67779SAndroid Build Coastguard Worker XML_ERROR_SUSPENDED, 120*6be67779SAndroid Build Coastguard Worker XML_ERROR_NOT_SUSPENDED, 121*6be67779SAndroid Build Coastguard Worker XML_ERROR_ABORTED, 122*6be67779SAndroid Build Coastguard Worker XML_ERROR_FINISHED, 123*6be67779SAndroid Build Coastguard Worker XML_ERROR_SUSPEND_PE, 124*6be67779SAndroid Build Coastguard Worker /* Added in 2.0. */ 125*6be67779SAndroid Build Coastguard Worker XML_ERROR_RESERVED_PREFIX_XML, 126*6be67779SAndroid Build Coastguard Worker XML_ERROR_RESERVED_PREFIX_XMLNS, 127*6be67779SAndroid Build Coastguard Worker XML_ERROR_RESERVED_NAMESPACE_URI, 128*6be67779SAndroid Build Coastguard Worker /* Added in 2.2.1. */ 129*6be67779SAndroid Build Coastguard Worker XML_ERROR_INVALID_ARGUMENT, 130*6be67779SAndroid Build Coastguard Worker /* Added in 2.3.0. */ 131*6be67779SAndroid Build Coastguard Worker XML_ERROR_NO_BUFFER, 132*6be67779SAndroid Build Coastguard Worker /* Added in 2.4.0. */ 133*6be67779SAndroid Build Coastguard Worker XML_ERROR_AMPLIFICATION_LIMIT_BREACH 134*6be67779SAndroid Build Coastguard Worker }; 135*6be67779SAndroid Build Coastguard Worker 136*6be67779SAndroid Build Coastguard Worker enum XML_Content_Type { 137*6be67779SAndroid Build Coastguard Worker XML_CTYPE_EMPTY = 1, 138*6be67779SAndroid Build Coastguard Worker XML_CTYPE_ANY, 139*6be67779SAndroid Build Coastguard Worker XML_CTYPE_MIXED, 140*6be67779SAndroid Build Coastguard Worker XML_CTYPE_NAME, 141*6be67779SAndroid Build Coastguard Worker XML_CTYPE_CHOICE, 142*6be67779SAndroid Build Coastguard Worker XML_CTYPE_SEQ 143*6be67779SAndroid Build Coastguard Worker }; 144*6be67779SAndroid Build Coastguard Worker 145*6be67779SAndroid Build Coastguard Worker enum XML_Content_Quant { 146*6be67779SAndroid Build Coastguard Worker XML_CQUANT_NONE, 147*6be67779SAndroid Build Coastguard Worker XML_CQUANT_OPT, 148*6be67779SAndroid Build Coastguard Worker XML_CQUANT_REP, 149*6be67779SAndroid Build Coastguard Worker XML_CQUANT_PLUS 150*6be67779SAndroid Build Coastguard Worker }; 151*6be67779SAndroid Build Coastguard Worker 152*6be67779SAndroid Build Coastguard Worker /* If type == XML_CTYPE_EMPTY or XML_CTYPE_ANY, then quant will be 153*6be67779SAndroid Build Coastguard Worker XML_CQUANT_NONE, and the other fields will be zero or NULL. 154*6be67779SAndroid Build Coastguard Worker If type == XML_CTYPE_MIXED, then quant will be NONE or REP and 155*6be67779SAndroid Build Coastguard Worker numchildren will contain number of elements that may be mixed in 156*6be67779SAndroid Build Coastguard Worker and children point to an array of XML_Content cells that will be 157*6be67779SAndroid Build Coastguard Worker all of XML_CTYPE_NAME type with no quantification. 158*6be67779SAndroid Build Coastguard Worker 159*6be67779SAndroid Build Coastguard Worker If type == XML_CTYPE_NAME, then the name points to the name, and 160*6be67779SAndroid Build Coastguard Worker the numchildren field will be zero and children will be NULL. The 161*6be67779SAndroid Build Coastguard Worker quant fields indicates any quantifiers placed on the name. 162*6be67779SAndroid Build Coastguard Worker 163*6be67779SAndroid Build Coastguard Worker CHOICE and SEQ will have name NULL, the number of children in 164*6be67779SAndroid Build Coastguard Worker numchildren and children will point, recursively, to an array 165*6be67779SAndroid Build Coastguard Worker of XML_Content cells. 166*6be67779SAndroid Build Coastguard Worker 167*6be67779SAndroid Build Coastguard Worker The EMPTY, ANY, and MIXED types will only occur at top level. 168*6be67779SAndroid Build Coastguard Worker */ 169*6be67779SAndroid Build Coastguard Worker 170*6be67779SAndroid Build Coastguard Worker typedef struct XML_cp XML_Content; 171*6be67779SAndroid Build Coastguard Worker 172*6be67779SAndroid Build Coastguard Worker struct XML_cp { 173*6be67779SAndroid Build Coastguard Worker enum XML_Content_Type type; 174*6be67779SAndroid Build Coastguard Worker enum XML_Content_Quant quant; 175*6be67779SAndroid Build Coastguard Worker XML_Char *name; 176*6be67779SAndroid Build Coastguard Worker unsigned int numchildren; 177*6be67779SAndroid Build Coastguard Worker XML_Content *children; 178*6be67779SAndroid Build Coastguard Worker }; 179*6be67779SAndroid Build Coastguard Worker 180*6be67779SAndroid Build Coastguard Worker /* This is called for an element declaration. See above for 181*6be67779SAndroid Build Coastguard Worker description of the model argument. It's the user code's responsibility 182*6be67779SAndroid Build Coastguard Worker to free model when finished with it. See XML_FreeContentModel. 183*6be67779SAndroid Build Coastguard Worker There is no need to free the model from the handler, it can be kept 184*6be67779SAndroid Build Coastguard Worker around and freed at a later stage. 185*6be67779SAndroid Build Coastguard Worker */ 186*6be67779SAndroid Build Coastguard Worker typedef void(XMLCALL *XML_ElementDeclHandler)(void *userData, 187*6be67779SAndroid Build Coastguard Worker const XML_Char *name, 188*6be67779SAndroid Build Coastguard Worker XML_Content *model); 189*6be67779SAndroid Build Coastguard Worker 190*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 191*6be67779SAndroid Build Coastguard Worker XML_SetElementDeclHandler(XML_Parser parser, XML_ElementDeclHandler eldecl); 192*6be67779SAndroid Build Coastguard Worker 193*6be67779SAndroid Build Coastguard Worker /* The Attlist declaration handler is called for *each* attribute. So 194*6be67779SAndroid Build Coastguard Worker a single Attlist declaration with multiple attributes declared will 195*6be67779SAndroid Build Coastguard Worker generate multiple calls to this handler. The "default" parameter 196*6be67779SAndroid Build Coastguard Worker may be NULL in the case of the "#IMPLIED" or "#REQUIRED" 197*6be67779SAndroid Build Coastguard Worker keyword. The "isrequired" parameter will be true and the default 198*6be67779SAndroid Build Coastguard Worker value will be NULL in the case of "#REQUIRED". If "isrequired" is 199*6be67779SAndroid Build Coastguard Worker true and default is non-NULL, then this is a "#FIXED" default. 200*6be67779SAndroid Build Coastguard Worker */ 201*6be67779SAndroid Build Coastguard Worker typedef void(XMLCALL *XML_AttlistDeclHandler)( 202*6be67779SAndroid Build Coastguard Worker void *userData, const XML_Char *elname, const XML_Char *attname, 203*6be67779SAndroid Build Coastguard Worker const XML_Char *att_type, const XML_Char *dflt, int isrequired); 204*6be67779SAndroid Build Coastguard Worker 205*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 206*6be67779SAndroid Build Coastguard Worker XML_SetAttlistDeclHandler(XML_Parser parser, XML_AttlistDeclHandler attdecl); 207*6be67779SAndroid Build Coastguard Worker 208*6be67779SAndroid Build Coastguard Worker /* The XML declaration handler is called for *both* XML declarations 209*6be67779SAndroid Build Coastguard Worker and text declarations. The way to distinguish is that the version 210*6be67779SAndroid Build Coastguard Worker parameter will be NULL for text declarations. The encoding 211*6be67779SAndroid Build Coastguard Worker parameter may be NULL for XML declarations. The standalone 212*6be67779SAndroid Build Coastguard Worker parameter will be -1, 0, or 1 indicating respectively that there 213*6be67779SAndroid Build Coastguard Worker was no standalone parameter in the declaration, that it was given 214*6be67779SAndroid Build Coastguard Worker as no, or that it was given as yes. 215*6be67779SAndroid Build Coastguard Worker */ 216*6be67779SAndroid Build Coastguard Worker typedef void(XMLCALL *XML_XmlDeclHandler)(void *userData, 217*6be67779SAndroid Build Coastguard Worker const XML_Char *version, 218*6be67779SAndroid Build Coastguard Worker const XML_Char *encoding, 219*6be67779SAndroid Build Coastguard Worker int standalone); 220*6be67779SAndroid Build Coastguard Worker 221*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 222*6be67779SAndroid Build Coastguard Worker XML_SetXmlDeclHandler(XML_Parser parser, XML_XmlDeclHandler xmldecl); 223*6be67779SAndroid Build Coastguard Worker 224*6be67779SAndroid Build Coastguard Worker typedef struct { 225*6be67779SAndroid Build Coastguard Worker void *(*malloc_fcn)(size_t size); 226*6be67779SAndroid Build Coastguard Worker void *(*realloc_fcn)(void *ptr, size_t size); 227*6be67779SAndroid Build Coastguard Worker void (*free_fcn)(void *ptr); 228*6be67779SAndroid Build Coastguard Worker } XML_Memory_Handling_Suite; 229*6be67779SAndroid Build Coastguard Worker 230*6be67779SAndroid Build Coastguard Worker /* Constructs a new parser; encoding is the encoding specified by the 231*6be67779SAndroid Build Coastguard Worker external protocol or NULL if there is none specified. 232*6be67779SAndroid Build Coastguard Worker */ 233*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(XML_Parser) 234*6be67779SAndroid Build Coastguard Worker XML_ParserCreate(const XML_Char *encoding); 235*6be67779SAndroid Build Coastguard Worker 236*6be67779SAndroid Build Coastguard Worker /* Constructs a new parser and namespace processor. Element type 237*6be67779SAndroid Build Coastguard Worker names and attribute names that belong to a namespace will be 238*6be67779SAndroid Build Coastguard Worker expanded; unprefixed attribute names are never expanded; unprefixed 239*6be67779SAndroid Build Coastguard Worker element type names are expanded only if there is a default 240*6be67779SAndroid Build Coastguard Worker namespace. The expanded name is the concatenation of the namespace 241*6be67779SAndroid Build Coastguard Worker URI, the namespace separator character, and the local part of the 242*6be67779SAndroid Build Coastguard Worker name. If the namespace separator is '\0' then the namespace URI 243*6be67779SAndroid Build Coastguard Worker and the local part will be concatenated without any separator. 244*6be67779SAndroid Build Coastguard Worker It is a programming error to use the separator '\0' with namespace 245*6be67779SAndroid Build Coastguard Worker triplets (see XML_SetReturnNSTriplet). 246*6be67779SAndroid Build Coastguard Worker If a namespace separator is chosen that can be part of a URI or 247*6be67779SAndroid Build Coastguard Worker part of an XML name, splitting an expanded name back into its 248*6be67779SAndroid Build Coastguard Worker 1, 2 or 3 original parts on application level in the element handler 249*6be67779SAndroid Build Coastguard Worker may end up vulnerable, so these are advised against; sane choices for 250*6be67779SAndroid Build Coastguard Worker a namespace separator are e.g. '\n' (line feed) and '|' (pipe). 251*6be67779SAndroid Build Coastguard Worker 252*6be67779SAndroid Build Coastguard Worker Note that Expat does not validate namespace URIs (beyond encoding) 253*6be67779SAndroid Build Coastguard Worker against RFC 3986 today (and is not required to do so with regard to 254*6be67779SAndroid Build Coastguard Worker the XML 1.0 namespaces specification) but it may start doing that 255*6be67779SAndroid Build Coastguard Worker in future releases. Before that, an application using Expat must 256*6be67779SAndroid Build Coastguard Worker be ready to receive namespace URIs containing non-URI characters. 257*6be67779SAndroid Build Coastguard Worker */ 258*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(XML_Parser) 259*6be67779SAndroid Build Coastguard Worker XML_ParserCreateNS(const XML_Char *encoding, XML_Char namespaceSeparator); 260*6be67779SAndroid Build Coastguard Worker 261*6be67779SAndroid Build Coastguard Worker /* Constructs a new parser using the memory management suite referred to 262*6be67779SAndroid Build Coastguard Worker by memsuite. If memsuite is NULL, then use the standard library memory 263*6be67779SAndroid Build Coastguard Worker suite. If namespaceSeparator is non-NULL it creates a parser with 264*6be67779SAndroid Build Coastguard Worker namespace processing as described above. The character pointed at 265*6be67779SAndroid Build Coastguard Worker will serve as the namespace separator. 266*6be67779SAndroid Build Coastguard Worker 267*6be67779SAndroid Build Coastguard Worker All further memory operations used for the created parser will come from 268*6be67779SAndroid Build Coastguard Worker the given suite. 269*6be67779SAndroid Build Coastguard Worker */ 270*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(XML_Parser) 271*6be67779SAndroid Build Coastguard Worker XML_ParserCreate_MM(const XML_Char *encoding, 272*6be67779SAndroid Build Coastguard Worker const XML_Memory_Handling_Suite *memsuite, 273*6be67779SAndroid Build Coastguard Worker const XML_Char *namespaceSeparator); 274*6be67779SAndroid Build Coastguard Worker 275*6be67779SAndroid Build Coastguard Worker /* Prepare a parser object to be reused. This is particularly 276*6be67779SAndroid Build Coastguard Worker valuable when memory allocation overhead is disproportionately high, 277*6be67779SAndroid Build Coastguard Worker such as when a large number of small documnents need to be parsed. 278*6be67779SAndroid Build Coastguard Worker All handlers are cleared from the parser, except for the 279*6be67779SAndroid Build Coastguard Worker unknownEncodingHandler. The parser's external state is re-initialized 280*6be67779SAndroid Build Coastguard Worker except for the values of ns and ns_triplets. 281*6be67779SAndroid Build Coastguard Worker 282*6be67779SAndroid Build Coastguard Worker Added in Expat 1.95.3. 283*6be67779SAndroid Build Coastguard Worker */ 284*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(XML_Bool) 285*6be67779SAndroid Build Coastguard Worker XML_ParserReset(XML_Parser parser, const XML_Char *encoding); 286*6be67779SAndroid Build Coastguard Worker 287*6be67779SAndroid Build Coastguard Worker /* atts is array of name/value pairs, terminated by 0; 288*6be67779SAndroid Build Coastguard Worker names and values are 0 terminated. 289*6be67779SAndroid Build Coastguard Worker */ 290*6be67779SAndroid Build Coastguard Worker typedef void(XMLCALL *XML_StartElementHandler)(void *userData, 291*6be67779SAndroid Build Coastguard Worker const XML_Char *name, 292*6be67779SAndroid Build Coastguard Worker const XML_Char **atts); 293*6be67779SAndroid Build Coastguard Worker 294*6be67779SAndroid Build Coastguard Worker typedef void(XMLCALL *XML_EndElementHandler)(void *userData, 295*6be67779SAndroid Build Coastguard Worker const XML_Char *name); 296*6be67779SAndroid Build Coastguard Worker 297*6be67779SAndroid Build Coastguard Worker /* s is not 0 terminated. */ 298*6be67779SAndroid Build Coastguard Worker typedef void(XMLCALL *XML_CharacterDataHandler)(void *userData, 299*6be67779SAndroid Build Coastguard Worker const XML_Char *s, int len); 300*6be67779SAndroid Build Coastguard Worker 301*6be67779SAndroid Build Coastguard Worker /* target and data are 0 terminated */ 302*6be67779SAndroid Build Coastguard Worker typedef void(XMLCALL *XML_ProcessingInstructionHandler)(void *userData, 303*6be67779SAndroid Build Coastguard Worker const XML_Char *target, 304*6be67779SAndroid Build Coastguard Worker const XML_Char *data); 305*6be67779SAndroid Build Coastguard Worker 306*6be67779SAndroid Build Coastguard Worker /* data is 0 terminated */ 307*6be67779SAndroid Build Coastguard Worker typedef void(XMLCALL *XML_CommentHandler)(void *userData, const XML_Char *data); 308*6be67779SAndroid Build Coastguard Worker 309*6be67779SAndroid Build Coastguard Worker typedef void(XMLCALL *XML_StartCdataSectionHandler)(void *userData); 310*6be67779SAndroid Build Coastguard Worker typedef void(XMLCALL *XML_EndCdataSectionHandler)(void *userData); 311*6be67779SAndroid Build Coastguard Worker 312*6be67779SAndroid Build Coastguard Worker /* This is called for any characters in the XML document for which 313*6be67779SAndroid Build Coastguard Worker there is no applicable handler. This includes both characters that 314*6be67779SAndroid Build Coastguard Worker are part of markup which is of a kind that is not reported 315*6be67779SAndroid Build Coastguard Worker (comments, markup declarations), or characters that are part of a 316*6be67779SAndroid Build Coastguard Worker construct which could be reported but for which no handler has been 317*6be67779SAndroid Build Coastguard Worker supplied. The characters are passed exactly as they were in the XML 318*6be67779SAndroid Build Coastguard Worker document except that they will be encoded in UTF-8 or UTF-16. 319*6be67779SAndroid Build Coastguard Worker Line boundaries are not normalized. Note that a byte order mark 320*6be67779SAndroid Build Coastguard Worker character is not passed to the default handler. There are no 321*6be67779SAndroid Build Coastguard Worker guarantees about how characters are divided between calls to the 322*6be67779SAndroid Build Coastguard Worker default handler: for example, a comment might be split between 323*6be67779SAndroid Build Coastguard Worker multiple calls. 324*6be67779SAndroid Build Coastguard Worker */ 325*6be67779SAndroid Build Coastguard Worker typedef void(XMLCALL *XML_DefaultHandler)(void *userData, const XML_Char *s, 326*6be67779SAndroid Build Coastguard Worker int len); 327*6be67779SAndroid Build Coastguard Worker 328*6be67779SAndroid Build Coastguard Worker /* This is called for the start of the DOCTYPE declaration, before 329*6be67779SAndroid Build Coastguard Worker any DTD or internal subset is parsed. 330*6be67779SAndroid Build Coastguard Worker */ 331*6be67779SAndroid Build Coastguard Worker typedef void(XMLCALL *XML_StartDoctypeDeclHandler)(void *userData, 332*6be67779SAndroid Build Coastguard Worker const XML_Char *doctypeName, 333*6be67779SAndroid Build Coastguard Worker const XML_Char *sysid, 334*6be67779SAndroid Build Coastguard Worker const XML_Char *pubid, 335*6be67779SAndroid Build Coastguard Worker int has_internal_subset); 336*6be67779SAndroid Build Coastguard Worker 337*6be67779SAndroid Build Coastguard Worker /* This is called for the end of the DOCTYPE declaration when the 338*6be67779SAndroid Build Coastguard Worker closing > is encountered, but after processing any external 339*6be67779SAndroid Build Coastguard Worker subset. 340*6be67779SAndroid Build Coastguard Worker */ 341*6be67779SAndroid Build Coastguard Worker typedef void(XMLCALL *XML_EndDoctypeDeclHandler)(void *userData); 342*6be67779SAndroid Build Coastguard Worker 343*6be67779SAndroid Build Coastguard Worker /* This is called for entity declarations. The is_parameter_entity 344*6be67779SAndroid Build Coastguard Worker argument will be non-zero if the entity is a parameter entity, zero 345*6be67779SAndroid Build Coastguard Worker otherwise. 346*6be67779SAndroid Build Coastguard Worker 347*6be67779SAndroid Build Coastguard Worker For internal entities (<!ENTITY foo "bar">), value will 348*6be67779SAndroid Build Coastguard Worker be non-NULL and systemId, publicID, and notationName will be NULL. 349*6be67779SAndroid Build Coastguard Worker The value string is NOT null-terminated; the length is provided in 350*6be67779SAndroid Build Coastguard Worker the value_length argument. Since it is legal to have zero-length 351*6be67779SAndroid Build Coastguard Worker values, do not use this argument to test for internal entities. 352*6be67779SAndroid Build Coastguard Worker 353*6be67779SAndroid Build Coastguard Worker For external entities, value will be NULL and systemId will be 354*6be67779SAndroid Build Coastguard Worker non-NULL. The publicId argument will be NULL unless a public 355*6be67779SAndroid Build Coastguard Worker identifier was provided. The notationName argument will have a 356*6be67779SAndroid Build Coastguard Worker non-NULL value only for unparsed entity declarations. 357*6be67779SAndroid Build Coastguard Worker 358*6be67779SAndroid Build Coastguard Worker Note that is_parameter_entity can't be changed to XML_Bool, since 359*6be67779SAndroid Build Coastguard Worker that would break binary compatibility. 360*6be67779SAndroid Build Coastguard Worker */ 361*6be67779SAndroid Build Coastguard Worker typedef void(XMLCALL *XML_EntityDeclHandler)( 362*6be67779SAndroid Build Coastguard Worker void *userData, const XML_Char *entityName, int is_parameter_entity, 363*6be67779SAndroid Build Coastguard Worker const XML_Char *value, int value_length, const XML_Char *base, 364*6be67779SAndroid Build Coastguard Worker const XML_Char *systemId, const XML_Char *publicId, 365*6be67779SAndroid Build Coastguard Worker const XML_Char *notationName); 366*6be67779SAndroid Build Coastguard Worker 367*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 368*6be67779SAndroid Build Coastguard Worker XML_SetEntityDeclHandler(XML_Parser parser, XML_EntityDeclHandler handler); 369*6be67779SAndroid Build Coastguard Worker 370*6be67779SAndroid Build Coastguard Worker /* OBSOLETE -- OBSOLETE -- OBSOLETE 371*6be67779SAndroid Build Coastguard Worker This handler has been superseded by the EntityDeclHandler above. 372*6be67779SAndroid Build Coastguard Worker It is provided here for backward compatibility. 373*6be67779SAndroid Build Coastguard Worker 374*6be67779SAndroid Build Coastguard Worker This is called for a declaration of an unparsed (NDATA) entity. 375*6be67779SAndroid Build Coastguard Worker The base argument is whatever was set by XML_SetBase. The 376*6be67779SAndroid Build Coastguard Worker entityName, systemId and notationName arguments will never be 377*6be67779SAndroid Build Coastguard Worker NULL. The other arguments may be. 378*6be67779SAndroid Build Coastguard Worker */ 379*6be67779SAndroid Build Coastguard Worker typedef void(XMLCALL *XML_UnparsedEntityDeclHandler)( 380*6be67779SAndroid Build Coastguard Worker void *userData, const XML_Char *entityName, const XML_Char *base, 381*6be67779SAndroid Build Coastguard Worker const XML_Char *systemId, const XML_Char *publicId, 382*6be67779SAndroid Build Coastguard Worker const XML_Char *notationName); 383*6be67779SAndroid Build Coastguard Worker 384*6be67779SAndroid Build Coastguard Worker /* This is called for a declaration of notation. The base argument is 385*6be67779SAndroid Build Coastguard Worker whatever was set by XML_SetBase. The notationName will never be 386*6be67779SAndroid Build Coastguard Worker NULL. The other arguments can be. 387*6be67779SAndroid Build Coastguard Worker */ 388*6be67779SAndroid Build Coastguard Worker typedef void(XMLCALL *XML_NotationDeclHandler)(void *userData, 389*6be67779SAndroid Build Coastguard Worker const XML_Char *notationName, 390*6be67779SAndroid Build Coastguard Worker const XML_Char *base, 391*6be67779SAndroid Build Coastguard Worker const XML_Char *systemId, 392*6be67779SAndroid Build Coastguard Worker const XML_Char *publicId); 393*6be67779SAndroid Build Coastguard Worker 394*6be67779SAndroid Build Coastguard Worker /* When namespace processing is enabled, these are called once for 395*6be67779SAndroid Build Coastguard Worker each namespace declaration. The call to the start and end element 396*6be67779SAndroid Build Coastguard Worker handlers occur between the calls to the start and end namespace 397*6be67779SAndroid Build Coastguard Worker declaration handlers. For an xmlns attribute, prefix will be 398*6be67779SAndroid Build Coastguard Worker NULL. For an xmlns="" attribute, uri will be NULL. 399*6be67779SAndroid Build Coastguard Worker */ 400*6be67779SAndroid Build Coastguard Worker typedef void(XMLCALL *XML_StartNamespaceDeclHandler)(void *userData, 401*6be67779SAndroid Build Coastguard Worker const XML_Char *prefix, 402*6be67779SAndroid Build Coastguard Worker const XML_Char *uri); 403*6be67779SAndroid Build Coastguard Worker 404*6be67779SAndroid Build Coastguard Worker typedef void(XMLCALL *XML_EndNamespaceDeclHandler)(void *userData, 405*6be67779SAndroid Build Coastguard Worker const XML_Char *prefix); 406*6be67779SAndroid Build Coastguard Worker 407*6be67779SAndroid Build Coastguard Worker /* This is called if the document is not standalone, that is, it has an 408*6be67779SAndroid Build Coastguard Worker external subset or a reference to a parameter entity, but does not 409*6be67779SAndroid Build Coastguard Worker have standalone="yes". If this handler returns XML_STATUS_ERROR, 410*6be67779SAndroid Build Coastguard Worker then processing will not continue, and the parser will return a 411*6be67779SAndroid Build Coastguard Worker XML_ERROR_NOT_STANDALONE error. 412*6be67779SAndroid Build Coastguard Worker If parameter entity parsing is enabled, then in addition to the 413*6be67779SAndroid Build Coastguard Worker conditions above this handler will only be called if the referenced 414*6be67779SAndroid Build Coastguard Worker entity was actually read. 415*6be67779SAndroid Build Coastguard Worker */ 416*6be67779SAndroid Build Coastguard Worker typedef int(XMLCALL *XML_NotStandaloneHandler)(void *userData); 417*6be67779SAndroid Build Coastguard Worker 418*6be67779SAndroid Build Coastguard Worker /* This is called for a reference to an external parsed general 419*6be67779SAndroid Build Coastguard Worker entity. The referenced entity is not automatically parsed. The 420*6be67779SAndroid Build Coastguard Worker application can parse it immediately or later using 421*6be67779SAndroid Build Coastguard Worker XML_ExternalEntityParserCreate. 422*6be67779SAndroid Build Coastguard Worker 423*6be67779SAndroid Build Coastguard Worker The parser argument is the parser parsing the entity containing the 424*6be67779SAndroid Build Coastguard Worker reference; it can be passed as the parser argument to 425*6be67779SAndroid Build Coastguard Worker XML_ExternalEntityParserCreate. The systemId argument is the 426*6be67779SAndroid Build Coastguard Worker system identifier as specified in the entity declaration; it will 427*6be67779SAndroid Build Coastguard Worker not be NULL. 428*6be67779SAndroid Build Coastguard Worker 429*6be67779SAndroid Build Coastguard Worker The base argument is the system identifier that should be used as 430*6be67779SAndroid Build Coastguard Worker the base for resolving systemId if systemId was relative; this is 431*6be67779SAndroid Build Coastguard Worker set by XML_SetBase; it may be NULL. 432*6be67779SAndroid Build Coastguard Worker 433*6be67779SAndroid Build Coastguard Worker The publicId argument is the public identifier as specified in the 434*6be67779SAndroid Build Coastguard Worker entity declaration, or NULL if none was specified; the whitespace 435*6be67779SAndroid Build Coastguard Worker in the public identifier will have been normalized as required by 436*6be67779SAndroid Build Coastguard Worker the XML spec. 437*6be67779SAndroid Build Coastguard Worker 438*6be67779SAndroid Build Coastguard Worker The context argument specifies the parsing context in the format 439*6be67779SAndroid Build Coastguard Worker expected by the context argument to XML_ExternalEntityParserCreate; 440*6be67779SAndroid Build Coastguard Worker context is valid only until the handler returns, so if the 441*6be67779SAndroid Build Coastguard Worker referenced entity is to be parsed later, it must be copied. 442*6be67779SAndroid Build Coastguard Worker context is NULL only when the entity is a parameter entity. 443*6be67779SAndroid Build Coastguard Worker 444*6be67779SAndroid Build Coastguard Worker The handler should return XML_STATUS_ERROR if processing should not 445*6be67779SAndroid Build Coastguard Worker continue because of a fatal error in the handling of the external 446*6be67779SAndroid Build Coastguard Worker entity. In this case the calling parser will return an 447*6be67779SAndroid Build Coastguard Worker XML_ERROR_EXTERNAL_ENTITY_HANDLING error. 448*6be67779SAndroid Build Coastguard Worker 449*6be67779SAndroid Build Coastguard Worker Note that unlike other handlers the first argument is the parser, 450*6be67779SAndroid Build Coastguard Worker not userData. 451*6be67779SAndroid Build Coastguard Worker */ 452*6be67779SAndroid Build Coastguard Worker typedef int(XMLCALL *XML_ExternalEntityRefHandler)(XML_Parser parser, 453*6be67779SAndroid Build Coastguard Worker const XML_Char *context, 454*6be67779SAndroid Build Coastguard Worker const XML_Char *base, 455*6be67779SAndroid Build Coastguard Worker const XML_Char *systemId, 456*6be67779SAndroid Build Coastguard Worker const XML_Char *publicId); 457*6be67779SAndroid Build Coastguard Worker 458*6be67779SAndroid Build Coastguard Worker /* This is called in two situations: 459*6be67779SAndroid Build Coastguard Worker 1) An entity reference is encountered for which no declaration 460*6be67779SAndroid Build Coastguard Worker has been read *and* this is not an error. 461*6be67779SAndroid Build Coastguard Worker 2) An internal entity reference is read, but not expanded, because 462*6be67779SAndroid Build Coastguard Worker XML_SetDefaultHandler has been called. 463*6be67779SAndroid Build Coastguard Worker Note: skipped parameter entities in declarations and skipped general 464*6be67779SAndroid Build Coastguard Worker entities in attribute values cannot be reported, because 465*6be67779SAndroid Build Coastguard Worker the event would be out of sync with the reporting of the 466*6be67779SAndroid Build Coastguard Worker declarations or attribute values 467*6be67779SAndroid Build Coastguard Worker */ 468*6be67779SAndroid Build Coastguard Worker typedef void(XMLCALL *XML_SkippedEntityHandler)(void *userData, 469*6be67779SAndroid Build Coastguard Worker const XML_Char *entityName, 470*6be67779SAndroid Build Coastguard Worker int is_parameter_entity); 471*6be67779SAndroid Build Coastguard Worker 472*6be67779SAndroid Build Coastguard Worker /* This structure is filled in by the XML_UnknownEncodingHandler to 473*6be67779SAndroid Build Coastguard Worker provide information to the parser about encodings that are unknown 474*6be67779SAndroid Build Coastguard Worker to the parser. 475*6be67779SAndroid Build Coastguard Worker 476*6be67779SAndroid Build Coastguard Worker The map[b] member gives information about byte sequences whose 477*6be67779SAndroid Build Coastguard Worker first byte is b. 478*6be67779SAndroid Build Coastguard Worker 479*6be67779SAndroid Build Coastguard Worker If map[b] is c where c is >= 0, then b by itself encodes the 480*6be67779SAndroid Build Coastguard Worker Unicode scalar value c. 481*6be67779SAndroid Build Coastguard Worker 482*6be67779SAndroid Build Coastguard Worker If map[b] is -1, then the byte sequence is malformed. 483*6be67779SAndroid Build Coastguard Worker 484*6be67779SAndroid Build Coastguard Worker If map[b] is -n, where n >= 2, then b is the first byte of an 485*6be67779SAndroid Build Coastguard Worker n-byte sequence that encodes a single Unicode scalar value. 486*6be67779SAndroid Build Coastguard Worker 487*6be67779SAndroid Build Coastguard Worker The data member will be passed as the first argument to the convert 488*6be67779SAndroid Build Coastguard Worker function. 489*6be67779SAndroid Build Coastguard Worker 490*6be67779SAndroid Build Coastguard Worker The convert function is used to convert multibyte sequences; s will 491*6be67779SAndroid Build Coastguard Worker point to a n-byte sequence where map[(unsigned char)*s] == -n. The 492*6be67779SAndroid Build Coastguard Worker convert function must return the Unicode scalar value represented 493*6be67779SAndroid Build Coastguard Worker by this byte sequence or -1 if the byte sequence is malformed. 494*6be67779SAndroid Build Coastguard Worker 495*6be67779SAndroid Build Coastguard Worker The convert function may be NULL if the encoding is a single-byte 496*6be67779SAndroid Build Coastguard Worker encoding, that is if map[b] >= -1 for all bytes b. 497*6be67779SAndroid Build Coastguard Worker 498*6be67779SAndroid Build Coastguard Worker When the parser is finished with the encoding, then if release is 499*6be67779SAndroid Build Coastguard Worker not NULL, it will call release passing it the data member; once 500*6be67779SAndroid Build Coastguard Worker release has been called, the convert function will not be called 501*6be67779SAndroid Build Coastguard Worker again. 502*6be67779SAndroid Build Coastguard Worker 503*6be67779SAndroid Build Coastguard Worker Expat places certain restrictions on the encodings that are supported 504*6be67779SAndroid Build Coastguard Worker using this mechanism. 505*6be67779SAndroid Build Coastguard Worker 506*6be67779SAndroid Build Coastguard Worker 1. Every ASCII character that can appear in a well-formed XML document, 507*6be67779SAndroid Build Coastguard Worker other than the characters 508*6be67779SAndroid Build Coastguard Worker 509*6be67779SAndroid Build Coastguard Worker $@\^`{}~ 510*6be67779SAndroid Build Coastguard Worker 511*6be67779SAndroid Build Coastguard Worker must be represented by a single byte, and that byte must be the 512*6be67779SAndroid Build Coastguard Worker same byte that represents that character in ASCII. 513*6be67779SAndroid Build Coastguard Worker 514*6be67779SAndroid Build Coastguard Worker 2. No character may require more than 4 bytes to encode. 515*6be67779SAndroid Build Coastguard Worker 516*6be67779SAndroid Build Coastguard Worker 3. All characters encoded must have Unicode scalar values <= 517*6be67779SAndroid Build Coastguard Worker 0xFFFF, (i.e., characters that would be encoded by surrogates in 518*6be67779SAndroid Build Coastguard Worker UTF-16 are not allowed). Note that this restriction doesn't 519*6be67779SAndroid Build Coastguard Worker apply to the built-in support for UTF-8 and UTF-16. 520*6be67779SAndroid Build Coastguard Worker 521*6be67779SAndroid Build Coastguard Worker 4. No Unicode character may be encoded by more than one distinct 522*6be67779SAndroid Build Coastguard Worker sequence of bytes. 523*6be67779SAndroid Build Coastguard Worker */ 524*6be67779SAndroid Build Coastguard Worker typedef struct { 525*6be67779SAndroid Build Coastguard Worker int map[256]; 526*6be67779SAndroid Build Coastguard Worker void *data; 527*6be67779SAndroid Build Coastguard Worker int(XMLCALL *convert)(void *data, const char *s); 528*6be67779SAndroid Build Coastguard Worker void(XMLCALL *release)(void *data); 529*6be67779SAndroid Build Coastguard Worker } XML_Encoding; 530*6be67779SAndroid Build Coastguard Worker 531*6be67779SAndroid Build Coastguard Worker /* This is called for an encoding that is unknown to the parser. 532*6be67779SAndroid Build Coastguard Worker 533*6be67779SAndroid Build Coastguard Worker The encodingHandlerData argument is that which was passed as the 534*6be67779SAndroid Build Coastguard Worker second argument to XML_SetUnknownEncodingHandler. 535*6be67779SAndroid Build Coastguard Worker 536*6be67779SAndroid Build Coastguard Worker The name argument gives the name of the encoding as specified in 537*6be67779SAndroid Build Coastguard Worker the encoding declaration. 538*6be67779SAndroid Build Coastguard Worker 539*6be67779SAndroid Build Coastguard Worker If the callback can provide information about the encoding, it must 540*6be67779SAndroid Build Coastguard Worker fill in the XML_Encoding structure, and return XML_STATUS_OK. 541*6be67779SAndroid Build Coastguard Worker Otherwise it must return XML_STATUS_ERROR. 542*6be67779SAndroid Build Coastguard Worker 543*6be67779SAndroid Build Coastguard Worker If info does not describe a suitable encoding, then the parser will 544*6be67779SAndroid Build Coastguard Worker return an XML_ERROR_UNKNOWN_ENCODING error. 545*6be67779SAndroid Build Coastguard Worker */ 546*6be67779SAndroid Build Coastguard Worker typedef int(XMLCALL *XML_UnknownEncodingHandler)(void *encodingHandlerData, 547*6be67779SAndroid Build Coastguard Worker const XML_Char *name, 548*6be67779SAndroid Build Coastguard Worker XML_Encoding *info); 549*6be67779SAndroid Build Coastguard Worker 550*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 551*6be67779SAndroid Build Coastguard Worker XML_SetElementHandler(XML_Parser parser, XML_StartElementHandler start, 552*6be67779SAndroid Build Coastguard Worker XML_EndElementHandler end); 553*6be67779SAndroid Build Coastguard Worker 554*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 555*6be67779SAndroid Build Coastguard Worker XML_SetStartElementHandler(XML_Parser parser, XML_StartElementHandler handler); 556*6be67779SAndroid Build Coastguard Worker 557*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 558*6be67779SAndroid Build Coastguard Worker XML_SetEndElementHandler(XML_Parser parser, XML_EndElementHandler handler); 559*6be67779SAndroid Build Coastguard Worker 560*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 561*6be67779SAndroid Build Coastguard Worker XML_SetCharacterDataHandler(XML_Parser parser, 562*6be67779SAndroid Build Coastguard Worker XML_CharacterDataHandler handler); 563*6be67779SAndroid Build Coastguard Worker 564*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 565*6be67779SAndroid Build Coastguard Worker XML_SetProcessingInstructionHandler(XML_Parser parser, 566*6be67779SAndroid Build Coastguard Worker XML_ProcessingInstructionHandler handler); 567*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 568*6be67779SAndroid Build Coastguard Worker XML_SetCommentHandler(XML_Parser parser, XML_CommentHandler handler); 569*6be67779SAndroid Build Coastguard Worker 570*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 571*6be67779SAndroid Build Coastguard Worker XML_SetCdataSectionHandler(XML_Parser parser, 572*6be67779SAndroid Build Coastguard Worker XML_StartCdataSectionHandler start, 573*6be67779SAndroid Build Coastguard Worker XML_EndCdataSectionHandler end); 574*6be67779SAndroid Build Coastguard Worker 575*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 576*6be67779SAndroid Build Coastguard Worker XML_SetStartCdataSectionHandler(XML_Parser parser, 577*6be67779SAndroid Build Coastguard Worker XML_StartCdataSectionHandler start); 578*6be67779SAndroid Build Coastguard Worker 579*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 580*6be67779SAndroid Build Coastguard Worker XML_SetEndCdataSectionHandler(XML_Parser parser, 581*6be67779SAndroid Build Coastguard Worker XML_EndCdataSectionHandler end); 582*6be67779SAndroid Build Coastguard Worker 583*6be67779SAndroid Build Coastguard Worker /* This sets the default handler and also inhibits expansion of 584*6be67779SAndroid Build Coastguard Worker internal entities. These entity references will be passed to the 585*6be67779SAndroid Build Coastguard Worker default handler, or to the skipped entity handler, if one is set. 586*6be67779SAndroid Build Coastguard Worker */ 587*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 588*6be67779SAndroid Build Coastguard Worker XML_SetDefaultHandler(XML_Parser parser, XML_DefaultHandler handler); 589*6be67779SAndroid Build Coastguard Worker 590*6be67779SAndroid Build Coastguard Worker /* This sets the default handler but does not inhibit expansion of 591*6be67779SAndroid Build Coastguard Worker internal entities. The entity reference will not be passed to the 592*6be67779SAndroid Build Coastguard Worker default handler. 593*6be67779SAndroid Build Coastguard Worker */ 594*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 595*6be67779SAndroid Build Coastguard Worker XML_SetDefaultHandlerExpand(XML_Parser parser, XML_DefaultHandler handler); 596*6be67779SAndroid Build Coastguard Worker 597*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 598*6be67779SAndroid Build Coastguard Worker XML_SetDoctypeDeclHandler(XML_Parser parser, XML_StartDoctypeDeclHandler start, 599*6be67779SAndroid Build Coastguard Worker XML_EndDoctypeDeclHandler end); 600*6be67779SAndroid Build Coastguard Worker 601*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 602*6be67779SAndroid Build Coastguard Worker XML_SetStartDoctypeDeclHandler(XML_Parser parser, 603*6be67779SAndroid Build Coastguard Worker XML_StartDoctypeDeclHandler start); 604*6be67779SAndroid Build Coastguard Worker 605*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 606*6be67779SAndroid Build Coastguard Worker XML_SetEndDoctypeDeclHandler(XML_Parser parser, XML_EndDoctypeDeclHandler end); 607*6be67779SAndroid Build Coastguard Worker 608*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 609*6be67779SAndroid Build Coastguard Worker XML_SetUnparsedEntityDeclHandler(XML_Parser parser, 610*6be67779SAndroid Build Coastguard Worker XML_UnparsedEntityDeclHandler handler); 611*6be67779SAndroid Build Coastguard Worker 612*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 613*6be67779SAndroid Build Coastguard Worker XML_SetNotationDeclHandler(XML_Parser parser, XML_NotationDeclHandler handler); 614*6be67779SAndroid Build Coastguard Worker 615*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 616*6be67779SAndroid Build Coastguard Worker XML_SetNamespaceDeclHandler(XML_Parser parser, 617*6be67779SAndroid Build Coastguard Worker XML_StartNamespaceDeclHandler start, 618*6be67779SAndroid Build Coastguard Worker XML_EndNamespaceDeclHandler end); 619*6be67779SAndroid Build Coastguard Worker 620*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 621*6be67779SAndroid Build Coastguard Worker XML_SetStartNamespaceDeclHandler(XML_Parser parser, 622*6be67779SAndroid Build Coastguard Worker XML_StartNamespaceDeclHandler start); 623*6be67779SAndroid Build Coastguard Worker 624*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 625*6be67779SAndroid Build Coastguard Worker XML_SetEndNamespaceDeclHandler(XML_Parser parser, 626*6be67779SAndroid Build Coastguard Worker XML_EndNamespaceDeclHandler end); 627*6be67779SAndroid Build Coastguard Worker 628*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 629*6be67779SAndroid Build Coastguard Worker XML_SetNotStandaloneHandler(XML_Parser parser, 630*6be67779SAndroid Build Coastguard Worker XML_NotStandaloneHandler handler); 631*6be67779SAndroid Build Coastguard Worker 632*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 633*6be67779SAndroid Build Coastguard Worker XML_SetExternalEntityRefHandler(XML_Parser parser, 634*6be67779SAndroid Build Coastguard Worker XML_ExternalEntityRefHandler handler); 635*6be67779SAndroid Build Coastguard Worker 636*6be67779SAndroid Build Coastguard Worker /* If a non-NULL value for arg is specified here, then it will be 637*6be67779SAndroid Build Coastguard Worker passed as the first argument to the external entity ref handler 638*6be67779SAndroid Build Coastguard Worker instead of the parser object. 639*6be67779SAndroid Build Coastguard Worker */ 640*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 641*6be67779SAndroid Build Coastguard Worker XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg); 642*6be67779SAndroid Build Coastguard Worker 643*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 644*6be67779SAndroid Build Coastguard Worker XML_SetSkippedEntityHandler(XML_Parser parser, 645*6be67779SAndroid Build Coastguard Worker XML_SkippedEntityHandler handler); 646*6be67779SAndroid Build Coastguard Worker 647*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 648*6be67779SAndroid Build Coastguard Worker XML_SetUnknownEncodingHandler(XML_Parser parser, 649*6be67779SAndroid Build Coastguard Worker XML_UnknownEncodingHandler handler, 650*6be67779SAndroid Build Coastguard Worker void *encodingHandlerData); 651*6be67779SAndroid Build Coastguard Worker 652*6be67779SAndroid Build Coastguard Worker /* This can be called within a handler for a start element, end 653*6be67779SAndroid Build Coastguard Worker element, processing instruction or character data. It causes the 654*6be67779SAndroid Build Coastguard Worker corresponding markup to be passed to the default handler. 655*6be67779SAndroid Build Coastguard Worker */ 656*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 657*6be67779SAndroid Build Coastguard Worker XML_DefaultCurrent(XML_Parser parser); 658*6be67779SAndroid Build Coastguard Worker 659*6be67779SAndroid Build Coastguard Worker /* If do_nst is non-zero, and namespace processing is in effect, and 660*6be67779SAndroid Build Coastguard Worker a name has a prefix (i.e. an explicit namespace qualifier) then 661*6be67779SAndroid Build Coastguard Worker that name is returned as a triplet in a single string separated by 662*6be67779SAndroid Build Coastguard Worker the separator character specified when the parser was created: URI 663*6be67779SAndroid Build Coastguard Worker + sep + local_name + sep + prefix. 664*6be67779SAndroid Build Coastguard Worker 665*6be67779SAndroid Build Coastguard Worker If do_nst is zero, then namespace information is returned in the 666*6be67779SAndroid Build Coastguard Worker default manner (URI + sep + local_name) whether or not the name 667*6be67779SAndroid Build Coastguard Worker has a prefix. 668*6be67779SAndroid Build Coastguard Worker 669*6be67779SAndroid Build Coastguard Worker Note: Calling XML_SetReturnNSTriplet after XML_Parse or 670*6be67779SAndroid Build Coastguard Worker XML_ParseBuffer has no effect. 671*6be67779SAndroid Build Coastguard Worker */ 672*6be67779SAndroid Build Coastguard Worker 673*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 674*6be67779SAndroid Build Coastguard Worker XML_SetReturnNSTriplet(XML_Parser parser, int do_nst); 675*6be67779SAndroid Build Coastguard Worker 676*6be67779SAndroid Build Coastguard Worker /* This value is passed as the userData argument to callbacks. */ 677*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 678*6be67779SAndroid Build Coastguard Worker XML_SetUserData(XML_Parser parser, void *userData); 679*6be67779SAndroid Build Coastguard Worker 680*6be67779SAndroid Build Coastguard Worker /* Returns the last value set by XML_SetUserData or NULL. */ 681*6be67779SAndroid Build Coastguard Worker #define XML_GetUserData(parser) (*(void **)(parser)) 682*6be67779SAndroid Build Coastguard Worker 683*6be67779SAndroid Build Coastguard Worker /* This is equivalent to supplying an encoding argument to 684*6be67779SAndroid Build Coastguard Worker XML_ParserCreate. On success XML_SetEncoding returns non-zero, 685*6be67779SAndroid Build Coastguard Worker zero otherwise. 686*6be67779SAndroid Build Coastguard Worker Note: Calling XML_SetEncoding after XML_Parse or XML_ParseBuffer 687*6be67779SAndroid Build Coastguard Worker has no effect and returns XML_STATUS_ERROR. 688*6be67779SAndroid Build Coastguard Worker */ 689*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(enum XML_Status) 690*6be67779SAndroid Build Coastguard Worker XML_SetEncoding(XML_Parser parser, const XML_Char *encoding); 691*6be67779SAndroid Build Coastguard Worker 692*6be67779SAndroid Build Coastguard Worker /* If this function is called, then the parser will be passed as the 693*6be67779SAndroid Build Coastguard Worker first argument to callbacks instead of userData. The userData will 694*6be67779SAndroid Build Coastguard Worker still be accessible using XML_GetUserData. 695*6be67779SAndroid Build Coastguard Worker */ 696*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 697*6be67779SAndroid Build Coastguard Worker XML_UseParserAsHandlerArg(XML_Parser parser); 698*6be67779SAndroid Build Coastguard Worker 699*6be67779SAndroid Build Coastguard Worker /* If useDTD == XML_TRUE is passed to this function, then the parser 700*6be67779SAndroid Build Coastguard Worker will assume that there is an external subset, even if none is 701*6be67779SAndroid Build Coastguard Worker specified in the document. In such a case the parser will call the 702*6be67779SAndroid Build Coastguard Worker externalEntityRefHandler with a value of NULL for the systemId 703*6be67779SAndroid Build Coastguard Worker argument (the publicId and context arguments will be NULL as well). 704*6be67779SAndroid Build Coastguard Worker Note: For the purpose of checking WFC: Entity Declared, passing 705*6be67779SAndroid Build Coastguard Worker useDTD == XML_TRUE will make the parser behave as if the document 706*6be67779SAndroid Build Coastguard Worker had a DTD with an external subset. 707*6be67779SAndroid Build Coastguard Worker Note: If this function is called, then this must be done before 708*6be67779SAndroid Build Coastguard Worker the first call to XML_Parse or XML_ParseBuffer, since it will 709*6be67779SAndroid Build Coastguard Worker have no effect after that. Returns 710*6be67779SAndroid Build Coastguard Worker XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING. 711*6be67779SAndroid Build Coastguard Worker Note: If the document does not have a DOCTYPE declaration at all, 712*6be67779SAndroid Build Coastguard Worker then startDoctypeDeclHandler and endDoctypeDeclHandler will not 713*6be67779SAndroid Build Coastguard Worker be called, despite an external subset being parsed. 714*6be67779SAndroid Build Coastguard Worker Note: If XML_DTD is not defined when Expat is compiled, returns 715*6be67779SAndroid Build Coastguard Worker XML_ERROR_FEATURE_REQUIRES_XML_DTD. 716*6be67779SAndroid Build Coastguard Worker Note: If parser == NULL, returns XML_ERROR_INVALID_ARGUMENT. 717*6be67779SAndroid Build Coastguard Worker */ 718*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(enum XML_Error) 719*6be67779SAndroid Build Coastguard Worker XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD); 720*6be67779SAndroid Build Coastguard Worker 721*6be67779SAndroid Build Coastguard Worker /* Sets the base to be used for resolving relative URIs in system 722*6be67779SAndroid Build Coastguard Worker identifiers in declarations. Resolving relative identifiers is 723*6be67779SAndroid Build Coastguard Worker left to the application: this value will be passed through as the 724*6be67779SAndroid Build Coastguard Worker base argument to the XML_ExternalEntityRefHandler, 725*6be67779SAndroid Build Coastguard Worker XML_NotationDeclHandler and XML_UnparsedEntityDeclHandler. The base 726*6be67779SAndroid Build Coastguard Worker argument will be copied. Returns XML_STATUS_ERROR if out of memory, 727*6be67779SAndroid Build Coastguard Worker XML_STATUS_OK otherwise. 728*6be67779SAndroid Build Coastguard Worker */ 729*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(enum XML_Status) 730*6be67779SAndroid Build Coastguard Worker XML_SetBase(XML_Parser parser, const XML_Char *base); 731*6be67779SAndroid Build Coastguard Worker 732*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(const XML_Char *) 733*6be67779SAndroid Build Coastguard Worker XML_GetBase(XML_Parser parser); 734*6be67779SAndroid Build Coastguard Worker 735*6be67779SAndroid Build Coastguard Worker /* Returns the number of the attribute/value pairs passed in last call 736*6be67779SAndroid Build Coastguard Worker to the XML_StartElementHandler that were specified in the start-tag 737*6be67779SAndroid Build Coastguard Worker rather than defaulted. Each attribute/value pair counts as 2; thus 738*6be67779SAndroid Build Coastguard Worker this corresponds to an index into the atts array passed to the 739*6be67779SAndroid Build Coastguard Worker XML_StartElementHandler. Returns -1 if parser == NULL. 740*6be67779SAndroid Build Coastguard Worker */ 741*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(int) 742*6be67779SAndroid Build Coastguard Worker XML_GetSpecifiedAttributeCount(XML_Parser parser); 743*6be67779SAndroid Build Coastguard Worker 744*6be67779SAndroid Build Coastguard Worker /* Returns the index of the ID attribute passed in the last call to 745*6be67779SAndroid Build Coastguard Worker XML_StartElementHandler, or -1 if there is no ID attribute or 746*6be67779SAndroid Build Coastguard Worker parser == NULL. Each attribute/value pair counts as 2; thus this 747*6be67779SAndroid Build Coastguard Worker corresponds to an index into the atts array passed to the 748*6be67779SAndroid Build Coastguard Worker XML_StartElementHandler. 749*6be67779SAndroid Build Coastguard Worker */ 750*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(int) 751*6be67779SAndroid Build Coastguard Worker XML_GetIdAttributeIndex(XML_Parser parser); 752*6be67779SAndroid Build Coastguard Worker 753*6be67779SAndroid Build Coastguard Worker #ifdef XML_ATTR_INFO 754*6be67779SAndroid Build Coastguard Worker /* Source file byte offsets for the start and end of attribute names and values. 755*6be67779SAndroid Build Coastguard Worker The value indices are exclusive of surrounding quotes; thus in a UTF-8 source 756*6be67779SAndroid Build Coastguard Worker file an attribute value of "blah" will yield: 757*6be67779SAndroid Build Coastguard Worker info->valueEnd - info->valueStart = 4 bytes. 758*6be67779SAndroid Build Coastguard Worker */ 759*6be67779SAndroid Build Coastguard Worker typedef struct { 760*6be67779SAndroid Build Coastguard Worker XML_Index nameStart; /* Offset to beginning of the attribute name. */ 761*6be67779SAndroid Build Coastguard Worker XML_Index nameEnd; /* Offset after the attribute name's last byte. */ 762*6be67779SAndroid Build Coastguard Worker XML_Index valueStart; /* Offset to beginning of the attribute value. */ 763*6be67779SAndroid Build Coastguard Worker XML_Index valueEnd; /* Offset after the attribute value's last byte. */ 764*6be67779SAndroid Build Coastguard Worker } XML_AttrInfo; 765*6be67779SAndroid Build Coastguard Worker 766*6be67779SAndroid Build Coastguard Worker /* Returns an array of XML_AttrInfo structures for the attribute/value pairs 767*6be67779SAndroid Build Coastguard Worker passed in last call to the XML_StartElementHandler that were specified 768*6be67779SAndroid Build Coastguard Worker in the start-tag rather than defaulted. Each attribute/value pair counts 769*6be67779SAndroid Build Coastguard Worker as 1; thus the number of entries in the array is 770*6be67779SAndroid Build Coastguard Worker XML_GetSpecifiedAttributeCount(parser) / 2. 771*6be67779SAndroid Build Coastguard Worker */ 772*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(const XML_AttrInfo *) 773*6be67779SAndroid Build Coastguard Worker XML_GetAttributeInfo(XML_Parser parser); 774*6be67779SAndroid Build Coastguard Worker #endif 775*6be67779SAndroid Build Coastguard Worker 776*6be67779SAndroid Build Coastguard Worker /* Parses some input. Returns XML_STATUS_ERROR if a fatal error is 777*6be67779SAndroid Build Coastguard Worker detected. The last call to XML_Parse must have isFinal true; len 778*6be67779SAndroid Build Coastguard Worker may be zero for this call (or any other). 779*6be67779SAndroid Build Coastguard Worker 780*6be67779SAndroid Build Coastguard Worker Though the return values for these functions has always been 781*6be67779SAndroid Build Coastguard Worker described as a Boolean value, the implementation, at least for the 782*6be67779SAndroid Build Coastguard Worker 1.95.x series, has always returned exactly one of the XML_Status 783*6be67779SAndroid Build Coastguard Worker values. 784*6be67779SAndroid Build Coastguard Worker */ 785*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(enum XML_Status) 786*6be67779SAndroid Build Coastguard Worker XML_Parse(XML_Parser parser, const char *s, int len, int isFinal); 787*6be67779SAndroid Build Coastguard Worker 788*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void *) 789*6be67779SAndroid Build Coastguard Worker XML_GetBuffer(XML_Parser parser, int len); 790*6be67779SAndroid Build Coastguard Worker 791*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(enum XML_Status) 792*6be67779SAndroid Build Coastguard Worker XML_ParseBuffer(XML_Parser parser, int len, int isFinal); 793*6be67779SAndroid Build Coastguard Worker 794*6be67779SAndroid Build Coastguard Worker /* Stops parsing, causing XML_Parse() or XML_ParseBuffer() to return. 795*6be67779SAndroid Build Coastguard Worker Must be called from within a call-back handler, except when aborting 796*6be67779SAndroid Build Coastguard Worker (resumable = 0) an already suspended parser. Some call-backs may 797*6be67779SAndroid Build Coastguard Worker still follow because they would otherwise get lost. Examples: 798*6be67779SAndroid Build Coastguard Worker - endElementHandler() for empty elements when stopped in 799*6be67779SAndroid Build Coastguard Worker startElementHandler(), 800*6be67779SAndroid Build Coastguard Worker - endNameSpaceDeclHandler() when stopped in endElementHandler(), 801*6be67779SAndroid Build Coastguard Worker and possibly others. 802*6be67779SAndroid Build Coastguard Worker 803*6be67779SAndroid Build Coastguard Worker Can be called from most handlers, including DTD related call-backs, 804*6be67779SAndroid Build Coastguard Worker except when parsing an external parameter entity and resumable != 0. 805*6be67779SAndroid Build Coastguard Worker Returns XML_STATUS_OK when successful, XML_STATUS_ERROR otherwise. 806*6be67779SAndroid Build Coastguard Worker Possible error codes: 807*6be67779SAndroid Build Coastguard Worker - XML_ERROR_SUSPENDED: when suspending an already suspended parser. 808*6be67779SAndroid Build Coastguard Worker - XML_ERROR_FINISHED: when the parser has already finished. 809*6be67779SAndroid Build Coastguard Worker - XML_ERROR_SUSPEND_PE: when suspending while parsing an external PE. 810*6be67779SAndroid Build Coastguard Worker 811*6be67779SAndroid Build Coastguard Worker When resumable != 0 (true) then parsing is suspended, that is, 812*6be67779SAndroid Build Coastguard Worker XML_Parse() and XML_ParseBuffer() return XML_STATUS_SUSPENDED. 813*6be67779SAndroid Build Coastguard Worker Otherwise, parsing is aborted, that is, XML_Parse() and XML_ParseBuffer() 814*6be67779SAndroid Build Coastguard Worker return XML_STATUS_ERROR with error code XML_ERROR_ABORTED. 815*6be67779SAndroid Build Coastguard Worker 816*6be67779SAndroid Build Coastguard Worker *Note*: 817*6be67779SAndroid Build Coastguard Worker This will be applied to the current parser instance only, that is, if 818*6be67779SAndroid Build Coastguard Worker there is a parent parser then it will continue parsing when the 819*6be67779SAndroid Build Coastguard Worker externalEntityRefHandler() returns. It is up to the implementation of 820*6be67779SAndroid Build Coastguard Worker the externalEntityRefHandler() to call XML_StopParser() on the parent 821*6be67779SAndroid Build Coastguard Worker parser (recursively), if one wants to stop parsing altogether. 822*6be67779SAndroid Build Coastguard Worker 823*6be67779SAndroid Build Coastguard Worker When suspended, parsing can be resumed by calling XML_ResumeParser(). 824*6be67779SAndroid Build Coastguard Worker */ 825*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(enum XML_Status) 826*6be67779SAndroid Build Coastguard Worker XML_StopParser(XML_Parser parser, XML_Bool resumable); 827*6be67779SAndroid Build Coastguard Worker 828*6be67779SAndroid Build Coastguard Worker /* Resumes parsing after it has been suspended with XML_StopParser(). 829*6be67779SAndroid Build Coastguard Worker Must not be called from within a handler call-back. Returns same 830*6be67779SAndroid Build Coastguard Worker status codes as XML_Parse() or XML_ParseBuffer(). 831*6be67779SAndroid Build Coastguard Worker Additional error code XML_ERROR_NOT_SUSPENDED possible. 832*6be67779SAndroid Build Coastguard Worker 833*6be67779SAndroid Build Coastguard Worker *Note*: 834*6be67779SAndroid Build Coastguard Worker This must be called on the most deeply nested child parser instance 835*6be67779SAndroid Build Coastguard Worker first, and on its parent parser only after the child parser has finished, 836*6be67779SAndroid Build Coastguard Worker to be applied recursively until the document entity's parser is restarted. 837*6be67779SAndroid Build Coastguard Worker That is, the parent parser will not resume by itself and it is up to the 838*6be67779SAndroid Build Coastguard Worker application to call XML_ResumeParser() on it at the appropriate moment. 839*6be67779SAndroid Build Coastguard Worker */ 840*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(enum XML_Status) 841*6be67779SAndroid Build Coastguard Worker XML_ResumeParser(XML_Parser parser); 842*6be67779SAndroid Build Coastguard Worker 843*6be67779SAndroid Build Coastguard Worker enum XML_Parsing { XML_INITIALIZED, XML_PARSING, XML_FINISHED, XML_SUSPENDED }; 844*6be67779SAndroid Build Coastguard Worker 845*6be67779SAndroid Build Coastguard Worker typedef struct { 846*6be67779SAndroid Build Coastguard Worker enum XML_Parsing parsing; 847*6be67779SAndroid Build Coastguard Worker XML_Bool finalBuffer; 848*6be67779SAndroid Build Coastguard Worker } XML_ParsingStatus; 849*6be67779SAndroid Build Coastguard Worker 850*6be67779SAndroid Build Coastguard Worker /* Returns status of parser with respect to being initialized, parsing, 851*6be67779SAndroid Build Coastguard Worker finished, or suspended and processing the final buffer. 852*6be67779SAndroid Build Coastguard Worker XXX XML_Parse() and XML_ParseBuffer() should return XML_ParsingStatus, 853*6be67779SAndroid Build Coastguard Worker XXX with XML_FINISHED_OK or XML_FINISHED_ERROR replacing XML_FINISHED 854*6be67779SAndroid Build Coastguard Worker */ 855*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 856*6be67779SAndroid Build Coastguard Worker XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status); 857*6be67779SAndroid Build Coastguard Worker 858*6be67779SAndroid Build Coastguard Worker /* Creates an XML_Parser object that can parse an external general 859*6be67779SAndroid Build Coastguard Worker entity; context is a '\0'-terminated string specifying the parse 860*6be67779SAndroid Build Coastguard Worker context; encoding is a '\0'-terminated string giving the name of 861*6be67779SAndroid Build Coastguard Worker the externally specified encoding, or NULL if there is no 862*6be67779SAndroid Build Coastguard Worker externally specified encoding. The context string consists of a 863*6be67779SAndroid Build Coastguard Worker sequence of tokens separated by formfeeds (\f); a token consisting 864*6be67779SAndroid Build Coastguard Worker of a name specifies that the general entity of the name is open; a 865*6be67779SAndroid Build Coastguard Worker token of the form prefix=uri specifies the namespace for a 866*6be67779SAndroid Build Coastguard Worker particular prefix; a token of the form =uri specifies the default 867*6be67779SAndroid Build Coastguard Worker namespace. This can be called at any point after the first call to 868*6be67779SAndroid Build Coastguard Worker an ExternalEntityRefHandler so longer as the parser has not yet 869*6be67779SAndroid Build Coastguard Worker been freed. The new parser is completely independent and may 870*6be67779SAndroid Build Coastguard Worker safely be used in a separate thread. The handlers and userData are 871*6be67779SAndroid Build Coastguard Worker initialized from the parser argument. Returns NULL if out of memory. 872*6be67779SAndroid Build Coastguard Worker Otherwise returns a new XML_Parser object. 873*6be67779SAndroid Build Coastguard Worker */ 874*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(XML_Parser) 875*6be67779SAndroid Build Coastguard Worker XML_ExternalEntityParserCreate(XML_Parser parser, const XML_Char *context, 876*6be67779SAndroid Build Coastguard Worker const XML_Char *encoding); 877*6be67779SAndroid Build Coastguard Worker 878*6be67779SAndroid Build Coastguard Worker enum XML_ParamEntityParsing { 879*6be67779SAndroid Build Coastguard Worker XML_PARAM_ENTITY_PARSING_NEVER, 880*6be67779SAndroid Build Coastguard Worker XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE, 881*6be67779SAndroid Build Coastguard Worker XML_PARAM_ENTITY_PARSING_ALWAYS 882*6be67779SAndroid Build Coastguard Worker }; 883*6be67779SAndroid Build Coastguard Worker 884*6be67779SAndroid Build Coastguard Worker /* Controls parsing of parameter entities (including the external DTD 885*6be67779SAndroid Build Coastguard Worker subset). If parsing of parameter entities is enabled, then 886*6be67779SAndroid Build Coastguard Worker references to external parameter entities (including the external 887*6be67779SAndroid Build Coastguard Worker DTD subset) will be passed to the handler set with 888*6be67779SAndroid Build Coastguard Worker XML_SetExternalEntityRefHandler. The context passed will be 0. 889*6be67779SAndroid Build Coastguard Worker 890*6be67779SAndroid Build Coastguard Worker Unlike external general entities, external parameter entities can 891*6be67779SAndroid Build Coastguard Worker only be parsed synchronously. If the external parameter entity is 892*6be67779SAndroid Build Coastguard Worker to be parsed, it must be parsed during the call to the external 893*6be67779SAndroid Build Coastguard Worker entity ref handler: the complete sequence of 894*6be67779SAndroid Build Coastguard Worker XML_ExternalEntityParserCreate, XML_Parse/XML_ParseBuffer and 895*6be67779SAndroid Build Coastguard Worker XML_ParserFree calls must be made during this call. After 896*6be67779SAndroid Build Coastguard Worker XML_ExternalEntityParserCreate has been called to create the parser 897*6be67779SAndroid Build Coastguard Worker for the external parameter entity (context must be 0 for this 898*6be67779SAndroid Build Coastguard Worker call), it is illegal to make any calls on the old parser until 899*6be67779SAndroid Build Coastguard Worker XML_ParserFree has been called on the newly created parser. 900*6be67779SAndroid Build Coastguard Worker If the library has been compiled without support for parameter 901*6be67779SAndroid Build Coastguard Worker entity parsing (ie without XML_DTD being defined), then 902*6be67779SAndroid Build Coastguard Worker XML_SetParamEntityParsing will return 0 if parsing of parameter 903*6be67779SAndroid Build Coastguard Worker entities is requested; otherwise it will return non-zero. 904*6be67779SAndroid Build Coastguard Worker Note: If XML_SetParamEntityParsing is called after XML_Parse or 905*6be67779SAndroid Build Coastguard Worker XML_ParseBuffer, then it has no effect and will always return 0. 906*6be67779SAndroid Build Coastguard Worker Note: If parser == NULL, the function will do nothing and return 0. 907*6be67779SAndroid Build Coastguard Worker */ 908*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(int) 909*6be67779SAndroid Build Coastguard Worker XML_SetParamEntityParsing(XML_Parser parser, 910*6be67779SAndroid Build Coastguard Worker enum XML_ParamEntityParsing parsing); 911*6be67779SAndroid Build Coastguard Worker 912*6be67779SAndroid Build Coastguard Worker /* Sets the hash salt to use for internal hash calculations. 913*6be67779SAndroid Build Coastguard Worker Helps in preventing DoS attacks based on predicting hash 914*6be67779SAndroid Build Coastguard Worker function behavior. This must be called before parsing is started. 915*6be67779SAndroid Build Coastguard Worker Returns 1 if successful, 0 when called after parsing has started. 916*6be67779SAndroid Build Coastguard Worker Note: If parser == NULL, the function will do nothing and return 0. 917*6be67779SAndroid Build Coastguard Worker */ 918*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(int) 919*6be67779SAndroid Build Coastguard Worker XML_SetHashSalt(XML_Parser parser, unsigned long hash_salt); 920*6be67779SAndroid Build Coastguard Worker 921*6be67779SAndroid Build Coastguard Worker /* If XML_Parse or XML_ParseBuffer have returned XML_STATUS_ERROR, then 922*6be67779SAndroid Build Coastguard Worker XML_GetErrorCode returns information about the error. 923*6be67779SAndroid Build Coastguard Worker */ 924*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(enum XML_Error) 925*6be67779SAndroid Build Coastguard Worker XML_GetErrorCode(XML_Parser parser); 926*6be67779SAndroid Build Coastguard Worker 927*6be67779SAndroid Build Coastguard Worker /* These functions return information about the current parse 928*6be67779SAndroid Build Coastguard Worker location. They may be called from any callback called to report 929*6be67779SAndroid Build Coastguard Worker some parse event; in this case the location is the location of the 930*6be67779SAndroid Build Coastguard Worker first of the sequence of characters that generated the event. When 931*6be67779SAndroid Build Coastguard Worker called from callbacks generated by declarations in the document 932*6be67779SAndroid Build Coastguard Worker prologue, the location identified isn't as neatly defined, but will 933*6be67779SAndroid Build Coastguard Worker be within the relevant markup. When called outside of the callback 934*6be67779SAndroid Build Coastguard Worker functions, the position indicated will be just past the last parse 935*6be67779SAndroid Build Coastguard Worker event (regardless of whether there was an associated callback). 936*6be67779SAndroid Build Coastguard Worker 937*6be67779SAndroid Build Coastguard Worker They may also be called after returning from a call to XML_Parse 938*6be67779SAndroid Build Coastguard Worker or XML_ParseBuffer. If the return value is XML_STATUS_ERROR then 939*6be67779SAndroid Build Coastguard Worker the location is the location of the character at which the error 940*6be67779SAndroid Build Coastguard Worker was detected; otherwise the location is the location of the last 941*6be67779SAndroid Build Coastguard Worker parse event, as described above. 942*6be67779SAndroid Build Coastguard Worker 943*6be67779SAndroid Build Coastguard Worker Note: XML_GetCurrentLineNumber and XML_GetCurrentColumnNumber 944*6be67779SAndroid Build Coastguard Worker return 0 to indicate an error. 945*6be67779SAndroid Build Coastguard Worker Note: XML_GetCurrentByteIndex returns -1 to indicate an error. 946*6be67779SAndroid Build Coastguard Worker */ 947*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(XML_Size) XML_GetCurrentLineNumber(XML_Parser parser); 948*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(XML_Size) XML_GetCurrentColumnNumber(XML_Parser parser); 949*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(XML_Index) XML_GetCurrentByteIndex(XML_Parser parser); 950*6be67779SAndroid Build Coastguard Worker 951*6be67779SAndroid Build Coastguard Worker /* Return the number of bytes in the current event. 952*6be67779SAndroid Build Coastguard Worker Returns 0 if the event is in an internal entity. 953*6be67779SAndroid Build Coastguard Worker */ 954*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(int) 955*6be67779SAndroid Build Coastguard Worker XML_GetCurrentByteCount(XML_Parser parser); 956*6be67779SAndroid Build Coastguard Worker 957*6be67779SAndroid Build Coastguard Worker /* If XML_CONTEXT_BYTES is >=1, returns the input buffer, sets 958*6be67779SAndroid Build Coastguard Worker the integer pointed to by offset to the offset within this buffer 959*6be67779SAndroid Build Coastguard Worker of the current parse position, and sets the integer pointed to by size 960*6be67779SAndroid Build Coastguard Worker to the size of this buffer (the number of input bytes). Otherwise 961*6be67779SAndroid Build Coastguard Worker returns a NULL pointer. Also returns a NULL pointer if a parse isn't 962*6be67779SAndroid Build Coastguard Worker active. 963*6be67779SAndroid Build Coastguard Worker 964*6be67779SAndroid Build Coastguard Worker NOTE: The character pointer returned should not be used outside 965*6be67779SAndroid Build Coastguard Worker the handler that makes the call. 966*6be67779SAndroid Build Coastguard Worker */ 967*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(const char *) 968*6be67779SAndroid Build Coastguard Worker XML_GetInputContext(XML_Parser parser, int *offset, int *size); 969*6be67779SAndroid Build Coastguard Worker 970*6be67779SAndroid Build Coastguard Worker /* For backwards compatibility with previous versions. */ 971*6be67779SAndroid Build Coastguard Worker #define XML_GetErrorLineNumber XML_GetCurrentLineNumber 972*6be67779SAndroid Build Coastguard Worker #define XML_GetErrorColumnNumber XML_GetCurrentColumnNumber 973*6be67779SAndroid Build Coastguard Worker #define XML_GetErrorByteIndex XML_GetCurrentByteIndex 974*6be67779SAndroid Build Coastguard Worker 975*6be67779SAndroid Build Coastguard Worker /* Frees the content model passed to the element declaration handler */ 976*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 977*6be67779SAndroid Build Coastguard Worker XML_FreeContentModel(XML_Parser parser, XML_Content *model); 978*6be67779SAndroid Build Coastguard Worker 979*6be67779SAndroid Build Coastguard Worker /* Exposing the memory handling functions used in Expat */ 980*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void *) 981*6be67779SAndroid Build Coastguard Worker XML_ATTR_MALLOC 982*6be67779SAndroid Build Coastguard Worker XML_ATTR_ALLOC_SIZE(2) 983*6be67779SAndroid Build Coastguard Worker XML_MemMalloc(XML_Parser parser, size_t size); 984*6be67779SAndroid Build Coastguard Worker 985*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void *) 986*6be67779SAndroid Build Coastguard Worker XML_ATTR_ALLOC_SIZE(3) 987*6be67779SAndroid Build Coastguard Worker XML_MemRealloc(XML_Parser parser, void *ptr, size_t size); 988*6be67779SAndroid Build Coastguard Worker 989*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 990*6be67779SAndroid Build Coastguard Worker XML_MemFree(XML_Parser parser, void *ptr); 991*6be67779SAndroid Build Coastguard Worker 992*6be67779SAndroid Build Coastguard Worker /* Frees memory used by the parser. */ 993*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(void) 994*6be67779SAndroid Build Coastguard Worker XML_ParserFree(XML_Parser parser); 995*6be67779SAndroid Build Coastguard Worker 996*6be67779SAndroid Build Coastguard Worker /* Returns a string describing the error. */ 997*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(const XML_LChar *) 998*6be67779SAndroid Build Coastguard Worker XML_ErrorString(enum XML_Error code); 999*6be67779SAndroid Build Coastguard Worker 1000*6be67779SAndroid Build Coastguard Worker /* Return a string containing the version number of this expat */ 1001*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(const XML_LChar *) 1002*6be67779SAndroid Build Coastguard Worker XML_ExpatVersion(void); 1003*6be67779SAndroid Build Coastguard Worker 1004*6be67779SAndroid Build Coastguard Worker typedef struct { 1005*6be67779SAndroid Build Coastguard Worker int major; 1006*6be67779SAndroid Build Coastguard Worker int minor; 1007*6be67779SAndroid Build Coastguard Worker int micro; 1008*6be67779SAndroid Build Coastguard Worker } XML_Expat_Version; 1009*6be67779SAndroid Build Coastguard Worker 1010*6be67779SAndroid Build Coastguard Worker /* Return an XML_Expat_Version structure containing numeric version 1011*6be67779SAndroid Build Coastguard Worker number information for this version of expat. 1012*6be67779SAndroid Build Coastguard Worker */ 1013*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(XML_Expat_Version) 1014*6be67779SAndroid Build Coastguard Worker XML_ExpatVersionInfo(void); 1015*6be67779SAndroid Build Coastguard Worker 1016*6be67779SAndroid Build Coastguard Worker /* Added in Expat 1.95.5. */ 1017*6be67779SAndroid Build Coastguard Worker enum XML_FeatureEnum { 1018*6be67779SAndroid Build Coastguard Worker XML_FEATURE_END = 0, 1019*6be67779SAndroid Build Coastguard Worker XML_FEATURE_UNICODE, 1020*6be67779SAndroid Build Coastguard Worker XML_FEATURE_UNICODE_WCHAR_T, 1021*6be67779SAndroid Build Coastguard Worker XML_FEATURE_DTD, 1022*6be67779SAndroid Build Coastguard Worker XML_FEATURE_CONTEXT_BYTES, 1023*6be67779SAndroid Build Coastguard Worker XML_FEATURE_MIN_SIZE, 1024*6be67779SAndroid Build Coastguard Worker XML_FEATURE_SIZEOF_XML_CHAR, 1025*6be67779SAndroid Build Coastguard Worker XML_FEATURE_SIZEOF_XML_LCHAR, 1026*6be67779SAndroid Build Coastguard Worker XML_FEATURE_NS, 1027*6be67779SAndroid Build Coastguard Worker XML_FEATURE_LARGE_SIZE, 1028*6be67779SAndroid Build Coastguard Worker XML_FEATURE_ATTR_INFO, 1029*6be67779SAndroid Build Coastguard Worker /* Added in Expat 2.4.0. */ 1030*6be67779SAndroid Build Coastguard Worker XML_FEATURE_BILLION_LAUGHS_ATTACK_PROTECTION_MAXIMUM_AMPLIFICATION_DEFAULT, 1031*6be67779SAndroid Build Coastguard Worker XML_FEATURE_BILLION_LAUGHS_ATTACK_PROTECTION_ACTIVATION_THRESHOLD_DEFAULT, 1032*6be67779SAndroid Build Coastguard Worker /* Added in Expat 2.6.0. */ 1033*6be67779SAndroid Build Coastguard Worker XML_FEATURE_GE 1034*6be67779SAndroid Build Coastguard Worker /* Additional features must be added to the end of this enum. */ 1035*6be67779SAndroid Build Coastguard Worker }; 1036*6be67779SAndroid Build Coastguard Worker 1037*6be67779SAndroid Build Coastguard Worker typedef struct { 1038*6be67779SAndroid Build Coastguard Worker enum XML_FeatureEnum feature; 1039*6be67779SAndroid Build Coastguard Worker const XML_LChar *name; 1040*6be67779SAndroid Build Coastguard Worker long int value; 1041*6be67779SAndroid Build Coastguard Worker } XML_Feature; 1042*6be67779SAndroid Build Coastguard Worker 1043*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(const XML_Feature *) 1044*6be67779SAndroid Build Coastguard Worker XML_GetFeatureList(void); 1045*6be67779SAndroid Build Coastguard Worker 1046*6be67779SAndroid Build Coastguard Worker #if defined(XML_DTD) || (defined(XML_GE) && XML_GE == 1) 1047*6be67779SAndroid Build Coastguard Worker /* Added in Expat 2.4.0 for XML_DTD defined and 1048*6be67779SAndroid Build Coastguard Worker * added in Expat 2.6.0 for XML_GE == 1. */ 1049*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(XML_Bool) 1050*6be67779SAndroid Build Coastguard Worker XML_SetBillionLaughsAttackProtectionMaximumAmplification( 1051*6be67779SAndroid Build Coastguard Worker XML_Parser parser, float maximumAmplificationFactor); 1052*6be67779SAndroid Build Coastguard Worker 1053*6be67779SAndroid Build Coastguard Worker /* Added in Expat 2.4.0 for XML_DTD defined and 1054*6be67779SAndroid Build Coastguard Worker * added in Expat 2.6.0 for XML_GE == 1. */ 1055*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(XML_Bool) 1056*6be67779SAndroid Build Coastguard Worker XML_SetBillionLaughsAttackProtectionActivationThreshold( 1057*6be67779SAndroid Build Coastguard Worker XML_Parser parser, unsigned long long activationThresholdBytes); 1058*6be67779SAndroid Build Coastguard Worker #endif 1059*6be67779SAndroid Build Coastguard Worker 1060*6be67779SAndroid Build Coastguard Worker /* Added in Expat 2.6.0. */ 1061*6be67779SAndroid Build Coastguard Worker XMLPARSEAPI(XML_Bool) 1062*6be67779SAndroid Build Coastguard Worker XML_SetReparseDeferralEnabled(XML_Parser parser, XML_Bool enabled); 1063*6be67779SAndroid Build Coastguard Worker 1064*6be67779SAndroid Build Coastguard Worker /* Expat follows the semantic versioning convention. 1065*6be67779SAndroid Build Coastguard Worker See https://semver.org 1066*6be67779SAndroid Build Coastguard Worker */ 1067*6be67779SAndroid Build Coastguard Worker #define XML_MAJOR_VERSION 2 1068*6be67779SAndroid Build Coastguard Worker #define XML_MINOR_VERSION 6 1069*6be67779SAndroid Build Coastguard Worker #define XML_MICRO_VERSION 3 1070*6be67779SAndroid Build Coastguard Worker 1071*6be67779SAndroid Build Coastguard Worker #ifdef __cplusplus 1072*6be67779SAndroid Build Coastguard Worker } 1073*6be67779SAndroid Build Coastguard Worker #endif 1074*6be67779SAndroid Build Coastguard Worker 1075*6be67779SAndroid Build Coastguard Worker #endif /* not Expat_INCLUDED */ 1076