1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parserInternals.c : Internal routines (and obsolete ones) needed for the 3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XML and HTML parsers. 4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See Copyright for the status of this software. 6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * daniel@veillard.com 8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IN_LIBXML 11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h" 12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(WIN32) && !defined (__CYGWIN__) 14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_DIR_SEP '\\' 15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_DIR_SEP '/' 17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h> 20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_CTYPE_H 21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <ctype.h> 22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_STDLIB_H 24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <stdlib.h> 25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_SYS_STAT_H 27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <sys/stat.h> 28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_FCNTL_H 30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <fcntl.h> 31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_UNISTD_H 33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <unistd.h> 34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H 36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <zlib.h> 37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlmemory.h> 40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/tree.h> 41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parser.h> 42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parserInternals.h> 43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/valid.h> 44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/entities.h> 45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlerror.h> 46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/encoding.h> 47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/valid.h> 48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlIO.h> 49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/uri.h> 50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/dict.h> 51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/SAX.h> 52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_CATALOG_ENABLED 53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/catalog.h> 54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/globals.h> 56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/chvalid.h> 57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Various global defaults for parsing 60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCheckVersion: 64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @version: the include version number 65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check the compiled lib version against the include one. 67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This can warn or immediately kill the application 68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCheckVersion(int version) { 71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int myversion = (int) LIBXML_VERSION; 72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitParser(); 74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((myversion / 10000) != (version / 10000)) { 76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Fatal: program compiled against libxml %d using libxml %d\n", 78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (version / 10000), (myversion / 10000)); 79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, 80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Fatal: program compiled against libxml %d using libxml %d\n", 81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (version / 10000), (myversion / 10000)); 82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((myversion / 100) < (version / 100)) { 84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Warning: program compiled against libxml %d using older %d\n", 86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (version / 100), (myversion / 100)); 87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Some factorized error routines * 94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlErrMemory: 100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XML parser context 101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of attribute error 104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlErrMemory(xmlParserCtxtPtr ctxt, const char *extra) 107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->disableSAX != 0) && 109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->instate == XML_PARSER_EOF)) 110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = XML_ERR_NO_MEMORY; 113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_EOF; 114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->disableSAX = 1; 115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (extra) 117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, 118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, 119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, 0, 0, 120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Memory allocation failed : %s\n", extra); 121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, 123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL, 124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, 0, 0, "Memory allocation failed\n"); 125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * __xmlErrEncoding: 129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XML parser context 130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @xmlerr: the error number 131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the error message 132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: an string info 133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2: an string info 134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an encoding error 136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project__xmlErrEncoding(xmlParserCtxtPtr ctxt, xmlParserErrors xmlerr, 139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *msg, const xmlChar * str1, const xmlChar * str2) 140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->disableSAX != 0) && 142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->instate == XML_PARSER_EOF)) 143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) 145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = xmlerr; 146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, 147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt, NULL, XML_FROM_PARSER, xmlerr, XML_ERR_FATAL, 148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, 0, (const char *) str1, (const char *) str2, 149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, 0, 0, msg, str1, str2); 150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->wellFormed = 0; 152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->recovery == 0) 153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->disableSAX = 1; 154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlErrInternal: 159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XML parser context 160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the error message 161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: error informations 162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an internal error 164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlErrInternal(xmlParserCtxtPtr ctxt, const char *msg, const xmlChar * str) 167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->disableSAX != 0) && 169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->instate == XML_PARSER_EOF)) 170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) 172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = XML_ERR_INTERNAL_ERROR; 173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, 174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt, NULL, XML_FROM_PARSER, XML_ERR_INTERNAL_ERROR, 175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_FATAL, NULL, 0, (const char *) str, NULL, NULL, 176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 0, 0, msg, str); 177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->wellFormed = 0; 179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->recovery == 0) 180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->disableSAX = 1; 181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlErrEncodingInt: 186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XML parser context 187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error number 188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the error message 189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an integer value 190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * n encoding error 192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlErrEncodingInt(xmlParserCtxtPtr ctxt, xmlParserErrors error, 195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *msg, int val) 196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->disableSAX != 0) && 198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->instate == XML_PARSER_EOF)) 199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) 201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = error; 202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, 203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_FATAL, 204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, 0, NULL, NULL, NULL, val, 0, msg, val); 205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->wellFormed = 0; 207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->recovery == 0) 208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->disableSAX = 1; 209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIsLetter: 214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @c: an unicode character (int) 215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check whether the character is allowed by the production 217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [84] Letter ::= BaseChar | Ideographic 218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if not, non-zero otherwise 220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlIsLetter(int c) { 223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(IS_BASECHAR(c) || IS_IDEOGRAPHIC(c)); 224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Input handling functions for progressive parsing * 229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_INPUT */ 233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_STACK */ 234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_PUSH */ 235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* we need to keep enough input to show errors in context */ 238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define LINE_LEN 80 239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INPUT 241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CHECK_BUFFER(in) check_buffer(in) 242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic 244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid check_buffer(xmlParserInputPtr in) { 245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->base != in->buf->buffer->content) { 246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlParserInput: base mismatch problem\n"); 248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->cur < in->base) { 250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlParserInput: cur < base problem\n"); 252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->cur > in->base + in->buf->buffer->use) { 254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlParserInput: cur > base + use problem\n"); 256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext,"buffer %x : content %x, cur %d, use %d, size %d\n", 258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (int) in, (int) in->buf->buffer->content, in->cur - in->base, 259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in->buf->buffer->use, in->buf->buffer->size); 260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CHECK_BUFFER(in) 264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserInputRead: 269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @in: an XML parser input 270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len: an indicative size for the lookahead 271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This function refresh the input for the parser. It doesn't try to 273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * preserve pointers to the input buffer, and discard already read data 274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of xmlChars read, or -1 in case of error, 0 indicate the 276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * end of this entity 277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputRead(xmlParserInputPtr in, int len) { 280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int used; 282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int indx; 283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in == NULL) return(-1); 285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INPUT 286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Read\n"); 287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->buf == NULL) return(-1); 289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->base == NULL) return(-1); 290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->cur == NULL) return(-1); 291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->buf->buffer == NULL) return(-1); 292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->buf->readcallback == NULL) return(-1); 293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_BUFFER(in); 295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project used = in->cur - in->buf->buffer->content; 297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlBufferShrink(in->buf->buffer, used); 298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret > 0) { 299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in->cur -= ret; 300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in->consumed += ret; 301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlParserInputBufferRead(in->buf, len); 303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->base != in->buf->buffer->content) { 304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the buffer has been reallocated 306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project indx = in->cur - in->base; 308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in->base = in->buf->buffer->content; 309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in->cur = &in->buf->buffer->content[indx]; 310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in->end = &in->buf->buffer->content[in->buf->buffer->use]; 312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_BUFFER(in); 314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserInputGrow: 320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @in: an XML parser input 321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len: an indicative size for the lookahead 322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This function increase the input for the parser. It tries to 324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * preserve pointers to the input buffer, and keep already read data 325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of xmlChars read, or -1 in case of error, 0 indicate the 327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * end of this entity 328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputGrow(xmlParserInputPtr in, int len) { 331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int indx; 333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in == NULL) return(-1); 335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INPUT 336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Grow\n"); 337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->buf == NULL) return(-1); 339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->base == NULL) return(-1); 340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->cur == NULL) return(-1); 341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->buf->buffer == NULL) return(-1); 342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_BUFFER(in); 344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project indx = in->cur - in->base; 346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->buf->buffer->use > (unsigned int) indx + INPUT_CHUNK) { 347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_BUFFER(in); 349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->buf->readcallback != NULL) 353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlParserInputBufferGrow(in->buf, len); 354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NOTE : in->base may be a "dangling" i.e. freed pointer in this 359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * block, but we use it really as an integer to do some 360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * pointer arithmetic. Insure will raise it as a bug but in 361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * that specific case, that's not ! 362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->base != in->buf->buffer->content) { 364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the buffer has been reallocated 366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project indx = in->cur - in->base; 368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in->base = in->buf->buffer->content; 369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in->cur = &in->buf->buffer->content[indx]; 370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in->end = &in->buf->buffer->content[in->buf->buffer->use]; 372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_BUFFER(in); 374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserInputShrink: 380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @in: an XML parser input 381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This function removes used input for the parser. 383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputShrink(xmlParserInputPtr in) { 386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int used; 387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int indx; 389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INPUT 391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Shrink\n"); 392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in == NULL) return; 394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->buf == NULL) return; 395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->base == NULL) return; 396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->cur == NULL) return; 397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->buf->buffer == NULL) return; 398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_BUFFER(in); 400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project used = in->cur - in->buf->buffer->content; 402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Do not shrink on large buffers whose only a tiny fraction 404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * was consumed 405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (used > INPUT_CHUNK) { 407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlBufferShrink(in->buf->buffer, used - LINE_LEN); 408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret > 0) { 409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in->cur -= ret; 410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in->consumed += ret; 411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in->end = &in->buf->buffer->content[in->buf->buffer->use]; 413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_BUFFER(in); 416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->buf->buffer->use > INPUT_CHUNK) { 418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputBufferRead(in->buf, 2 * INPUT_CHUNK); 421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->base != in->buf->buffer->content) { 422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the buffer has been reallocated 424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project indx = in->cur - in->base; 426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in->base = in->buf->buffer->content; 427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in->cur = &in->buf->buffer->content[indx]; 428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in->end = &in->buf->buffer->content[in->buf->buffer->use]; 430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_BUFFER(in); 432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * UTF8 character input and related functions * 437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNextChar: 442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XML parser context 443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip to the next char input char. 445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNextChar(xmlParserCtxtPtr ctxt) 449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->instate == XML_PARSER_EOF) || 451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->input == NULL)) 452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->charset == XML_CHAR_ENCODING_UTF8) { 455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*ctxt->input->cur == 0) && 456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0) && 457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->instate != XML_PARSER_COMMENT)) { 458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If we are at the end of the current entity and 460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the context allows it, we pop consumed entities 461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * automatically. 462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the auto closing should be blocked in other cases 463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPopInput(ctxt); 465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const unsigned char *cur; 467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned char c; 468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2.11 End-of-Line Handling 471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the literal two-character sequence "#xD#xA" or a standalone 472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * literal #xD, an XML processor must pass to the application 473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the single character #xA. 474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*(ctxt->input->cur) == '\n') { 476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->line++; ctxt->input->col = 1; 477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->col++; 479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We are supposed to handle UTF8, check it's valid 482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * From rfc2044: encoding of the Unicode values on UTF-8: 483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * UCS-4 range (hex.) UTF-8 octet sequence (binary) 485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0000 0000-0000 007F 0xxxxxxx 486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0000 0080-0000 07FF 110xxxxx 10xxxxxx 487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx 488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for the 0x110000 limit too 490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->input->cur; 492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = *cur; 494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (c & 0x80) { 495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (c == 0xC0) 496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto encoding_error; 497df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur[1] == 0) { 498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputGrow(ctxt->input, INPUT_CHUNK); 499df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = ctxt->input->cur; 500df143a5041f03a22808b59c76698770b74692815Selim Gurun } 501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur[1] & 0xc0) != 0x80) 502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto encoding_error; 503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c & 0xe0) == 0xe0) { 504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int val; 505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 506df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur[2] == 0) { 507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputGrow(ctxt->input, INPUT_CHUNK); 508df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = ctxt->input->cur; 509df143a5041f03a22808b59c76698770b74692815Selim Gurun } 510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur[2] & 0xc0) != 0x80) 511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto encoding_error; 512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c & 0xf0) == 0xf0) { 513df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur[3] == 0) { 514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputGrow(ctxt->input, INPUT_CHUNK); 515df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = ctxt->input->cur; 516df143a5041f03a22808b59c76698770b74692815Selim Gurun } 517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((c & 0xf8) != 0xf0) || 518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((cur[3] & 0xc0) != 0x80)) 519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto encoding_error; 520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4-byte code */ 521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->cur += 4; 522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = (cur[0] & 0x7) << 18; 523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= (cur[1] & 0x3f) << 12; 524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= (cur[2] & 0x3f) << 6; 525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= cur[3] & 0x3f; 526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3-byte code */ 528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->cur += 3; 529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = (cur[0] & 0xf) << 12; 530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= (cur[1] & 0x3f) << 6; 531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= cur[2] & 0x3f; 532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((val > 0xd7ff) && (val < 0xe000)) || 534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((val > 0xfffd) && (val < 0x10000)) || 535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (val >= 0x110000)) { 536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrEncodingInt(ctxt, XML_ERR_INVALID_CHAR, 537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Char 0x%X out of allowed range\n", 538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val); 539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2-byte code */ 542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->cur += 2; 543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1-byte code */ 545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->cur++; 546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbChars++; 548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*ctxt->input->cur == 0) 549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputGrow(ctxt->input, INPUT_CHUNK); 550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Assume it's a fixed length encoding (1) with 554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a compatible encoding for the ASCII set, since 555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XML constructs only use < 128 chars 556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*(ctxt->input->cur) == '\n') { 559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->line++; ctxt->input->col = 1; 560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->col++; 562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->cur++; 563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbChars++; 564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*ctxt->input->cur == 0) 565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputGrow(ctxt->input, INPUT_CHUNK); 566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*ctxt->input->cur == '%') && (!ctxt->html)) 568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserHandlePEReference(ctxt); 569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*ctxt->input->cur == 0) && 570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) 571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPopInput(ctxt); 572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectencoding_error: 574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If we detect an UTF8 error that probably mean that the 576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * input encoding didn't get properly advertised in the 577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * declaration header. Report the error and switch the encoding 578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to ISO-Latin-1 (if you don't like this policy, just declare the 579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * encoding !) 580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->input == NULL) || 582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->input->end - ctxt->input->cur < 4)) { 583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlErrEncoding(ctxt, XML_ERR_INVALID_CHAR, 584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Input is not proper UTF-8, indicate encoding !\n", 585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char buffer[150]; 588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(buffer, 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", 590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->cur[0], ctxt->input->cur[1], 591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->cur[2], ctxt->input->cur[3]); 592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlErrEncoding(ctxt, XML_ERR_INVALID_CHAR, 593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Input is not proper UTF-8, indicate encoding !\n%s", 594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST buffer, NULL); 595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->charset = XML_CHAR_ENCODING_8859_1; 597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->cur++; 598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCurrentChar: 603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XML parser context 604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len: pointer to the length of the char read 605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The current char value, if using UTF-8 this may actually span multiple 607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * bytes in the input buffer. Implement the end of line normalization: 608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2.11 End-of-Line Handling 609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wherever an external parsed entity or the literal entity value 610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of an internal parsed entity contains either the literal two-character 611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * sequence "#xD#xA" or a standalone literal #xD, an XML processor 612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * must pass to the application the single character #xA. 613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This behavior can conveniently be produced by normalizing all 614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * line breaks to #xA on input, before parsing.) 615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the current char value and its length 617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCurrentChar(xmlParserCtxtPtr ctxt, int *len) { 621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (len == NULL) || (ctxt->input == NULL)) return(0); 622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->instate == XML_PARSER_EOF) 623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*ctxt->input->cur >= 0x20) && (*ctxt->input->cur <= 0x7F)) { 626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 1; 627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((int) *ctxt->input->cur); 628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->charset == XML_CHAR_ENCODING_UTF8) { 630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We are supposed to handle UTF8, check it's valid 632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * From rfc2044: encoding of the Unicode values on UTF-8: 633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * UCS-4 range (hex.) UTF-8 octet sequence (binary) 635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0000 0000-0000 007F 0xxxxxxx 636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0000 0080-0000 07FF 110xxxxx 10xxxxxx 637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx 638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for the 0x110000 limit too 640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const unsigned char *cur = ctxt->input->cur; 642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned char c; 643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int val; 644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = *cur; 646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (c & 0x80) { 647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((c & 0x40) == 0) || (c == 0xC0)) 648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto encoding_error; 649df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur[1] == 0) { 650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputGrow(ctxt->input, INPUT_CHUNK); 651df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = ctxt->input->cur; 652df143a5041f03a22808b59c76698770b74692815Selim Gurun } 653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur[1] & 0xc0) != 0x80) 654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto encoding_error; 655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c & 0xe0) == 0xe0) { 656df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur[2] == 0) { 657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputGrow(ctxt->input, INPUT_CHUNK); 658df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = ctxt->input->cur; 659df143a5041f03a22808b59c76698770b74692815Selim Gurun } 660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur[2] & 0xc0) != 0x80) 661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto encoding_error; 662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c & 0xf0) == 0xf0) { 663df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur[3] == 0) { 664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputGrow(ctxt->input, INPUT_CHUNK); 665df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = ctxt->input->cur; 666df143a5041f03a22808b59c76698770b74692815Selim Gurun } 667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((c & 0xf8) != 0xf0) || 668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((cur[3] & 0xc0) != 0x80)) 669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto encoding_error; 670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4-byte code */ 671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 4; 672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = (cur[0] & 0x7) << 18; 673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= (cur[1] & 0x3f) << 12; 674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= (cur[2] & 0x3f) << 6; 675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= cur[3] & 0x3f; 676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val < 0x10000) 677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto encoding_error; 678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3-byte code */ 680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 3; 681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = (cur[0] & 0xf) << 12; 682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= (cur[1] & 0x3f) << 6; 683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= cur[2] & 0x3f; 684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val < 0x800) 685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto encoding_error; 686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2-byte code */ 689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 2; 690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = (cur[0] & 0x1f) << 6; 691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= cur[1] & 0x3f; 692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val < 0x80) 693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto encoding_error; 694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_CHAR(val)) { 696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrEncodingInt(ctxt, XML_ERR_INVALID_CHAR, 697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Char 0x%X out of allowed range\n", val); 698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(val); 700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1-byte code */ 702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 1; 703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*ctxt->input->cur == 0) 704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputGrow(ctxt->input, INPUT_CHUNK); 705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*ctxt->input->cur == 0) && 706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->input->end > ctxt->input->cur)) { 707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrEncodingInt(ctxt, XML_ERR_INVALID_CHAR, 708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Char 0x0 out of allowed range\n", 0); 709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*ctxt->input->cur == 0xD) { 711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->input->cur[1] == 0xA) { 712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbChars++; 713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->cur++; 714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0xA); 716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((int) *ctxt->input->cur); 718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Assume it's a fixed length encoding (1) with 722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a compatible encoding for the ASCII set, since 723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XML constructs only use < 128 chars 724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 1; 726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*ctxt->input->cur == 0xD) { 727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->input->cur[1] == 0xA) { 728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbChars++; 729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->cur++; 730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0xA); 732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((int) *ctxt->input->cur); 734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectencoding_error: 735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * An encoding problem may arise from a truncated input buffer 737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * splitting a character in the middle. In that case do not raise 738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * an error but return 0 to endicate an end of stream problem 739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->input->end - ctxt->input->cur < 4) { 741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 0; 742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If we detect an UTF8 error that probably mean that the 747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * input encoding didn't get properly advertised in the 748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * declaration header. Report the error and switch the encoding 749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to ISO-Latin-1 (if you don't like this policy, just declare the 750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * encoding !) 751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char buffer[150]; 754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(&buffer[0], 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", 756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->cur[0], ctxt->input->cur[1], 757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->cur[2], ctxt->input->cur[3]); 758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlErrEncoding(ctxt, XML_ERR_INVALID_CHAR, 759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Input is not proper UTF-8, indicate encoding !\n%s", 760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST buffer, NULL); 761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->charset = XML_CHAR_ENCODING_8859_1; 763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 1; 764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((int) *ctxt->input->cur); 765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStringCurrentChar: 769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XML parser context 770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: pointer to the beginning of the char 771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len: pointer to the length of the char read 772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The current char value, if using UTF-8 this may actually span multiple 774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * bytes in the input buffer. 775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the current char value and its length 777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStringCurrentChar(xmlParserCtxtPtr ctxt, const xmlChar * cur, int *len) 781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((len == NULL) || (cur == NULL)) return(0); 783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->charset == XML_CHAR_ENCODING_UTF8)) { 784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We are supposed to handle UTF8, check it's valid 786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * From rfc2044: encoding of the Unicode values on UTF-8: 787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * UCS-4 range (hex.) UTF-8 octet sequence (binary) 789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0000 0000-0000 007F 0xxxxxxx 790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0000 0080-0000 07FF 110xxxxx 10xxxxxx 791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx 792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for the 0x110000 limit too 794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned char c; 796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int val; 797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = *cur; 799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (c & 0x80) { 800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur[1] & 0xc0) != 0x80) 801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto encoding_error; 802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c & 0xe0) == 0xe0) { 803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur[2] & 0xc0) != 0x80) 805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto encoding_error; 806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c & 0xf0) == 0xf0) { 807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((c & 0xf8) != 0xf0) || ((cur[3] & 0xc0) != 0x80)) 808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto encoding_error; 809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4-byte code */ 810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 4; 811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = (cur[0] & 0x7) << 18; 812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= (cur[1] & 0x3f) << 12; 813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= (cur[2] & 0x3f) << 6; 814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= cur[3] & 0x3f; 815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3-byte code */ 817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 3; 818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = (cur[0] & 0xf) << 12; 819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= (cur[1] & 0x3f) << 6; 820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= cur[2] & 0x3f; 821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2-byte code */ 824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 2; 825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = (cur[0] & 0x1f) << 6; 826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= cur[1] & 0x3f; 827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_CHAR(val)) { 829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrEncodingInt(ctxt, XML_ERR_INVALID_CHAR, 830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Char 0x%X out of allowed range\n", val); 831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (val); 833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1-byte code */ 835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 1; 836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ((int) *cur); 837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Assume it's a fixed length encoding (1) with 841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a compatible encoding for the ASCII set, since 842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XML constructs only use < 128 chars 843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 1; 845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ((int) *cur); 846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectencoding_error: 847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * An encoding problem may arise from a truncated input buffer 850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * splitting a character in the middle. In that case do not raise 851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * an error but return 0 to endicate an end of stream problem 852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->input == NULL) || 854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->input->end - ctxt->input->cur < 4)) { 855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 0; 856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If we detect an UTF8 error that probably mean that the 860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * input encoding didn't get properly advertised in the 861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * declaration header. Report the error and switch the encoding 862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to ISO-Latin-1 (if you don't like this policy, just declare the 863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * encoding !) 864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char buffer[150]; 867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(buffer, 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", 869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->cur[0], ctxt->input->cur[1], 870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->cur[2], ctxt->input->cur[3]); 871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlErrEncoding(ctxt, XML_ERR_INVALID_CHAR, 872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Input is not proper UTF-8, indicate encoding !\n%s", 873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST buffer, NULL); 874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 1; 876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ((int) *cur); 877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCopyCharMultiByte: 881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @out: pointer to an array of xmlChar 882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the char value 883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * append the char value in the array 885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of xmlChar written 887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCopyCharMultiByte(xmlChar *out, int val) { 890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (out == NULL) return(0); 891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We are supposed to handle UTF8, check it's valid 893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * From rfc2044: encoding of the Unicode values on UTF-8: 894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * UCS-4 range (hex.) UTF-8 octet sequence (binary) 896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0000 0000-0000 007F 0xxxxxxx 897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0000 0080-0000 07FF 110xxxxx 10xxxxxx 898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx 899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val >= 0x80) { 901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *savedout = out; 902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int bits; 903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val < 0x800) { *out++= (val >> 6) | 0xC0; bits= 0; } 904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (val < 0x10000) { *out++= (val >> 12) | 0xE0; bits= 6;} 905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (val < 0x110000) { *out++= (val >> 18) | 0xF0; bits= 12; } 906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrEncodingInt(NULL, XML_ERR_INVALID_CHAR, 908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal error, xmlCopyCharMultiByte 0x%X out of bound\n", 909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val); 910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for ( ; bits >= 0; bits-= 6) 913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++= ((val >> bits) & 0x3F) | 0x80 ; 914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (out - savedout); 915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out = (xmlChar) val; 917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return 1; 918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCopyChar: 922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len: Ignored, compatibility 923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @out: pointer to an array of xmlChar 924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the char value 925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * append the char value in the array 927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of xmlChar written 929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCopyChar(int len ATTRIBUTE_UNUSED, xmlChar *out, int val) { 933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (out == NULL) return(0); 934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* the len parameter is ignored */ 935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val >= 0x80) { 936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlCopyCharMultiByte (out, val)); 937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out = (xmlChar) val; 939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return 1; 940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Commodity functions to switch encodings * 945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 948df143a5041f03a22808b59c76698770b74692815Selim Gurun/* defined in encoding.c, not public */ 949df143a5041f03a22808b59c76698770b74692815Selim Gurunint 950df143a5041f03a22808b59c76698770b74692815Selim GurunxmlCharEncFirstLineInt(xmlCharEncodingHandler *handler, xmlBufferPtr out, 951df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlBufferPtr in, int len); 952df143a5041f03a22808b59c76698770b74692815Selim Gurun 953df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic int 954df143a5041f03a22808b59c76698770b74692815Selim GurunxmlSwitchToEncodingInt(xmlParserCtxtPtr ctxt, 955df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlCharEncodingHandlerPtr handler, int len); 956df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic int 957df143a5041f03a22808b59c76698770b74692815Selim GurunxmlSwitchInputEncodingInt(xmlParserCtxtPtr ctxt, xmlParserInputPtr input, 958df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlCharEncodingHandlerPtr handler, int len); 959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSwitchEncoding: 961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context 962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @enc: the encoding value (number) 963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * change the input functions when discovering the character encoding 965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of a given entity. 966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 otherwise 968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSwitchEncoding(xmlParserCtxtPtr ctxt, xmlCharEncoding enc) 971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCharEncodingHandlerPtr handler; 973df143a5041f03a22808b59c76698770b74692815Selim Gurun int len = -1; 974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return(-1); 976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (enc) { 977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_ERROR: 978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlErrEncoding(ctxt, XML_ERR_UNKNOWN_ENCODING, 979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "encoding unknown\n", NULL, NULL); 980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_NONE: 982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* let's assume it's UTF-8 without the XML decl */ 983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->charset = XML_CHAR_ENCODING_UTF8; 984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_UTF8: 986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* default encoding, no conversion should be needed */ 987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->charset = XML_CHAR_ENCODING_UTF8; 988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Errata on XML-1.0 June 20 2001 991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Specific handling of the Byte Order Mark for 992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * UTF-8 993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->input != NULL) && 995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->input->cur[0] == 0xEF) && 996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->input->cur[1] == 0xBB) && 997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->input->cur[2] == 0xBF)) { 998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->cur += 3; 999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_UTF16LE: 1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_UTF16BE: 1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /*The raw input characters are encoded 1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *in UTF-16. As we expect this function 1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *to be called after xmlCharEncInFunc, we expect 1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *ctxt->input->cur to contain UTF-8 encoded characters. 1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *So the raw UTF16 Byte Order Mark 1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *has also been converted into 1009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *an UTF-8 BOM. Let's skip that BOM. 1010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->input != NULL) && (ctxt->input->cur != NULL) && 1012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->input->cur[0] == 0xEF) && 1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->input->cur[1] == 0xBB) && 1014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->input->cur[2] == 0xBF)) { 1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->cur += 3; 1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1017df143a5041f03a22808b59c76698770b74692815Selim Gurun len = 90; 1018df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 1019df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_CHAR_ENCODING_UCS2: 1020df143a5041f03a22808b59c76698770b74692815Selim Gurun len = 90; 1021df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 1022df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_CHAR_ENCODING_UCS4BE: 1023df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_CHAR_ENCODING_UCS4LE: 1024df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_CHAR_ENCODING_UCS4_2143: 1025df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_CHAR_ENCODING_UCS4_3412: 1026df143a5041f03a22808b59c76698770b74692815Selim Gurun len = 180; 1027df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 1028df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_CHAR_ENCODING_EBCDIC: 1029df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_CHAR_ENCODING_8859_1: 1030df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_CHAR_ENCODING_8859_2: 1031df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_CHAR_ENCODING_8859_3: 1032df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_CHAR_ENCODING_8859_4: 1033df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_CHAR_ENCODING_8859_5: 1034df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_CHAR_ENCODING_8859_6: 1035df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_CHAR_ENCODING_8859_7: 1036df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_CHAR_ENCODING_8859_8: 1037df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_CHAR_ENCODING_8859_9: 1038df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_CHAR_ENCODING_ASCII: 1039df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_CHAR_ENCODING_2022_JP: 1040df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_CHAR_ENCODING_SHIFT_JIS: 1041df143a5041f03a22808b59c76698770b74692815Selim Gurun case XML_CHAR_ENCODING_EUC_JP: 1042df143a5041f03a22808b59c76698770b74692815Selim Gurun len = 45; 1043df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project handler = xmlGetCharEncodingHandler(enc); 1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (handler == NULL) { 1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Default handlers. 1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (enc) { 1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_ASCII: 1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* default encoding, no conversion should be needed */ 1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->charset = XML_CHAR_ENCODING_UTF8; 1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_UTF16LE: 1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_UTF16BE: 1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_UCS4LE: 1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, 1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "encoding not supported %s\n", 1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "USC4 little endian", NULL); 1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_UCS4BE: 1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, 1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "encoding not supported %s\n", 1067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "USC4 big endian", NULL); 1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_EBCDIC: 1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, 1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "encoding not supported %s\n", 1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "EBCDIC", NULL); 1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_UCS4_2143: 1075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, 1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "encoding not supported %s\n", 1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "UCS4 2143", NULL); 1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_UCS4_3412: 1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, 1081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "encoding not supported %s\n", 1082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "UCS4 3412", NULL); 1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_UCS2: 1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, 1086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "encoding not supported %s\n", 1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "UCS2", NULL); 1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_8859_1: 1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_8859_2: 1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_8859_3: 1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_8859_4: 1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_8859_5: 1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_8859_6: 1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_8859_7: 1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_8859_8: 1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_8859_9: 1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We used to keep the internal content in the 1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * document encoding however this turns being unmaintainable 1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * So xmlGetCharEncodingHandler() will return non-null 1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * values for this now. 1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->inputNr == 1) && 1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->encoding == NULL) && 1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->input != NULL) && 1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->input->encoding != NULL)) { 1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->encoding = xmlStrdup(ctxt->input->encoding); 1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->charset = enc; 1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_2022_JP: 1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, 1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "encoding not supported %s\n", 1115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "ISO-2022-JP", NULL); 1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_SHIFT_JIS: 1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, 1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "encoding not supported %s\n", 1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "Shift_JIS", NULL); 1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CHAR_ENCODING_EUC_JP: 1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING, 1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "encoding not supported %s\n", 1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "EUC-JP", NULL); 1126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (handler == NULL) 1132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->charset = XML_CHAR_ENCODING_UTF8; 1134df143a5041f03a22808b59c76698770b74692815Selim Gurun return(xmlSwitchToEncodingInt(ctxt, handler, len)); 1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSwitchInputEncoding: 1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context 1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @input: the input stream 1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @handler: the encoding handler 1142df143a5041f03a22808b59c76698770b74692815Selim Gurun * @len: the number of bytes to convert for the first line or -1 1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * change the input functions when discovering the character encoding 1145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of a given entity. 1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 otherwise 1148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1149df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic int 1150df143a5041f03a22808b59c76698770b74692815Selim GurunxmlSwitchInputEncodingInt(xmlParserCtxtPtr ctxt, xmlParserInputPtr input, 1151df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlCharEncodingHandlerPtr handler, int len) 1152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbchars; 1154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (handler == NULL) 1156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input == NULL) 1158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input->buf != NULL) { 1160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input->buf->encoder != NULL) { 1161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check in case the auto encoding detetection triggered 1163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in already. 1164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input->buf->encoder == handler) 1166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "UTF-16" can be used for both LE and BE 1170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!xmlStrncmp(BAD_CAST input->buf->encoder->name, 1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "UTF-16", 6)) && 1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrncmp(BAD_CAST handler->name, 1173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "UTF-16", 6))) { 1174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note: this is a bit dangerous, but that's what it 1180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * takes to use nearly compatible signature for different 1181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * encodings. 1182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCharEncCloseFunc(input->buf->encoder); 1184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->buf->encoder = handler; 1185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->buf->encoder = handler; 1188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Is there already some content down the pipe to convert ? 1191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((input->buf->buffer != NULL) && (input->buf->buffer->use > 0)) { 1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int processed; 1194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int use; 1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Specific handling of the Byte Order Mark for 1198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * UTF-16 1199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((handler->name != NULL) && 1201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!strcmp(handler->name, "UTF-16LE") || 1202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project !strcmp(handler->name, "UTF-16")) && 1203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (input->cur[0] == 0xFF) && (input->cur[1] == 0xFE)) { 1204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->cur += 2; 1205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((handler->name != NULL) && 1207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!strcmp(handler->name, "UTF-16BE")) && 1208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (input->cur[0] == 0xFE) && (input->cur[1] == 0xFF)) { 1209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->cur += 2; 1210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Errata on XML-1.0 June 20 2001 1213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Specific handling of the Byte Order Mark for 1214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * UTF-8 1215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((handler->name != NULL) && 1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!strcmp(handler->name, "UTF-8")) && 1218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (input->cur[0] == 0xEF) && 1219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (input->cur[1] == 0xBB) && (input->cur[2] == 0xBF)) { 1220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->cur += 3; 1221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Shrink the current input buffer. 1225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Move it as the raw buffer and create a new input buffer 1226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project processed = input->cur - input->base; 1228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferShrink(input->buf->buffer, processed); 1229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->buf->raw = input->buf->buffer; 1230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->buf->buffer = xmlBufferCreate(); 1231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->buf->rawconsumed = processed; 1232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project use = input->buf->raw->use; 1233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->html) { 1235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * convert as much as possible of the buffer 1237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbchars = xmlCharEncInFunc(input->buf->encoder, 1239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->buf->buffer, 1240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->buf->raw); 1241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * convert just enough to get 1244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * '<?xml version="1.0" encoding="xxx"?>' 1245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parsed with the autodetected encoding 1246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * into the parser reading buffer. 1247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1248df143a5041f03a22808b59c76698770b74692815Selim Gurun nbchars = xmlCharEncFirstLineInt(input->buf->encoder, 1249df143a5041f03a22808b59c76698770b74692815Selim Gurun input->buf->buffer, 1250df143a5041f03a22808b59c76698770b74692815Selim Gurun input->buf->raw, 1251df143a5041f03a22808b59c76698770b74692815Selim Gurun len); 1252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nbchars < 0) { 1254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrInternal(ctxt, 1255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "switching encoding: encoder error\n", 1256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 1257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->buf->rawconsumed += use - input->buf->raw->use; 1260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->base = input->cur = input->buf->buffer->content; 1261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->end = &input->base[input->buf->buffer->use]; 1262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (input->length == 0) { 1266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * When parsing a static memory array one must know the 1268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * size to be able to convert the buffer. 1269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrInternal(ctxt, "switching encoding : no input\n", NULL); 1271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1277df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlSwitchInputEncoding: 1278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context 1279df143a5041f03a22808b59c76698770b74692815Selim Gurun * @input: the input stream 1280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @handler: the encoding handler 1281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * change the input functions when discovering the character encoding 1283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of a given entity. 1284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 otherwise 1286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1288df143a5041f03a22808b59c76698770b74692815Selim GurunxmlSwitchInputEncoding(xmlParserCtxtPtr ctxt, xmlParserInputPtr input, 1289df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlCharEncodingHandlerPtr handler) { 1290df143a5041f03a22808b59c76698770b74692815Selim Gurun return(xmlSwitchInputEncodingInt(ctxt, input, handler, -1)); 1291df143a5041f03a22808b59c76698770b74692815Selim Gurun} 1292df143a5041f03a22808b59c76698770b74692815Selim Gurun 1293df143a5041f03a22808b59c76698770b74692815Selim Gurun/** 1294df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlSwitchToEncodingInt: 1295df143a5041f03a22808b59c76698770b74692815Selim Gurun * @ctxt: the parser context 1296df143a5041f03a22808b59c76698770b74692815Selim Gurun * @handler: the encoding handler 1297df143a5041f03a22808b59c76698770b74692815Selim Gurun * @len: the lenght to convert or -1 1298df143a5041f03a22808b59c76698770b74692815Selim Gurun * 1299df143a5041f03a22808b59c76698770b74692815Selim Gurun * change the input functions when discovering the character encoding 1300df143a5041f03a22808b59c76698770b74692815Selim Gurun * of a given entity, and convert only @len bytes of the output, this 1301df143a5041f03a22808b59c76698770b74692815Selim Gurun * is needed on auto detect to allows any declared encoding later to 1302df143a5041f03a22808b59c76698770b74692815Selim Gurun * convert the actual content after the xmlDecl 1303df143a5041f03a22808b59c76698770b74692815Selim Gurun * 1304df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns 0 in case of success, -1 otherwise 1305df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 1306df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic int 1307df143a5041f03a22808b59c76698770b74692815Selim GurunxmlSwitchToEncodingInt(xmlParserCtxtPtr ctxt, 1308df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlCharEncodingHandlerPtr handler, int len) { 1309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 1310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (handler != NULL) { 1312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->input != NULL) { 1313df143a5041f03a22808b59c76698770b74692815Selim Gurun ret = xmlSwitchInputEncodingInt(ctxt, ctxt->input, handler, len); 1314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrInternal(ctxt, "xmlSwitchToEncoding : no input\n", 1316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 1317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The parsing is now done in UTF8 natively 1321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->charset = XML_CHAR_ENCODING_UTF8; 1323df143a5041f03a22808b59c76698770b74692815Selim Gurun } else 1324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 1326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1328df143a5041f03a22808b59c76698770b74692815Selim Gurun/** 1329df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlSwitchToEncoding: 1330df143a5041f03a22808b59c76698770b74692815Selim Gurun * @ctxt: the parser context 1331df143a5041f03a22808b59c76698770b74692815Selim Gurun * @handler: the encoding handler 1332df143a5041f03a22808b59c76698770b74692815Selim Gurun * 1333df143a5041f03a22808b59c76698770b74692815Selim Gurun * change the input functions when discovering the character encoding 1334df143a5041f03a22808b59c76698770b74692815Selim Gurun * of a given entity. 1335df143a5041f03a22808b59c76698770b74692815Selim Gurun * 1336df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns 0 in case of success, -1 otherwise 1337df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 1338df143a5041f03a22808b59c76698770b74692815Selim Gurunint 1339df143a5041f03a22808b59c76698770b74692815Selim GurunxmlSwitchToEncoding(xmlParserCtxtPtr ctxt, xmlCharEncodingHandlerPtr handler) 1340df143a5041f03a22808b59c76698770b74692815Selim Gurun{ 1341df143a5041f03a22808b59c76698770b74692815Selim Gurun return (xmlSwitchToEncodingInt(ctxt, handler, -1)); 1342df143a5041f03a22808b59c76698770b74692815Selim Gurun} 1343df143a5041f03a22808b59c76698770b74692815Selim Gurun 1344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 1345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Commodity functions to handle entities processing * 1347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 1349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeInputStream: 1352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @input: an xmlParserInputPtr 1353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up an input stream. 1355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeInputStream(xmlParserInputPtr input) { 1358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input == NULL) return; 1359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input->filename != NULL) xmlFree((char *) input->filename); 1361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input->directory != NULL) xmlFree((char *) input->directory); 1362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input->encoding != NULL) xmlFree((char *) input->encoding); 1363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input->version != NULL) xmlFree((char *) input->version); 1364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((input->free != NULL) && (input->base != NULL)) 1365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->free((xmlChar *) input->base); 1366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input->buf != NULL) 1367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeParserInputBuffer(input->buf); 1368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(input); 1369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewInputStream: 1373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XML parser context 1374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new input stream structure 1376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new input stream or NULL 1377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputPtr 1379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNewInputStream(xmlParserCtxtPtr ctxt) { 1380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr input; 1381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project static int id = 0; 1382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input = (xmlParserInputPtr) xmlMalloc(sizeof(xmlParserInput)); 1384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input == NULL) { 1385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrMemory(ctxt, "couldn't allocate a new input stream\n"); 1386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(input, 0, sizeof(xmlParserInput)); 1389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->line = 1; 1390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->col = 1; 1391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->standalone = -1; 1392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * we don't care about thread reentrancy unicity for a single 1394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parser context (and hence thread) is sufficient. 1395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->id = id++; 1397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(input); 1398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewIOInputStream: 1402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XML parser context 1403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @input: an I/O Input 1404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @enc: the charset encoding if known 1405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new input stream structure encapsulating the @input into 1407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a stream suitable for the parser. 1408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new input stream or NULL 1410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputPtr 1412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNewIOInputStream(xmlParserCtxtPtr ctxt, xmlParserInputBufferPtr input, 1413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCharEncoding enc) { 1414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr inputStream; 1415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input == NULL) return(NULL); 1417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlParserDebugEntities) 1418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "new input from I/O\n"); 1419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputStream = xmlNewInputStream(ctxt); 1420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (inputStream == NULL) { 1421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputStream->filename = NULL; 1424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputStream->buf = input; 1425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputStream->base = inputStream->buf->buffer->content; 1426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputStream->cur = inputStream->buf->buffer->content; 1427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputStream->end = &inputStream->base[inputStream->buf->buffer->use]; 1428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (enc != XML_CHAR_ENCODING_NONE) { 1429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSwitchEncoding(ctxt, enc); 1430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(inputStream); 1433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewEntityInputStream: 1437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XML parser context 1438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @entity: an Entity pointer 1439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new input stream based on an xmlEntityPtr 1441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new input stream or NULL 1443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputPtr 1445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNewEntityInputStream(xmlParserCtxtPtr ctxt, xmlEntityPtr entity) { 1446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr input; 1447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (entity == NULL) { 1449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrInternal(ctxt, "xmlNewEntityInputStream entity = NULL\n", 1450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 1451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlParserDebugEntities) 1454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "new input from entity: %s\n", entity->name); 1456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (entity->content == NULL) { 1457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (entity->etype) { 1458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: 1459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrInternal(ctxt, "Cannot parse entity %s\n", 1460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entity->name); 1461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXTERNAL_GENERAL_PARSED_ENTITY: 1463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXTERNAL_PARAMETER_ENTITY: 1464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlLoadExternalEntity((char *) entity->URI, 1465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (char *) entity->ExternalID, ctxt)); 1466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_INTERNAL_GENERAL_ENTITY: 1467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrInternal(ctxt, 1468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal entity %s without content !\n", 1469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entity->name); 1470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_INTERNAL_PARAMETER_ENTITY: 1472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrInternal(ctxt, 1473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal parameter entity %s without content !\n", 1474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entity->name); 1475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_INTERNAL_PREDEFINED_ENTITY: 1477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrInternal(ctxt, 1478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Predefined entity %s without content !\n", 1479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entity->name); 1480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input = xmlNewInputStream(ctxt); 1485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input == NULL) { 1486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 148860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (entity->URI != NULL) 148960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott input->filename = (char *) xmlStrdup((xmlChar *) entity->URI); 1490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->base = entity->content; 1491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->cur = entity->content; 1492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->length = entity->length; 1493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->end = &entity->content[input->length]; 1494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(input); 1495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewStringInputStream: 1499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XML parser context 1500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer: an memory buffer 1501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new input stream based on a memory buffer. 1503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new input stream 1504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputPtr 1506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNewStringInputStream(xmlParserCtxtPtr ctxt, const xmlChar *buffer) { 1507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr input; 1508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buffer == NULL) { 1510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrInternal(ctxt, "xmlNewStringInputStream string = NULL\n", 1511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 1512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlParserDebugEntities) 1515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "new fixed input: %.30s\n", buffer); 1517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input = xmlNewInputStream(ctxt); 1518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input == NULL) { 1519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrMemory(ctxt, "couldn't allocate a new input stream\n"); 1520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->base = buffer; 1523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->cur = buffer; 1524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->length = xmlStrlen(buffer); 1525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->end = &buffer[input->length]; 1526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(input); 1527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewInputFromFile: 1531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XML parser context 1532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename: the filename to use as entity 1533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new input stream based on a file or an URL. 1535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new input stream or NULL in case of error 1537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserInputPtr 1539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNewInputFromFile(xmlParserCtxtPtr ctxt, const char *filename) { 1540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputBufferPtr buf; 1541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr inputStream; 1542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *directory = NULL; 1543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *URI = NULL; 1544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlParserDebugEntities) 1546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 1547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "new input from file: %s\n", filename); 1548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return(NULL); 1549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf = xmlParserInputBufferCreateFilename(filename, XML_CHAR_ENCODING_NONE); 1550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buf == NULL) { 1551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (filename == NULL) 1552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlLoaderErr(ctxt, 1553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "failed to load external entity: NULL filename \n", 1554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 1555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlLoaderErr(ctxt, "failed to load external entity \"%s\"\n", 1557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) filename); 1558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputStream = xmlNewInputStream(ctxt); 1562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (inputStream == NULL) 1563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputStream->buf = buf; 1566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputStream = xmlCheckHTTPInput(ctxt, inputStream); 1567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (inputStream == NULL) 1568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (inputStream->filename == NULL) 1571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URI = xmlStrdup((xmlChar *) filename); 1572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URI = xmlStrdup((xmlChar *) inputStream->filename); 1574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project directory = xmlParserGetDirectory((const char *) URI); 1575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (inputStream->filename != NULL) xmlFree((char *)inputStream->filename); 1576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputStream->filename = (char *) xmlCanonicPath((const xmlChar *) URI); 1577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (URI != NULL) xmlFree((char *) URI); 1578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputStream->directory = directory; 1579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputStream->base = inputStream->buf->buffer->content; 1581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputStream->cur = inputStream->buf->buffer->content; 1582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputStream->end = &inputStream->base[inputStream->buf->buffer->use]; 1583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->directory == NULL) && (directory != NULL)) 1584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->directory = (char *) xmlStrdup((const xmlChar *) directory); 1585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(inputStream); 1586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 1589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Commodity functions to handle parser contexts * 1591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 1593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlInitParserCtxt: 1596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XML parser context 1597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initialize a parser context 1599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success and -1 in case of error 1601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlInitParserCtxt(xmlParserCtxtPtr ctxt) 1605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr input; 1607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(ctxt==NULL) { 1609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrInternal(NULL, "Got NULL parser context\n", NULL); 1610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDefaultSAXHandlerInit(); 1614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->dict == NULL) 1616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->dict = xmlDictCreate(); 1617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->dict == NULL) { 1618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrMemory(NULL, "cannot initialize parser context\n"); 1619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->sax == NULL) 1622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler)); 1623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->sax == NULL) { 1624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrMemory(NULL, "cannot initialize parser context\n"); 1625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSAXVersion(ctxt->sax, 2); 1629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxatts = 0; 1631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atts = NULL; 1632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Allocate the Input stack */ 1633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->inputTab == NULL) { 1634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inputTab = (xmlParserInputPtr *) 1635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(5 * sizeof(xmlParserInputPtr)); 1636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inputMax = 5; 1637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->inputTab == NULL) { 1639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrMemory(NULL, "cannot initialize parser context\n"); 1640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inputNr = 0; 1641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inputMax = 0; 1642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input = NULL; 1643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((input = inputPop(ctxt)) != NULL) { /* Non consuming */ 1646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeInputStream(input); 1647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inputNr = 0; 1649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input = NULL; 1650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->version = NULL; 1652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->encoding = NULL; 1653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->standalone = -1; 1654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->hasExternalSubset = 0; 1655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->hasPErefs = 0; 1656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->html = 0; 1657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->external = 0; 1658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_START; 1659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->token = 0; 1660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->directory = NULL; 1661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Allocate the Node stack */ 1663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nodeTab == NULL) { 1664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeTab = (xmlNodePtr *) xmlMalloc(10 * sizeof(xmlNodePtr)); 1665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeMax = 10; 1666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nodeTab == NULL) { 1668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrMemory(NULL, "cannot initialize parser context\n"); 1669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeNr = 0; 1670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeMax = 0; 1671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->node = NULL; 1672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inputNr = 0; 1673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inputMax = 0; 1674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input = NULL; 1675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeNr = 0; 1678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->node = NULL; 1679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Allocate the Name stack */ 1681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nameTab == NULL) { 1682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nameTab = (const xmlChar **) xmlMalloc(10 * sizeof(xmlChar *)); 1683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nameMax = 10; 1684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nameTab == NULL) { 1686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrMemory(NULL, "cannot initialize parser context\n"); 1687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeNr = 0; 1688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeMax = 0; 1689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->node = NULL; 1690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inputNr = 0; 1691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inputMax = 0; 1692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input = NULL; 1693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nameNr = 0; 1694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nameMax = 0; 1695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->name = NULL; 1696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nameNr = 0; 1699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->name = NULL; 1700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Allocate the space stack */ 1702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->spaceTab == NULL) { 1703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->spaceTab = (int *) xmlMalloc(10 * sizeof(int)); 1704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->spaceMax = 10; 1705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->spaceTab == NULL) { 1707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrMemory(NULL, "cannot initialize parser context\n"); 1708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeNr = 0; 1709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeMax = 0; 1710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->node = NULL; 1711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inputNr = 0; 1712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inputMax = 0; 1713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input = NULL; 1714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nameNr = 0; 1715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nameMax = 0; 1716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->name = NULL; 1717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->spaceNr = 0; 1718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->spaceMax = 0; 1719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->space = NULL; 1720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->spaceNr = 1; 1723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->spaceMax = 10; 1724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->spaceTab[0] = -1; 1725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->space = &ctxt->spaceTab[0]; 1726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->userData = ctxt; 1727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->myDoc = NULL; 1728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->wellFormed = 1; 1729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nsWellFormed = 1; 1730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valid = 1; 1731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->loadsubset = xmlLoadExtDtdDefaultValue; 1732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->validate = xmlDoValidityCheckingDefaultValue; 1733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pedantic = xmlPedanticParserDefaultValue; 1734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->linenumbers = xmlLineNumbersDefaultValue; 1735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->keepBlanks = xmlKeepBlanksDefaultValue; 1736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->keepBlanks == 0) 1737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->ignorableWhitespace = xmlSAX2IgnorableWhitespace; 1738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vctxt.finishDtd = XML_CTXT_FINISH_DTD_0; 1740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vctxt.userData = ctxt; 1741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vctxt.error = xmlParserValidityError; 1742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vctxt.warning = xmlParserValidityWarning; 1743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->validate) { 1744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlGetWarningsDefaultValue == 0) 1745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vctxt.warning = NULL; 1746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vctxt.warning = xmlParserValidityWarning; 1748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vctxt.nodeMax = 0; 1749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->replaceEntities = xmlSubstituteEntitiesDefaultValue; 1751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->record_info = 0; 1752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbChars = 0; 1753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->checkIndex = 0; 1754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inSubset = 0; 1755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = XML_ERR_OK; 1756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->depth = 0; 1757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->charset = XML_CHAR_ENCODING_UTF8; 1758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->catalogs = NULL; 175960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ctxt->nbentities = 0; 1760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitNodeInfoSeq(&ctxt->node_seq); 1761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeParserCtxt: 1766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XML parser context 1767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free all the memory used by a parser context. However the parsed 1769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * document in ctxt->myDoc is not freed. 1770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeParserCtxt(xmlParserCtxtPtr ctxt) 1774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr input; 1776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return; 1778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((input = inputPop(ctxt)) != NULL) { /* Non consuming */ 1780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeInputStream(input); 1781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->spaceTab != NULL) xmlFree(ctxt->spaceTab); 1783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nameTab != NULL) xmlFree((xmlChar * *)ctxt->nameTab); 1784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nodeTab != NULL) xmlFree(ctxt->nodeTab); 1785df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->nodeInfoTab != NULL) xmlFree(ctxt->nodeInfoTab); 1786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->inputTab != NULL) xmlFree(ctxt->inputTab); 1787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->version != NULL) xmlFree((char *) ctxt->version); 1788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->encoding != NULL) xmlFree((char *) ctxt->encoding); 1789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->extSubURI != NULL) xmlFree((char *) ctxt->extSubURI); 1790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->extSubSystem != NULL) xmlFree((char *) ctxt->extSubSystem); 1791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_SAX1_ENABLED 1792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax != NULL) && 1793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->sax != (xmlSAXHandlerPtr) &xmlDefaultSAXHandler)) 1794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 1795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->sax != NULL) 1796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_SAX1_ENABLED */ 1797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->sax); 1798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->directory != NULL) xmlFree((char *) ctxt->directory); 1799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->vctxt.nodeTab != NULL) xmlFree(ctxt->vctxt.nodeTab); 1800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->atts != NULL) xmlFree((xmlChar * *)ctxt->atts); 1801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->dict != NULL) xmlDictFree(ctxt->dict); 1802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nsTab != NULL) xmlFree((char *) ctxt->nsTab); 1803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->pushTab != NULL) xmlFree(ctxt->pushTab); 1804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->attallocs != NULL) xmlFree(ctxt->attallocs); 1805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->attsDefault != NULL) 1806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(ctxt->attsDefault, (xmlHashDeallocator) xmlFree); 1807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->attsSpecial != NULL) 1808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(ctxt->attsSpecial, NULL); 1809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->freeElems != NULL) { 1810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur, next; 1811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->freeElems; 1813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 1814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = cur->next; 1815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(cur); 1816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = next; 1817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->freeAttrs != NULL) { 1820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr cur, next; 1821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->freeAttrs; 1823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 1824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = cur->next; 1825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(cur); 1826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = next; 1827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * cleanup the error strings 1831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->lastError.message != NULL) 1833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->lastError.message); 1834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->lastError.file != NULL) 1835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->lastError.file); 1836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->lastError.str1 != NULL) 1837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->lastError.str1); 1838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->lastError.str2 != NULL) 1839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->lastError.str2); 1840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->lastError.str3 != NULL) 1841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->lastError.str3); 1842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_CATALOG_ENABLED 1844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->catalogs != NULL) 1845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCatalogFreeLocal(ctxt->catalogs); 1846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt); 1848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewParserCtxt: 1852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate and initialize a new parser context. 1854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlParserCtxtPtr or NULL 1856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserCtxtPtr 1859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNewParserCtxt(void) 1860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserCtxtPtr ctxt; 1862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = (xmlParserCtxtPtr) xmlMalloc(sizeof(xmlParserCtxt)); 1864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) { 1865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrMemory(NULL, "cannot allocate parser context\n"); 1866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ctxt, 0, sizeof(xmlParserCtxt)); 1869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlInitParserCtxt(ctxt) < 0) { 1870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeParserCtxt(ctxt); 1871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt); 1874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 1877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handling of node informations * 1879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 1881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlClearParserCtxt: 1884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XML parser context 1885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Clear (release owned resources) and reinitialize a parser context 1887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlClearParserCtxt(xmlParserCtxtPtr ctxt) 1891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt==NULL) 1893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlClearNodeInfoSeq(&ctxt->node_seq); 1895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCtxtReset(ctxt); 1896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserFindNodeInfo: 1901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: an XML parser context 1902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: an XML node within the tree 1903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find the parser node info struct for a given node 1905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns an xmlParserNodeInfo block pointer or NULL 1907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectconst xmlParserNodeInfo * 1909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserFindNodeInfo(const xmlParserCtxtPtr ctx, const xmlNodePtr node) 1910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned long pos; 1912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctx == NULL) || (node == NULL)) 1914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Find position where node should be at */ 1916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pos = xmlParserFindNodeInfoIndex(&ctx->node_seq, node); 1917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (pos < ctx->node_seq.length 1918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && ctx->node_seq.buffer[pos].node == node) 1919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return &ctx->node_seq.buffer[pos]; 1920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return NULL; 1922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlInitNodeInfoSeq: 1927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @seq: a node info sequence pointer 1928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * -- Initialize (set to initial state) node info sequence 1930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlInitNodeInfoSeq(xmlParserNodeInfoSeqPtr seq) 1933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (seq == NULL) 1935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project seq->length = 0; 1937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project seq->maximum = 0; 1938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project seq->buffer = NULL; 1939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlClearNodeInfoSeq: 1943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @seq: a node info sequence pointer 1944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * -- Clear (release memory and reinitialize) node 1946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * info sequence 1947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlClearNodeInfoSeq(xmlParserNodeInfoSeqPtr seq) 1950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (seq == NULL) 1952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (seq->buffer != NULL) 1954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(seq->buffer); 1955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitNodeInfoSeq(seq); 1956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserFindNodeInfoIndex: 1960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @seq: a node info sequence pointer 1961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: an XML node pointer 1962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserFindNodeInfoIndex : Find the index that the info record for 1965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the given node is or should be at in a sorted sequence 1966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a long indicating the position of the record 1968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectunsigned long 1970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserFindNodeInfoIndex(const xmlParserNodeInfoSeqPtr seq, 1971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlNodePtr node) 1972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned long upper, lower, middle; 1974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int found = 0; 1975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((seq == NULL) || (node == NULL)) 1977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ((unsigned long) -1); 1978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Do a binary search for the key */ 1980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lower = 1; 1981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project upper = seq->length; 1982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project middle = 0; 1983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (lower <= upper && !found) { 1984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project middle = lower + (upper - lower) / 2; 1985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == seq->buffer[middle - 1].node) 1986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project found = 1; 1987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (node < seq->buffer[middle - 1].node) 1988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project upper = middle - 1; 1989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lower = middle + 1; 1991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Return position */ 1994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (middle == 0 || seq->buffer[middle - 1].node < node) 1995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return middle; 1996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return middle - 1; 1998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserAddNodeInfo: 2003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XML parser context 2004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @info: a node info sequence pointer 2005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Insert node info record into the sorted sequence 2007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 2009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserAddNodeInfo(xmlParserCtxtPtr ctxt, 2010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlParserNodeInfoPtr info) 2011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned long pos; 2013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (info == NULL)) return; 2015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Find pos and check to see if node is already in the sequence */ 2017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pos = xmlParserFindNodeInfoIndex(&ctxt->node_seq, (xmlNodePtr) 2018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project info->node); 2019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((pos < ctxt->node_seq.length) && 2021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->node_seq.buffer != NULL) && 2022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->node_seq.buffer[pos].node == info->node)) { 2023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->node_seq.buffer[pos] = *info; 2024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Otherwise, we need to add new node to buffer */ 2027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 2028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->node_seq.length + 1 > ctxt->node_seq.maximum) { 2029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserNodeInfo *tmp_buffer; 2030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int byte_size; 2031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->node_seq.maximum == 0) 2033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->node_seq.maximum = 2; 2034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project byte_size = (sizeof(*ctxt->node_seq.buffer) * 2035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (2 * ctxt->node_seq.maximum)); 2036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->node_seq.buffer == NULL) 2038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp_buffer = (xmlParserNodeInfo *) xmlMalloc(byte_size); 2039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp_buffer = 2041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlParserNodeInfo *) xmlRealloc(ctxt->node_seq.buffer, 2042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project byte_size); 2043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp_buffer == NULL) { 2045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrMemory(ctxt, "failed to allocate buffer\n"); 2046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 2047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->node_seq.buffer = tmp_buffer; 2049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->node_seq.maximum *= 2; 2050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* If position is not at end, move elements out of the way */ 2053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (pos != ctxt->node_seq.length) { 2054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned long i; 2055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = ctxt->node_seq.length; i > pos; i--) 2057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->node_seq.buffer[i] = ctxt->node_seq.buffer[i - 1]; 2058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Copy element and increase length */ 2061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->node_seq.buffer[pos] = *info; 2062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->node_seq.length++; 2063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 2067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Defaults settings * 2069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 2071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlPedanticParserDefault: 2073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: int 0 or 1 2074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set and return the previous value for enabling pedantic warnings. 2076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the last value for 0 for no substitution, 1 for substitution. 2078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPedanticParserDefault(int val) { 2082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int old = xmlPedanticParserDefaultValue; 2083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPedanticParserDefaultValue = val; 2085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(old); 2086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlLineNumbersDefault: 2090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: int 0 or 1 2091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set and return the previous value for enabling line numbers in elements 2093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * contents. This may break on old application and is turned off by default. 2094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the last value for 0 for no substitution, 1 for substitution. 2096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlLineNumbersDefault(int val) { 2100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int old = xmlLineNumbersDefaultValue; 2101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlLineNumbersDefaultValue = val; 2103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(old); 2104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSubstituteEntitiesDefault: 2108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: int 0 or 1 2109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set and return the previous value for default entity support. 2111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initially the parser always keep entity references instead of substituting 2112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * entity values in the output. This function has to be used to change the 2113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * default parser behavior 2114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SAX::substituteEntities() has to be used for changing that on a file by 2115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * file basis. 2116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the last value for 0 for no substitution, 1 for substitution. 2118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSubstituteEntitiesDefault(int val) { 2122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int old = xmlSubstituteEntitiesDefaultValue; 2123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSubstituteEntitiesDefaultValue = val; 2125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(old); 2126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlKeepBlanksDefault: 2130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: int 0 or 1 2131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set and return the previous value for default blanks text nodes support. 2133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The 1.x version of the parser used an heuristic to try to detect 2134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ignorable white spaces. As a result the SAX callback was generating 2135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSAX2IgnorableWhitespace() callbacks instead of characters() one, and when 2136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * using the DOM output text nodes containing those blanks were not generated. 2137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The 2.x and later version will switch to the XML standard way and 2138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ignorableWhitespace() are only generated when running the parser in 2139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * validating mode and when the current element doesn't allow CDATA or 2140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * mixed content. 2141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This function is provided as a way to force the standard behavior 2142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * on 1.X libs and to switch back to the old mode for compatibility when 2143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * running 1.X client code on 2.X . Upgrade of 1.X code should be done 2144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by using xmlIsBlankNode() commodity function to detect the "empty" 2145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nodes generated. 2146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This value also affect autogeneration of indentation when saving code 2147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if blanks sections are kept, indentation is not generated. 2148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the last value for 0 for no substitution, 1 for substitution. 2150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlKeepBlanksDefault(int val) { 2154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int old = xmlKeepBlanksDefaultValue; 2155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlKeepBlanksDefaultValue = val; 2157df143a5041f03a22808b59c76698770b74692815Selim Gurun if (!val) xmlIndentTreeOutput = 1; 2158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(old); 2159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_parserInternals 2162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h" 2163