1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * HTMLparser.c : an HTML 4.0 non-verifying parser 3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See Copyright for the status of this software. 5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * daniel@veillard.com 7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IN_LIBXML 10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h" 11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_HTML_ENABLED 12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h> 14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_CTYPE_H 15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <ctype.h> 16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_STDLIB_H 18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <stdlib.h> 19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_SYS_STAT_H 21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <sys/stat.h> 22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_FCNTL_H 24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <fcntl.h> 25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_UNISTD_H 27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <unistd.h> 28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_ZLIB_H 30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <zlib.h> 31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlmemory.h> 34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/tree.h> 35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parser.h> 36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parserInternals.h> 37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlerror.h> 38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/HTMLparser.h> 39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/HTMLtree.h> 40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/entities.h> 41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/encoding.h> 42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/valid.h> 43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlIO.h> 44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/globals.h> 45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/uri.h> 46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define HTML_MAX_NAMELEN 1000 48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define HTML_PARSER_BIG_BUFFER_SIZE 1000 49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define HTML_PARSER_BUFFER_SIZE 100 50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG */ 52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_PUSH */ 53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int htmlOmittedDefaultValue = 1; 55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar * htmlDecodeEntities(htmlParserCtxtPtr ctxt, int len, 57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar end, xmlChar end2, xmlChar end3); 58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void htmlParseComment(htmlParserCtxtPtr ctxt); 59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 62df143a5041f03a22808b59c76698770b74692815Selim Gurun * Some factorized error routines * 63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlErrMemory: 68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of attribute error 72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlErrMemory(xmlParserCtxtPtr ctxt, const char *extra) 75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->disableSAX != 0) && 77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->instate == XML_PARSER_EOF)) 78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = XML_ERR_NO_MEMORY; 81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_EOF; 82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->disableSAX = 1; 83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (extra) 85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, 86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, 87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, 0, 0, 88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Memory allocation failed : %s\n", extra); 89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, 91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL, 92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, 0, 0, "Memory allocation failed\n"); 93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseErr: 97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error number 99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the error message 100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: string infor 101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2: string infor 102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a fatal parser error, i.e. violating Well-Formedness constraints 104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, 107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *msg, const xmlChar *str1, const xmlChar *str2) 108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->disableSAX != 0) && 110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->instate == XML_PARSER_EOF)) 111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) 113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = error; 114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_HTML, error, 115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_ERROR, NULL, 0, 116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) str1, (const char *) str2, 117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, 0, 0, 118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project msg, str1, str2); 119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) 120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->wellFormed = 0; 121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseErrInt: 125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error number 127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the error message 128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: integer info 129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a fatal parser error, i.e. violating Well-Formedness constraints 131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseErrInt(xmlParserCtxtPtr ctxt, xmlParserErrors error, 134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *msg, int val) 135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->disableSAX != 0) && 137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->instate == XML_PARSER_EOF)) 138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) 140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = error; 141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_HTML, error, 142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_ERROR, NULL, 0, NULL, NULL, 143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, val, 0, msg, val); 144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) 145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->wellFormed = 0; 146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 150df143a5041f03a22808b59c76698770b74692815Selim Gurun * Parser stacks related functions and macros * 151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlnamePush: 156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the element name 158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pushes a new element name on top of the name stack 160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of error, the index in the stack otherwise 162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlnamePush(htmlParserCtxtPtr ctxt, const xmlChar * value) 165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 166df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((ctxt->html < 3) && (xmlStrEqual(value, BAD_CAST "head"))) 167df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->html = 3; 168df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((ctxt->html < 10) && (xmlStrEqual(value, BAD_CAST "body"))) 169df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->html = 10; 170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nameNr >= ctxt->nameMax) { 171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nameMax *= 2; 172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nameTab = (const xmlChar * *) 173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRealloc((xmlChar * *)ctxt->nameTab, 174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nameMax * 175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(ctxt->nameTab[0])); 176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nameTab == NULL) { 177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlErrMemory(ctxt, NULL); 178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nameTab[ctxt->nameNr] = value; 182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->name = value; 183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ctxt->nameNr++); 184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlnamePop: 187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops the top element name from the name stack 190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the name just removed 192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar * 194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlnamePop(htmlParserCtxtPtr ctxt) 195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *ret; 197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nameNr <= 0) 199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nameNr--; 201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nameNr < 0) 202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nameNr > 0) 204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->name = ctxt->nameTab[ctxt->nameNr - 1]; 205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->name = NULL; 207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ctxt->nameTab[ctxt->nameNr]; 208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nameTab[ctxt->nameNr] = NULL; 209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 212df143a5041f03a22808b59c76698770b74692815Selim Gurun/** 213df143a5041f03a22808b59c76698770b74692815Selim Gurun * htmlNodeInfoPush: 214df143a5041f03a22808b59c76698770b74692815Selim Gurun * @ctxt: an HTML parser context 215df143a5041f03a22808b59c76698770b74692815Selim Gurun * @value: the node info 216df143a5041f03a22808b59c76698770b74692815Selim Gurun * 217df143a5041f03a22808b59c76698770b74692815Selim Gurun * Pushes a new element name on top of the node info stack 218df143a5041f03a22808b59c76698770b74692815Selim Gurun * 219df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns 0 in case of error, the index in the stack otherwise 220df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 221df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic int 222df143a5041f03a22808b59c76698770b74692815Selim GurunhtmlNodeInfoPush(htmlParserCtxtPtr ctxt, htmlParserNodeInfo *value) 223df143a5041f03a22808b59c76698770b74692815Selim Gurun{ 224df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->nodeInfoNr >= ctxt->nodeInfoMax) { 225df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->nodeInfoMax == 0) 226df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->nodeInfoMax = 5; 227df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->nodeInfoMax *= 2; 228df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->nodeInfoTab = (htmlParserNodeInfo *) 229df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlRealloc((htmlParserNodeInfo *)ctxt->nodeInfoTab, 230df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->nodeInfoMax * 231df143a5041f03a22808b59c76698770b74692815Selim Gurun sizeof(ctxt->nodeInfoTab[0])); 232df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->nodeInfoTab == NULL) { 233df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlErrMemory(ctxt, NULL); 234df143a5041f03a22808b59c76698770b74692815Selim Gurun return (0); 235df143a5041f03a22808b59c76698770b74692815Selim Gurun } 236df143a5041f03a22808b59c76698770b74692815Selim Gurun } 237df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->nodeInfoTab[ctxt->nodeInfoNr] = *value; 238df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->nodeInfo = &ctxt->nodeInfoTab[ctxt->nodeInfoNr]; 239df143a5041f03a22808b59c76698770b74692815Selim Gurun return (ctxt->nodeInfoNr++); 240df143a5041f03a22808b59c76698770b74692815Selim Gurun} 241df143a5041f03a22808b59c76698770b74692815Selim Gurun 242df143a5041f03a22808b59c76698770b74692815Selim Gurun/** 243df143a5041f03a22808b59c76698770b74692815Selim Gurun * htmlNodeInfoPop: 244df143a5041f03a22808b59c76698770b74692815Selim Gurun * @ctxt: an HTML parser context 245df143a5041f03a22808b59c76698770b74692815Selim Gurun * 246df143a5041f03a22808b59c76698770b74692815Selim Gurun * Pops the top element name from the node info stack 247df143a5041f03a22808b59c76698770b74692815Selim Gurun * 248df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns 0 in case of error, the pointer to NodeInfo otherwise 249df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 250df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic htmlParserNodeInfo * 251df143a5041f03a22808b59c76698770b74692815Selim GurunhtmlNodeInfoPop(htmlParserCtxtPtr ctxt) 252df143a5041f03a22808b59c76698770b74692815Selim Gurun{ 253df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->nodeInfoNr <= 0) 254df143a5041f03a22808b59c76698770b74692815Selim Gurun return (NULL); 255df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->nodeInfoNr--; 256df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->nodeInfoNr < 0) 257df143a5041f03a22808b59c76698770b74692815Selim Gurun return (NULL); 258df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->nodeInfoNr > 0) 259df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->nodeInfo = &ctxt->nodeInfoTab[ctxt->nodeInfoNr - 1]; 260df143a5041f03a22808b59c76698770b74692815Selim Gurun else 261df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->nodeInfo = NULL; 262df143a5041f03a22808b59c76698770b74692815Selim Gurun return &ctxt->nodeInfoTab[ctxt->nodeInfoNr]; 263df143a5041f03a22808b59c76698770b74692815Selim Gurun} 264df143a5041f03a22808b59c76698770b74692815Selim Gurun 265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Macros for accessing the content. Those should be used only by the parser, 267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and not exported. 268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dirty macros, i.e. one need to make assumption on the context to use them 270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * CUR_PTR return the current pointer to the xmlChar to be parsed. 272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * CUR returns the current xmlChar value, i.e. a 8 bit value if compiled 273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in ISO-Latin or UTF-8, and the current 16 bit value if compiled 274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in UNICODE mode. This should be used internally by the parser 275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * only to compare to ASCII values otherwise it would break when 276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * running with UTF-8 encoding. 277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NXT(n) returns the n'th next xmlChar. Same as CUR is should be used only 278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to compare on ASCII based substring. 279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * UPP(n) returns the n'th next xmlChar converted to uppercase. Same as CUR 280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it should be used only to compare on ASCII based substring. 281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SKIP(n) Skip n xmlChar, and must also be used only to skip ASCII defined 282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * strings without newlines within the parser. 283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Clean macros, not dependent of an ASCII context, expect UTF-8 encoding 285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * CURRENT Returns the current char value, with the full decoding of 287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * UTF-8 if we are using this mode. It returns an int. 288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NEXT Skip to the next character, this does the proper decoding 289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in UTF-8 mode. It also pop-up unfinished entities on the fly. 290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NEXTL(l) Skip the current unicode character of l xmlChars long. 291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * COPY(to) copy one char to *to, increment CUR_PTR and to accordingly 292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define UPPER (toupper(*ctxt->input->cur)) 295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SKIP(val) ctxt->nbChars += (val),ctxt->input->cur += (val),ctxt->input->col+=(val) 297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NXT(val) ctxt->input->cur[(val)] 299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define UPP(val) (toupper(ctxt->input->cur[(val)])) 301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR_PTR ctxt->input->cur 303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SHRINK if ((ctxt->input->cur - ctxt->input->base > 2 * INPUT_CHUNK) && \ 305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->input->end - ctxt->input->cur < 2 * INPUT_CHUNK)) \ 306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputShrink(ctxt->input) 307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define GROW if ((ctxt->progressive == 0) && \ 309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->input->end - ctxt->input->cur < INPUT_CHUNK)) \ 310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputGrow(ctxt->input, INPUT_CHUNK) 311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CURRENT ((int) (*ctxt->input->cur)) 313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SKIP_BLANKS htmlSkipBlankChars(ctxt) 315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* Inported from XML */ 317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define CUR (ctxt->token ? ctxt->token : (int) (*ctxt->input->cur)) */ 319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR ((int) (*ctxt->input->cur)) 320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NEXT xmlNextChar(ctxt) 321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define RAW (ctxt->token ? -1 : (*ctxt->input->cur)) 323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NEXTL(l) do { \ 326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*(ctxt->input->cur) == '\n') { \ 327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->line++; ctxt->input->col = 1; \ 328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else ctxt->input->col++; \ 329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->token = 0; ctxt->input->cur += l; ctxt->nbChars++; \ 330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (0) 331df143a5041f03a22808b59c76698770b74692815Selim Gurun 332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************ 333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project \ 334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); \ 335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*ctxt->input->cur == '&') xmlParserHandleReference(ctxt); 336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************/ 337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR_CHAR(l) htmlCurrentChar(ctxt, &l) 339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR_SCHAR(s, l) xmlStringCurrentChar(ctxt, s, &l) 340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define COPY_BUF(l,b,i,v) \ 342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l == 1) b[i++] = (xmlChar) v; \ 343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else i += xmlCopyChar(l,&b[i],v) 344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 346df143a5041f03a22808b59c76698770b74692815Selim Gurun * htmlFindEncoding: 347df143a5041f03a22808b59c76698770b74692815Selim Gurun * @the HTML parser context 348df143a5041f03a22808b59c76698770b74692815Selim Gurun * 349df143a5041f03a22808b59c76698770b74692815Selim Gurun * Ty to find and encoding in the current data available in the input 350df143a5041f03a22808b59c76698770b74692815Selim Gurun * buffer this is needed to try to switch to the proper encoding when 351df143a5041f03a22808b59c76698770b74692815Selim Gurun * one face a character error. 352df143a5041f03a22808b59c76698770b74692815Selim Gurun * That's an heuristic, since it's operating outside of parsing it could 353df143a5041f03a22808b59c76698770b74692815Selim Gurun * try to use a meta which had been commented out, that's the reason it 354df143a5041f03a22808b59c76698770b74692815Selim Gurun * should only be used in case of error, not as a default. 355df143a5041f03a22808b59c76698770b74692815Selim Gurun * 356df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns an encoding string or NULL if not found, the string need to 357df143a5041f03a22808b59c76698770b74692815Selim Gurun * be freed 358df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 359df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic xmlChar * 360df143a5041f03a22808b59c76698770b74692815Selim GurunhtmlFindEncoding(xmlParserCtxtPtr ctxt) { 361df143a5041f03a22808b59c76698770b74692815Selim Gurun const xmlChar *start, *cur, *end; 362df143a5041f03a22808b59c76698770b74692815Selim Gurun 363df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((ctxt == NULL) || (ctxt->input == NULL) || 364df143a5041f03a22808b59c76698770b74692815Selim Gurun (ctxt->input->encoding != NULL) || (ctxt->input->buf == NULL) || 365df143a5041f03a22808b59c76698770b74692815Selim Gurun (ctxt->input->buf->encoder != NULL)) 366df143a5041f03a22808b59c76698770b74692815Selim Gurun return(NULL); 367df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((ctxt->input->cur == NULL) || (ctxt->input->end == NULL)) 368df143a5041f03a22808b59c76698770b74692815Selim Gurun return(NULL); 369df143a5041f03a22808b59c76698770b74692815Selim Gurun 370df143a5041f03a22808b59c76698770b74692815Selim Gurun start = ctxt->input->cur; 371df143a5041f03a22808b59c76698770b74692815Selim Gurun end = ctxt->input->end; 372df143a5041f03a22808b59c76698770b74692815Selim Gurun /* we also expect the input buffer to be zero terminated */ 373df143a5041f03a22808b59c76698770b74692815Selim Gurun if (*end != 0) 374df143a5041f03a22808b59c76698770b74692815Selim Gurun return(NULL); 375df143a5041f03a22808b59c76698770b74692815Selim Gurun 376df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = xmlStrcasestr(start, BAD_CAST "HTTP-EQUIV"); 377df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur == NULL) 378df143a5041f03a22808b59c76698770b74692815Selim Gurun return(NULL); 379df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = xmlStrcasestr(cur, BAD_CAST "CONTENT"); 380df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur == NULL) 381df143a5041f03a22808b59c76698770b74692815Selim Gurun return(NULL); 382df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = xmlStrcasestr(cur, BAD_CAST "CHARSET="); 383df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur == NULL) 384df143a5041f03a22808b59c76698770b74692815Selim Gurun return(NULL); 385df143a5041f03a22808b59c76698770b74692815Selim Gurun cur += 8; 386df143a5041f03a22808b59c76698770b74692815Selim Gurun start = cur; 387df143a5041f03a22808b59c76698770b74692815Selim Gurun while (((*cur >= 'A') && (*cur <= 'Z')) || 388df143a5041f03a22808b59c76698770b74692815Selim Gurun ((*cur >= 'a') && (*cur <= 'z')) || 389df143a5041f03a22808b59c76698770b74692815Selim Gurun ((*cur >= '0') && (*cur <= '9')) || 390df143a5041f03a22808b59c76698770b74692815Selim Gurun (*cur == '-') || (*cur == '_') || (*cur == ':') || (*cur == '/')) 391df143a5041f03a22808b59c76698770b74692815Selim Gurun cur++; 392df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur == start) 393df143a5041f03a22808b59c76698770b74692815Selim Gurun return(NULL); 394df143a5041f03a22808b59c76698770b74692815Selim Gurun return(xmlStrndup(start, cur - start)); 395df143a5041f03a22808b59c76698770b74692815Selim Gurun} 396df143a5041f03a22808b59c76698770b74692815Selim Gurun 397df143a5041f03a22808b59c76698770b74692815Selim Gurun/** 398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlCurrentChar: 399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the HTML parser context 400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len: pointer to the length of the char read 401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The current char value, if using UTF-8 this may actually span multiple 403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * bytes in the input buffer. Implement the end of line normalization: 404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2.11 End-of-Line Handling 405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the encoding is unspecified, in the case we find an ISO-Latin-1 406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * char, then the encoding converter is plugged in automatically. 407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the current char value and its length 409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlCurrentChar(xmlParserCtxtPtr ctxt, int *len) { 413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->instate == XML_PARSER_EOF) 414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->token != 0) { 417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 0; 418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->token); 419df143a5041f03a22808b59c76698770b74692815Selim Gurun } 420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->charset == XML_CHAR_ENCODING_UTF8) { 421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We are supposed to handle UTF8, check it's valid 423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * From rfc2044: encoding of the Unicode values on UTF-8: 424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * UCS-4 range (hex.) UTF-8 octet sequence (binary) 426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0000 0000-0000 007F 0xxxxxxx 427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0000 0080-0000 07FF 110xxxxx 10xxxxxx 428df143a5041f03a22808b59c76698770b74692815Selim Gurun * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx 429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for the 0x110000 limit too 431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const unsigned char *cur = ctxt->input->cur; 433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned char c; 434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int val; 435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = *cur; 437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (c & 0x80) { 438df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur[1] == 0) { 439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputGrow(ctxt->input, INPUT_CHUNK); 440df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = ctxt->input->cur; 441df143a5041f03a22808b59c76698770b74692815Selim Gurun } 442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur[1] & 0xc0) != 0x80) 443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto encoding_error; 444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c & 0xe0) == 0xe0) { 445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 446df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur[2] == 0) { 447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputGrow(ctxt->input, INPUT_CHUNK); 448df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = ctxt->input->cur; 449df143a5041f03a22808b59c76698770b74692815Selim Gurun } 450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur[2] & 0xc0) != 0x80) 451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto encoding_error; 452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c & 0xf0) == 0xf0) { 453df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cur[3] == 0) { 454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputGrow(ctxt->input, INPUT_CHUNK); 455df143a5041f03a22808b59c76698770b74692815Selim Gurun cur = ctxt->input->cur; 456df143a5041f03a22808b59c76698770b74692815Selim Gurun } 457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((c & 0xf8) != 0xf0) || 458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((cur[3] & 0xc0) != 0x80)) 459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto encoding_error; 460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4-byte code */ 461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 4; 462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = (cur[0] & 0x7) << 18; 463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= (cur[1] & 0x3f) << 12; 464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= (cur[2] & 0x3f) << 6; 465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= cur[3] & 0x3f; 466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3-byte code */ 468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 3; 469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = (cur[0] & 0xf) << 12; 470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= (cur[1] & 0x3f) << 6; 471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= cur[2] & 0x3f; 472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2-byte code */ 475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 2; 476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = (cur[0] & 0x1f) << 6; 477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= cur[1] & 0x3f; 478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_CHAR(val)) { 480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErrInt(ctxt, XML_ERR_INVALID_CHAR, 481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Char 0x%X out of allowed range\n", val); 482df143a5041f03a22808b59c76698770b74692815Selim Gurun } 483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(val); 484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 485df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((*ctxt->input->cur == 0) && 486df143a5041f03a22808b59c76698770b74692815Selim Gurun (ctxt->input->cur < ctxt->input->end)) { 487df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParseErrInt(ctxt, XML_ERR_INVALID_CHAR, 488df143a5041f03a22808b59c76698770b74692815Selim Gurun "Char 0x%X out of allowed range\n", 0); 489df143a5041f03a22808b59c76698770b74692815Selim Gurun *len = 1; 490df143a5041f03a22808b59c76698770b74692815Selim Gurun return(' '); 491df143a5041f03a22808b59c76698770b74692815Selim Gurun } 492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1-byte code */ 493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 1; 494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((int) *ctxt->input->cur); 495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Assume it's a fixed length encoding (1) with 499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a compatible encoding for the ASCII set, since 500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XML constructs only use < 128 chars 501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 1; 503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((int) *ctxt->input->cur < 0x80) 504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((int) *ctxt->input->cur); 505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Humm this is bad, do an automatic flow conversion 508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 509df143a5041f03a22808b59c76698770b74692815Selim Gurun { 510df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlChar * guess; 511df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlCharEncodingHandlerPtr handler; 512df143a5041f03a22808b59c76698770b74692815Selim Gurun 513df143a5041f03a22808b59c76698770b74692815Selim Gurun guess = htmlFindEncoding(ctxt); 514df143a5041f03a22808b59c76698770b74692815Selim Gurun if (guess == NULL) { 515df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlSwitchEncoding(ctxt, XML_CHAR_ENCODING_8859_1); 516df143a5041f03a22808b59c76698770b74692815Selim Gurun } else { 517df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->input->encoding != NULL) 518df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlFree((xmlChar *) ctxt->input->encoding); 519df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->input->encoding = guess; 520df143a5041f03a22808b59c76698770b74692815Selim Gurun handler = xmlFindCharEncodingHandler((const char *) guess); 521df143a5041f03a22808b59c76698770b74692815Selim Gurun if (handler != NULL) { 522df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlSwitchToEncoding(ctxt, handler); 523df143a5041f03a22808b59c76698770b74692815Selim Gurun } else { 524df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParseErr(ctxt, XML_ERR_INVALID_ENCODING, 525df143a5041f03a22808b59c76698770b74692815Selim Gurun "Unsupported encoding %s", guess, NULL); 526df143a5041f03a22808b59c76698770b74692815Selim Gurun } 527df143a5041f03a22808b59c76698770b74692815Selim Gurun } 528df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->charset = XML_CHAR_ENCODING_UTF8; 529df143a5041f03a22808b59c76698770b74692815Selim Gurun } 530df143a5041f03a22808b59c76698770b74692815Selim Gurun 531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlCurrentChar(ctxt, len)); 532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectencoding_error: 534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If we detect an UTF8 error that probably mean that the 536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * input encoding didn't get properly advertized in the 537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * declaration header. Report the error and switch the encoding 538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to ISO-Latin-1 (if you don't like this policy, just declare the 539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * encoding !) 540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char buffer[150]; 543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->input->end - ctxt->input->cur >= 4) { 545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(buffer, 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", 546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->cur[0], ctxt->input->cur[1], 547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->cur[2], ctxt->input->cur[3]); 548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(buffer, 149, "Bytes: 0x%02X\n", ctxt->input->cur[0]); 550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INVALID_ENCODING, 552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Input is not proper UTF-8, indicate encoding !\n", 553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST buffer, NULL); 554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 556df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->charset = XML_CHAR_ENCODING_8859_1; 557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 1; 558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((int) *ctxt->input->cur); 559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlSkipBlankChars: 563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the HTML parser context 564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * skip all blanks character found at that point in the input streams. 566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of space chars skipped 568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlSkipBlankChars(xmlParserCtxtPtr ctxt) { 572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int res = 0; 573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*(ctxt->input->cur))) { 575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*ctxt->input->cur == 0) && 576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) { 577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPopInput(ctxt); 578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*(ctxt->input->cur) == '\n') { 580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->line++; ctxt->input->col = 1; 581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else ctxt->input->col++; 582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->cur++; 583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbChars++; 584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*ctxt->input->cur == 0) 585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputGrow(ctxt->input, INPUT_CHUNK); 586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res++; 588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res); 590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 596df143a5041f03a22808b59c76698770b74692815Selim Gurun * The list of HTML elements and their properties * 597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Start Tag: 1 means the start tag can be ommited 602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * End Tag: 1 means the end tag can be ommited 603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2 means it's forbidden (empty elements) 604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3 means the tag is stylistic and should be closed easily 605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Depr: this element is deprecated 606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * DTD: 1 means that this element is valid only in the Loose DTD 607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2 means that this element is valid only in the Frameset DTD 608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Name,Start Tag,End Tag,Save End,Empty,Deprecated,DTD,inline,Description 610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project , subElements , impliedsubelt , Attributes, userdata 611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* Definitions and a couple of vars for HTML Elements */ 614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FONTSTYLE "tt", "i", "b", "u", "s", "strike", "big", "small" 616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NB_FONTSTYLE 8 617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PHRASE "em", "strong", "dfn", "code", "samp", "kbd", "var", "cite", "abbr", "acronym" 618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NB_PHRASE 10 619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SPECIAL "a", "img", "applet", "embed", "object", "font", "basefont", "br", "script", "map", "q", "sub", "sup", "span", "bdo", "iframe" 620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NB_SPECIAL 16 621df143a5041f03a22808b59c76698770b74692815Selim Gurun#define INLINE FONTSTYLE, PHRASE, SPECIAL, FORMCTRL 622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NB_INLINE NB_PCDATA + NB_FONTSTYLE + NB_PHRASE + NB_SPECIAL + NB_FORMCTRL 623df143a5041f03a22808b59c76698770b74692815Selim Gurun#define BLOCK HEADING, LIST, "pre", "p", "dl", "div", "center", "noscript", "noframes", "blockquote", "form", "isindex", "hr", "table", "fieldset", "address" 624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NB_BLOCK NB_HEADING + NB_LIST + 14 625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FORMCTRL "input", "select", "textarea", "label", "button" 626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NB_FORMCTRL 5 627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PCDATA 628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NB_PCDATA 0 629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define HEADING "h1", "h2", "h3", "h4", "h5", "h6" 630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NB_HEADING 6 631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define LIST "ul", "ol", "dir", "menu" 632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NB_LIST 4 633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MODIFIER 634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NB_MODIFIER 0 635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FLOW BLOCK,INLINE 636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NB_FLOW NB_BLOCK + NB_INLINE 637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define EMPTY NULL 638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const html_flow[] = { FLOW, NULL } ; 641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const html_inline[] = { INLINE, NULL } ; 642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* placeholders: elts with content but no subelements */ 644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const html_pcdata[] = { NULL } ; 645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define html_cdata html_pcdata 646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* ... and for HTML Attributes */ 649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define COREATTRS "id", "class", "style", "title" 651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NB_COREATTRS 4 652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define I18N "lang", "dir" 653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NB_I18N 2 654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define EVENTS "onclick", "ondblclick", "onmousedown", "onmouseup", "onmouseover", "onmouseout", "onkeypress", "onkeydown", "onkeyup" 655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NB_EVENTS 9 656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define ATTRS COREATTRS,I18N,EVENTS 657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NB_ATTRS NB_NB_COREATTRS + NB_I18N + NB_EVENTS 658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CELLHALIGN "align", "char", "charoff" 659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NB_CELLHALIGN 3 660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CELLVALIGN "valign" 661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NB_CELLVALIGN 1 662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const html_attrs[] = { ATTRS, NULL } ; 664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const core_i18n_attrs[] = { COREATTRS, I18N, NULL } ; 665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const core_attrs[] = { COREATTRS, NULL } ; 666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const i18n_attrs[] = { I18N, NULL } ; 667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* Other declarations that should go inline ... */ 670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const a_attrs[] = { ATTRS, "charset", "type", "name", 671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "href", "hreflang", "rel", "rev", "accesskey", "shape", "coords", 672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "tabindex", "onfocus", "onblur", NULL } ; 673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const target_attr[] = { "target", NULL } ; 674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const rows_cols_attr[] = { "rows", "cols", NULL } ; 675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const alt_attr[] = { "alt", NULL } ; 676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const src_alt_attrs[] = { "src", "alt", NULL } ; 677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const href_attrs[] = { "href", NULL } ; 678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const clear_attrs[] = { "clear", NULL } ; 679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const inline_p[] = { INLINE, "p", NULL } ; 680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const flow_param[] = { FLOW, "param", NULL } ; 682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const applet_attrs[] = { COREATTRS , "codebase", 683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "archive", "alt", "name", "height", "width", "align", 684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "hspace", "vspace", NULL } ; 685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const area_attrs[] = { "shape", "coords", "href", "nohref", 686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "tabindex", "accesskey", "onfocus", "onblur", NULL } ; 687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const basefont_attrs[] = 688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { "id", "size", "color", "face", NULL } ; 689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const quote_attrs[] = { ATTRS, "cite", NULL } ; 690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const body_contents[] = { FLOW, "ins", "del", NULL } ; 691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const body_attrs[] = { ATTRS, "onload", "onunload", NULL } ; 692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const body_depr[] = { "background", "bgcolor", "text", 693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "link", "vlink", "alink", NULL } ; 694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const button_attrs[] = { ATTRS, "name", "value", "type", 695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "disabled", "tabindex", "accesskey", "onfocus", "onblur", NULL } ; 696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const col_attrs[] = { ATTRS, "span", "width", CELLHALIGN, CELLVALIGN, NULL } ; 699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const col_elt[] = { "col", NULL } ; 700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const edit_attrs[] = { ATTRS, "datetime", "cite", NULL } ; 701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const compact_attrs[] = { ATTRS, "compact", NULL } ; 702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const dl_contents[] = { "dt", "dd", NULL } ; 703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const compact_attr[] = { "compact", NULL } ; 704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const label_attr[] = { "label", NULL } ; 705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const fieldset_contents[] = { FLOW, "legend" } ; 706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const font_attrs[] = { COREATTRS, I18N, "size", "color", "face" , NULL } ; 707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const form_contents[] = { HEADING, LIST, INLINE, "pre", "p", "div", "center", "noscript", "noframes", "blockquote", "isindex", "hr", "table", "fieldset", "address", NULL } ; 708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const form_attrs[] = { ATTRS, "method", "enctype", "accept", "name", "onsubmit", "onreset", "accept-charset", NULL } ; 709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const frame_attrs[] = { COREATTRS, "longdesc", "name", "src", "frameborder", "marginwidth", "marginheight", "noresize", "scrolling" , NULL } ; 710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const frameset_attrs[] = { COREATTRS, "rows", "cols", "onload", "onunload", NULL } ; 711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const frameset_contents[] = { "frameset", "frame", "noframes", NULL } ; 712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const head_attrs[] = { I18N, "profile", NULL } ; 713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const head_contents[] = { "title", "isindex", "base", "script", "style", "meta", "link", "object", NULL } ; 714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const hr_depr[] = { "align", "noshade", "size", "width", NULL } ; 715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const version_attr[] = { "version", NULL } ; 716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const html_content[] = { "head", "body", "frameset", NULL } ; 717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const iframe_attrs[] = { COREATTRS, "longdesc", "name", "src", "frameborder", "marginwidth", "marginheight", "scrolling", "align", "height", "width", NULL } ; 718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const img_attrs[] = { ATTRS, "longdesc", "name", "height", "width", "usemap", "ismap", NULL } ; 719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const embed_attrs[] = { COREATTRS, "align", "alt", "border", "code", "codebase", "frameborder", "height", "hidden", "hspace", "name", "palette", "pluginspace", "pluginurl", "src", "type", "units", "vspace", "width", NULL } ; 720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const input_attrs[] = { ATTRS, "type", "name", "value", "checked", "disabled", "readonly", "size", "maxlength", "src", "alt", "usemap", "ismap", "tabindex", "accesskey", "onfocus", "onblur", "onselect", "onchange", "accept", NULL } ; 721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const prompt_attrs[] = { COREATTRS, I18N, "prompt", NULL } ; 722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const label_attrs[] = { ATTRS, "for", "accesskey", "onfocus", "onblur", NULL } ; 723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const legend_attrs[] = { ATTRS, "accesskey", NULL } ; 724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const align_attr[] = { "align", NULL } ; 725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const link_attrs[] = { ATTRS, "charset", "href", "hreflang", "type", "rel", "rev", "media", NULL } ; 726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const map_contents[] = { BLOCK, "area", NULL } ; 727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const name_attr[] = { "name", NULL } ; 728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const action_attr[] = { "action", NULL } ; 729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const blockli_elt[] = { BLOCK, "li", NULL } ; 730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const meta_attrs[] = { I18N, "http-equiv", "name", "scheme", NULL } ; 731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const content_attr[] = { "content", NULL } ; 732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const type_attr[] = { "type", NULL } ; 733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const noframes_content[] = { "body", FLOW MODIFIER, NULL } ; 734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const object_contents[] = { FLOW, "param", NULL } ; 735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const object_attrs[] = { ATTRS, "declare", "classid", "codebase", "data", "type", "codetype", "archive", "standby", "height", "width", "usemap", "name", "tabindex", NULL } ; 736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const object_depr[] = { "align", "border", "hspace", "vspace", NULL } ; 737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const ol_attrs[] = { "type", "compact", "start", NULL} ; 738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const option_elt[] = { "option", NULL } ; 739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const optgroup_attrs[] = { ATTRS, "disabled", NULL } ; 740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const option_attrs[] = { ATTRS, "disabled", "label", "selected", "value", NULL } ; 741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const param_attrs[] = { "id", "value", "valuetype", "type", NULL } ; 742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const width_attr[] = { "width", NULL } ; 743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const pre_content[] = { PHRASE, "tt", "i", "b", "u", "s", "strike", "a", "br", "script", "map", "q", "span", "bdo", "iframe", NULL } ; 744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const script_attrs[] = { "charset", "src", "defer", "event", "for", NULL } ; 745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const language_attr[] = { "language", NULL } ; 746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const select_content[] = { "optgroup", "option", NULL } ; 747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const select_attrs[] = { ATTRS, "name", "size", "multiple", "disabled", "tabindex", "onfocus", "onblur", "onchange", NULL } ; 748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const style_attrs[] = { I18N, "media", "title", NULL } ; 749df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic const char* const table_attrs[] = { ATTRS, "summary", "width", "border", "frame", "rules", "cellspacing", "cellpadding", "datapagesize", NULL } ; 750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const table_depr[] = { "align", "bgcolor", NULL } ; 751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const table_contents[] = { "caption", "col", "colgroup", "thead", "tfoot", "tbody", "tr", NULL} ; 752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const tr_elt[] = { "tr", NULL } ; 753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const talign_attrs[] = { ATTRS, CELLHALIGN, CELLVALIGN, NULL} ; 754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const th_td_depr[] = { "nowrap", "bgcolor", "width", "height", NULL } ; 755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const th_td_attr[] = { ATTRS, "abbr", "axis", "headers", "scope", "rowspan", "colspan", CELLHALIGN, CELLVALIGN, NULL } ; 756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const textarea_attrs[] = { ATTRS, "name", "disabled", "readonly", "tabindex", "accesskey", "onfocus", "onblur", "onselect", "onchange", NULL } ; 757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const tr_contents[] = { "th", "td", NULL } ; 758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const bgcolor_attr[] = { "bgcolor", NULL } ; 759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const li_elt[] = { "li", NULL } ; 760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const ul_depr[] = { "type", "compact", NULL} ; 761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* const dir_attr[] = { "dir", NULL} ; 762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DECL (const char**) 764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const htmlElemDesc 766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecthtml40ElementTable[] = { 767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "a", 0, 0, 0, 0, 0, 0, 1, "anchor ", 768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline , NULL , DECL a_attrs , DECL target_attr, NULL 769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "abbr", 0, 0, 0, 0, 0, 0, 1, "abbreviated form", 771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline , NULL , DECL html_attrs, NULL, NULL 772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "acronym", 0, 0, 0, 0, 0, 0, 1, "", 774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline , NULL , DECL html_attrs, NULL, NULL 775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "address", 0, 0, 0, 0, 0, 0, 0, "information on author ", 777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL inline_p , NULL , DECL html_attrs, NULL, NULL 778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "applet", 0, 0, 0, 0, 1, 1, 2, "java applet ", 780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL flow_param , NULL , NULL , DECL applet_attrs, NULL 781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "area", 0, 2, 2, 1, 0, 0, 0, "client-side image map area ", 783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project EMPTY , NULL , DECL area_attrs , DECL target_attr, DECL alt_attr 784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "b", 0, 3, 0, 0, 0, 0, 1, "bold text style", 786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline , NULL , DECL html_attrs, NULL, NULL 787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "base", 0, 2, 2, 1, 0, 0, 0, "document base uri ", 789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project EMPTY , NULL , NULL , DECL target_attr, DECL href_attrs 790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "basefont", 0, 2, 2, 1, 1, 1, 1, "base font size " , 792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project EMPTY , NULL , NULL, DECL basefont_attrs, NULL 793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "bdo", 0, 0, 0, 0, 0, 0, 1, "i18n bidi over-ride ", 795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline , NULL , DECL core_i18n_attrs, NULL, DECL dir_attr 796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "big", 0, 3, 0, 0, 0, 0, 1, "large text style", 798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline , NULL , DECL html_attrs, NULL, NULL 799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "blockquote", 0, 0, 0, 0, 0, 0, 0, "long quotation ", 801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_flow , NULL , DECL quote_attrs , NULL, NULL 802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "body", 1, 1, 0, 0, 0, 0, 0, "document body ", 804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL body_contents , "div" , DECL body_attrs, DECL body_depr, NULL 805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "br", 0, 2, 2, 1, 0, 0, 1, "forced line break ", 807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project EMPTY , NULL , DECL core_attrs, DECL clear_attrs , NULL 808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "button", 0, 0, 0, 0, 0, 0, 2, "push button ", 810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_flow MODIFIER , NULL , DECL button_attrs, NULL, NULL 811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "caption", 0, 0, 0, 0, 0, 0, 0, "table caption ", 813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline , NULL , DECL html_attrs, NULL, NULL 814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "center", 0, 3, 0, 0, 1, 1, 0, "shorthand for div align=center ", 816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_flow , NULL , NULL, DECL html_attrs, NULL 817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "cite", 0, 0, 0, 0, 0, 0, 1, "citation", 819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline , NULL , DECL html_attrs, NULL, NULL 820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "code", 0, 0, 0, 0, 0, 0, 1, "computer code fragment", 822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline , NULL , DECL html_attrs, NULL, NULL 823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "col", 0, 2, 2, 1, 0, 0, 0, "table column ", 825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project EMPTY , NULL , DECL col_attrs , NULL, NULL 826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "colgroup", 0, 1, 0, 0, 0, 0, 0, "table column group ", 828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL col_elt , "col" , DECL col_attrs , NULL, NULL 829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "dd", 0, 1, 0, 0, 0, 0, 0, "definition description ", 831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_flow , NULL , DECL html_attrs, NULL, NULL 832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "del", 0, 0, 0, 0, 0, 0, 2, "deleted text ", 834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_flow , NULL , DECL edit_attrs , NULL, NULL 835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "dfn", 0, 0, 0, 0, 0, 0, 1, "instance definition", 837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline , NULL , DECL html_attrs, NULL, NULL 838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "dir", 0, 0, 0, 0, 1, 1, 0, "directory list", 840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL blockli_elt, "li" , NULL, DECL compact_attrs, NULL 841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "div", 0, 0, 0, 0, 0, 0, 0, "generic language/style container", 843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_flow, NULL, DECL html_attrs, DECL align_attr, NULL 844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "dl", 0, 0, 0, 0, 0, 0, 0, "definition list ", 846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL dl_contents , "dd" , DECL html_attrs, DECL compact_attr, NULL 847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "dt", 0, 1, 0, 0, 0, 0, 0, "definition term ", 849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, DECL html_attrs, NULL, NULL 850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "em", 0, 3, 0, 0, 0, 0, 1, "emphasis", 852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, DECL html_attrs, NULL, NULL 853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "embed", 0, 1, 0, 0, 1, 1, 1, "generic embedded object ", 855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project EMPTY, NULL, DECL embed_attrs, NULL, NULL 856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "fieldset", 0, 0, 0, 0, 0, 0, 0, "form control group ", 858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL fieldset_contents , NULL, DECL html_attrs, NULL, NULL 859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "font", 0, 3, 0, 0, 1, 1, 1, "local change to font ", 861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, NULL, DECL font_attrs, NULL 862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "form", 0, 0, 0, 0, 0, 0, 0, "interactive form ", 864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL form_contents, "fieldset", DECL form_attrs , DECL target_attr, DECL action_attr 865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "frame", 0, 2, 2, 1, 0, 2, 0, "subwindow " , 867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project EMPTY, NULL, NULL, DECL frame_attrs, NULL 868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "frameset", 0, 0, 0, 0, 0, 2, 0, "window subdivision" , 870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL frameset_contents, "noframes" , NULL , DECL frameset_attrs, NULL 871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "h1", 0, 0, 0, 0, 0, 0, 0, "heading ", 873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL 874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "h2", 0, 0, 0, 0, 0, 0, 0, "heading ", 876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL 877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "h3", 0, 0, 0, 0, 0, 0, 0, "heading ", 879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL 880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "h4", 0, 0, 0, 0, 0, 0, 0, "heading ", 882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL 883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "h5", 0, 0, 0, 0, 0, 0, 0, "heading ", 885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL 886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "h6", 0, 0, 0, 0, 0, 0, 0, "heading ", 888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL 889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "head", 1, 1, 0, 0, 0, 0, 0, "document head ", 891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL head_contents, NULL, DECL head_attrs, NULL, NULL 892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "hr", 0, 2, 2, 1, 0, 0, 0, "horizontal rule " , 894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project EMPTY, NULL, DECL html_attrs, DECL hr_depr, NULL 895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "html", 1, 1, 0, 0, 0, 0, 0, "document root element ", 897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_content , NULL , DECL i18n_attrs, DECL version_attr, NULL 898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "i", 0, 3, 0, 0, 0, 0, 1, "italic text style", 900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, DECL html_attrs, NULL, NULL 901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "iframe", 0, 0, 0, 0, 0, 1, 2, "inline subwindow ", 903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_flow, NULL, NULL, DECL iframe_attrs, NULL 904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "img", 0, 2, 2, 1, 0, 0, 1, "embedded image ", 906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project EMPTY, NULL, DECL img_attrs, DECL align_attr, DECL src_alt_attrs 907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "input", 0, 2, 2, 1, 0, 0, 1, "form control ", 909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project EMPTY, NULL, DECL input_attrs , DECL align_attr, NULL 910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "ins", 0, 0, 0, 0, 0, 0, 2, "inserted text", 912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_flow, NULL, DECL edit_attrs, NULL, NULL 913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "isindex", 0, 2, 2, 1, 1, 1, 0, "single line prompt ", 915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project EMPTY, NULL, NULL, DECL prompt_attrs, NULL 916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "kbd", 0, 0, 0, 0, 0, 0, 1, "text to be entered by the user", 918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, DECL html_attrs, NULL, NULL 919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "label", 0, 0, 0, 0, 0, 0, 1, "form field label text ", 921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline MODIFIER, NULL, DECL label_attrs , NULL, NULL 922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "legend", 0, 0, 0, 0, 0, 0, 0, "fieldset legend ", 924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, DECL legend_attrs , DECL align_attr, NULL 925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "li", 0, 1, 1, 0, 0, 0, 0, "list item ", 927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_flow, NULL, DECL html_attrs, NULL, NULL 928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "link", 0, 2, 2, 1, 0, 0, 0, "a media-independent link ", 930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project EMPTY, NULL, DECL link_attrs, DECL target_attr, NULL 931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "map", 0, 0, 0, 0, 0, 0, 2, "client-side image map ", 933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL map_contents , NULL, DECL html_attrs , NULL, DECL name_attr 934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "menu", 0, 0, 0, 0, 1, 1, 0, "menu list ", 936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL blockli_elt , NULL, NULL, DECL compact_attrs, NULL 937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "meta", 0, 2, 2, 1, 0, 0, 0, "generic metainformation ", 939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project EMPTY, NULL, DECL meta_attrs , NULL , DECL content_attr 940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "noframes", 0, 0, 0, 0, 0, 2, 0, "alternate content container for non frame-based rendering ", 942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL noframes_content, "body" , DECL html_attrs, NULL, NULL 943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "noscript", 0, 0, 0, 0, 0, 0, 0, "alternate content container for non script-based rendering ", 945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_flow, "div", DECL html_attrs, NULL, NULL 946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "object", 0, 0, 0, 0, 0, 0, 2, "generic embedded object ", 948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL object_contents , "div" , DECL object_attrs, DECL object_depr, NULL 949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "ol", 0, 0, 0, 0, 0, 0, 0, "ordered list ", 951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL li_elt , "li" , DECL html_attrs, DECL ol_attrs, NULL 952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "optgroup", 0, 0, 0, 0, 0, 0, 0, "option group ", 954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL option_elt , "option", DECL optgroup_attrs, NULL, DECL label_attr 955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "option", 0, 1, 0, 0, 0, 0, 0, "selectable choice " , 957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_pcdata, NULL, DECL option_attrs, NULL, NULL 958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "p", 0, 1, 0, 0, 0, 0, 0, "paragraph ", 960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL 961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "param", 0, 2, 2, 1, 0, 0, 0, "named property value ", 963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project EMPTY, NULL, DECL param_attrs, NULL, DECL name_attr 964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "pre", 0, 0, 0, 0, 0, 0, 0, "preformatted text ", 966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL pre_content, NULL, DECL html_attrs, DECL width_attr, NULL 967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "q", 0, 0, 0, 0, 0, 0, 1, "short inline quotation ", 969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, DECL quote_attrs, NULL, NULL 970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "s", 0, 3, 0, 0, 1, 1, 1, "strike-through text style", 972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, NULL, DECL html_attrs, NULL 973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "samp", 0, 0, 0, 0, 0, 0, 1, "sample program output, scripts, etc.", 975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, DECL html_attrs, NULL, NULL 976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "script", 0, 0, 0, 0, 0, 0, 2, "script statements ", 978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_cdata, NULL, DECL script_attrs, DECL language_attr, DECL type_attr 979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "select", 0, 0, 0, 0, 0, 0, 1, "option selector ", 981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL select_content, NULL, DECL select_attrs, NULL, NULL 982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "small", 0, 3, 0, 0, 0, 0, 1, "small text style", 984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, DECL html_attrs, NULL, NULL 985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "span", 0, 0, 0, 0, 0, 0, 1, "generic language/style container ", 987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, DECL html_attrs, NULL, NULL 988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "strike", 0, 3, 0, 0, 1, 1, 1, "strike-through text", 990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, NULL, DECL html_attrs, NULL 991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "strong", 0, 3, 0, 0, 0, 0, 1, "strong emphasis", 993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, DECL html_attrs, NULL, NULL 994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "style", 0, 0, 0, 0, 0, 0, 0, "style info ", 996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_cdata, NULL, DECL style_attrs, NULL, DECL type_attr 997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "sub", 0, 3, 0, 0, 0, 0, 1, "subscript", 999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, DECL html_attrs, NULL, NULL 1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "sup", 0, 3, 0, 0, 0, 0, 1, "superscript ", 1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, DECL html_attrs, NULL, NULL 1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "table", 0, 0, 0, 0, 0, 0, 0, "", 1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL table_contents , "tr" , DECL table_attrs , DECL table_depr, NULL 1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "tbody", 1, 0, 0, 0, 0, 0, 0, "table body ", 1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL tr_elt , "tr" , DECL talign_attrs, NULL, NULL 1009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 1010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "td", 0, 0, 0, 0, 0, 0, 0, "table data cell", 1011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_flow, NULL, DECL th_td_attr, DECL th_td_depr, NULL 1012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "textarea", 0, 0, 0, 0, 0, 0, 1, "multi-line text field ", 1014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_pcdata, NULL, DECL textarea_attrs, NULL, DECL rows_cols_attr 1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "tfoot", 0, 1, 0, 0, 0, 0, 0, "table footer ", 1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL tr_elt , "tr" , DECL talign_attrs, NULL, NULL 1018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "th", 0, 1, 0, 0, 0, 0, 0, "table header cell", 1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_flow, NULL, DECL th_td_attr, DECL th_td_depr, NULL 1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "thead", 0, 1, 0, 0, 0, 0, 0, "table header ", 1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL tr_elt , "tr" , DECL talign_attrs, NULL, NULL 1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 1025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "title", 0, 0, 0, 0, 0, 0, 0, "document title ", 1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_pcdata, NULL, DECL i18n_attrs, NULL, NULL 1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 1028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "tr", 0, 0, 0, 0, 0, 0, 0, "table row ", 1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL tr_contents , "td" , DECL talign_attrs, DECL bgcolor_attr, NULL 1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "tt", 0, 3, 0, 0, 0, 0, 1, "teletype or monospaced text style", 1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, DECL html_attrs, NULL, NULL 1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "u", 0, 3, 0, 0, 1, 1, 1, "underlined text style", 1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, NULL, DECL html_attrs, NULL 1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "ul", 0, 0, 0, 0, 0, 0, 0, "unordered list ", 1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL li_elt , "li" , DECL html_attrs, DECL ul_depr, NULL 1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}, 1040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ "var", 0, 0, 0, 0, 0, 0, 1, "instance of a variable or program argument", 1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DECL html_inline, NULL, DECL html_attrs, NULL, NULL 1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * start tags that imply the end of current element 1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char * const htmlStartClose[] = { 1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"form", "form", "p", "hr", "h1", "h2", "h3", "h4", "h5", "h6", 1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "dl", "ul", "ol", "menu", "dir", "address", "pre", 1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "listing", "xmp", "head", NULL, 1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"head", "p", NULL, 1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"title", "p", NULL, 1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"body", "head", "style", "link", "title", "p", NULL, 1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"frameset", "head", "style", "link", "title", "p", NULL, 1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"li", "p", "h1", "h2", "h3", "h4", "h5", "h6", "dl", "address", 1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "pre", "listing", "xmp", "head", "li", NULL, 1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"hr", "p", "head", NULL, 1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"h1", "p", "head", NULL, 1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"h2", "p", "head", NULL, 1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"h3", "p", "head", NULL, 1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"h4", "p", "head", NULL, 1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"h5", "p", "head", NULL, 1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"h6", "p", "head", NULL, 1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"dir", "p", "head", NULL, 1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"address", "p", "head", "ul", NULL, 1067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"pre", "p", "head", "ul", NULL, 1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"listing", "p", "head", NULL, 1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"xmp", "p", "head", NULL, 1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"blockquote", "p", "head", NULL, 1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"dl", "p", "dt", "menu", "dir", "address", "pre", "listing", 1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmp", "head", NULL, 1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"dt", "p", "menu", "dir", "address", "pre", "listing", "xmp", 1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "head", "dd", NULL, 1075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"dd", "p", "menu", "dir", "address", "pre", "listing", "xmp", 1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "head", "dt", NULL, 1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"ul", "p", "head", "ol", "menu", "dir", "address", "pre", 1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "listing", "xmp", NULL, 1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"ol", "p", "head", "ul", NULL, 1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"menu", "p", "head", "ul", NULL, 1081df143a5041f03a22808b59c76698770b74692815Selim Gurun"p", "p", "head", "h1", "h2", "h3", "h4", "h5", "h6", FONTSTYLE, NULL, 1082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"div", "p", "head", NULL, 1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"noscript", "p", "head", NULL, 1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"center", "font", "b", "i", "p", "head", NULL, 1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"a", "a", NULL, 1086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"caption", "p", NULL, 1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"colgroup", "caption", "colgroup", "col", "p", NULL, 1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"col", "caption", "col", "p", NULL, 1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"table", "p", "head", "h1", "h2", "h3", "h4", "h5", "h6", "pre", 1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "listing", "xmp", "a", NULL, 1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"th", "th", "td", "p", "span", "font", "a", "b", "i", "u", NULL, 1092df143a5041f03a22808b59c76698770b74692815Selim Gurun"td", "th", "td", "p", "span", "font", "a", "b", "i", "u", NULL, 1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"tr", "th", "td", "tr", "caption", "col", "colgroup", "p", NULL, 1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"thead", "caption", "col", "colgroup", NULL, 1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"tfoot", "th", "td", "tr", "caption", "col", "colgroup", "thead", 1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "tbody", "p", NULL, 1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"tbody", "th", "td", "tr", "caption", "col", "colgroup", "thead", 1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "tfoot", "tbody", "p", NULL, 1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"optgroup", "option", NULL, 1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"option", "option", NULL, 1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"fieldset", "legend", "p", "head", "h1", "h2", "h3", "h4", "h5", "h6", 1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "pre", "listing", "xmp", "a", NULL, 1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectNULL 1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The list of HTML elements which are supposed not to have 1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * CDATA content and where a p element will be implied 1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: extend that list by reading the HTML SGML DTD on 1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * implied paragraph 1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char *const htmlNoContentElements[] = { 1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "html", 1115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "head", 1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL 1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The list of HTML attributes which are of content %Script; 1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NOTE: when adding ones, check htmlIsScriptAttribute() since 1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it assumes the name starts with 'on' 1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char *const htmlScriptAttributes[] = { 1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "onclick", 1126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "ondblclick", 1127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "onmousedown", 1128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "onmouseup", 1129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "onmouseover", 1130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "onmousemove", 1131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "onmouseout", 1132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "onkeypress", 1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "onkeydown", 1134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "onkeyup", 1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "onload", 1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "onunload", 1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "onfocus", 1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "onblur", 1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "onsubmit", 1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "onrest", 1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "onchange", 1142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "onselect" 1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This table is used by the htmlparser to know what to do with 1147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * broken html pages. By assigning different priorities to different 1148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * elements the parser can decide how to handle extra endtags. 1149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Endtags are only allowed to close elements with lower or equal 1150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * priority. 1151df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 1152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct { 1154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *name; 1155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int priority; 1156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} elementPriority; 1157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const elementPriority htmlEndPriority[] = { 1159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project {"div", 150}, 1160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project {"td", 160}, 1161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project {"th", 160}, 1162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project {"tr", 170}, 1163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project {"thead", 180}, 1164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project {"tbody", 180}, 1165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project {"tfoot", 180}, 1166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project {"table", 190}, 1167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project {"head", 200}, 1168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project {"body", 200}, 1169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project {"html", 220}, 1170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project {NULL, 100} /* Default priority */ 1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char** htmlStartCloseIndex[100]; 1174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int htmlStartCloseIndexinitialized = 0; 1175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 1177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1178df143a5041f03a22808b59c76698770b74692815Selim Gurun * functions to handle HTML specific data * 1179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 1181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlInitAutoClose: 1184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initialize the htmlStartCloseIndex for fast lookup of closing tags names. 1186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is not reentrant. Call xmlInitParser() once before processing in 1187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * case of use in multithreaded programs. 1188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlInitAutoClose(void) { 1191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int indx, i = 0; 1192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (htmlStartCloseIndexinitialized) return; 1194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (indx = 0;indx < 100;indx ++) htmlStartCloseIndex[indx] = NULL; 1196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project indx = 0; 1197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((htmlStartClose[i] != NULL) && (indx < 100 - 1)) { 1198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlStartCloseIndex[indx++] = (const char**) &htmlStartClose[i]; 1199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (htmlStartClose[i] != NULL) i++; 1200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i++; 1201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlStartCloseIndexinitialized = 1; 1203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlTagLookup: 1207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @tag: The tag name in lowercase 1208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Lookup the HTML tag in the ElementTable 1210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the related htmlElemDescPtr or NULL if not found. 1212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectconst htmlElemDesc * 1214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlTagLookup(const xmlChar *tag) { 1215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int i; 1216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < (sizeof(html40ElementTable) / 1218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(html40ElementTable[0]));i++) { 1219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrcasecmp(tag, BAD_CAST html40ElementTable[i].name)) 1220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((htmlElemDescPtr) &html40ElementTable[i]); 1221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlGetEndPriority: 1227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: The name of the element to look up the priority for. 1228df143a5041f03a22808b59c76698770b74692815Selim Gurun * 1229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Return value: The "endtag" priority. 1230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project **/ 1231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlGetEndPriority (const xmlChar *name) { 1233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i = 0; 1234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((htmlEndPriority[i].name != NULL) && 1236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual((const xmlChar *)htmlEndPriority[i].name, name))) 1237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i++; 1238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(htmlEndPriority[i].priority); 1240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlCheckAutoClose: 1245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @newtag: The new tag name 1246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @oldtag: The old tag name 1247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks whether the new tag is one of the registered valid tags for 1249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * closing old. 1250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initialize the htmlStartCloseIndex for fast lookup of closing tags names. 1251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if no, 1 if yes. 1253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlCheckAutoClose(const xmlChar * newtag, const xmlChar * oldtag) 1256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, indx; 1258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char **closed = NULL; 1259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (htmlStartCloseIndexinitialized == 0) 1261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlInitAutoClose(); 1262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* inefficient, but not a big deal */ 1264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (indx = 0; indx < 100; indx++) { 1265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project closed = htmlStartCloseIndex[indx]; 1266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (closed == NULL) 1267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(BAD_CAST * closed, newtag)) 1269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = closed - htmlStartClose; 1273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i++; 1274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (htmlStartClose[i] != NULL) { 1275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(BAD_CAST htmlStartClose[i], oldtag)) { 1276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 1277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i++; 1279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlAutoCloseOnClose: 1285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 1286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @newtag: The new tag name 1287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @force: force the tag closure 1288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The HTML DTD allows an ending tag to implicitly close other tags. 1290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlAutoCloseOnClose(htmlParserCtxtPtr ctxt, const xmlChar * newtag) 1293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const htmlElemDesc *info; 1295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, priority; 1296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project priority = htmlGetEndPriority(newtag); 1298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = (ctxt->nameNr - 1); i >= 0; i--) { 1300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(newtag, ctxt->nameTab[i])) 1302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A missplaced endtag can only close elements with lower 1305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or equal priority, so if we find an element with higher 1306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * priority before we find an element with 1307df143a5041f03a22808b59c76698770b74692815Selim Gurun * matching name, we just ignore this endtag 1308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (htmlGetEndPriority(ctxt->nameTab[i]) > priority) 1310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (i < 0) 1313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (!xmlStrEqual(newtag, ctxt->name)) { 1316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project info = htmlTagLookup(ctxt->name); 1317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((info != NULL) && (info->endTag == 3)) { 1318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_TAG_NAME_MISMATCH, 1319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Opening and ending tag mismatch: %s and %s\n", 1320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newtag, ctxt->name); 1321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) 1323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->endElement(ctxt->userData, ctxt->name); 1324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlnamePop(ctxt); 1325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlAutoCloseOnEnd: 1330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 1331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Close all remaining tags at the end of the stream 1333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlAutoCloseOnEnd(htmlParserCtxtPtr ctxt) 1336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nameNr == 0) 1340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = (ctxt->nameNr - 1); i >= 0; i--) { 1342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) 1343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->endElement(ctxt->userData, ctxt->name); 1344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlnamePop(ctxt); 1345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlAutoClose: 1350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 1351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @newtag: The new tag name or NULL 1352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The HTML DTD allows a tag to implicitly close other tags. 1354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The list is kept in htmlStartClose array. This function is 1355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * called when a new tag has been detected and generates the 1356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * appropriates closes if possible/needed. 1357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If newtag is NULL this mean we are at the end of the resource 1358df143a5041f03a22808b59c76698770b74692815Selim Gurun * and we should check 1359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlAutoClose(htmlParserCtxtPtr ctxt, const xmlChar * newtag) 1362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((newtag != NULL) && (ctxt->name != NULL) && 1364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (htmlCheckAutoClose(newtag, ctxt->name))) { 1365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) 1366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->endElement(ctxt->userData, ctxt->name); 1367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlnamePop(ctxt); 1368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (newtag == NULL) { 1370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlAutoCloseOnEnd(ctxt); 1371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((newtag == NULL) && (ctxt->name != NULL) && 1374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlStrEqual(ctxt->name, BAD_CAST "head")) || 1375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(ctxt->name, BAD_CAST "body")) || 1376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(ctxt->name, BAD_CAST "html")))) { 1377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) 1378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->endElement(ctxt->userData, ctxt->name); 1379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlnamePop(ctxt); 1380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlAutoCloseTag: 1385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the HTML document 1386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: The tag name 1387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: the HTML element 1388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The HTML DTD allows a tag to implicitly close other tags. 1390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The list is kept in htmlStartClose array. This function checks 1391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if the element or one of it's children would autoclose the 1392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * given tag. 1393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if autoclose, 0 otherwise 1395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlAutoCloseTag(htmlDocPtr doc, const xmlChar *name, htmlNodePtr elem) { 1398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlNodePtr child; 1399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem == NULL) return(1); 1401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, elem->name)) return(0); 1402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (htmlCheckAutoClose(elem->name, name)) return(1); 1403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = elem->children; 1404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 1405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (htmlAutoCloseTag(doc, name, child)) return(1); 1406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 1407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlIsAutoClosed: 1413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the HTML document 1414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem: the HTML element 1415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The HTML DTD allows a tag to implicitly close other tags. 1417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The list is kept in htmlStartClose array. This function checks 1418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if a tag is autoclosed by one of it's child 1419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if autoclosed, 0 otherwise 1421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlIsAutoClosed(htmlDocPtr doc, htmlNodePtr elem) { 1424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlNodePtr child; 1425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem == NULL) return(1); 1427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = elem->children; 1428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 1429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (htmlAutoCloseTag(doc, elem->name, child)) return(1); 1430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 1431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlCheckImplied: 1437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 1438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @newtag: The new tag name 1439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The HTML DTD allows a tag to exists only implicitly 1441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * called when a new tag has been detected and generates the 1442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * appropriates implicit tags if missing 1443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlCheckImplied(htmlParserCtxtPtr ctxt, const xmlChar *newtag) { 1446df143a5041f03a22808b59c76698770b74692815Selim Gurun int i; 1447df143a5041f03a22808b59c76698770b74692815Selim Gurun 1448df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->options & HTML_PARSE_NOIMPLIED) 1449df143a5041f03a22808b59c76698770b74692815Selim Gurun return; 1450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!htmlOmittedDefaultValue) 1451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(newtag, BAD_CAST"html")) 1453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nameNr <= 0) { 1455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlnamePush(ctxt, BAD_CAST"html"); 1456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) 1457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->startElement(ctxt->userData, BAD_CAST"html", NULL); 1458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((xmlStrEqual(newtag, BAD_CAST"body")) || (xmlStrEqual(newtag, BAD_CAST"head"))) 1460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1461df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((ctxt->nameNr <= 1) && 1462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlStrEqual(newtag, BAD_CAST"script")) || 1463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(newtag, BAD_CAST"style")) || 1464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(newtag, BAD_CAST"meta")) || 1465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(newtag, BAD_CAST"link")) || 1466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(newtag, BAD_CAST"title")) || 1467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(newtag, BAD_CAST"base")))) { 1468df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->html >= 3) { 1469df143a5041f03a22808b59c76698770b74692815Selim Gurun /* we already saw or generated an <head> before */ 1470df143a5041f03a22808b59c76698770b74692815Selim Gurun return; 1471df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1472df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 1473df143a5041f03a22808b59c76698770b74692815Selim Gurun * dropped OBJECT ... i you put it first BODY will be 1474df143a5041f03a22808b59c76698770b74692815Selim Gurun * assumed ! 1475df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 1476df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlnamePush(ctxt, BAD_CAST"head"); 1477df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) 1478df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->sax->startElement(ctxt->userData, BAD_CAST"head", NULL); 1479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((!xmlStrEqual(newtag, BAD_CAST"noframes")) && 1480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(newtag, BAD_CAST"frame")) && 1481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(newtag, BAD_CAST"frameset"))) { 1482df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->html >= 10) { 1483df143a5041f03a22808b59c76698770b74692815Selim Gurun /* we already saw or generated a <body> before */ 1484df143a5041f03a22808b59c76698770b74692815Selim Gurun return; 1485df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ctxt->nameNr;i++) { 1487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(ctxt->nameTab[i], BAD_CAST"body")) { 1488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(ctxt->nameTab[i], BAD_CAST"head")) { 1491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1494df143a5041f03a22808b59c76698770b74692815Selim Gurun 1495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlnamePush(ctxt, BAD_CAST"body"); 1496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) 1497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->startElement(ctxt->userData, BAD_CAST"body", NULL); 1498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlCheckParagraph 1503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 1504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check whether a p element need to be implied before inserting 1506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * characters in the current element. 1507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if a paragraph has been inserted, 0 if not and -1 1509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in case of error. 1510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlCheckParagraph(htmlParserCtxtPtr ctxt) { 1514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *tag; 1515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 1518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tag = ctxt->name; 1520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tag == NULL) { 1521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlAutoClose(ctxt, BAD_CAST"p"); 1522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlCheckImplied(ctxt, BAD_CAST"p"); 1523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlnamePush(ctxt, BAD_CAST"p"); 1524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) 1525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->startElement(ctxt->userData, BAD_CAST"p", NULL); 1526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 1527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!htmlOmittedDefaultValue) 1529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; htmlNoContentElements[i] != NULL; i++) { 1531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(tag, BAD_CAST htmlNoContentElements[i])) { 1532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlAutoClose(ctxt, BAD_CAST"p"); 1533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlCheckImplied(ctxt, BAD_CAST"p"); 1534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlnamePush(ctxt, BAD_CAST"p"); 1535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) 1536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->startElement(ctxt->userData, BAD_CAST"p", NULL); 1537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 1538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlIsScriptAttribute: 1545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: an attribute name 1546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if an attribute is of content type Script 1548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 is the attribute is a script 0 otherwise 1550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlIsScriptAttribute(const xmlChar *name) { 1553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int i; 1554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) 1556df143a5041f03a22808b59c76698770b74692815Selim Gurun return(0); 1557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * all script attributes start with 'on' 1559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((name[0] != 'o') || (name[1] != 'n')) 1561df143a5041f03a22808b59c76698770b74692815Selim Gurun return(0); 1562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; 1563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i < sizeof(htmlScriptAttributes)/sizeof(htmlScriptAttributes[0]); 1564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i++) { 1565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, (const xmlChar *) htmlScriptAttributes[i])) 1566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 1567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 1572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1573df143a5041f03a22808b59c76698770b74692815Selim Gurun * The list of HTML predefined entities * 1574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 1576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const htmlEntityDesc html40EntitiesTable[] = { 1579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 1580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the 4 absolute ones, plus apostrophe. 1581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 34, "quot", "quotation mark = APL quote, U+0022 ISOnum" }, 1583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 38, "amp", "ampersand, U+0026 ISOnum" }, 1584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 39, "apos", "single quote" }, 1585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 60, "lt", "less-than sign, U+003C ISOnum" }, 1586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 62, "gt", "greater-than sign, U+003E ISOnum" }, 1587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 1589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A bunch still in the 128-255 range 1590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Replacing them depend really on the charset used. 1591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 160, "nbsp", "no-break space = non-breaking space, U+00A0 ISOnum" }, 1593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 161, "iexcl","inverted exclamation mark, U+00A1 ISOnum" }, 1594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 162, "cent", "cent sign, U+00A2 ISOnum" }, 1595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 163, "pound","pound sign, U+00A3 ISOnum" }, 1596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 164, "curren","currency sign, U+00A4 ISOnum" }, 1597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 165, "yen", "yen sign = yuan sign, U+00A5 ISOnum" }, 1598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 166, "brvbar","broken bar = broken vertical bar, U+00A6 ISOnum" }, 1599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 167, "sect", "section sign, U+00A7 ISOnum" }, 1600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 168, "uml", "diaeresis = spacing diaeresis, U+00A8 ISOdia" }, 1601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 169, "copy", "copyright sign, U+00A9 ISOnum" }, 1602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 170, "ordf", "feminine ordinal indicator, U+00AA ISOnum" }, 1603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 171, "laquo","left-pointing double angle quotation mark = left pointing guillemet, U+00AB ISOnum" }, 1604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 172, "not", "not sign, U+00AC ISOnum" }, 1605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 173, "shy", "soft hyphen = discretionary hyphen, U+00AD ISOnum" }, 1606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 174, "reg", "registered sign = registered trade mark sign, U+00AE ISOnum" }, 1607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 175, "macr", "macron = spacing macron = overline = APL overbar, U+00AF ISOdia" }, 1608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 176, "deg", "degree sign, U+00B0 ISOnum" }, 1609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 177, "plusmn","plus-minus sign = plus-or-minus sign, U+00B1 ISOnum" }, 1610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 178, "sup2", "superscript two = superscript digit two = squared, U+00B2 ISOnum" }, 1611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 179, "sup3", "superscript three = superscript digit three = cubed, U+00B3 ISOnum" }, 1612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 180, "acute","acute accent = spacing acute, U+00B4 ISOdia" }, 1613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 181, "micro","micro sign, U+00B5 ISOnum" }, 1614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 182, "para", "pilcrow sign = paragraph sign, U+00B6 ISOnum" }, 1615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 183, "middot","middle dot = Georgian comma Greek middle dot, U+00B7 ISOnum" }, 1616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 184, "cedil","cedilla = spacing cedilla, U+00B8 ISOdia" }, 1617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 185, "sup1", "superscript one = superscript digit one, U+00B9 ISOnum" }, 1618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 186, "ordm", "masculine ordinal indicator, U+00BA ISOnum" }, 1619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 187, "raquo","right-pointing double angle quotation mark right pointing guillemet, U+00BB ISOnum" }, 1620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 188, "frac14","vulgar fraction one quarter = fraction one quarter, U+00BC ISOnum" }, 1621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 189, "frac12","vulgar fraction one half = fraction one half, U+00BD ISOnum" }, 1622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 190, "frac34","vulgar fraction three quarters = fraction three quarters, U+00BE ISOnum" }, 1623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 191, "iquest","inverted question mark = turned question mark, U+00BF ISOnum" }, 1624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 192, "Agrave","latin capital letter A with grave = latin capital letter A grave, U+00C0 ISOlat1" }, 1625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 193, "Aacute","latin capital letter A with acute, U+00C1 ISOlat1" }, 1626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 194, "Acirc","latin capital letter A with circumflex, U+00C2 ISOlat1" }, 1627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 195, "Atilde","latin capital letter A with tilde, U+00C3 ISOlat1" }, 1628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 196, "Auml", "latin capital letter A with diaeresis, U+00C4 ISOlat1" }, 1629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 197, "Aring","latin capital letter A with ring above = latin capital letter A ring, U+00C5 ISOlat1" }, 1630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 198, "AElig","latin capital letter AE = latin capital ligature AE, U+00C6 ISOlat1" }, 1631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 199, "Ccedil","latin capital letter C with cedilla, U+00C7 ISOlat1" }, 1632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 200, "Egrave","latin capital letter E with grave, U+00C8 ISOlat1" }, 1633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 201, "Eacute","latin capital letter E with acute, U+00C9 ISOlat1" }, 1634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 202, "Ecirc","latin capital letter E with circumflex, U+00CA ISOlat1" }, 1635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 203, "Euml", "latin capital letter E with diaeresis, U+00CB ISOlat1" }, 1636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 204, "Igrave","latin capital letter I with grave, U+00CC ISOlat1" }, 1637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 205, "Iacute","latin capital letter I with acute, U+00CD ISOlat1" }, 1638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 206, "Icirc","latin capital letter I with circumflex, U+00CE ISOlat1" }, 1639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 207, "Iuml", "latin capital letter I with diaeresis, U+00CF ISOlat1" }, 1640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 208, "ETH", "latin capital letter ETH, U+00D0 ISOlat1" }, 1641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 209, "Ntilde","latin capital letter N with tilde, U+00D1 ISOlat1" }, 1642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 210, "Ograve","latin capital letter O with grave, U+00D2 ISOlat1" }, 1643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 211, "Oacute","latin capital letter O with acute, U+00D3 ISOlat1" }, 1644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 212, "Ocirc","latin capital letter O with circumflex, U+00D4 ISOlat1" }, 1645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 213, "Otilde","latin capital letter O with tilde, U+00D5 ISOlat1" }, 1646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 214, "Ouml", "latin capital letter O with diaeresis, U+00D6 ISOlat1" }, 1647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 215, "times","multiplication sign, U+00D7 ISOnum" }, 1648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 216, "Oslash","latin capital letter O with stroke latin capital letter O slash, U+00D8 ISOlat1" }, 1649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 217, "Ugrave","latin capital letter U with grave, U+00D9 ISOlat1" }, 1650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 218, "Uacute","latin capital letter U with acute, U+00DA ISOlat1" }, 1651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 219, "Ucirc","latin capital letter U with circumflex, U+00DB ISOlat1" }, 1652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 220, "Uuml", "latin capital letter U with diaeresis, U+00DC ISOlat1" }, 1653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 221, "Yacute","latin capital letter Y with acute, U+00DD ISOlat1" }, 1654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 222, "THORN","latin capital letter THORN, U+00DE ISOlat1" }, 1655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 223, "szlig","latin small letter sharp s = ess-zed, U+00DF ISOlat1" }, 1656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 224, "agrave","latin small letter a with grave = latin small letter a grave, U+00E0 ISOlat1" }, 1657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 225, "aacute","latin small letter a with acute, U+00E1 ISOlat1" }, 1658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 226, "acirc","latin small letter a with circumflex, U+00E2 ISOlat1" }, 1659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 227, "atilde","latin small letter a with tilde, U+00E3 ISOlat1" }, 1660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 228, "auml", "latin small letter a with diaeresis, U+00E4 ISOlat1" }, 1661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 229, "aring","latin small letter a with ring above = latin small letter a ring, U+00E5 ISOlat1" }, 1662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 230, "aelig","latin small letter ae = latin small ligature ae, U+00E6 ISOlat1" }, 1663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 231, "ccedil","latin small letter c with cedilla, U+00E7 ISOlat1" }, 1664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 232, "egrave","latin small letter e with grave, U+00E8 ISOlat1" }, 1665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 233, "eacute","latin small letter e with acute, U+00E9 ISOlat1" }, 1666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 234, "ecirc","latin small letter e with circumflex, U+00EA ISOlat1" }, 1667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 235, "euml", "latin small letter e with diaeresis, U+00EB ISOlat1" }, 1668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 236, "igrave","latin small letter i with grave, U+00EC ISOlat1" }, 1669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 237, "iacute","latin small letter i with acute, U+00ED ISOlat1" }, 1670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 238, "icirc","latin small letter i with circumflex, U+00EE ISOlat1" }, 1671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 239, "iuml", "latin small letter i with diaeresis, U+00EF ISOlat1" }, 1672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 240, "eth", "latin small letter eth, U+00F0 ISOlat1" }, 1673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 241, "ntilde","latin small letter n with tilde, U+00F1 ISOlat1" }, 1674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 242, "ograve","latin small letter o with grave, U+00F2 ISOlat1" }, 1675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 243, "oacute","latin small letter o with acute, U+00F3 ISOlat1" }, 1676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 244, "ocirc","latin small letter o with circumflex, U+00F4 ISOlat1" }, 1677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 245, "otilde","latin small letter o with tilde, U+00F5 ISOlat1" }, 1678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 246, "ouml", "latin small letter o with diaeresis, U+00F6 ISOlat1" }, 1679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 247, "divide","division sign, U+00F7 ISOnum" }, 1680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 248, "oslash","latin small letter o with stroke, = latin small letter o slash, U+00F8 ISOlat1" }, 1681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 249, "ugrave","latin small letter u with grave, U+00F9 ISOlat1" }, 1682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 250, "uacute","latin small letter u with acute, U+00FA ISOlat1" }, 1683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 251, "ucirc","latin small letter u with circumflex, U+00FB ISOlat1" }, 1684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 252, "uuml", "latin small letter u with diaeresis, U+00FC ISOlat1" }, 1685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 253, "yacute","latin small letter y with acute, U+00FD ISOlat1" }, 1686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 254, "thorn","latin small letter thorn with, U+00FE ISOlat1" }, 1687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 255, "yuml", "latin small letter y with diaeresis, U+00FF ISOlat1" }, 1688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 338, "OElig","latin capital ligature OE, U+0152 ISOlat2" }, 1690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 339, "oelig","latin small ligature oe, U+0153 ISOlat2" }, 1691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 352, "Scaron","latin capital letter S with caron, U+0160 ISOlat2" }, 1692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 353, "scaron","latin small letter s with caron, U+0161 ISOlat2" }, 1693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 376, "Yuml", "latin capital letter Y with diaeresis, U+0178 ISOlat2" }, 1694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 1696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Anything below should really be kept as entities references 1697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 402, "fnof", "latin small f with hook = function = florin, U+0192 ISOtech" }, 1699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 710, "circ", "modifier letter circumflex accent, U+02C6 ISOpub" }, 1701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 732, "tilde","small tilde, U+02DC ISOdia" }, 1702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 913, "Alpha","greek capital letter alpha, U+0391" }, 1704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 914, "Beta", "greek capital letter beta, U+0392" }, 1705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 915, "Gamma","greek capital letter gamma, U+0393 ISOgrk3" }, 1706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 916, "Delta","greek capital letter delta, U+0394 ISOgrk3" }, 1707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 917, "Epsilon","greek capital letter epsilon, U+0395" }, 1708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 918, "Zeta", "greek capital letter zeta, U+0396" }, 1709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 919, "Eta", "greek capital letter eta, U+0397" }, 1710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 920, "Theta","greek capital letter theta, U+0398 ISOgrk3" }, 1711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 921, "Iota", "greek capital letter iota, U+0399" }, 1712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 922, "Kappa","greek capital letter kappa, U+039A" }, 1713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 923, "Lambda", "greek capital letter lambda, U+039B ISOgrk3" }, 1714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 924, "Mu", "greek capital letter mu, U+039C" }, 1715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 925, "Nu", "greek capital letter nu, U+039D" }, 1716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 926, "Xi", "greek capital letter xi, U+039E ISOgrk3" }, 1717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 927, "Omicron","greek capital letter omicron, U+039F" }, 1718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 928, "Pi", "greek capital letter pi, U+03A0 ISOgrk3" }, 1719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 929, "Rho", "greek capital letter rho, U+03A1" }, 1720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 931, "Sigma","greek capital letter sigma, U+03A3 ISOgrk3" }, 1721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 932, "Tau", "greek capital letter tau, U+03A4" }, 1722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 933, "Upsilon","greek capital letter upsilon, U+03A5 ISOgrk3" }, 1723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 934, "Phi", "greek capital letter phi, U+03A6 ISOgrk3" }, 1724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 935, "Chi", "greek capital letter chi, U+03A7" }, 1725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 936, "Psi", "greek capital letter psi, U+03A8 ISOgrk3" }, 1726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 937, "Omega","greek capital letter omega, U+03A9 ISOgrk3" }, 1727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 945, "alpha","greek small letter alpha, U+03B1 ISOgrk3" }, 1729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 946, "beta", "greek small letter beta, U+03B2 ISOgrk3" }, 1730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 947, "gamma","greek small letter gamma, U+03B3 ISOgrk3" }, 1731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 948, "delta","greek small letter delta, U+03B4 ISOgrk3" }, 1732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 949, "epsilon","greek small letter epsilon, U+03B5 ISOgrk3" }, 1733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 950, "zeta", "greek small letter zeta, U+03B6 ISOgrk3" }, 1734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 951, "eta", "greek small letter eta, U+03B7 ISOgrk3" }, 1735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 952, "theta","greek small letter theta, U+03B8 ISOgrk3" }, 1736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 953, "iota", "greek small letter iota, U+03B9 ISOgrk3" }, 1737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 954, "kappa","greek small letter kappa, U+03BA ISOgrk3" }, 1738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 955, "lambda","greek small letter lambda, U+03BB ISOgrk3" }, 1739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 956, "mu", "greek small letter mu, U+03BC ISOgrk3" }, 1740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 957, "nu", "greek small letter nu, U+03BD ISOgrk3" }, 1741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 958, "xi", "greek small letter xi, U+03BE ISOgrk3" }, 1742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 959, "omicron","greek small letter omicron, U+03BF NEW" }, 1743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 960, "pi", "greek small letter pi, U+03C0 ISOgrk3" }, 1744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 961, "rho", "greek small letter rho, U+03C1 ISOgrk3" }, 1745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 962, "sigmaf","greek small letter final sigma, U+03C2 ISOgrk3" }, 1746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 963, "sigma","greek small letter sigma, U+03C3 ISOgrk3" }, 1747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 964, "tau", "greek small letter tau, U+03C4 ISOgrk3" }, 1748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 965, "upsilon","greek small letter upsilon, U+03C5 ISOgrk3" }, 1749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 966, "phi", "greek small letter phi, U+03C6 ISOgrk3" }, 1750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 967, "chi", "greek small letter chi, U+03C7 ISOgrk3" }, 1751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 968, "psi", "greek small letter psi, U+03C8 ISOgrk3" }, 1752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 969, "omega","greek small letter omega, U+03C9 ISOgrk3" }, 1753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 977, "thetasym","greek small letter theta symbol, U+03D1 NEW" }, 1754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 978, "upsih","greek upsilon with hook symbol, U+03D2 NEW" }, 1755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 982, "piv", "greek pi symbol, U+03D6 ISOgrk3" }, 1756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8194, "ensp", "en space, U+2002 ISOpub" }, 1758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8195, "emsp", "em space, U+2003 ISOpub" }, 1759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8201, "thinsp","thin space, U+2009 ISOpub" }, 1760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8204, "zwnj", "zero width non-joiner, U+200C NEW RFC 2070" }, 1761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8205, "zwj", "zero width joiner, U+200D NEW RFC 2070" }, 1762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8206, "lrm", "left-to-right mark, U+200E NEW RFC 2070" }, 1763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8207, "rlm", "right-to-left mark, U+200F NEW RFC 2070" }, 1764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8211, "ndash","en dash, U+2013 ISOpub" }, 1765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8212, "mdash","em dash, U+2014 ISOpub" }, 1766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8216, "lsquo","left single quotation mark, U+2018 ISOnum" }, 1767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8217, "rsquo","right single quotation mark, U+2019 ISOnum" }, 1768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8218, "sbquo","single low-9 quotation mark, U+201A NEW" }, 1769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8220, "ldquo","left double quotation mark, U+201C ISOnum" }, 1770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8221, "rdquo","right double quotation mark, U+201D ISOnum" }, 1771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8222, "bdquo","double low-9 quotation mark, U+201E NEW" }, 1772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8224, "dagger","dagger, U+2020 ISOpub" }, 1773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8225, "Dagger","double dagger, U+2021 ISOpub" }, 1774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8226, "bull", "bullet = black small circle, U+2022 ISOpub" }, 1776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8230, "hellip","horizontal ellipsis = three dot leader, U+2026 ISOpub" }, 1777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8240, "permil","per mille sign, U+2030 ISOtech" }, 1779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8242, "prime","prime = minutes = feet, U+2032 ISOtech" }, 1781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8243, "Prime","double prime = seconds = inches, U+2033 ISOtech" }, 1782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8249, "lsaquo","single left-pointing angle quotation mark, U+2039 ISO proposed" }, 1784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8250, "rsaquo","single right-pointing angle quotation mark, U+203A ISO proposed" }, 1785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8254, "oline","overline = spacing overscore, U+203E NEW" }, 1787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8260, "frasl","fraction slash, U+2044 NEW" }, 1788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8364, "euro", "euro sign, U+20AC NEW" }, 1790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8465, "image","blackletter capital I = imaginary part, U+2111 ISOamso" }, 1792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8472, "weierp","script capital P = power set = Weierstrass p, U+2118 ISOamso" }, 1793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8476, "real", "blackletter capital R = real part symbol, U+211C ISOamso" }, 1794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8482, "trade","trade mark sign, U+2122 ISOnum" }, 1795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8501, "alefsym","alef symbol = first transfinite cardinal, U+2135 NEW" }, 1796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8592, "larr", "leftwards arrow, U+2190 ISOnum" }, 1797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8593, "uarr", "upwards arrow, U+2191 ISOnum" }, 1798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8594, "rarr", "rightwards arrow, U+2192 ISOnum" }, 1799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8595, "darr", "downwards arrow, U+2193 ISOnum" }, 1800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8596, "harr", "left right arrow, U+2194 ISOamsa" }, 1801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8629, "crarr","downwards arrow with corner leftwards = carriage return, U+21B5 NEW" }, 1802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8656, "lArr", "leftwards double arrow, U+21D0 ISOtech" }, 1803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8657, "uArr", "upwards double arrow, U+21D1 ISOamsa" }, 1804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8658, "rArr", "rightwards double arrow, U+21D2 ISOtech" }, 1805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8659, "dArr", "downwards double arrow, U+21D3 ISOamsa" }, 1806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8660, "hArr", "left right double arrow, U+21D4 ISOamsa" }, 1807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8704, "forall","for all, U+2200 ISOtech" }, 1809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8706, "part", "partial differential, U+2202 ISOtech" }, 1810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8707, "exist","there exists, U+2203 ISOtech" }, 1811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8709, "empty","empty set = null set = diameter, U+2205 ISOamso" }, 1812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8711, "nabla","nabla = backward difference, U+2207 ISOtech" }, 1813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8712, "isin", "element of, U+2208 ISOtech" }, 1814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8713, "notin","not an element of, U+2209 ISOtech" }, 1815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8715, "ni", "contains as member, U+220B ISOtech" }, 1816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8719, "prod", "n-ary product = product sign, U+220F ISOamsb" }, 1817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8721, "sum", "n-ary summation, U+2211 ISOamsb" }, 1818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8722, "minus","minus sign, U+2212 ISOtech" }, 1819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8727, "lowast","asterisk operator, U+2217 ISOtech" }, 1820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8730, "radic","square root = radical sign, U+221A ISOtech" }, 1821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8733, "prop", "proportional to, U+221D ISOtech" }, 1822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8734, "infin","infinity, U+221E ISOtech" }, 1823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8736, "ang", "angle, U+2220 ISOamso" }, 1824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8743, "and", "logical and = wedge, U+2227 ISOtech" }, 1825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8744, "or", "logical or = vee, U+2228 ISOtech" }, 1826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8745, "cap", "intersection = cap, U+2229 ISOtech" }, 1827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8746, "cup", "union = cup, U+222A ISOtech" }, 1828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8747, "int", "integral, U+222B ISOtech" }, 1829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8756, "there4","therefore, U+2234 ISOtech" }, 1830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8764, "sim", "tilde operator = varies with = similar to, U+223C ISOtech" }, 1831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8773, "cong", "approximately equal to, U+2245 ISOtech" }, 1832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8776, "asymp","almost equal to = asymptotic to, U+2248 ISOamsr" }, 1833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8800, "ne", "not equal to, U+2260 ISOtech" }, 1834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8801, "equiv","identical to, U+2261 ISOtech" }, 1835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8804, "le", "less-than or equal to, U+2264 ISOtech" }, 1836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8805, "ge", "greater-than or equal to, U+2265 ISOtech" }, 1837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8834, "sub", "subset of, U+2282 ISOtech" }, 1838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8835, "sup", "superset of, U+2283 ISOtech" }, 1839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8836, "nsub", "not a subset of, U+2284 ISOamsn" }, 1840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8838, "sube", "subset of or equal to, U+2286 ISOtech" }, 1841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8839, "supe", "superset of or equal to, U+2287 ISOtech" }, 1842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8853, "oplus","circled plus = direct sum, U+2295 ISOamsb" }, 1843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8855, "otimes","circled times = vector product, U+2297 ISOamsb" }, 1844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8869, "perp", "up tack = orthogonal to = perpendicular, U+22A5 ISOtech" }, 1845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8901, "sdot", "dot operator, U+22C5 ISOamsb" }, 1846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8968, "lceil","left ceiling = apl upstile, U+2308 ISOamsc" }, 1847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8969, "rceil","right ceiling, U+2309 ISOamsc" }, 1848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8970, "lfloor","left floor = apl downstile, U+230A ISOamsc" }, 1849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8971, "rfloor","right floor, U+230B ISOamsc" }, 1850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9001, "lang", "left-pointing angle bracket = bra, U+2329 ISOtech" }, 1851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9002, "rang", "right-pointing angle bracket = ket, U+232A ISOtech" }, 1852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9674, "loz", "lozenge, U+25CA ISOpub" }, 1853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9824, "spades","black spade suit, U+2660 ISOpub" }, 1855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9827, "clubs","black club suit = shamrock, U+2663 ISOpub" }, 1856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9829, "hearts","black heart suit = valentine, U+2665 ISOpub" }, 1857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 9830, "diams","black diamond suit, U+2666 ISOpub" }, 1858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 1860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 1862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Commodity functions to handle entities * 1864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 1866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 1868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Macro used to grow the current buffer. 1869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define growBuffer(buffer) { \ 1871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *tmp; \ 1872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buffer##_size *= 2; \ 1873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlChar *) xmlRealloc(buffer, buffer##_size * sizeof(xmlChar)); \ 1874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { \ 1875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlErrMemory(ctxt, "growing buffer\n"); \ 1876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(buffer); \ 1877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); \ 1878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } \ 1879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buffer = tmp; \ 1880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlEntityLookup: 1884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the entity name 1885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Lookup the given entity in EntitiesTable 1887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: the linear scan is really ugly, an hash table is really needed. 1889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the associated htmlEntityDescPtr if found, NULL otherwise. 1891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectconst htmlEntityDesc * 1893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlEntityLookup(const xmlChar *name) { 1894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int i; 1895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < (sizeof(html40EntitiesTable)/ 1897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(html40EntitiesTable[0]));i++) { 1898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST html40EntitiesTable[i].name)) { 1899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((htmlEntityDescPtr) &html40EntitiesTable[i]); 1900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlEntityValueLookup: 1907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the entity's unicode value 1908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Lookup the given entity in EntitiesTable 1910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: the linear scan is really ugly, an hash table is really needed. 1912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the associated htmlEntityDescPtr if found, NULL otherwise. 1914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectconst htmlEntityDesc * 1916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlEntityValueLookup(unsigned int value) { 1917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int i; 1918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < (sizeof(html40EntitiesTable)/ 1920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(html40EntitiesTable[0]));i++) { 1921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (html40EntitiesTable[i].value >= value) { 1922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (html40EntitiesTable[i].value > value) 1923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((htmlEntityDescPtr) &html40EntitiesTable[i]); 1925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * UTF8ToHtml: 1932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @out: a pointer to an array of bytes to store the result 1933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @outlen: the length of @out 1934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @in: a pointer to an array of UTF-8 chars 1935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inlen: the length of @in 1936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Take a block of UTF-8 chars in and try to convert it to an ASCII 1938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * plus HTML entities block of chars out. 1939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if success, -2 if the transcoding fails, or -1 otherwise 1941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The value of @inlen after return is the number of octets consumed 1942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * as the return value is positive, else unpredictable. 1943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The value of @outlen after return is the number of octets consumed. 1944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectUTF8ToHtml(unsigned char* out, int *outlen, 1947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const unsigned char* in, int *inlen) { 1948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const unsigned char* processed = in; 1949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const unsigned char* outend; 1950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const unsigned char* outstart = out; 1951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const unsigned char* instart = in; 1952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const unsigned char* inend; 1953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int c, d; 1954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int trailing; 1955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((out == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1); 1957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in == NULL) { 1958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * initialization nothing to do 1960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *outlen = 0; 1962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *inlen = 0; 1963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inend = in + (*inlen); 1966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outend = out + (*outlen); 1967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (in < inend) { 1968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project d = *in++; 1969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (d < 0x80) { c= d; trailing= 0; } 1970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (d < 0xC0) { 1971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* trailing byte in leading position */ 1972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *outlen = out - outstart; 1973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *inlen = processed - instart; 1974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 1975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (d < 0xE0) { c= d & 0x1F; trailing= 1; } 1976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (d < 0xF0) { c= d & 0x0F; trailing= 2; } 1977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (d < 0xF8) { c= d & 0x07; trailing= 3; } 1978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 1979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* no chance for this in Ascii */ 1980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *outlen = out - outstart; 1981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *inlen = processed - instart; 1982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 1983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (inend - in < trailing) { 1986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1987df143a5041f03a22808b59c76698770b74692815Selim Gurun } 1988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for ( ; trailing; trailing--) { 1990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((in >= inend) || (((d= *in++) & 0xC0) != 0x80)) 1991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c <<= 6; 1993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c |= d & 0x3F; 1994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* assertion: c is a single UTF-4 value */ 1997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (c < 0x80) { 1998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (out + 1 >= outend) 1999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = c; 2001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len; 2003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const htmlEntityDesc * ent; 2004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *cp; 2005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char nbuf[16]; 2006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to lookup a predefined HTML entity for it 2009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ent = htmlEntityValueLookup(c); 2012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ent == NULL) { 2013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(nbuf, sizeof(nbuf), "#%u", c); 2014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cp = nbuf; 2015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cp = ent->name; 2018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = strlen(cp); 2019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (out + 2 + len >= outend) 2020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '&'; 2022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(out, cp, len); 2023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project out += len; 2024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = ';'; 2025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project processed = in; 2027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *outlen = out - outstart; 2029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *inlen = processed - instart; 2030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlEncodeEntities: 2035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @out: a pointer to an array of bytes to store the result 2036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @outlen: the length of @out 2037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @in: a pointer to an array of UTF-8 chars 2038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inlen: the length of @in 2039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @quoteChar: the quote character to escape (' or ") or zero. 2040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Take a block of UTF-8 chars in and try to convert it to an ASCII 2042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * plus HTML entities block of chars out. 2043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if success, -2 if the transcoding fails, or -1 otherwise 2045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The value of @inlen after return is the number of octets consumed 2046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * as the return value is positive, else unpredictable. 2047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The value of @outlen after return is the number of octets consumed. 2048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlEncodeEntities(unsigned char* out, int *outlen, 2051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const unsigned char* in, int *inlen, int quoteChar) { 2052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const unsigned char* processed = in; 2053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const unsigned char* outend; 2054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const unsigned char* outstart = out; 2055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const unsigned char* instart = in; 2056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const unsigned char* inend; 2057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int c, d; 2058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int trailing; 2059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((out == NULL) || (outlen == NULL) || (inlen == NULL) || (in == NULL)) 2061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outend = out + (*outlen); 2063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inend = in + (*inlen); 2064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (in < inend) { 2065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project d = *in++; 2066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (d < 0x80) { c= d; trailing= 0; } 2067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (d < 0xC0) { 2068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* trailing byte in leading position */ 2069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *outlen = out - outstart; 2070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *inlen = processed - instart; 2071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 2072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (d < 0xE0) { c= d & 0x1F; trailing= 1; } 2073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (d < 0xF0) { c= d & 0x0F; trailing= 2; } 2074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (d < 0xF8) { c= d & 0x07; trailing= 3; } 2075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 2076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* no chance for this in Ascii */ 2077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *outlen = out - outstart; 2078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *inlen = processed - instart; 2079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 2080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (inend - in < trailing) 2083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (trailing--) { 2086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((d= *in++) & 0xC0) != 0x80) { 2087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *outlen = out - outstart; 2088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *inlen = processed - instart; 2089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 2090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c <<= 6; 2092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c |= d & 0x3F; 2093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* assertion: c is a single UTF-4 value */ 2096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c < 0x80) && (c != (unsigned int) quoteChar) && 2097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (c != '&') && (c != '<') && (c != '>')) { 2098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (out >= outend) 2099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = c; 2101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const htmlEntityDesc * ent; 2103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *cp; 2104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char nbuf[16]; 2105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len; 2106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to lookup a predefined HTML entity for it 2109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ent = htmlEntityValueLookup(c); 2111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ent == NULL) { 2112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(nbuf, sizeof(nbuf), "#%u", c); 2113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cp = nbuf; 2114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cp = ent->name; 2117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = strlen(cp); 2118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (out + 2 + len > outend) 2119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '&'; 2121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(out, cp, len); 2122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project out += len; 2123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = ';'; 2124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project processed = in; 2126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *outlen = out - outstart; 2128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *inlen = processed - instart; 2129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 2133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Commodity functions to handle streams * 2135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 2137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlNewInputStream: 2140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 2141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new input stream structure 2143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new input stream or NULL 2144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic htmlParserInputPtr 2146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlNewInputStream(htmlParserCtxtPtr ctxt) { 2147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParserInputPtr input; 2148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input = (xmlParserInputPtr) xmlMalloc(sizeof(htmlParserInput)); 2150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input == NULL) { 2151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlErrMemory(ctxt, "couldn't allocate a new input stream\n"); 2152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(input, 0, sizeof(htmlParserInput)); 2155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->filename = NULL; 2156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->directory = NULL; 2157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->base = NULL; 2158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->cur = NULL; 2159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->buf = NULL; 2160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->line = 1; 2161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->col = 1; 2162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->buf = NULL; 2163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->free = NULL; 2164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->version = NULL; 2165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->consumed = 0; 2166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->length = 0; 2167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(input); 2168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 2172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Commodity functions, cleanup needed ? * 2174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 2176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 2177df143a5041f03a22808b59c76698770b74692815Selim Gurun * all tags allowing pc data from the html 4.01 loose dtd 2178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NOTE: it might be more apropriate to integrate this information 2179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * into the html40ElementTable array but I don't want to risk any 2180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * binary incomptibility 2181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char *allowPCData[] = { 2183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "a", "abbr", "acronym", "address", "applet", "b", "bdo", "big", 2184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "blockquote", "body", "button", "caption", "center", "cite", "code", 2185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "dd", "del", "dfn", "div", "dt", "em", "font", "form", "h1", "h2", 2186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "h3", "h4", "h5", "h6", "i", "iframe", "ins", "kbd", "label", "legend", 2187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "li", "noframes", "noscript", "object", "p", "pre", "q", "s", "samp", 2188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "small", "span", "strike", "strong", "td", "th", "tt", "u", "var" 2189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 2190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * areBlanks: 2193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 2194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: a xmlChar * 2195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len: the size of @str 2196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Is this a sequence of blank chars that one can ignore ? 2198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if ignorable 0 otherwise. 2200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int areBlanks(htmlParserCtxtPtr ctxt, const xmlChar *str, int len) { 2203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int i; 2204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int j; 2205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr lastChild; 2206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDtdPtr dtd; 2207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0;j < len;j++) 2209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!(IS_BLANK_CH(str[j]))) return(0); 2210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == 0) return(1); 2212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '<') return(0); 2213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->name == NULL) 2214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(ctxt->name, BAD_CAST"html")) 2216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(ctxt->name, BAD_CAST"head")) 2218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Only strip CDATA children of the body tag for strict HTML DTDs */ 2221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(ctxt->name, BAD_CAST "body") && ctxt->myDoc != NULL) { 2222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dtd = xmlGetIntSubset(ctxt->myDoc); 2223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd != NULL && dtd->ExternalID != NULL) { 2224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrcasecmp(dtd->ExternalID, BAD_CAST "-//W3C//DTD HTML 4.01//EN") || 2225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project !xmlStrcasecmp(dtd->ExternalID, BAD_CAST "-//W3C//DTD HTML 4//EN")) 2226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->node == NULL) return(0); 2231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lastChild = xmlGetLastChild(ctxt->node); 2232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((lastChild) && (lastChild->type == XML_COMMENT_NODE)) 2233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lastChild = lastChild->prev; 2234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lastChild == NULL) { 2235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->node->type != XML_ELEMENT_NODE) && 2236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->node->content != NULL)) return(0); 2237df143a5041f03a22808b59c76698770b74692815Selim Gurun /* keep ws in constructs like ...<b> </b>... 2238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for all tags "b" allowing PCDATA */ 2239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for ( i = 0; i < sizeof(allowPCData)/sizeof(allowPCData[0]); i++ ) { 2240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( xmlStrEqual(ctxt->name, BAD_CAST allowPCData[i]) ) { 2241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlNodeIsText(lastChild)) { 2245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2247df143a5041f03a22808b59c76698770b74692815Selim Gurun /* keep ws in constructs like <p><b>xy</b> <i>z</i><p> 2248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for all tags "p" allowing PCDATA */ 2249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for ( i = 0; i < sizeof(allowPCData)/sizeof(allowPCData[0]); i++ ) { 2250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( xmlStrEqual(lastChild->name, BAD_CAST allowPCData[i]) ) { 2251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlNewDocNoDtD: 2260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URI: URI for the dtd, or NULL 2261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ExternalID: the external ID of the DTD, or NULL 2262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates a new HTML document without a DTD node if @URI and @ExternalID 2264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * are NULL 2265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a new document, do not initialize the DTD if not provided 2267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocPtr 2269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlNewDocNoDtD(const xmlChar *URI, const xmlChar *ExternalID) { 2270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr cur; 2271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new document and fill the fields. 2274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = (xmlDocPtr) xmlMalloc(sizeof(xmlDoc)); 2276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 2277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlErrMemory(NULL, "HTML document creation failed\n"); 2278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur, 0, sizeof(xmlDoc)); 2281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_HTML_DOCUMENT_NODE; 2283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->version = NULL; 2284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->intSubset = NULL; 2285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->doc = cur; 2286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name = NULL; 2287df143a5041f03a22808b59c76698770b74692815Selim Gurun cur->children = NULL; 2288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->extSubset = NULL; 2289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->oldNs = NULL; 2290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->encoding = NULL; 2291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->standalone = 1; 2292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->compression = 0; 2293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->ids = NULL; 2294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->refs = NULL; 2295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->_private = NULL; 2296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->charset = XML_CHAR_ENCODING_UTF8; 229760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott cur->properties = XML_DOC_HTML | XML_DOC_USERBUILT; 2298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ExternalID != NULL) || 2299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (URI != NULL)) 2300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCreateIntSubset(cur, BAD_CAST "html", ExternalID, URI); 2301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 2302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlNewDoc: 2306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URI: URI for the dtd, or NULL 2307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ExternalID: the external ID of the DTD, or NULL 2308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates a new HTML document 2310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a new document 2312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocPtr 2314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlNewDoc(const xmlChar *URI, const xmlChar *ExternalID) { 2315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((URI == NULL) && (ExternalID == NULL)) 2316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(htmlNewDocNoDtD( 2317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "http://www.w3.org/TR/REC-html40/loose.dtd", 2318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "-//W3C//DTD HTML 4.0 Transitional//EN")); 2319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(htmlNewDocNoDtD(URI, ExternalID)); 2321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 2325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The parser itself * 2327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Relates to http://www.w3.org/TR/html40 * 2328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 2330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 2332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The parser itself * 2334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 2336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar * htmlParseNameComplex(xmlParserCtxtPtr ctxt); 2338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseHTMLName: 2341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 2342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an HTML tag or attribute name, note that we convert it to lowercase 2344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * since HTML names are not case-sensitive. 2345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the Tag Name parsed or NULL 2347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar * 2350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseHTMLName(htmlParserCtxtPtr ctxt) { 2351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i = 0; 2352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar loc[HTML_PARSER_BUFFER_SIZE]; 2353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_ASCII_LETTER(CUR) && (CUR != '_') && 2355df143a5041f03a22808b59c76698770b74692815Selim Gurun (CUR != ':') && (CUR != '.')) return(NULL); 2356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((i < HTML_PARSER_BUFFER_SIZE) && 2358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((IS_ASCII_LETTER(CUR)) || (IS_ASCII_DIGIT(CUR)) || 2359df143a5041f03a22808b59c76698770b74692815Selim Gurun (CUR == ':') || (CUR == '-') || (CUR == '_') || 2360df143a5041f03a22808b59c76698770b74692815Selim Gurun (CUR == '.'))) { 2361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR >= 'A') && (CUR <= 'Z')) loc[i] = CUR + 0x20; 2362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else loc[i] = CUR; 2363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i++; 2364df143a5041f03a22808b59c76698770b74692815Selim Gurun 2365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 2366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2367df143a5041f03a22808b59c76698770b74692815Selim Gurun 2368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlDictLookup(ctxt->dict, loc, i)); 2369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseHTMLName_nonInvasive: 2374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 2375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an HTML tag or attribute name, note that we convert it to lowercase 2377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * since HTML names are not case-sensitive, this doesn't consume the data 2378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * from the stream, it's a look-ahead 2379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the Tag Name parsed or NULL 2381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar * 2384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseHTMLName_nonInvasive(htmlParserCtxtPtr ctxt) { 2385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i = 0; 2386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar loc[HTML_PARSER_BUFFER_SIZE]; 2387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_ASCII_LETTER(NXT(1)) && (NXT(1) != '_') && 2389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (NXT(1) != ':')) return(NULL); 2390df143a5041f03a22808b59c76698770b74692815Selim Gurun 2391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((i < HTML_PARSER_BUFFER_SIZE) && 2392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((IS_ASCII_LETTER(NXT(1+i))) || (IS_ASCII_DIGIT(NXT(1+i))) || 2393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (NXT(1+i) == ':') || (NXT(1+i) == '-') || (NXT(1+i) == '_'))) { 2394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((NXT(1+i) >= 'A') && (NXT(1+i) <= 'Z')) loc[i] = NXT(1+i) + 0x20; 2395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else loc[i] = NXT(1+i); 2396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i++; 2397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2398df143a5041f03a22808b59c76698770b74692815Selim Gurun 2399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlDictLookup(ctxt->dict, loc, i)); 2400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseName: 2405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 2406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an HTML name, this routine is case sensitive. 2408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the Name parsed or NULL 2410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar * 2413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseName(htmlParserCtxtPtr ctxt) { 2414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *in; 2415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *ret; 2416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int count = 0; 2417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project GROW; 2419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Accelerator for simple ASCII names 2422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in = ctxt->input->cur; 2424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((*in >= 0x61) && (*in <= 0x7A)) || 2425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((*in >= 0x41) && (*in <= 0x5A)) || 2426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*in == '_') || (*in == ':')) { 2427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in++; 2428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (((*in >= 0x61) && (*in <= 0x7A)) || 2429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((*in >= 0x41) && (*in <= 0x5A)) || 2430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((*in >= 0x30) && (*in <= 0x39)) || 2431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*in == '_') || (*in == '-') || 2432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*in == ':') || (*in == '.')) 2433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in++; 2434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*in > 0) && (*in < 0x80)) { 2435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project count = in - ctxt->input->cur; 2436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlDictLookup(ctxt->dict, ctxt->input->cur, count); 2437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->cur = in; 2438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbChars += count; 2439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->col += count; 2440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(htmlParseNameComplex(ctxt)); 2444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar * 2447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseNameComplex(xmlParserCtxtPtr ctxt) { 2448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len = 0, l; 2449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int c; 2450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int count = 0; 2451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handler for more complex cases 2454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project GROW; 2456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = CUR_CHAR(l); 2457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ 2458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!IS_LETTER(c) && (c != '_') && 2459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (c != ':'))) { 2460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ 2464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((IS_LETTER(c)) || (IS_DIGIT(c)) || 2465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (c == '.') || (c == '-') || 2466df143a5041f03a22808b59c76698770b74692815Selim Gurun (c == '_') || (c == ':') || 2467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (IS_COMBINING(c)) || 2468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (IS_EXTENDER(c)))) { 2469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (count++ > 100) { 2470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project count = 0; 2471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project GROW; 2472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len += l; 2474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXTL(l); 2475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = CUR_CHAR(l); 2476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len)); 2478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseHTMLAttribute: 2483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 2484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @stop: a char stop value 2485df143a5041f03a22808b59c76698770b74692815Selim Gurun * 2486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an HTML attribute value till the stop (quote), if 2487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * stop is 0 then it stops at the first space 2488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the attribute parsed or NULL 2490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 2493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseHTMLAttribute(htmlParserCtxtPtr ctxt, const xmlChar stop) { 2494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *buffer = NULL; 2495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int buffer_size = 0; 2496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *out = NULL; 2497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name = NULL; 2498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *cur = NULL; 2499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const htmlEntityDesc * ent; 2500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * allocate a translation buffer. 2503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buffer_size = HTML_PARSER_BUFFER_SIZE; 2505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buffer = (xmlChar *) xmlMallocAtomic(buffer_size * sizeof(xmlChar)); 2506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buffer == NULL) { 2507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlErrMemory(ctxt, "buffer allocation failed\n"); 2508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project out = buffer; 2511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Ok loop until we reach one of the ending chars 2514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR != 0) && (CUR != stop)) { 2516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((stop == 0) && (CUR == '>')) break; 2517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((stop == 0) && (IS_BLANK_CH(CUR))) break; 2518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '&') { 2519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (NXT(1) == '#') { 2520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int c; 2521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int bits; 2522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = htmlParseCharRef(ctxt); 2524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (c < 0x80) 2525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { *out++ = c; bits= -6; } 2526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (c < 0x800) 2527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { *out++ =((c >> 6) & 0x1F) | 0xC0; bits= 0; } 2528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (c < 0x10000) 2529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { *out++ =((c >> 12) & 0x0F) | 0xE0; bits= 6; } 2530df143a5041f03a22808b59c76698770b74692815Selim Gurun else 2531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { *out++ =((c >> 18) & 0x07) | 0xF0; bits= 12; } 2532df143a5041f03a22808b59c76698770b74692815Selim Gurun 2533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for ( ; bits >= 0; bits-= 6) { 2534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = ((c >> bits) & 0x3F) | 0x80; 2535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2536df143a5041f03a22808b59c76698770b74692815Selim Gurun 2537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (out - buffer > buffer_size - 100) { 2538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int indx = out - buffer; 2539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project growBuffer(buffer); 2541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project out = &buffer[indx]; 2542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ent = htmlParseEntityRef(ctxt, &name); 2545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 2546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '&'; 2547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (out - buffer > buffer_size - 100) { 2548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int indx = out - buffer; 2549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project growBuffer(buffer); 2551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project out = &buffer[indx]; 2552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ent == NULL) { 2554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '&'; 2555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = name; 2556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*cur != 0) { 2557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (out - buffer > buffer_size - 100) { 2558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int indx = out - buffer; 2559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project growBuffer(buffer); 2561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project out = &buffer[indx]; 2562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = *cur++; 2564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int c; 2567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int bits; 2568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (out - buffer > buffer_size - 100) { 2570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int indx = out - buffer; 2571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project growBuffer(buffer); 2573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project out = &buffer[indx]; 2574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = ent->value; 2576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (c < 0x80) 2577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { *out++ = c; bits= -6; } 2578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (c < 0x800) 2579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { *out++ =((c >> 6) & 0x1F) | 0xC0; bits= 0; } 2580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (c < 0x10000) 2581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { *out++ =((c >> 12) & 0x0F) | 0xE0; bits= 6; } 2582df143a5041f03a22808b59c76698770b74692815Selim Gurun else 2583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { *out++ =((c >> 18) & 0x07) | 0xF0; bits= 12; } 2584df143a5041f03a22808b59c76698770b74692815Selim Gurun 2585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for ( ; bits >= 0; bits-= 6) { 2586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = ((c >> bits) & 0x3F) | 0x80; 2587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int c; 2592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int bits, l; 2593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (out - buffer > buffer_size - 100) { 2595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int indx = out - buffer; 2596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project growBuffer(buffer); 2598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project out = &buffer[indx]; 2599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = CUR_CHAR(l); 2601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (c < 0x80) 2602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { *out++ = c; bits= -6; } 2603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (c < 0x800) 2604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { *out++ =((c >> 6) & 0x1F) | 0xC0; bits= 0; } 2605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (c < 0x10000) 2606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { *out++ =((c >> 12) & 0x0F) | 0xE0; bits= 6; } 2607df143a5041f03a22808b59c76698770b74692815Selim Gurun else 2608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { *out++ =((c >> 18) & 0x07) | 0xF0; bits= 12; } 2609df143a5041f03a22808b59c76698770b74692815Selim Gurun 2610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for ( ; bits >= 0; bits-= 6) { 2611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = ((c >> bits) & 0x3F) | 0x80; 2612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 2614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2616df143a5041f03a22808b59c76698770b74692815Selim Gurun *out = 0; 2617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(buffer); 2618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseEntityRef: 2622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 2623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: location to store the entity name 2624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an HTML ENTITY references 2626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [68] EntityRef ::= '&' Name ';' 2628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the associated htmlEntityDescPtr if found, or NULL otherwise, 2630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if non-NULL *str will have to be freed by the caller. 2631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectconst htmlEntityDesc * 2633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseEntityRef(htmlParserCtxtPtr ctxt, const xmlChar **str) { 2634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name; 2635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const htmlEntityDesc * ent = NULL; 2636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str != NULL) *str = NULL; 2638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->input == NULL)) return(NULL); 2639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '&') { 2641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 2642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = htmlParseName(ctxt); 2643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 2644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_NAME_REQUIRED, 2645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "htmlParseEntityRef: no name\n", NULL, NULL); 2646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project GROW; 2648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == ';') { 2649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str != NULL) 2650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *str = name; 2651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Lookup the entity in the table. 2654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ent = htmlEntityLookup(name); 2656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ent != NULL) /* OK that's ugly !!! */ 2657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 2658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_ENTITYREF_SEMICOL_MISSING, 2660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "htmlParseEntityRef: expecting ';'\n", 2661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 2662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str != NULL) 2663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *str = name; 2664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ent); 2668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseAttValue: 2672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 2673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a value for an attribute 2675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note: the parser won't do substitution of entities here, this 2676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will be handled later in xmlStringGetNodeList, unless it was 2677df143a5041f03a22808b59c76698770b74692815Selim Gurun * asked for ctxt->replaceEntities != 0 2678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the AttValue parsed or NULL. 2680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 2683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseAttValue(htmlParserCtxtPtr ctxt) { 2684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret = NULL; 2685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '"') { 2687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 2688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = htmlParseHTMLAttribute(ctxt, '"'); 2689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '"') { 2690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, 2691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "AttValue: \" expected\n", NULL, NULL); 2692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 2693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 2694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '\'') { 2695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 2696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = htmlParseHTMLAttribute(ctxt, '\''); 2697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '\'') { 2698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, 2699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "AttValue: ' expected\n", NULL, NULL); 2700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 2701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 2702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * That's an HTMLism, the attribute value may not be quoted 2705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = htmlParseHTMLAttribute(ctxt, 0); 2707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 2708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_ATTRIBUTE_WITHOUT_VALUE, 2709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "AttValue: no value found\n", NULL, NULL); 2710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseSystemLiteral: 2717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 2718df143a5041f03a22808b59c76698770b74692815Selim Gurun * 2719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an HTML Literal 2720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'") 2722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the SystemLiteral parsed or NULL 2724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 2727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseSystemLiteral(htmlParserCtxtPtr ctxt) { 2728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *q; 2729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret = NULL; 2730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '"') { 2732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 2733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project q = CUR_PTR; 2734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((IS_CHAR_CH(CUR)) && (CUR != '"')) 2735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 2736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_CHAR_CH(CUR)) { 2737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, 2738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unfinished SystemLiteral\n", NULL, NULL); 2739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrndup(q, CUR_PTR - q); 2741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 2742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '\'') { 2744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 2745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project q = CUR_PTR; 2746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((IS_CHAR_CH(CUR)) && (CUR != '\'')) 2747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 2748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_CHAR_CH(CUR)) { 2749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, 2750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unfinished SystemLiteral\n", NULL, NULL); 2751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrndup(q, CUR_PTR - q); 2753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 2754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_STARTED, 2757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project " or ' expected\n", NULL, NULL); 2758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2759df143a5041f03a22808b59c76698770b74692815Selim Gurun 2760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParsePubidLiteral: 2765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 2766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an HTML public literal 2768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [12] PubidLiteral ::= '"' PubidChar* '"' | "'" (PubidChar - "'")* "'" 2770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the PubidLiteral parsed or NULL. 2772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 2775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParsePubidLiteral(htmlParserCtxtPtr ctxt) { 2776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *q; 2777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret = NULL; 2778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Name ::= (Letter | '_') (NameChar)* 2780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '"') { 2782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 2783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project q = CUR_PTR; 2784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_PUBIDCHAR_CH(CUR)) NEXT; 2785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '"') { 2786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, 2787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unfinished PubidLiteral\n", NULL, NULL); 2788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrndup(q, CUR_PTR - q); 2790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 2791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '\'') { 2793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 2794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project q = CUR_PTR; 2795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((IS_PUBIDCHAR_CH(CUR)) && (CUR != '\'')) 2796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 2797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '\'') { 2798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, 2799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unfinished PubidLiteral\n", NULL, NULL); 2800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrndup(q, CUR_PTR - q); 2802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 2803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_STARTED, 2806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "PubidLiteral \" or ' expected\n", NULL, NULL); 2807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2808df143a5041f03a22808b59c76698770b74692815Selim Gurun 2809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseScript: 2814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 2815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of an HTML SCRIPT or STYLE element 2817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://www.w3.org/TR/html4/sgml/dtd.html#Script 2818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://www.w3.org/TR/html4/sgml/dtd.html#StyleSheet 2819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://www.w3.org/TR/html4/types.html#type-script 2820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://www.w3.org/TR/html4/types.html#h-6.15 2821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://www.w3.org/TR/html4/appendix/notes.html#h-B.3.2.1 2822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Script data ( %Script; in the DTD) can be the content of the SCRIPT 2824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element and the value of intrinsic event attributes. User agents must 2825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * not evaluate script data as HTML markup but instead must pass it on as 2826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * data to a script engine. 2827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NOTES: 2828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - The content is passed like CDATA 2829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - the attributes for style and scripting "onXXX" are also described 2830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * as CDATA but SGML allows entities references in attributes so their 2831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * processing is identical as other attributes 2832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 2834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseScript(htmlParserCtxtPtr ctxt) { 2835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar buf[HTML_PARSER_BIG_BUFFER_SIZE + 5]; 2836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbchar = 0; 2837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int cur,l; 2838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SHRINK; 2840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR_CHAR(l); 2841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_CHAR_CH(cur)) { 2842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == '<') && (NXT(1) == '/')) { 2843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * One should break here, the specification is clear: 2845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Authors should therefore escape "</" within the content. 2846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Escape mechanisms are specific to each scripting or 2847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * style sheet language. 2848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In recovery mode, only break if end tag match the 2850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * current tag, effectively ignoring all tags inside the 2851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * script/style block and treating the entire block as 2852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * CDATA. 2853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->recovery) { 2855df143a5041f03a22808b59c76698770b74692815Selim Gurun if (xmlStrncasecmp(ctxt->name, ctxt->input->cur+2, 2856df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlStrlen(ctxt->name)) == 0) 2857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 2858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; /* while */ 2859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_TAG_NAME_MISMATCH, 2861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Element %s embeds close tag\n", 2862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->name, NULL); 2863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((NXT(2) >= 'A') && (NXT(2) <= 'Z')) || 2866df143a5041f03a22808b59c76698770b74692815Selim Gurun ((NXT(2) >= 'a') && (NXT(2) <= 'z'))) 2867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 2868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; /* while */ 2869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project COPY_BUF(l,buf,nbchar,cur); 2873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nbchar >= HTML_PARSER_BIG_BUFFER_SIZE) { 2874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->sax->cdataBlock!= NULL) { 2875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Insert as CDATA, which is the same as HTML_PRESERVE_NODE 2877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->cdataBlock(ctxt->userData, buf, nbchar); 2879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->sax->characters != NULL) { 2880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->characters(ctxt->userData, buf, nbchar); 2881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbchar = 0; 2883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project GROW; 2885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXTL(l); 2886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR_CHAR(l); 2887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!(IS_CHAR_CH(cur))) && (!((cur == 0) && (ctxt->progressive)))) { 2890df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParseErrInt(ctxt, XML_ERR_INVALID_CHAR, 2891df143a5041f03a22808b59c76698770b74692815Selim Gurun "Invalid char in CDATA 0x%X\n", cur); 2892df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->input->cur < ctxt->input->end) { 2893df143a5041f03a22808b59c76698770b74692815Selim Gurun NEXT; 2894df143a5041f03a22808b59c76698770b74692815Selim Gurun } 2895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((nbchar != 0) && (ctxt->sax != NULL) && (!ctxt->disableSAX)) { 2898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->sax->cdataBlock!= NULL) { 2899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Insert as CDATA, which is the same as HTML_PRESERVE_NODE 2901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->cdataBlock(ctxt->userData, buf, nbchar); 2903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->sax->characters != NULL) { 2904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->characters(ctxt->userData, buf, nbchar); 2905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseCharData: 2912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 2913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a CharData section. 2915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if we are within a CDATA section ']]>' marks an end of section. 2916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [14] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*) 2918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 2921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseCharData(htmlParserCtxtPtr ctxt) { 2922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar buf[HTML_PARSER_BIG_BUFFER_SIZE + 5]; 2923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbchar = 0; 2924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int cur, l; 292560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott int chunk = 0; 2926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SHRINK; 2928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR_CHAR(l); 2929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (((cur != '<') || (ctxt->token == '<')) && 2930df143a5041f03a22808b59c76698770b74692815Selim Gurun ((cur != '&') || (ctxt->token == '&')) && 2931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur != 0)) { 2932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!(IS_CHAR(cur))) { 2933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErrInt(ctxt, XML_ERR_INVALID_CHAR, 2934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Invalid char in CDATA 0x%X\n", cur); 2935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project COPY_BUF(l,buf,nbchar,cur); 2937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nbchar >= HTML_PARSER_BIG_BUFFER_SIZE) { 2939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Ok the segment is to be consumed as chars. 2941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax != NULL) && (!ctxt->disableSAX)) { 2943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (areBlanks(ctxt, buf, nbchar)) { 2944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->sax->ignorableWhitespace != NULL) 2945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->ignorableWhitespace(ctxt->userData, 2946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf, nbchar); 2947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlCheckParagraph(ctxt); 2949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->sax->characters != NULL) 2950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->characters(ctxt->userData, buf, nbchar); 2951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbchar = 0; 2954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXTL(l); 295660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott chunk++; 295760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (chunk > HTML_PARSER_BUFFER_SIZE) { 295860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott chunk = 0; 295960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott SHRINK; 296060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott GROW; 296160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 2962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR_CHAR(l); 2963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == 0) { 2964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SHRINK; 2965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project GROW; 2966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR_CHAR(l); 2967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nbchar != 0) { 2970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf[nbchar] = 0; 2971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Ok the segment is to be consumed as chars. 2974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax != NULL) && (!ctxt->disableSAX)) { 2976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (areBlanks(ctxt, buf, nbchar)) { 2977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->sax->ignorableWhitespace != NULL) 2978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->ignorableWhitespace(ctxt->userData, buf, nbchar); 2979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlCheckParagraph(ctxt); 2981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->sax->characters != NULL) 2982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->characters(ctxt->userData, buf, nbchar); 2983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Loop detection 2988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == 0) 2990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_EOF; 2991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseExternalID: 2996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 2997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @publicID: a xmlChar** receiving PubidLiteral 2998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse an External ID or a Public ID 3000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [75] ExternalID ::= 'SYSTEM' S SystemLiteral 3002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'PUBLIC' S PubidLiteral S SystemLiteral 3003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [83] PublicID ::= 'PUBLIC' S PubidLiteral 3005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the function returns SystemLiteral and in the second 3007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * case publicID receives PubidLiteral, is strict is off 3008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it is possible to return NULL and have publicID set. 3009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 3012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseExternalID(htmlParserCtxtPtr ctxt, xmlChar **publicID) { 3013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *URI = NULL; 3014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((UPPER == 'S') && (UPP(1) == 'Y') && 3016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (UPP(2) == 'S') && (UPP(3) == 'T') && 3017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (UPP(4) == 'E') && (UPP(5) == 'M')) { 3018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(6); 3019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_BLANK_CH(CUR)) { 3020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_SPACE_REQUIRED, 3021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Space required after 'SYSTEM'\n", NULL, NULL); 3022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 3024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URI = htmlParseSystemLiteral(ctxt); 3025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (URI == NULL) { 3026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_URI_REQUIRED, 3027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "htmlParseExternalID: SYSTEM, no URI\n", NULL, NULL); 3028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((UPPER == 'P') && (UPP(1) == 'U') && 3030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (UPP(2) == 'B') && (UPP(3) == 'L') && 3031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (UPP(4) == 'I') && (UPP(5) == 'C')) { 3032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(6); 3033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_BLANK_CH(CUR)) { 3034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_SPACE_REQUIRED, 3035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Space required after 'PUBLIC'\n", NULL, NULL); 3036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 3038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *publicID = htmlParsePubidLiteral(ctxt); 3039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*publicID == NULL) { 3040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_PUBID_REQUIRED, 3041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "htmlParseExternalID: PUBLIC, no Public Identifier\n", 3042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 3043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 3045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR == '"') || (CUR == '\'')) { 3046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URI = htmlParseSystemLiteral(ctxt); 3047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(URI); 3050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParsePI: 3054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XML parser context 3055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an XML Processing Instruction. 3057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [16] PI ::= '<?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>' 3059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 3061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParsePI(htmlParserCtxtPtr ctxt) { 3062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *buf = NULL; 3063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len = 0; 3064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int size = HTML_PARSER_BUFFER_SIZE; 3065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int cur, l; 3066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *target; 3067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputState state; 3068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int count = 0; 3069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((RAW == '<') && (NXT(1) == '?')) { 3071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->instate; 3072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_PI; 3073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this is a Processing Instruction. 3075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(2); 3077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SHRINK; 3078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse the target name and check for special support like 3081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * namespace. 3082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target = htmlParseName(ctxt); 3084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (target != NULL) { 3085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (RAW == '>') { 3086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(1); 3087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SAX: PI detected. 3090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax) && (!ctxt->disableSAX) && 3092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->sax->processingInstruction != NULL)) 3093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->processingInstruction(ctxt->userData, 3094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target, NULL); 3095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = state; 3096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); 3099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buf == NULL) { 3100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlErrMemory(ctxt, NULL); 3101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = state; 3102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR; 3105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_BLANK(cur)) { 3106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_SPACE_REQUIRED, 3107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "ParsePI: PI %s space expected\n", target, NULL); 3108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 3110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR_CHAR(l); 3111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_CHAR(cur) && (cur != '>')) { 3112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (len + 5 >= size) { 3113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *tmp; 3114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size *= 2; 3116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); 3117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 3118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlErrMemory(ctxt, NULL); 3119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(buf); 3120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = state; 3121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf = tmp; 3124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project count++; 3126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (count > 50) { 3127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project GROW; 3128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project count = 0; 3129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project COPY_BUF(l,buf,len,cur); 3131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXTL(l); 3132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR_CHAR(l); 3133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == 0) { 3134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SHRINK; 3135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project GROW; 3136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR_CHAR(l); 3137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf[len] = 0; 3140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != '>') { 3141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_PI_NOT_FINISHED, 3142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "ParsePI: PI %s never end ...\n", target, NULL); 3143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(1); 3145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SAX: PI detected. 3148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax) && (!ctxt->disableSAX) && 3150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->sax->processingInstruction != NULL)) 3151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->processingInstruction(ctxt->userData, 3152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target, buf); 3153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(buf); 3155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3156df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParseErr(ctxt, XML_ERR_PI_NOT_STARTED, 3157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "PI is not started correctly", NULL, NULL); 3158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = state; 3160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseComment: 3165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 3166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse an XML (SGML) comment <!-- .... --> 3168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [15] Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->' 3170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 3172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseComment(htmlParserCtxtPtr ctxt) { 3173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *buf = NULL; 3174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len; 3175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int size = HTML_PARSER_BUFFER_SIZE; 3176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int q, ql; 3177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int r, rl; 3178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int cur, l; 3179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputState state; 3180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check that there is a comment right here. 3183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((RAW != '<') || (NXT(1) != '!') || 3185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (NXT(2) != '-') || (NXT(3) != '-')) return; 3186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project state = ctxt->instate; 3188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_COMMENT; 3189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SHRINK; 3190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(4); 3191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); 3192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buf == NULL) { 3193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlErrMemory(ctxt, "buffer allocation failed\n"); 3194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = state; 3195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project q = CUR_CHAR(ql); 3198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXTL(ql); 3199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project r = CUR_CHAR(rl); 3200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXTL(rl); 3201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR_CHAR(l); 3202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = 0; 3203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_CHAR(cur) && 3204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((cur != '>') || 3205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (r != '-') || (q != '-'))) { 3206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (len + 5 >= size) { 3207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *tmp; 3208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size *= 2; 3210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); 3211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 3212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(buf); 3213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlErrMemory(ctxt, "growing buffer failed\n"); 3214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = state; 3215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf = tmp; 3218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project COPY_BUF(ql,buf,len,q); 3220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project q = r; 3221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ql = rl; 3222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project r = cur; 3223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rl = l; 3224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXTL(l); 3225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR_CHAR(l); 3226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == 0) { 3227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SHRINK; 3228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project GROW; 3229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = CUR_CHAR(l); 3230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf[len] = 0; 3233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_CHAR(cur)) { 3234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_COMMENT_NOT_FINISHED, 3235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Comment not terminated \n<!--%.50s\n", buf, NULL); 3236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(buf); 3237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 3239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax != NULL) && (ctxt->sax->comment != NULL) && 3240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!ctxt->disableSAX)) 3241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->comment(ctxt->userData, buf); 3242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(buf); 3243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = state; 3245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseCharRef: 3249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 3250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse Reference declarations 3252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [66] CharRef ::= '&#' [0-9]+ ';' | 3254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * '&#x' [0-9a-fA-F]+ ';' 3255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the value parsed (as an int) 3257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 3259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseCharRef(htmlParserCtxtPtr ctxt) { 3260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int val = 0; 3261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->input == NULL)) { 3263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, 3264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "htmlParseCharRef: context error\n", 3265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 3266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR == '&') && (NXT(1) == '#') && 3269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((NXT(2) == 'x') || NXT(2) == 'X')) { 3270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(3); 3271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (CUR != ';') { 3272df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((CUR >= '0') && (CUR <= '9')) 3273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = val * 16 + (CUR - '0'); 3274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((CUR >= 'a') && (CUR <= 'f')) 3275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = val * 16 + (CUR - 'a') + 10; 3276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((CUR >= 'A') && (CUR <= 'F')) 3277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = val * 16 + (CUR - 'A') + 10; 3278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 3279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INVALID_HEX_CHARREF, 3280df143a5041f03a22808b59c76698770b74692815Selim Gurun "htmlParseCharRef: missing semicolon\n", 3281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 328260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott break; 3283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 3285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == ';') 3287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 3288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((CUR == '&') && (NXT(1) == '#')) { 3289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(2); 3290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (CUR != ';') { 3291df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((CUR >= '0') && (CUR <= '9')) 3292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = val * 10 + (CUR - '0'); 3293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 3294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INVALID_DEC_CHARREF, 3295df143a5041f03a22808b59c76698770b74692815Selim Gurun "htmlParseCharRef: missing semicolon\n", 3296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 329760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott break; 3298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 3300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == ';') 3302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 3303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INVALID_CHARREF, 3305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "htmlParseCharRef: invalid value\n", NULL, NULL); 3306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check the value IS_CHAR ... 3309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_CHAR(val)) { 3311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(val); 3312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErrInt(ctxt, XML_ERR_INVALID_CHAR, 3314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "htmlParseCharRef: invalid xmlChar value %d\n", 3315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val); 3316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseDocTypeDecl: 3323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 3324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a DOCTYPE declaration 3326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3327df143a5041f03a22808b59c76698770b74692815Selim Gurun * [28] doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S? 3328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ('[' (markupdecl | PEReference | S)* ']' S?)? '>' 3329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 3332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseDocTypeDecl(htmlParserCtxtPtr ctxt) { 3333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name; 3334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ExternalID = NULL; 3335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *URI = NULL; 3336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We know that '<!DOCTYPE' has been detected. 3339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(9); 3341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 3343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse the DOCTYPE name. 3346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = htmlParseName(ctxt); 3348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 3349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_NAME_REQUIRED, 3350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "htmlParseDocTypeDecl : no DOCTYPE name !\n", 3351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 3352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check that upper(name) == "HTML" !!!!!!!!!!!!! 3355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 3358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for SystemID and ExternalID 3361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URI = htmlParseExternalID(ctxt, &ExternalID); 3363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 3364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We should be at the end of the DOCTYPE declaration. 3367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '>') { 3369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_DOCTYPE_NOT_FINISHED, 3370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "DOCTYPE improperly terminated\n", NULL, NULL); 3371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* We shouldn't try to resynchronize ... */ 3372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 3374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create or update the document accordingly to the DOCTYPE 3377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax != NULL) && (ctxt->sax->internalSubset != NULL) && 3379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!ctxt->disableSAX)) 3380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->internalSubset(ctxt->userData, name, ExternalID, URI); 3381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup, since we don't use all those identifiers 3384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (URI != NULL) xmlFree(URI); 3386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ExternalID != NULL) xmlFree(ExternalID); 3387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseAttribute: 3391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 3392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: a xmlChar ** used to store the value of the attribute 3393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an attribute 3395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [41] Attribute ::= Name Eq AttValue 3397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [25] Eq ::= S? '=' S? 3399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * With namespace: 3401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [NS 11] Attribute ::= QName Eq AttValue 3403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Also the case QName == xmlns:??? is handled independently as a namespace 3405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * definition. 3406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the attribute name, and the value in *value. 3408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar * 3411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseAttribute(htmlParserCtxtPtr ctxt, xmlChar **value) { 3412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name; 3413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *val = NULL; 3414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *value = NULL; 3416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = htmlParseHTMLName(ctxt); 3417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 3418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_NAME_REQUIRED, 3419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "error parsing attribute name\n", NULL, NULL); 3420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * read the value 3425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 3427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '=') { 3428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 3429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 3430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = htmlParseAttValue(ctxt); 3431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *value = val; 3434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(name); 3435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlCheckEncoding: 3439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 3440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attvalue: the attribute value 3441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks an http-equiv attribute from a Meta tag to detect 3443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the encoding 3444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If a new encoding is detected the parser is switched to decode 3445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it and pass UTF8 3446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 3448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlCheckEncoding(htmlParserCtxtPtr ctxt, const xmlChar *attvalue) { 3449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *encoding; 3450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3451df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((ctxt == NULL) || (attvalue == NULL) || 3452df143a5041f03a22808b59c76698770b74692815Selim Gurun (ctxt->options & HTML_PARSE_IGNORE_ENC)) 3453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3455df143a5041f03a22808b59c76698770b74692815Selim Gurun /* do not change encoding */ 3456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->input->encoding != NULL) 3457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project encoding = xmlStrcasestr(attvalue, BAD_CAST"charset="); 3460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (encoding != NULL) { 3461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project encoding += 8; 3462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project encoding = xmlStrcasestr(attvalue, BAD_CAST"charset ="); 3464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (encoding != NULL) 3465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project encoding += 9; 3466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (encoding != NULL) { 3468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCharEncoding enc; 3469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCharEncodingHandlerPtr handler; 3470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*encoding == ' ') || (*encoding == '\t')) encoding++; 3472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->input->encoding != NULL) 3474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) ctxt->input->encoding); 3475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->encoding = xmlStrdup(encoding); 3476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project enc = xmlParseCharEncoding((const char *) encoding); 3478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * registered set of known encodings 3480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (enc != XML_CHAR_ENCODING_ERROR) { 3482df143a5041f03a22808b59c76698770b74692815Selim Gurun if (((enc == XML_CHAR_ENCODING_UTF16LE) || 3483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (enc == XML_CHAR_ENCODING_UTF16BE) || 3484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (enc == XML_CHAR_ENCODING_UCS4LE) || 3485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (enc == XML_CHAR_ENCODING_UCS4BE)) && 3486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->input->buf != NULL) && 3487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->input->buf->encoder == NULL)) { 3488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INVALID_ENCODING, 3489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "htmlCheckEncoding: wrong encoding meta\n", 3490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 3491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSwitchEncoding(ctxt, enc); 3493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->charset = XML_CHAR_ENCODING_UTF8; 3495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * fallback for unknown encodings 3498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project handler = xmlFindCharEncodingHandler((const char *) encoding); 3500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (handler != NULL) { 3501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSwitchToEncoding(ctxt, handler); 3502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->charset = XML_CHAR_ENCODING_UTF8; 3503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3504df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParseErr(ctxt, XML_ERR_UNSUPPORTED_ENCODING, 3505df143a5041f03a22808b59c76698770b74692815Selim Gurun "htmlCheckEncoding: unknown encoding %s\n", 3506df143a5041f03a22808b59c76698770b74692815Selim Gurun encoding, NULL); 3507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->input->buf != NULL) && 3511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->input->buf->encoder != NULL) && 3512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->input->buf->raw != NULL) && 3513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->input->buf->buffer != NULL)) { 3514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbchars; 3515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int processed; 3516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * convert as much as possible to the parser reading buffer. 3519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project processed = ctxt->input->cur - ctxt->input->base; 3521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferShrink(ctxt->input->buf->buffer, processed); 3522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbchars = xmlCharEncInFunc(ctxt->input->buf->encoder, 3523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->buf->buffer, 3524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->buf->raw); 3525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nbchars < 0) { 3526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INVALID_ENCODING, 3527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "htmlCheckEncoding: encoder error\n", 3528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 3529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->base = 3531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->cur = ctxt->input->buf->buffer->content; 3532df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->input->end = 3533df143a5041f03a22808b59c76698770b74692815Selim Gurun &ctxt->input->base[ctxt->input->buf->buffer->use]; 3534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlCheckMeta: 3540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 3541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @atts: the attributes values 3542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks an attributes from a Meta tag 3544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 3546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlCheckMeta(htmlParserCtxtPtr ctxt, const xmlChar **atts) { 3547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 3548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *att, *value; 3549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int http = 0; 3550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *content = NULL; 3551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (atts == NULL)) 3553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = 0; 3556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project att = atts[i++]; 3557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (att != NULL) { 3558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = atts[i++]; 3559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((value != NULL) && (!xmlStrcasecmp(att, BAD_CAST"http-equiv")) 3560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (!xmlStrcasecmp(value, BAD_CAST"Content-Type"))) 3561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project http = 1; 3562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((value != NULL) && (!xmlStrcasecmp(att, BAD_CAST"content"))) 3563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = value; 3564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project att = atts[i++]; 3565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((http) && (content != NULL)) 3567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlCheckEncoding(ctxt, content); 3568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseStartTag: 3573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 3574df143a5041f03a22808b59c76698770b74692815Selim Gurun * 3575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a start of tag either for rule element or 3576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * EmptyElement. In both case we don't parse the tag closing chars. 3577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [40] STag ::= '<' Name (S Attribute)* S? '>' 3579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [44] EmptyElemTag ::= '<' Name (S Attribute)* S? '/>' 3581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * With namespace: 3583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [NS 8] STag ::= '<' QName (S Attribute)* S? '>' 3585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [NS 10] EmptyElement ::= '<' QName (S Attribute)* S? '/>' 3587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 358860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Returns 0 in case of success, -1 in case of error and 1 if discarded 3589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseStartTag(htmlParserCtxtPtr ctxt) { 3593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name; 3594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *attname; 3595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *attvalue; 3596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar **atts; 3597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbatts = 0; 3598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxatts; 3599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int meta = 0; 3600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 360160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott int discardtag = 0; 3602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3603df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->instate == XML_PARSER_EOF) 3604df143a5041f03a22808b59c76698770b74692815Selim Gurun return(-1); 3605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->input == NULL)) { 3606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, 3607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "htmlParseStartTag: context error\n", NULL, NULL); 3608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return -1; 3609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '<') return -1; 3611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 3612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atts = ctxt->atts; 3614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project maxatts = ctxt->maxatts; 3615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project GROW; 3617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = htmlParseHTMLName(ctxt); 3618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 3619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_NAME_REQUIRED, 3620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "htmlParseStartTag: invalid element name\n", 3621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 3622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Dump the bogus tag like browsers do */ 3623df143a5041f03a22808b59c76698770b74692815Selim Gurun while ((IS_CHAR_CH(CUR)) && (CUR != '>') && 3624df143a5041f03a22808b59c76698770b74692815Selim Gurun (ctxt->instate != XML_PARSER_EOF)) 3625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 3626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return -1; 3627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST"meta")) 3629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project meta = 1; 3630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for auto-closure of HTML elements. 3633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlAutoClose(ctxt, name); 3635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for implied HTML elements. 3638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlCheckImplied(ctxt, name); 3640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Avoid html at any level > 0, head at any level != 1 3643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or any attempt to recurse body 3644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->nameNr > 0) && (xmlStrEqual(name, BAD_CAST"html"))) { 3646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_HTML_STRUCURE_ERROR, 3647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "htmlParseStartTag: misplaced <html> tag\n", 3648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, NULL); 364960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott discardtag = 1; 365060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ctxt->depth++; 3651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3652df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((ctxt->nameNr != 1) && 3653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(name, BAD_CAST"head"))) { 3654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_HTML_STRUCURE_ERROR, 3655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "htmlParseStartTag: misplaced <head> tag\n", 3656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, NULL); 365760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott discardtag = 1; 365860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ctxt->depth++; 3659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST"body")) { 3661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int indx; 3662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (indx = 0;indx < ctxt->nameNr;indx++) { 3663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(ctxt->nameTab[indx], BAD_CAST"body")) { 3664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_HTML_STRUCURE_ERROR, 3665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "htmlParseStartTag: misplaced <body> tag\n", 3666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, NULL); 366760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott discardtag = 1; 366860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ctxt->depth++; 3669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Now parse the attributes, it ends up with the ending 3675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (S Attribute)* S? 3677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 3679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((IS_CHAR_CH(CUR)) && 3680df143a5041f03a22808b59c76698770b74692815Selim Gurun (CUR != '>') && 3681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((CUR != '/') || (NXT(1) != '>'))) { 3682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project long cons = ctxt->nbChars; 3683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project GROW; 3685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attname = htmlParseAttribute(ctxt, &attvalue); 3686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attname != NULL) { 3687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Well formedness requires at most one declaration of an attribute 3690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < nbatts;i += 2) { 3692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(atts[i], attname)) { 3693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_ATTRIBUTE_REDEFINED, 3694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Attribute %s redefined\n", attname, NULL); 3695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attvalue != NULL) 3696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(attvalue); 3697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto failed; 3698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add the pair to atts 3703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atts == NULL) { 3705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project maxatts = 22; /* allow for 10 attrs by default */ 3706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atts = (const xmlChar **) 3707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(maxatts * sizeof(xmlChar *)); 3708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atts == NULL) { 3709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlErrMemory(ctxt, NULL); 3710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attvalue != NULL) 3711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(attvalue); 3712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto failed; 3713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atts = atts; 3715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxatts = maxatts; 3716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (nbatts + 4 > maxatts) { 3717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar **n; 3718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project maxatts *= 2; 3720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project n = (const xmlChar **) xmlRealloc((void *) atts, 3721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project maxatts * sizeof(const xmlChar *)); 3722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (n == NULL) { 3723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlErrMemory(ctxt, NULL); 3724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attvalue != NULL) 3725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(attvalue); 3726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto failed; 3727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atts = n; 3729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->atts = atts; 3730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxatts = maxatts; 3731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atts[nbatts++] = attname; 3733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atts[nbatts++] = attvalue; 3734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atts[nbatts] = NULL; 3735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project atts[nbatts + 1] = NULL; 3736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 3738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attvalue != NULL) 3739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(attvalue); 3740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Dump the bogus attribute string up to the next blank or 3741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the end of the tag. */ 3742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((IS_CHAR_CH(CUR)) && 3743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project !(IS_BLANK_CH(CUR)) && (CUR != '>') && 3744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((CUR != '/') || (NXT(1) != '>'))) 3745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 3746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfailed: 3749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 3750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cons == ctxt->nbChars) { 3751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, 3752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "htmlParseStartTag: problem parsing attributes\n", 3753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 3754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle specific association to the META tag 3760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (meta && (nbatts != 0)) 3762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlCheckMeta(ctxt, atts); 3763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SAX: Start of Element ! 3766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 376760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (!discardtag) { 376860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott htmlnamePush(ctxt, name); 376960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) { 377060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (nbatts != 0) 377160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ctxt->sax->startElement(ctxt->userData, name, atts); 377260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott else 377360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ctxt->sax->startElement(ctxt->userData, name, NULL); 377460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 3775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atts != NULL) { 3778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 1;i < nbatts;i += 2) { 3779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (atts[i] != NULL) 3780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) atts[i]); 3781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 378460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(discardtag); 3785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseEndTag: 3789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 3790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an end of tag 3792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [42] ETag ::= '</' Name S? '>' 3794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * With namespace 3796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [NS 9] ETag ::= '</' QName S? '>' 3798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the current level should be closed. 3800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 3803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseEndTag(htmlParserCtxtPtr ctxt) 3804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name; 3806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *oldname; 3807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, ret; 3808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR != '<') || (NXT(1) != '/')) { 3810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_LTSLASH_REQUIRED, 3811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "htmlParseEndTag: '</' not found\n", NULL, NULL); 3812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 3813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(2); 3815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = htmlParseHTMLName(ctxt); 3817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) 3818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 3819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We should definitely be at the ending "S? '>'" part 3821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 3823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!IS_CHAR_CH(CUR)) || (CUR != '>')) { 3824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_GT_REQUIRED, 3825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "End tag : expected '>'\n", NULL, NULL); 3826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->recovery) { 3827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We're not at the ending > !! 3829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Error, unless in recover mode where we search forwards 3830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * until we find a > 3831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (CUR != '\0' && CUR != '>') NEXT; 3833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 3834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 3837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 383960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * if we ignored misplaced tags in htmlParseStartTag don't pop them 384060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * out now. 384160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 384260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((ctxt->depth > 0) && 384360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (xmlStrEqual(name, BAD_CAST "html") || 384460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlStrEqual(name, BAD_CAST "body") || 384560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlStrEqual(name, BAD_CAST "head"))) { 384660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ctxt->depth--; 384760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (0); 384860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 384960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 385060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* 3851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the name read is not one of the element in the parsing stack 3852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then return, it's just an error. 3853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = (ctxt->nameNr - 1); i >= 0; i--) { 3855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, ctxt->nameTab[i])) 3856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (i < 0) { 3859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_TAG_NAME_MISMATCH, 3860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unexpected end tag : %s\n", name, NULL); 3861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 3862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for auto-closure of HTML elements. 3867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlAutoCloseOnClose(ctxt, name); 3870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Well formedness constraints, opening and closing must match. 3873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * With the exception that the autoclose may have popped stuff out 3874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the stack. 3875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(name, ctxt->name)) { 3877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->name != NULL) && (!xmlStrEqual(ctxt->name, name))) { 3878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_TAG_NAME_MISMATCH, 3879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Opening and ending tag mismatch: %s and %s\n", 3880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, ctxt->name); 3881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SAX: End of Tag 3886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldname = ctxt->name; 3888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((oldname != NULL) && (xmlStrEqual(oldname, name))) { 3889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) 3890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->endElement(ctxt->userData, name); 3891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlnamePop(ctxt); 3892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 3893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 3895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 3898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseReference: 3903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 3904df143a5041f03a22808b59c76698770b74692815Selim Gurun * 3905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse and handle entity references in content, 3906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this will end-up in a call to character() since this is either a 3907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * CharRef, or a predefined entity. 3908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 3910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseReference(htmlParserCtxtPtr ctxt) { 3911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const htmlEntityDesc * ent; 3912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar out[6]; 3913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name; 3914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '&') return; 3915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (NXT(1) == '#') { 3917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int c; 3918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int bits, i = 0; 3919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = htmlParseCharRef(ctxt); 3921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (c == 0) 3922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (c < 0x80) { out[i++]= c; bits= -6; } 3925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (c < 0x800) { out[i++]=((c >> 6) & 0x1F) | 0xC0; bits= 0; } 3926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (c < 0x10000) { out[i++]=((c >> 12) & 0x0F) | 0xE0; bits= 6; } 3927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { out[i++]=((c >> 18) & 0x07) | 0xF0; bits= 12; } 3928df143a5041f03a22808b59c76698770b74692815Selim Gurun 3929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for ( ; bits >= 0; bits-= 6) { 3930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project out[i++]= ((c >> bits) & 0x3F) | 0x80; 3931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project out[i] = 0; 3933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlCheckParagraph(ctxt); 3935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL)) 3936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->characters(ctxt->userData, out, i); 3937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ent = htmlParseEntityRef(ctxt, &name); 3939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 3940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlCheckParagraph(ctxt); 3941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL)) 3942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->characters(ctxt->userData, BAD_CAST "&", 1); 3943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ent == NULL) || !(ent->value > 0)) { 3946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlCheckParagraph(ctxt); 3947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL)) { 3948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->characters(ctxt->userData, BAD_CAST "&", 1); 3949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->characters(ctxt->userData, name, xmlStrlen(name)); 3950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* ctxt->sax->characters(ctxt->userData, BAD_CAST ";", 1); */ 3951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int c; 3954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int bits, i = 0; 3955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = ent->value; 3957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (c < 0x80) 3958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { out[i++]= c; bits= -6; } 3959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (c < 0x800) 3960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { out[i++]=((c >> 6) & 0x1F) | 0xC0; bits= 0; } 3961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (c < 0x10000) 3962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { out[i++]=((c >> 12) & 0x0F) | 0xE0; bits= 6; } 3963df143a5041f03a22808b59c76698770b74692815Selim Gurun else 3964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { out[i++]=((c >> 18) & 0x07) | 0xF0; bits= 12; } 3965df143a5041f03a22808b59c76698770b74692815Selim Gurun 3966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for ( ; bits >= 0; bits-= 6) { 3967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project out[i++]= ((c >> bits) & 0x3F) | 0x80; 3968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project out[i] = 0; 3970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlCheckParagraph(ctxt); 3972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL)) 3973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->characters(ctxt->userData, out, i); 3974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseContent: 3980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 3981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse a content: comment, sub-element, reference or text. 3983df143a5041f03a22808b59c76698770b74692815Selim Gurun * Kept for compatibility with old code 3984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 3987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseContent(htmlParserCtxtPtr ctxt) { 3988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *currentNode; 3989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int depth; 3990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name; 3991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project currentNode = xmlStrdup(ctxt->name); 3993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth = ctxt->nameNr; 3994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (1) { 3995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project long cons = ctxt->nbChars; 3996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project GROW; 3998df143a5041f03a22808b59c76698770b74692815Selim Gurun 3999df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->instate == XML_PARSER_EOF) 4000df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 4001df143a5041f03a22808b59c76698770b74692815Selim Gurun 4002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Our tag or one of it's parent or children is ending. 4004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR == '<') && (NXT(1) == '/')) { 4006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (htmlParseEndTag(ctxt) && 4007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((currentNode != NULL) || (ctxt->nameNr == 0))) { 4008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (currentNode != NULL) 4009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(currentNode); 4010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; /* while */ 4013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((CUR == '<') && 4016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((IS_ASCII_LETTER(NXT(1))) || 4017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (NXT(1) == '_') || (NXT(1) == ':'))) { 4018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = htmlParseHTMLName_nonInvasive(ctxt); 4019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 4020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_NAME_REQUIRED, 4021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "htmlParseStartTag: invalid element name\n", 4022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 4023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Dump the bogus tag like browsers do */ 4024df143a5041f03a22808b59c76698770b74692815Selim Gurun while ((IS_CHAR_CH(CUR)) && (CUR != '>')) 4025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (currentNode != NULL) 4028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(currentNode); 4029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->name != NULL) { 4033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (htmlCheckAutoClose(name, ctxt->name) == 1) { 4034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlAutoClose(ctxt, name); 4035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 4036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4037df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Has this node been popped out during parsing of 4042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the next element 4043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->nameNr > 0) && (depth >= ctxt->nameNr) && 4045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrEqual(currentNode, ctxt->name))) 4046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 4047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (currentNode != NULL) xmlFree(currentNode); 4048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR != 0) && ((xmlStrEqual(currentNode, BAD_CAST"script")) || 4052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(currentNode, BAD_CAST"style")))) { 4053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle SCRIPT/STYLE separately 4055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseScript(ctxt); 4057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Sometimes DOCTYPE arrives in the middle of the document 4060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR == '<') && (NXT(1) == '!') && 4062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (UPP(2) == 'D') && (UPP(3) == 'O') && 4063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (UPP(4) == 'C') && (UPP(5) == 'T') && 4064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (UPP(6) == 'Y') && (UPP(7) == 'P') && 4065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (UPP(8) == 'E')) { 4066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_HTML_STRUCURE_ERROR, 4067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Misplaced DOCTYPE declaration\n", 4068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "DOCTYPE" , NULL); 4069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseDocTypeDecl(ctxt); 4070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * First case : a comment 4074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR == '<') && (NXT(1) == '!') && 4076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (NXT(2) == '-') && (NXT(3) == '-')) { 4077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseComment(ctxt); 4078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Second case : a Processing Instruction. 4082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((CUR == '<') && (NXT(1) == '?')) { 4084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParsePI(ctxt); 4085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Third case : a sub-element. 4089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (CUR == '<') { 4091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseElement(ctxt); 4092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fourth case : a reference. If if has not been resolved, 4096df143a5041f03a22808b59c76698770b74692815Selim Gurun * parsing returns it's Name, create the node 4097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (CUR == '&') { 4099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseReference(ctxt); 4100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fifth case : end of the resource 4104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (CUR == 0) { 4106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlAutoCloseOnEnd(ctxt); 4107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Last case, text. Note that References are handled directly. 4112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 4114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseCharData(ctxt); 4115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cons == ctxt->nbChars) { 4118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->node != NULL) { 4119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, 4120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "detected an error in element content\n", 4121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 4122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project GROW; 4127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (currentNode != NULL) xmlFree(currentNode); 4129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseElement: 4133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 4134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an HTML element, this is highly recursive 4136df143a5041f03a22808b59c76698770b74692815Selim Gurun * this is kept for compatibility with previous code versions 4137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [39] element ::= EmptyElemTag | STag content ETag 4139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [41] Attribute ::= Name Eq AttValue 4141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 4144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseElement(htmlParserCtxtPtr ctxt) { 4145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name; 4146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *currentNode = NULL; 4147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const htmlElemDesc * info; 4148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParserNodeInfo node_info; 4149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int failed; 4150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int depth; 4151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *oldptr; 4152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->input == NULL)) { 4154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, 4155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "htmlParseElement: context error\n", NULL, NULL); 4156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4158df143a5041f03a22808b59c76698770b74692815Selim Gurun 4159df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->instate == XML_PARSER_EOF) 4160df143a5041f03a22808b59c76698770b74692815Selim Gurun return; 4161df143a5041f03a22808b59c76698770b74692815Selim Gurun 4162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Capture start position */ 4163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->record_info) { 4164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node_info.begin_pos = ctxt->input->consumed + 4165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CUR_PTR - ctxt->input->base); 4166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node_info.begin_line = ctxt->input->line; 4167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project failed = htmlParseStartTag(ctxt); 4170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = ctxt->name; 417160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((failed == -1) || (name == NULL)) { 4172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '>') 4173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Lookup the info for that element. 4179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project info = htmlTagLookup(name); 4181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (info == NULL) { 4182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_HTML_UNKNOWN_TAG, 4183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Tag %s invalid\n", name, NULL); 4184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for an Empty Element labeled the XML/SGML way 4188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR == '/') && (NXT(1) == '>')) { 4190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(2); 4191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) 4192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->endElement(ctxt->userData, name); 4193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlnamePop(ctxt); 4194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '>') { 4198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 4199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_GT_REQUIRED, 4201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Couldn't find end of Start Tag %s\n", name, NULL); 4202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * end of parsing of this node. 4205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4206df143a5041f03a22808b59c76698770b74692815Selim Gurun if (xmlStrEqual(name, ctxt->name)) { 4207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nodePop(ctxt); 4208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlnamePop(ctxt); 4209df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Capture end position and add node 4213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->record_info) { 4215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node_info.end_pos = ctxt->input->consumed + 4216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CUR_PTR - ctxt->input->base); 4217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node_info.end_line = ctxt->input->line; 4218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node_info.node = ctxt->node; 4219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserAddNodeInfo(ctxt, &node_info); 4220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for an Empty Element from DTD definition 4226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((info != NULL) && (info->empty)) { 4228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) 4229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->endElement(ctxt->userData, name); 4230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlnamePop(ctxt); 4231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse the content of the element: 4236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project currentNode = xmlStrdup(ctxt->name); 4238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth = ctxt->nameNr; 4239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_CHAR_CH(CUR)) { 4240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldptr = ctxt->input->cur; 4241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseContent(ctxt); 4242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (oldptr==ctxt->input->cur) break; 4243df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->nameNr < depth) break; 4244df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Capture end position and add node 4248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( currentNode != NULL && ctxt->record_info ) { 4250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node_info.end_pos = ctxt->input->consumed + 4251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CUR_PTR - ctxt->input->base); 4252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node_info.end_line = ctxt->input->line; 4253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node_info.node = ctxt->node; 4254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserAddNodeInfo(ctxt, &node_info); 4255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_CHAR_CH(CUR)) { 4257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlAutoCloseOnEnd(ctxt); 4258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (currentNode != NULL) 4261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(currentNode); 4262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4264df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic void 4265df143a5041f03a22808b59c76698770b74692815Selim GurunhtmlParserFinishElementParsing(htmlParserCtxtPtr ctxt) { 4266df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 4267df143a5041f03a22808b59c76698770b74692815Selim Gurun * Capture end position and add node 4268df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 4269df143a5041f03a22808b59c76698770b74692815Selim Gurun if ( ctxt->node != NULL && ctxt->record_info ) { 4270df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->nodeInfo->end_pos = ctxt->input->consumed + 4271df143a5041f03a22808b59c76698770b74692815Selim Gurun (CUR_PTR - ctxt->input->base); 4272df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->nodeInfo->end_line = ctxt->input->line; 4273df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->nodeInfo->node = ctxt->node; 4274df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlParserAddNodeInfo(ctxt, ctxt->nodeInfo); 4275df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlNodeInfoPop(ctxt); 4276df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4277df143a5041f03a22808b59c76698770b74692815Selim Gurun if (!IS_CHAR_CH(CUR)) { 4278df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlAutoCloseOnEnd(ctxt); 4279df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4280df143a5041f03a22808b59c76698770b74692815Selim Gurun} 4281df143a5041f03a22808b59c76698770b74692815Selim Gurun 4282df143a5041f03a22808b59c76698770b74692815Selim Gurun/** 4283df143a5041f03a22808b59c76698770b74692815Selim Gurun * htmlParseElementInternal: 4284df143a5041f03a22808b59c76698770b74692815Selim Gurun * @ctxt: an HTML parser context 4285df143a5041f03a22808b59c76698770b74692815Selim Gurun * 4286df143a5041f03a22808b59c76698770b74692815Selim Gurun * parse an HTML element, new version, non recursive 4287df143a5041f03a22808b59c76698770b74692815Selim Gurun * 4288df143a5041f03a22808b59c76698770b74692815Selim Gurun * [39] element ::= EmptyElemTag | STag content ETag 4289df143a5041f03a22808b59c76698770b74692815Selim Gurun * 4290df143a5041f03a22808b59c76698770b74692815Selim Gurun * [41] Attribute ::= Name Eq AttValue 4291df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 4292df143a5041f03a22808b59c76698770b74692815Selim Gurun 4293df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic void 4294df143a5041f03a22808b59c76698770b74692815Selim GurunhtmlParseElementInternal(htmlParserCtxtPtr ctxt) { 4295df143a5041f03a22808b59c76698770b74692815Selim Gurun const xmlChar *name; 4296df143a5041f03a22808b59c76698770b74692815Selim Gurun const htmlElemDesc * info; 4297df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParserNodeInfo node_info; 4298df143a5041f03a22808b59c76698770b74692815Selim Gurun int failed; 4299df143a5041f03a22808b59c76698770b74692815Selim Gurun 4300df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((ctxt == NULL) || (ctxt->input == NULL)) { 4301df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, 4302df143a5041f03a22808b59c76698770b74692815Selim Gurun "htmlParseElementInternal: context error\n", NULL, NULL); 4303df143a5041f03a22808b59c76698770b74692815Selim Gurun return; 4304df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4305df143a5041f03a22808b59c76698770b74692815Selim Gurun 4306df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->instate == XML_PARSER_EOF) 4307df143a5041f03a22808b59c76698770b74692815Selim Gurun return; 4308df143a5041f03a22808b59c76698770b74692815Selim Gurun 4309df143a5041f03a22808b59c76698770b74692815Selim Gurun /* Capture start position */ 4310df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->record_info) { 4311df143a5041f03a22808b59c76698770b74692815Selim Gurun node_info.begin_pos = ctxt->input->consumed + 4312df143a5041f03a22808b59c76698770b74692815Selim Gurun (CUR_PTR - ctxt->input->base); 4313df143a5041f03a22808b59c76698770b74692815Selim Gurun node_info.begin_line = ctxt->input->line; 4314df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4315df143a5041f03a22808b59c76698770b74692815Selim Gurun 4316df143a5041f03a22808b59c76698770b74692815Selim Gurun failed = htmlParseStartTag(ctxt); 4317df143a5041f03a22808b59c76698770b74692815Selim Gurun name = ctxt->name; 4318df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((failed == -1) || (name == NULL)) { 4319df143a5041f03a22808b59c76698770b74692815Selim Gurun if (CUR == '>') 4320df143a5041f03a22808b59c76698770b74692815Selim Gurun NEXT; 4321df143a5041f03a22808b59c76698770b74692815Selim Gurun return; 4322df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4323df143a5041f03a22808b59c76698770b74692815Selim Gurun 4324df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 4325df143a5041f03a22808b59c76698770b74692815Selim Gurun * Lookup the info for that element. 4326df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 4327df143a5041f03a22808b59c76698770b74692815Selim Gurun info = htmlTagLookup(name); 4328df143a5041f03a22808b59c76698770b74692815Selim Gurun if (info == NULL) { 4329df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParseErr(ctxt, XML_HTML_UNKNOWN_TAG, 4330df143a5041f03a22808b59c76698770b74692815Selim Gurun "Tag %s invalid\n", name, NULL); 4331df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4332df143a5041f03a22808b59c76698770b74692815Selim Gurun 4333df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 4334df143a5041f03a22808b59c76698770b74692815Selim Gurun * Check for an Empty Element labeled the XML/SGML way 4335df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 4336df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((CUR == '/') && (NXT(1) == '>')) { 4337df143a5041f03a22808b59c76698770b74692815Selim Gurun SKIP(2); 4338df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) 4339df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->sax->endElement(ctxt->userData, name); 4340df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlnamePop(ctxt); 4341df143a5041f03a22808b59c76698770b74692815Selim Gurun return; 4342df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4343df143a5041f03a22808b59c76698770b74692815Selim Gurun 4344df143a5041f03a22808b59c76698770b74692815Selim Gurun if (CUR == '>') { 4345df143a5041f03a22808b59c76698770b74692815Selim Gurun NEXT; 4346df143a5041f03a22808b59c76698770b74692815Selim Gurun } else { 4347df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParseErr(ctxt, XML_ERR_GT_REQUIRED, 4348df143a5041f03a22808b59c76698770b74692815Selim Gurun "Couldn't find end of Start Tag %s\n", name, NULL); 4349df143a5041f03a22808b59c76698770b74692815Selim Gurun 4350df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 4351df143a5041f03a22808b59c76698770b74692815Selim Gurun * end of parsing of this node. 4352df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 4353df143a5041f03a22808b59c76698770b74692815Selim Gurun if (xmlStrEqual(name, ctxt->name)) { 4354df143a5041f03a22808b59c76698770b74692815Selim Gurun nodePop(ctxt); 4355df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlnamePop(ctxt); 4356df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4357df143a5041f03a22808b59c76698770b74692815Selim Gurun 4358df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->record_info) 4359df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlNodeInfoPush(ctxt, &node_info); 4360df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParserFinishElementParsing(ctxt); 4361df143a5041f03a22808b59c76698770b74692815Selim Gurun return; 4362df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4363df143a5041f03a22808b59c76698770b74692815Selim Gurun 4364df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 4365df143a5041f03a22808b59c76698770b74692815Selim Gurun * Check for an Empty Element from DTD definition 4366df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 4367df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((info != NULL) && (info->empty)) { 4368df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) 4369df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->sax->endElement(ctxt->userData, name); 4370df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlnamePop(ctxt); 4371df143a5041f03a22808b59c76698770b74692815Selim Gurun return; 4372df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4373df143a5041f03a22808b59c76698770b74692815Selim Gurun 4374df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->record_info) 4375df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlNodeInfoPush(ctxt, &node_info); 4376df143a5041f03a22808b59c76698770b74692815Selim Gurun} 4377df143a5041f03a22808b59c76698770b74692815Selim Gurun 4378df143a5041f03a22808b59c76698770b74692815Selim Gurun/** 4379df143a5041f03a22808b59c76698770b74692815Selim Gurun * htmlParseContentInternal: 4380df143a5041f03a22808b59c76698770b74692815Selim Gurun * @ctxt: an HTML parser context 4381df143a5041f03a22808b59c76698770b74692815Selim Gurun * 4382df143a5041f03a22808b59c76698770b74692815Selim Gurun * Parse a content: comment, sub-element, reference or text. 4383df143a5041f03a22808b59c76698770b74692815Selim Gurun * New version for non recursive htmlParseElementInternal 4384df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 4385df143a5041f03a22808b59c76698770b74692815Selim Gurun 4386df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic void 4387df143a5041f03a22808b59c76698770b74692815Selim GurunhtmlParseContentInternal(htmlParserCtxtPtr ctxt) { 4388df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlChar *currentNode; 4389df143a5041f03a22808b59c76698770b74692815Selim Gurun int depth; 4390df143a5041f03a22808b59c76698770b74692815Selim Gurun const xmlChar *name; 4391df143a5041f03a22808b59c76698770b74692815Selim Gurun 4392df143a5041f03a22808b59c76698770b74692815Selim Gurun currentNode = xmlStrdup(ctxt->name); 4393df143a5041f03a22808b59c76698770b74692815Selim Gurun depth = ctxt->nameNr; 4394df143a5041f03a22808b59c76698770b74692815Selim Gurun while (1) { 4395df143a5041f03a22808b59c76698770b74692815Selim Gurun long cons = ctxt->nbChars; 4396df143a5041f03a22808b59c76698770b74692815Selim Gurun 4397df143a5041f03a22808b59c76698770b74692815Selim Gurun GROW; 4398df143a5041f03a22808b59c76698770b74692815Selim Gurun 4399df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->instate == XML_PARSER_EOF) 4400df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 4401df143a5041f03a22808b59c76698770b74692815Selim Gurun 4402df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 4403df143a5041f03a22808b59c76698770b74692815Selim Gurun * Our tag or one of it's parent or children is ending. 4404df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 4405df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((CUR == '<') && (NXT(1) == '/')) { 4406df143a5041f03a22808b59c76698770b74692815Selim Gurun if (htmlParseEndTag(ctxt) && 4407df143a5041f03a22808b59c76698770b74692815Selim Gurun ((currentNode != NULL) || (ctxt->nameNr == 0))) { 4408df143a5041f03a22808b59c76698770b74692815Selim Gurun if (currentNode != NULL) 4409df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlFree(currentNode); 4410df143a5041f03a22808b59c76698770b74692815Selim Gurun 4411df143a5041f03a22808b59c76698770b74692815Selim Gurun currentNode = xmlStrdup(ctxt->name); 4412df143a5041f03a22808b59c76698770b74692815Selim Gurun depth = ctxt->nameNr; 4413df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4414df143a5041f03a22808b59c76698770b74692815Selim Gurun continue; /* while */ 4415df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4416df143a5041f03a22808b59c76698770b74692815Selim Gurun 4417df143a5041f03a22808b59c76698770b74692815Selim Gurun else if ((CUR == '<') && 4418df143a5041f03a22808b59c76698770b74692815Selim Gurun ((IS_ASCII_LETTER(NXT(1))) || 4419df143a5041f03a22808b59c76698770b74692815Selim Gurun (NXT(1) == '_') || (NXT(1) == ':'))) { 4420df143a5041f03a22808b59c76698770b74692815Selim Gurun name = htmlParseHTMLName_nonInvasive(ctxt); 4421df143a5041f03a22808b59c76698770b74692815Selim Gurun if (name == NULL) { 4422df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParseErr(ctxt, XML_ERR_NAME_REQUIRED, 4423df143a5041f03a22808b59c76698770b74692815Selim Gurun "htmlParseStartTag: invalid element name\n", 4424df143a5041f03a22808b59c76698770b74692815Selim Gurun NULL, NULL); 4425df143a5041f03a22808b59c76698770b74692815Selim Gurun /* Dump the bogus tag like browsers do */ 4426df143a5041f03a22808b59c76698770b74692815Selim Gurun while ((IS_CHAR_CH(CUR)) && (CUR != '>')) 4427df143a5041f03a22808b59c76698770b74692815Selim Gurun NEXT; 4428df143a5041f03a22808b59c76698770b74692815Selim Gurun 4429df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParserFinishElementParsing(ctxt); 4430df143a5041f03a22808b59c76698770b74692815Selim Gurun if (currentNode != NULL) 4431df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlFree(currentNode); 4432df143a5041f03a22808b59c76698770b74692815Selim Gurun 4433df143a5041f03a22808b59c76698770b74692815Selim Gurun currentNode = xmlStrdup(ctxt->name); 4434df143a5041f03a22808b59c76698770b74692815Selim Gurun depth = ctxt->nameNr; 4435df143a5041f03a22808b59c76698770b74692815Selim Gurun continue; 4436df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4437df143a5041f03a22808b59c76698770b74692815Selim Gurun 4438df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->name != NULL) { 4439df143a5041f03a22808b59c76698770b74692815Selim Gurun if (htmlCheckAutoClose(name, ctxt->name) == 1) { 4440df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlAutoClose(ctxt, name); 4441df143a5041f03a22808b59c76698770b74692815Selim Gurun continue; 4442df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4443df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4444df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4445df143a5041f03a22808b59c76698770b74692815Selim Gurun 4446df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 4447df143a5041f03a22808b59c76698770b74692815Selim Gurun * Has this node been popped out during parsing of 4448df143a5041f03a22808b59c76698770b74692815Selim Gurun * the next element 4449df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 4450df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((ctxt->nameNr > 0) && (depth >= ctxt->nameNr) && 4451df143a5041f03a22808b59c76698770b74692815Selim Gurun (!xmlStrEqual(currentNode, ctxt->name))) 4452df143a5041f03a22808b59c76698770b74692815Selim Gurun { 4453df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParserFinishElementParsing(ctxt); 4454df143a5041f03a22808b59c76698770b74692815Selim Gurun if (currentNode != NULL) xmlFree(currentNode); 4455df143a5041f03a22808b59c76698770b74692815Selim Gurun 4456df143a5041f03a22808b59c76698770b74692815Selim Gurun currentNode = xmlStrdup(ctxt->name); 4457df143a5041f03a22808b59c76698770b74692815Selim Gurun depth = ctxt->nameNr; 4458df143a5041f03a22808b59c76698770b74692815Selim Gurun continue; 4459df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4460df143a5041f03a22808b59c76698770b74692815Selim Gurun 4461df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((CUR != 0) && ((xmlStrEqual(currentNode, BAD_CAST"script")) || 4462df143a5041f03a22808b59c76698770b74692815Selim Gurun (xmlStrEqual(currentNode, BAD_CAST"style")))) { 4463df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 4464df143a5041f03a22808b59c76698770b74692815Selim Gurun * Handle SCRIPT/STYLE separately 4465df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 4466df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParseScript(ctxt); 4467df143a5041f03a22808b59c76698770b74692815Selim Gurun } else { 4468df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 4469df143a5041f03a22808b59c76698770b74692815Selim Gurun * Sometimes DOCTYPE arrives in the middle of the document 4470df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 4471df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((CUR == '<') && (NXT(1) == '!') && 4472df143a5041f03a22808b59c76698770b74692815Selim Gurun (UPP(2) == 'D') && (UPP(3) == 'O') && 4473df143a5041f03a22808b59c76698770b74692815Selim Gurun (UPP(4) == 'C') && (UPP(5) == 'T') && 4474df143a5041f03a22808b59c76698770b74692815Selim Gurun (UPP(6) == 'Y') && (UPP(7) == 'P') && 4475df143a5041f03a22808b59c76698770b74692815Selim Gurun (UPP(8) == 'E')) { 4476df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParseErr(ctxt, XML_HTML_STRUCURE_ERROR, 4477df143a5041f03a22808b59c76698770b74692815Selim Gurun "Misplaced DOCTYPE declaration\n", 4478df143a5041f03a22808b59c76698770b74692815Selim Gurun BAD_CAST "DOCTYPE" , NULL); 4479df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParseDocTypeDecl(ctxt); 4480df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4481df143a5041f03a22808b59c76698770b74692815Selim Gurun 4482df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 4483df143a5041f03a22808b59c76698770b74692815Selim Gurun * First case : a comment 4484df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 4485df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((CUR == '<') && (NXT(1) == '!') && 4486df143a5041f03a22808b59c76698770b74692815Selim Gurun (NXT(2) == '-') && (NXT(3) == '-')) { 4487df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParseComment(ctxt); 4488df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4489df143a5041f03a22808b59c76698770b74692815Selim Gurun 4490df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 4491df143a5041f03a22808b59c76698770b74692815Selim Gurun * Second case : a Processing Instruction. 4492df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 4493df143a5041f03a22808b59c76698770b74692815Selim Gurun else if ((CUR == '<') && (NXT(1) == '?')) { 4494df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParsePI(ctxt); 4495df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4496df143a5041f03a22808b59c76698770b74692815Selim Gurun 4497df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 4498df143a5041f03a22808b59c76698770b74692815Selim Gurun * Third case : a sub-element. 4499df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 4500df143a5041f03a22808b59c76698770b74692815Selim Gurun else if (CUR == '<') { 4501df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParseElementInternal(ctxt); 4502df143a5041f03a22808b59c76698770b74692815Selim Gurun if (currentNode != NULL) xmlFree(currentNode); 4503df143a5041f03a22808b59c76698770b74692815Selim Gurun 4504df143a5041f03a22808b59c76698770b74692815Selim Gurun currentNode = xmlStrdup(ctxt->name); 4505df143a5041f03a22808b59c76698770b74692815Selim Gurun depth = ctxt->nameNr; 4506df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4507df143a5041f03a22808b59c76698770b74692815Selim Gurun 4508df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 4509df143a5041f03a22808b59c76698770b74692815Selim Gurun * Fourth case : a reference. If if has not been resolved, 4510df143a5041f03a22808b59c76698770b74692815Selim Gurun * parsing returns it's Name, create the node 4511df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 4512df143a5041f03a22808b59c76698770b74692815Selim Gurun else if (CUR == '&') { 4513df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParseReference(ctxt); 4514df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4515df143a5041f03a22808b59c76698770b74692815Selim Gurun 4516df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 4517df143a5041f03a22808b59c76698770b74692815Selim Gurun * Fifth case : end of the resource 4518df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 4519df143a5041f03a22808b59c76698770b74692815Selim Gurun else if (CUR == 0) { 4520df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlAutoCloseOnEnd(ctxt); 4521df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 4522df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4523df143a5041f03a22808b59c76698770b74692815Selim Gurun 4524df143a5041f03a22808b59c76698770b74692815Selim Gurun /* 4525df143a5041f03a22808b59c76698770b74692815Selim Gurun * Last case, text. Note that References are handled directly. 4526df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 4527df143a5041f03a22808b59c76698770b74692815Selim Gurun else { 4528df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParseCharData(ctxt); 4529df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4530df143a5041f03a22808b59c76698770b74692815Selim Gurun 4531df143a5041f03a22808b59c76698770b74692815Selim Gurun if (cons == ctxt->nbChars) { 4532df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->node != NULL) { 4533df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, 4534df143a5041f03a22808b59c76698770b74692815Selim Gurun "detected an error in element content\n", 4535df143a5041f03a22808b59c76698770b74692815Selim Gurun NULL, NULL); 4536df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4537df143a5041f03a22808b59c76698770b74692815Selim Gurun break; 4538df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4539df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4540df143a5041f03a22808b59c76698770b74692815Selim Gurun GROW; 4541df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4542df143a5041f03a22808b59c76698770b74692815Selim Gurun if (currentNode != NULL) xmlFree(currentNode); 4543df143a5041f03a22808b59c76698770b74692815Selim Gurun} 4544df143a5041f03a22808b59c76698770b74692815Selim Gurun 4545df143a5041f03a22808b59c76698770b74692815Selim Gurun/** 4546df143a5041f03a22808b59c76698770b74692815Selim Gurun * htmlParseContent: 4547df143a5041f03a22808b59c76698770b74692815Selim Gurun * @ctxt: an HTML parser context 4548df143a5041f03a22808b59c76698770b74692815Selim Gurun * 4549df143a5041f03a22808b59c76698770b74692815Selim Gurun * Parse a content: comment, sub-element, reference or text. 4550df143a5041f03a22808b59c76698770b74692815Selim Gurun * This is the entry point when called from parser.c 4551df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 4552df143a5041f03a22808b59c76698770b74692815Selim Gurun 4553df143a5041f03a22808b59c76698770b74692815Selim Gurunvoid 4554df143a5041f03a22808b59c76698770b74692815Selim Gurun__htmlParseContent(void *ctxt) { 4555df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt != NULL) 4556df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParseContentInternal((htmlParserCtxtPtr) ctxt); 4557df143a5041f03a22808b59c76698770b74692815Selim Gurun} 4558df143a5041f03a22808b59c76698770b74692815Selim Gurun 4559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseDocument: 4561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 4562df143a5041f03a22808b59c76698770b74692815Selim Gurun * 4563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an HTML document (and build a tree if using the standard SAX 4564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * interface). 4565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0, -1 in case of error. the parser context is augmented 4567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * as a result of the parsing. 4568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 4571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseDocument(htmlParserCtxtPtr ctxt) { 457260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlChar start[4]; 457360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlCharEncoding enc; 4574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDtdPtr dtd; 4575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitParser(); 4577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlDefaultSAXHandlerInit(); 4579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->input == NULL)) { 4581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, 4582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "htmlParseDocument: context error\n", NULL, NULL); 4583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(XML_ERR_INTERNAL_ERROR); 4584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->html = 1; 4586df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->linenumbers = 1; 4587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project GROW; 4588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SAX: beginning of the document processing. 4590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax) && (ctxt->sax->setDocumentLocator)) 4592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->setDocumentLocator(ctxt->userData, &xmlDefaultSAXLocator); 4593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 459460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((ctxt->encoding == (const xmlChar *)XML_CHAR_ENCODING_NONE) && 459560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ((ctxt->input->end - ctxt->input->cur) >= 4)) { 459660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* 459760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Get the 4 first bytes and decode the charset 459860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * if enc != XML_CHAR_ENCODING_NONE 459960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * plug some encoding conversion routines. 460060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 460160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott start[0] = RAW; 460260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott start[1] = NXT(1); 460360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott start[2] = NXT(2); 460460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott start[3] = NXT(3); 460560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott enc = xmlDetectCharEncoding(&start[0], 4); 460660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (enc != XML_CHAR_ENCODING_NONE) { 460760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlSwitchEncoding(ctxt, enc); 460860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 460960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 461060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 4611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wipe out everything which is before the first '<' 4613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 4615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == 0) { 4616df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParseErr(ctxt, XML_ERR_DOCUMENT_EMPTY, 4617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Document is empty\n", NULL, NULL); 4618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax) && (ctxt->sax->startDocument) && (!ctxt->disableSAX)) 4621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->startDocument(ctxt->userData); 4622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse possible comments and PIs before any content 4626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (((CUR == '<') && (NXT(1) == '!') && 4628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (NXT(2) == '-') && (NXT(3) == '-')) || 4629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((CUR == '<') && (NXT(1) == '?'))) { 463060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott htmlParseComment(ctxt); 463160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott htmlParsePI(ctxt); 4632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 463360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 4634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Then possibly doc type declaration(s) and more Misc 4638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (doctypedecl Misc*)? 4639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR == '<') && (NXT(1) == '!') && 4641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (UPP(2) == 'D') && (UPP(3) == 'O') && 4642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (UPP(4) == 'C') && (UPP(5) == 'T') && 4643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (UPP(6) == 'Y') && (UPP(7) == 'P') && 4644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (UPP(8) == 'E')) { 4645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseDocTypeDecl(ctxt); 4646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 4648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse possible comments and PIs before any content 4651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (((CUR == '<') && (NXT(1) == '!') && 4653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (NXT(2) == '-') && (NXT(3) == '-')) || 4654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((CUR == '<') && (NXT(1) == '?'))) { 4655df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParseComment(ctxt); 4656df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParsePI(ctxt); 4657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 4658df143a5041f03a22808b59c76698770b74692815Selim Gurun } 4659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Time to start parsing the tree itself 4662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4663df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParseContentInternal(ctxt); 4664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * autoclose 4667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == 0) 4669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlAutoCloseOnEnd(ctxt); 4670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SAX: end of the document processing. 4674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) 4676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->endDocument(ctxt->userData); 4677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4678df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((!(ctxt->options & HTML_PARSE_NODEFDTD)) && (ctxt->myDoc != NULL)) { 4679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dtd = xmlGetIntSubset(ctxt->myDoc); 4680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd == NULL) 4681df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->myDoc->intSubset = 4682df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlCreateIntSubset(ctxt->myDoc, BAD_CAST "html", 4683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "-//W3C//DTD HTML 4.0 Transitional//EN", 4684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "http://www.w3.org/TR/REC-html40/loose.dtd"); 4685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! ctxt->wellFormed) return(-1); 4687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 4688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 4692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 4693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parser contexts handling * 4694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 4695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 4696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlInitParserCtxt: 4699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 4700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initialize a parser context 4702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success and -1 in case of error 4704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 4707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlInitParserCtxt(htmlParserCtxtPtr ctxt) 4708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlSAXHandler *sax; 4710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return(-1); 4712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ctxt, 0, sizeof(htmlParserCtxt)); 4713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->dict = xmlDictCreate(); 4715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->dict == NULL) { 4716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlErrMemory(NULL, "htmlInitParserCtxt: out of memory\n"); 4717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sax = (htmlSAXHandler *) xmlMalloc(sizeof(htmlSAXHandler)); 4720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sax == NULL) { 4721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlErrMemory(NULL, "htmlInitParserCtxt: out of memory\n"); 4722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 4725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(sax, 0, sizeof(htmlSAXHandler)); 4726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Allocate the Input stack */ 4728df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->inputTab = (htmlParserInputPtr *) 4729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(5 * sizeof(htmlParserInputPtr)); 4730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->inputTab == NULL) { 4731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlErrMemory(NULL, "htmlInitParserCtxt: out of memory\n"); 4732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inputNr = 0; 4733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inputMax = 0; 4734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input = NULL; 4735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inputNr = 0; 4738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inputMax = 5; 4739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input = NULL; 4740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->version = NULL; 4741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->encoding = NULL; 4742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->standalone = -1; 4743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_START; 4744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Allocate the Node stack */ 4746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeTab = (htmlNodePtr *) xmlMalloc(10 * sizeof(htmlNodePtr)); 4747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nodeTab == NULL) { 4748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlErrMemory(NULL, "htmlInitParserCtxt: out of memory\n"); 4749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeNr = 0; 4750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeMax = 0; 4751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->node = NULL; 4752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inputNr = 0; 4753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inputMax = 0; 4754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input = NULL; 4755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeNr = 0; 4758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeMax = 10; 4759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->node = NULL; 4760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Allocate the Name stack */ 4762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nameTab = (const xmlChar **) xmlMalloc(10 * sizeof(xmlChar *)); 4763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nameTab == NULL) { 4764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlErrMemory(NULL, "htmlInitParserCtxt: out of memory\n"); 4765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nameNr = 0; 4766df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->nameMax = 0; 4767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->name = NULL; 4768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeNr = 0; 4769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeMax = 0; 4770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->node = NULL; 4771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inputNr = 0; 4772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inputMax = 0; 4773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input = NULL; 4774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nameNr = 0; 4777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nameMax = 10; 4778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->name = NULL; 4779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4780df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->nodeInfoTab = NULL; 4781df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->nodeInfoNr = 0; 4782df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->nodeInfoMax = 0; 4783df143a5041f03a22808b59c76698770b74692815Selim Gurun 4784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sax == NULL) ctxt->sax = (xmlSAXHandlerPtr) &htmlDefaultSAXHandler; 4785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 4786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax = sax; 4787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(sax, &htmlDefaultSAXHandler, sizeof(xmlSAXHandlerV1)); 4788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->userData = ctxt; 4790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->myDoc = NULL; 4791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->wellFormed = 1; 4792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->replaceEntities = 0; 4793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->linenumbers = xmlLineNumbersDefaultValue; 4794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->html = 1; 4795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vctxt.finishDtd = XML_CTXT_FINISH_DTD_0; 4796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vctxt.userData = ctxt; 4797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vctxt.error = xmlParserValidityError; 4798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vctxt.warning = xmlParserValidityWarning; 4799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->record_info = 0; 4800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->validate = 0; 4801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbChars = 0; 4802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->checkIndex = 0; 4803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->catalogs = NULL; 4804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitNodeInfoSeq(&ctxt->node_seq); 4805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 4806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlFreeParserCtxt: 4810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 4811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free all the memory used by a parser context. However the parsed 4813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * document in ctxt->myDoc is not freed. 4814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 4817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlFreeParserCtxt(htmlParserCtxtPtr ctxt) 4818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeParserCtxt(ctxt); 4820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlNewParserCtxt: 4824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate and initialize a new parser context. 4826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the htmlParserCtxtPtr or NULL in case of allocation error 4828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParserCtxtPtr 4831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlNewParserCtxt(void) 4832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserCtxtPtr ctxt; 4834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = (xmlParserCtxtPtr) xmlMalloc(sizeof(xmlParserCtxt)); 4836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) { 4837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlErrMemory(NULL, "NewParserCtxt: out of memory\n"); 4838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ctxt, 0, sizeof(xmlParserCtxt)); 4841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (htmlInitParserCtxt(ctxt) < 0) { 4842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlFreeParserCtxt(ctxt); 4843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt); 4846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlCreateMemoryParserCtxt: 4850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer: a pointer to a char array 4851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size: the size of the array 4852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a parser context for an HTML in-memory document. 4854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new parser context or NULL 4856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParserCtxtPtr 4858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlCreateMemoryParserCtxt(const char *buffer, int size) { 4859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserCtxtPtr ctxt; 4860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr input; 4861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputBufferPtr buf; 4862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buffer == NULL) 4864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (size <= 0) 4866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = htmlNewParserCtxt(); 4869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 4870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf = xmlParserInputBufferCreateMem(buffer, size, XML_CHAR_ENCODING_NONE); 4873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buf == NULL) return(NULL); 4874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input = xmlNewInputStream(ctxt); 4876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input == NULL) { 4877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeParserCtxt(ctxt); 4878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->filename = NULL; 4882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->buf = buf; 4883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->base = input->buf->buffer->content; 4884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->cur = input->buf->buffer->content; 4885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->end = &input->buf->buffer->content[input->buf->buffer->use]; 4886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputPush(ctxt, input); 4888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt); 4889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlCreateDocParserCtxt: 4893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: a pointer to an array of xmlChar 4894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: a free form C string describing the HTML document encoding, or NULL 4895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a parser context for an HTML document. 4897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: check the need to add encoding handling there 4899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new parser context or NULL 4901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic htmlParserCtxtPtr 4903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlCreateDocParserCtxt(const xmlChar *cur, const char *encoding) { 4904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len; 4905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParserCtxtPtr ctxt; 4906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 4908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = xmlStrlen(cur); 4910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = htmlCreateMemoryParserCtxt((char *)cur, len); 4911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 4912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (encoding != NULL) { 4915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCharEncoding enc; 4916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCharEncodingHandlerPtr handler; 4917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->input->encoding != NULL) 4919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) ctxt->input->encoding); 4920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->encoding = xmlStrdup((const xmlChar *) encoding); 4921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project enc = xmlParseCharEncoding(encoding); 4923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * registered set of known encodings 4925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (enc != XML_CHAR_ENCODING_ERROR) { 4927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSwitchEncoding(ctxt, enc); 4928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) { 4929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_UNSUPPORTED_ENCODING, 4930df143a5041f03a22808b59c76698770b74692815Selim Gurun "Unsupported encoding %s\n", 4931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const xmlChar *) encoding, NULL); 4932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * fallback for unknown encodings 4936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project handler = xmlFindCharEncodingHandler((const char *) encoding); 4938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (handler != NULL) { 4939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSwitchToEncoding(ctxt, handler); 4940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_UNSUPPORTED_ENCODING, 4942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unsupported encoding %s\n", 4943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const xmlChar *) encoding, NULL); 4944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt); 4948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_PUSH_ENABLED 4951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 4952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 4953df143a5041f03a22808b59c76698770b74692815Selim Gurun * Progressive parsing interfaces * 4954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 4955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 4956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseLookupSequence: 4959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 4960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @first: the first char to lookup 4961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @next: the next char to lookup or zero 4962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @third: the next char to lookup or zero 4963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comment: flag to force checking inside comments 4964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to find if a sequence (first, next, third) or just (first next) or 4966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (first) is available in the input stream. 4967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This function has a side effect of (possibly) incrementing ctxt->checkIndex 4968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to avoid rescanning sequences of bytes, it DOES change the state of the 4969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parser, do not use liberally. 4970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is basically similar to xmlParseLookupSequence() 4971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the index to the current parsing point if the full sequence 4973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is available, -1 otherwise. 4974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 4976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseLookupSequence(htmlParserCtxtPtr ctxt, xmlChar first, 4977df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlChar next, xmlChar third, int iscomment, 4978df143a5041f03a22808b59c76698770b74692815Selim Gurun int ignoreattrval) 4979df143a5041f03a22808b59c76698770b74692815Selim Gurun{ 4980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int base, len; 4981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParserInputPtr in; 4982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *buf; 4983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int incomment = 0; 4984df143a5041f03a22808b59c76698770b74692815Selim Gurun int invalue = 0; 4985df143a5041f03a22808b59c76698770b74692815Selim Gurun char valdellim = 0x0; 4986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in = ctxt->input; 4988df143a5041f03a22808b59c76698770b74692815Selim Gurun if (in == NULL) 4989df143a5041f03a22808b59c76698770b74692815Selim Gurun return (-1); 4990df143a5041f03a22808b59c76698770b74692815Selim Gurun 4991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project base = in->cur - in->base; 4992df143a5041f03a22808b59c76698770b74692815Selim Gurun if (base < 0) 4993df143a5041f03a22808b59c76698770b74692815Selim Gurun return (-1); 4994df143a5041f03a22808b59c76698770b74692815Selim Gurun 4995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->checkIndex > base) 4996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project base = ctxt->checkIndex; 4997df143a5041f03a22808b59c76698770b74692815Selim Gurun 4998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->buf == NULL) { 4999df143a5041f03a22808b59c76698770b74692815Selim Gurun buf = in->base; 5000df143a5041f03a22808b59c76698770b74692815Selim Gurun len = in->length; 5001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5002df143a5041f03a22808b59c76698770b74692815Selim Gurun buf = in->buf->buffer->content; 5003df143a5041f03a22808b59c76698770b74692815Selim Gurun len = in->buf->buffer->use; 5004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5005df143a5041f03a22808b59c76698770b74692815Selim Gurun 5006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* take into account the sequence length */ 5007df143a5041f03a22808b59c76698770b74692815Selim Gurun if (third) 5008df143a5041f03a22808b59c76698770b74692815Selim Gurun len -= 2; 5009df143a5041f03a22808b59c76698770b74692815Selim Gurun else if (next) 5010df143a5041f03a22808b59c76698770b74692815Selim Gurun len--; 5011df143a5041f03a22808b59c76698770b74692815Selim Gurun for (; base < len; base++) { 5012df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((!incomment) && (base + 4 < len) && (!iscomment)) { 5013df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((buf[base] == '<') && (buf[base + 1] == '!') && 5014df143a5041f03a22808b59c76698770b74692815Selim Gurun (buf[base + 2] == '-') && (buf[base + 3] == '-')) { 5015df143a5041f03a22808b59c76698770b74692815Selim Gurun incomment = 1; 5016df143a5041f03a22808b59c76698770b74692815Selim Gurun /* do not increment past <! - some people use <!--> */ 5017df143a5041f03a22808b59c76698770b74692815Selim Gurun base += 2; 5018df143a5041f03a22808b59c76698770b74692815Selim Gurun } 5019df143a5041f03a22808b59c76698770b74692815Selim Gurun } 5020df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ignoreattrval) { 5021df143a5041f03a22808b59c76698770b74692815Selim Gurun if (buf[base] == '"' || buf[base] == '\'') { 5022df143a5041f03a22808b59c76698770b74692815Selim Gurun if (invalue) { 5023df143a5041f03a22808b59c76698770b74692815Selim Gurun if (buf[base] == valdellim) { 5024df143a5041f03a22808b59c76698770b74692815Selim Gurun invalue = 0; 5025df143a5041f03a22808b59c76698770b74692815Selim Gurun continue; 5026df143a5041f03a22808b59c76698770b74692815Selim Gurun } 5027df143a5041f03a22808b59c76698770b74692815Selim Gurun } else { 5028df143a5041f03a22808b59c76698770b74692815Selim Gurun valdellim = buf[base]; 5029df143a5041f03a22808b59c76698770b74692815Selim Gurun invalue = 1; 5030df143a5041f03a22808b59c76698770b74692815Selim Gurun continue; 5031df143a5041f03a22808b59c76698770b74692815Selim Gurun } 5032df143a5041f03a22808b59c76698770b74692815Selim Gurun } else if (invalue) { 5033df143a5041f03a22808b59c76698770b74692815Selim Gurun continue; 5034df143a5041f03a22808b59c76698770b74692815Selim Gurun } 5035df143a5041f03a22808b59c76698770b74692815Selim Gurun } 5036df143a5041f03a22808b59c76698770b74692815Selim Gurun if (incomment) { 5037df143a5041f03a22808b59c76698770b74692815Selim Gurun if (base + 3 > len) 5038df143a5041f03a22808b59c76698770b74692815Selim Gurun return (-1); 5039df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((buf[base] == '-') && (buf[base + 1] == '-') && 5040df143a5041f03a22808b59c76698770b74692815Selim Gurun (buf[base + 2] == '>')) { 5041df143a5041f03a22808b59c76698770b74692815Selim Gurun incomment = 0; 5042df143a5041f03a22808b59c76698770b74692815Selim Gurun base += 2; 5043df143a5041f03a22808b59c76698770b74692815Selim Gurun } 5044df143a5041f03a22808b59c76698770b74692815Selim Gurun continue; 5045df143a5041f03a22808b59c76698770b74692815Selim Gurun } 5046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buf[base] == first) { 5047df143a5041f03a22808b59c76698770b74692815Selim Gurun if (third != 0) { 5048df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((buf[base + 1] != next) || (buf[base + 2] != third)) 5049df143a5041f03a22808b59c76698770b74692815Selim Gurun continue; 5050df143a5041f03a22808b59c76698770b74692815Selim Gurun } else if (next != 0) { 5051df143a5041f03a22808b59c76698770b74692815Selim Gurun if (buf[base + 1] != next) 5052df143a5041f03a22808b59c76698770b74692815Selim Gurun continue; 5053df143a5041f03a22808b59c76698770b74692815Selim Gurun } 5054df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->checkIndex = 0; 5055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5056df143a5041f03a22808b59c76698770b74692815Selim Gurun if (next == 0) 5057df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlGenericError(xmlGenericErrorContext, 5058df143a5041f03a22808b59c76698770b74692815Selim Gurun "HPP: lookup '%c' found at %d\n", 5059df143a5041f03a22808b59c76698770b74692815Selim Gurun first, base); 5060df143a5041f03a22808b59c76698770b74692815Selim Gurun else if (third == 0) 5061df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlGenericError(xmlGenericErrorContext, 5062df143a5041f03a22808b59c76698770b74692815Selim Gurun "HPP: lookup '%c%c' found at %d\n", 5063df143a5041f03a22808b59c76698770b74692815Selim Gurun first, next, base); 5064df143a5041f03a22808b59c76698770b74692815Selim Gurun else 5065df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlGenericError(xmlGenericErrorContext, 5066df143a5041f03a22808b59c76698770b74692815Selim Gurun "HPP: lookup '%c%c%c' found at %d\n", 5067df143a5041f03a22808b59c76698770b74692815Selim Gurun first, next, third, base); 5068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5069df143a5041f03a22808b59c76698770b74692815Selim Gurun return (base - (in->cur - in->base)); 5070df143a5041f03a22808b59c76698770b74692815Selim Gurun } 5071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5072df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((!incomment) && (!invalue)) 5073df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->checkIndex = base; 5074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (next == 0) 5076df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlGenericError(xmlGenericErrorContext, 5077df143a5041f03a22808b59c76698770b74692815Selim Gurun "HPP: lookup '%c' failed\n", first); 5078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (third == 0) 5079df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlGenericError(xmlGenericErrorContext, 5080df143a5041f03a22808b59c76698770b74692815Selim Gurun "HPP: lookup '%c%c' failed\n", first, next); 5081df143a5041f03a22808b59c76698770b74692815Selim Gurun else 5082df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlGenericError(xmlGenericErrorContext, 5083df143a5041f03a22808b59c76698770b74692815Selim Gurun "HPP: lookup '%c%c%c' failed\n", first, next, 5084df143a5041f03a22808b59c76698770b74692815Selim Gurun third); 5085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5086df143a5041f03a22808b59c76698770b74692815Selim Gurun return (-1); 5087df143a5041f03a22808b59c76698770b74692815Selim Gurun} 5088df143a5041f03a22808b59c76698770b74692815Selim Gurun 5089df143a5041f03a22808b59c76698770b74692815Selim Gurun/** 5090df143a5041f03a22808b59c76698770b74692815Selim Gurun * htmlParseLookupChars: 5091df143a5041f03a22808b59c76698770b74692815Selim Gurun * @ctxt: an HTML parser context 5092df143a5041f03a22808b59c76698770b74692815Selim Gurun * @stop: Array of chars, which stop the lookup. 5093df143a5041f03a22808b59c76698770b74692815Selim Gurun * @stopLen: Length of stop-Array 5094df143a5041f03a22808b59c76698770b74692815Selim Gurun * 5095df143a5041f03a22808b59c76698770b74692815Selim Gurun * Try to find if any char of the stop-Array is available in the input 5096df143a5041f03a22808b59c76698770b74692815Selim Gurun * stream. 5097df143a5041f03a22808b59c76698770b74692815Selim Gurun * This function has a side effect of (possibly) incrementing ctxt->checkIndex 5098df143a5041f03a22808b59c76698770b74692815Selim Gurun * to avoid rescanning sequences of bytes, it DOES change the state of the 5099df143a5041f03a22808b59c76698770b74692815Selim Gurun * parser, do not use liberally. 5100df143a5041f03a22808b59c76698770b74692815Selim Gurun * 5101df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns the index to the current parsing point if a stopChar 5102df143a5041f03a22808b59c76698770b74692815Selim Gurun * is available, -1 otherwise. 5103df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 5104df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic int 5105df143a5041f03a22808b59c76698770b74692815Selim GurunhtmlParseLookupChars(htmlParserCtxtPtr ctxt, const xmlChar * stop, 5106df143a5041f03a22808b59c76698770b74692815Selim Gurun int stopLen) 5107df143a5041f03a22808b59c76698770b74692815Selim Gurun{ 5108df143a5041f03a22808b59c76698770b74692815Selim Gurun int base, len; 5109df143a5041f03a22808b59c76698770b74692815Selim Gurun htmlParserInputPtr in; 5110df143a5041f03a22808b59c76698770b74692815Selim Gurun const xmlChar *buf; 5111df143a5041f03a22808b59c76698770b74692815Selim Gurun int incomment = 0; 5112df143a5041f03a22808b59c76698770b74692815Selim Gurun int i; 5113df143a5041f03a22808b59c76698770b74692815Selim Gurun 5114df143a5041f03a22808b59c76698770b74692815Selim Gurun in = ctxt->input; 5115df143a5041f03a22808b59c76698770b74692815Selim Gurun if (in == NULL) 5116df143a5041f03a22808b59c76698770b74692815Selim Gurun return (-1); 5117df143a5041f03a22808b59c76698770b74692815Selim Gurun 5118df143a5041f03a22808b59c76698770b74692815Selim Gurun base = in->cur - in->base; 5119df143a5041f03a22808b59c76698770b74692815Selim Gurun if (base < 0) 5120df143a5041f03a22808b59c76698770b74692815Selim Gurun return (-1); 5121df143a5041f03a22808b59c76698770b74692815Selim Gurun 5122df143a5041f03a22808b59c76698770b74692815Selim Gurun if (ctxt->checkIndex > base) 5123df143a5041f03a22808b59c76698770b74692815Selim Gurun base = ctxt->checkIndex; 5124df143a5041f03a22808b59c76698770b74692815Selim Gurun 5125df143a5041f03a22808b59c76698770b74692815Selim Gurun if (in->buf == NULL) { 5126df143a5041f03a22808b59c76698770b74692815Selim Gurun buf = in->base; 5127df143a5041f03a22808b59c76698770b74692815Selim Gurun len = in->length; 5128df143a5041f03a22808b59c76698770b74692815Selim Gurun } else { 5129df143a5041f03a22808b59c76698770b74692815Selim Gurun buf = in->buf->buffer->content; 5130df143a5041f03a22808b59c76698770b74692815Selim Gurun len = in->buf->buffer->use; 5131df143a5041f03a22808b59c76698770b74692815Selim Gurun } 5132df143a5041f03a22808b59c76698770b74692815Selim Gurun 5133df143a5041f03a22808b59c76698770b74692815Selim Gurun for (; base < len; base++) { 5134df143a5041f03a22808b59c76698770b74692815Selim Gurun if (!incomment && (base + 4 < len)) { 5135df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((buf[base] == '<') && (buf[base + 1] == '!') && 5136df143a5041f03a22808b59c76698770b74692815Selim Gurun (buf[base + 2] == '-') && (buf[base + 3] == '-')) { 5137df143a5041f03a22808b59c76698770b74692815Selim Gurun incomment = 1; 5138df143a5041f03a22808b59c76698770b74692815Selim Gurun /* do not increment past <! - some people use <!--> */ 5139df143a5041f03a22808b59c76698770b74692815Selim Gurun base += 2; 5140df143a5041f03a22808b59c76698770b74692815Selim Gurun } 5141df143a5041f03a22808b59c76698770b74692815Selim Gurun } 5142df143a5041f03a22808b59c76698770b74692815Selim Gurun if (incomment) { 5143df143a5041f03a22808b59c76698770b74692815Selim Gurun if (base + 3 > len) 5144df143a5041f03a22808b59c76698770b74692815Selim Gurun return (-1); 5145df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((buf[base] == '-') && (buf[base + 1] == '-') && 5146df143a5041f03a22808b59c76698770b74692815Selim Gurun (buf[base + 2] == '>')) { 5147df143a5041f03a22808b59c76698770b74692815Selim Gurun incomment = 0; 5148df143a5041f03a22808b59c76698770b74692815Selim Gurun base += 2; 5149df143a5041f03a22808b59c76698770b74692815Selim Gurun } 5150df143a5041f03a22808b59c76698770b74692815Selim Gurun continue; 5151df143a5041f03a22808b59c76698770b74692815Selim Gurun } 5152df143a5041f03a22808b59c76698770b74692815Selim Gurun for (i = 0; i < stopLen; ++i) { 5153df143a5041f03a22808b59c76698770b74692815Selim Gurun if (buf[base] == stop[i]) { 5154df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->checkIndex = 0; 5155df143a5041f03a22808b59c76698770b74692815Selim Gurun return (base - (in->cur - in->base)); 5156df143a5041f03a22808b59c76698770b74692815Selim Gurun } 5157df143a5041f03a22808b59c76698770b74692815Selim Gurun } 5158df143a5041f03a22808b59c76698770b74692815Selim Gurun } 5159df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->checkIndex = base; 5160df143a5041f03a22808b59c76698770b74692815Selim Gurun return (-1); 5161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseTryOrFinish: 5165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 5166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @terminate: last chunk indicator 5167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to progress on parsing 5169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns zero if no parsing was possible 5171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 5173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { 5174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 5175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParserInputPtr in; 5176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int avail = 0; 5177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar cur, next; 5178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (ctxt->instate) { 5181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_EOF: 5182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: try EOF\n"); break; 5184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_START: 5185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: try START\n"); break; 5187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_MISC: 5188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: try MISC\n");break; 5190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_COMMENT: 5191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: try COMMENT\n");break; 5193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_PROLOG: 5194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: try PROLOG\n");break; 5196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_START_TAG: 5197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: try START_TAG\n");break; 5199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_CONTENT: 5200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: try CONTENT\n");break; 5202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_CDATA_SECTION: 5203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: try CDATA_SECTION\n");break; 5205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_END_TAG: 5206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: try END_TAG\n");break; 5208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_ENTITY_DECL: 5209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: try ENTITY_DECL\n");break; 5211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_ENTITY_VALUE: 5212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: try ENTITY_VALUE\n");break; 5214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_ATTRIBUTE_VALUE: 5215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: try ATTRIBUTE_VALUE\n");break; 5217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_DTD: 5218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: try DTD\n");break; 5220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_EPILOG: 5221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: try EPILOG\n");break; 5223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_PI: 5224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: try PI\n");break; 5226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_SYSTEM_LITERAL: 5227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: try SYSTEM_LITERAL\n");break; 5229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (1) { 5233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in = ctxt->input; 5235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in == NULL) break; 5236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->buf == NULL) 5237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project avail = in->length - (in->cur - in->base); 5238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project avail = in->buf->buffer->use - (in->cur - in->base); 5240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((avail == 0) && (terminate)) { 5241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlAutoCloseOnEnd(ctxt); 5242df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((ctxt->nameNr == 0) && (ctxt->instate != XML_PARSER_EOF)) { 5243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SAX: end of the document processing. 5245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_EOF; 5247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) 5248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->endDocument(ctxt->userData); 5249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (avail < 1) 5252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = in->cur[0]; 5254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == 0) { 5255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(1); 5256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 5257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (ctxt->instate) { 5260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_EOF: 5261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Document parsing is done ! 5263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_START: 5266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Very first chars read from the document flow. 5268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = in->cur[0]; 5270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_BLANK_CH(cur)) { 5271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 5272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->buf == NULL) 5273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project avail = in->length - (in->cur - in->base); 5274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project avail = in->buf->buffer->use - (in->cur - in->base); 5276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax) && (ctxt->sax->setDocumentLocator)) 5278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->setDocumentLocator(ctxt->userData, 5279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &xmlDefaultSAXLocator); 5280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax) && (ctxt->sax->startDocument) && 5281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!ctxt->disableSAX)) 5282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->startDocument(ctxt->userData); 5283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = in->cur[0]; 5285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = in->cur[1]; 5286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == '<') && (next == '!') && 5287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (UPP(2) == 'D') && (UPP(3) == 'O') && 5288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (UPP(4) == 'C') && (UPP(5) == 'T') && 5289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (UPP(6) == 'Y') && (UPP(7) == 'P') && 5290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (UPP(8) == 'E')) { 5291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!terminate) && 5292df143a5041f03a22808b59c76698770b74692815Selim Gurun (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) 5293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: Parsing internal subset\n"); 5297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseDocTypeDecl(ctxt); 5299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_PROLOG; 5300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering PROLOG\n"); 5303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_MISC; 5306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering MISC\n"); 5309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_MISC: 5313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 5314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->buf == NULL) 5315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project avail = in->length - (in->cur - in->base); 5316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project avail = in->buf->buffer->use - (in->cur - in->base); 5318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (avail < 2) 5319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = in->cur[0]; 5321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = in->cur[1]; 5322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == '<') && (next == '!') && 5323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (in->cur[2] == '-') && (in->cur[3] == '-')) { 5324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!terminate) && 5325df143a5041f03a22808b59c76698770b74692815Selim Gurun (htmlParseLookupSequence(ctxt, '-', '-', '>', 1, 1) < 0)) 5326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: Parsing Comment\n"); 5330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseComment(ctxt); 5332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_MISC; 5333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur == '<') && (next == '?')) { 5334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!terminate) && 5335df143a5041f03a22808b59c76698770b74692815Selim Gurun (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) 5336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: Parsing PI\n"); 5340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParsePI(ctxt); 5342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_MISC; 5343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur == '<') && (next == '!') && 5344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (UPP(2) == 'D') && (UPP(3) == 'O') && 5345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (UPP(4) == 'C') && (UPP(5) == 'T') && 5346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (UPP(6) == 'Y') && (UPP(7) == 'P') && 5347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (UPP(8) == 'E')) { 5348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!terminate) && 5349df143a5041f03a22808b59c76698770b74692815Selim Gurun (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) 5350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: Parsing internal subset\n"); 5354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseDocTypeDecl(ctxt); 5356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_PROLOG; 5357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering PROLOG\n"); 5360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur == '<') && (next == '!') && 5362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (avail < 9)) { 5363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_START_TAG; 5366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering START_TAG\n"); 5369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_PROLOG: 5373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 5374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->buf == NULL) 5375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project avail = in->length - (in->cur - in->base); 5376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project avail = in->buf->buffer->use - (in->cur - in->base); 5378df143a5041f03a22808b59c76698770b74692815Selim Gurun if (avail < 2) 5379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = in->cur[0]; 5381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = in->cur[1]; 5382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == '<') && (next == '!') && 5383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (in->cur[2] == '-') && (in->cur[3] == '-')) { 5384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!terminate) && 5385df143a5041f03a22808b59c76698770b74692815Selim Gurun (htmlParseLookupSequence(ctxt, '-', '-', '>', 1, 1) < 0)) 5386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: Parsing Comment\n"); 5390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseComment(ctxt); 5392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_PROLOG; 5393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur == '<') && (next == '?')) { 5394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!terminate) && 5395df143a5041f03a22808b59c76698770b74692815Selim Gurun (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) 5396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: Parsing PI\n"); 5400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParsePI(ctxt); 5402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_PROLOG; 5403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur == '<') && (next == '!') && 5404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (avail < 4)) { 5405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_START_TAG; 5408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering START_TAG\n"); 5411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_EPILOG: 5415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->buf == NULL) 5416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project avail = in->length - (in->cur - in->base); 5417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project avail = in->buf->buffer->use - (in->cur - in->base); 5419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (avail < 1) 5420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = in->cur[0]; 5422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_BLANK_CH(cur)) { 5423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseCharData(ctxt); 5424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (avail < 2) 5427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = in->cur[1]; 5429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == '<') && (next == '!') && 5430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (in->cur[2] == '-') && (in->cur[3] == '-')) { 5431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!terminate) && 5432df143a5041f03a22808b59c76698770b74692815Selim Gurun (htmlParseLookupSequence(ctxt, '-', '-', '>', 1, 1) < 0)) 5433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: Parsing Comment\n"); 5437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseComment(ctxt); 5439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_EPILOG; 5440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur == '<') && (next == '?')) { 5441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!terminate) && 5442df143a5041f03a22808b59c76698770b74692815Selim Gurun (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) 5443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: Parsing PI\n"); 5447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParsePI(ctxt); 5449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_EPILOG; 5450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur == '<') && (next == '!') && 5451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (avail < 4)) { 5452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = XML_ERR_DOCUMENT_END; 5455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->wellFormed = 0; 5456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_EOF; 5457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering EOF\n"); 5460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) 5462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->endDocument(ctxt->userData); 5463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_START_TAG: { 5467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name; 5468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int failed; 5469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const htmlElemDesc * info; 5470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (avail < 2) 5472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = in->cur[0]; 5474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != '<') { 5475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_CONTENT; 5476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering CONTENT\n"); 5479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in->cur[1] == '/') { 5483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_END_TAG; 5484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->checkIndex = 0; 5485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering END_TAG\n"); 5488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!terminate) && 5492df143a5041f03a22808b59c76698770b74692815Selim Gurun (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) 5493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project failed = htmlParseStartTag(ctxt); 5496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = ctxt->name; 549760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((failed == -1) || 5498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (name == NULL)) { 5499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '>') 5500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Lookup the info for that element. 5506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project info = htmlTagLookup(name); 5508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (info == NULL) { 5509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_HTML_UNKNOWN_TAG, 5510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Tag %s invalid\n", name, NULL); 5511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for an Empty Element labeled the XML/SGML way 5515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR == '/') && (NXT(1) == '>')) { 5517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(2); 5518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) 5519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->endElement(ctxt->userData, name); 5520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlnamePop(ctxt); 5521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_CONTENT; 5522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering CONTENT\n"); 5525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '>') { 5530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_GT_REQUIRED, 5533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Couldn't find end of Start Tag %s\n", 5534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, NULL); 5535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * end of parsing of this node. 5538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5539df143a5041f03a22808b59c76698770b74692815Selim Gurun if (xmlStrEqual(name, ctxt->name)) { 5540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nodePop(ctxt); 5541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlnamePop(ctxt); 5542df143a5041f03a22808b59c76698770b74692815Selim Gurun } 5543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_CONTENT; 5545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering CONTENT\n"); 5548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for an Empty Element from DTD definition 5554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((info != NULL) && (info->empty)) { 5556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) 5557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->endElement(ctxt->userData, name); 5558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlnamePop(ctxt); 5559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_CONTENT; 5561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering CONTENT\n"); 5564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_CONTENT: { 5568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project long cons; 5569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle preparsed entities and charRef 5571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->token != 0) { 5573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar chr[2] = { 0 , 0 } ; 5574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project chr[0] = (xmlChar) ctxt->token; 5576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlCheckParagraph(ctxt); 5577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL)) 5578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->characters(ctxt->userData, chr, 1); 5579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->token = 0; 5580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->checkIndex = 0; 5581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((avail == 1) && (terminate)) { 5583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = in->cur[0]; 5584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur != '<') && (cur != '&')) { 5585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->sax != NULL) { 5586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_BLANK_CH(cur)) { 5587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->sax->ignorableWhitespace != NULL) 5588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->ignorableWhitespace( 5589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->userData, &cur, 1); 5590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlCheckParagraph(ctxt); 5592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->sax->characters != NULL) 5593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->characters( 5594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->userData, &cur, 1); 5595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->token = 0; 5598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->checkIndex = 0; 5599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in->cur++; 5600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (avail < 2) 5604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = in->cur[0]; 5606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = in->cur[1]; 5607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cons = ctxt->nbChars; 5608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((xmlStrEqual(ctxt->name, BAD_CAST"script")) || 5609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(ctxt->name, BAD_CAST"style"))) { 5610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle SCRIPT/STYLE separately 5612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!terminate) { 5614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int idx; 5615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar val; 5616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5617df143a5041f03a22808b59c76698770b74692815Selim Gurun idx = htmlParseLookupSequence(ctxt, '<', '/', 0, 0, 0); 5618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (idx < 0) 5619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = in->cur[idx + 2]; 5621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == 0) /* bad cut of input */ 5622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseScript(ctxt); 5625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == '<') && (next == '/')) { 5626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_END_TAG; 5627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->checkIndex = 0; 5628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering END_TAG\n"); 5631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Sometimes DOCTYPE arrives in the middle of the document 5637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == '<') && (next == '!') && 5639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (UPP(2) == 'D') && (UPP(3) == 'O') && 5640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (UPP(4) == 'C') && (UPP(5) == 'T') && 5641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (UPP(6) == 'Y') && (UPP(7) == 'P') && 5642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (UPP(8) == 'E')) { 5643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!terminate) && 5644df143a5041f03a22808b59c76698770b74692815Selim Gurun (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) 5645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_HTML_STRUCURE_ERROR, 5647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Misplaced DOCTYPE declaration\n", 5648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "DOCTYPE" , NULL); 5649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseDocTypeDecl(ctxt); 5650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur == '<') && (next == '!') && 5651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (in->cur[2] == '-') && (in->cur[3] == '-')) { 5652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!terminate) && 5653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (htmlParseLookupSequence( 5654df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt, '-', '-', '>', 1, 1) < 0)) 5655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: Parsing Comment\n"); 5659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseComment(ctxt); 5661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_CONTENT; 5662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur == '<') && (next == '?')) { 5663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!terminate) && 5664df143a5041f03a22808b59c76698770b74692815Selim Gurun (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) 5665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: Parsing PI\n"); 5669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParsePI(ctxt); 5671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_CONTENT; 5672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur == '<') && (next == '!') && (avail < 4)) { 5673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur == '<') && (next == '/')) { 5675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_END_TAG; 5676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->checkIndex = 0; 5677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering END_TAG\n"); 5680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == '<') { 5683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_START_TAG; 5684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->checkIndex = 0; 5685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering START_TAG\n"); 5688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur == '&') { 5691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!terminate) && 5692df143a5041f03a22808b59c76698770b74692815Selim Gurun (htmlParseLookupChars(ctxt, 5693df143a5041f03a22808b59c76698770b74692815Selim Gurun BAD_CAST "; >/", 4) < 0)) 5694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: Parsing Reference\n"); 5698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO: check generation of subtrees if noent !!! */ 5700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseReference(ctxt); 5701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check that the text sequence is complete 5704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * before handing out the data to the parser 5705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to avoid problems with erroneous end of 5706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * data detection. 5707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!terminate) && 5709df143a5041f03a22808b59c76698770b74692815Selim Gurun (htmlParseLookupChars(ctxt, BAD_CAST "<&", 2) < 0)) 5710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->checkIndex = 0; 5712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: Parsing char data\n"); 5715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseCharData(ctxt); 5717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cons == ctxt->nbChars) { 5720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->node != NULL) { 5721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, 5722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "detected an error in element content\n", 5723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 5726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_END_TAG: 5732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (avail < 2) 5733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!terminate) && 5735df143a5041f03a22808b59c76698770b74692815Selim Gurun (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) 5736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 5737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseEndTag(ctxt); 5738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nameNr == 0) { 5739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_EPILOG; 5740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_CONTENT; 5742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->checkIndex = 0; 5744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering CONTENT\n"); 5747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_CDATA_SECTION: 5750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, 5751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: internal error, state == CDATA\n", 5752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_CONTENT; 5754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->checkIndex = 0; 5755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering CONTENT\n"); 5758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_DTD: 5761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, 5762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: internal error, state == DTD\n", 5763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_CONTENT; 5765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->checkIndex = 0; 5766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering CONTENT\n"); 5769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_COMMENT: 5772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, 5773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: internal error, state == COMMENT\n", 5774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_CONTENT; 5776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->checkIndex = 0; 5777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering CONTENT\n"); 5780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_PI: 5783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, 5784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: internal error, state == PI\n", 5785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_CONTENT; 5787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->checkIndex = 0; 5788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering CONTENT\n"); 5791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_ENTITY_DECL: 5794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, 5795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: internal error, state == ENTITY_DECL\n", 5796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_CONTENT; 5798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->checkIndex = 0; 5799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering CONTENT\n"); 5802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_ENTITY_VALUE: 5805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, 5806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: internal error, state == ENTITY_VALUE\n", 5807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_CONTENT; 5809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->checkIndex = 0; 5810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering DTD\n"); 5813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_ATTRIBUTE_VALUE: 5816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, 5817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: internal error, state == ATTRIBUTE_VALUE\n", 5818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_START_TAG; 5820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->checkIndex = 0; 5821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering START_TAG\n"); 5824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_SYSTEM_LITERAL: 5827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, 5828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: internal error, state == XML_PARSER_SYSTEM_LITERAL\n", 5829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_CONTENT; 5831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->checkIndex = 0; 5832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering CONTENT\n"); 5835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_IGNORE: 5838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, 5839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: internal error, state == XML_PARSER_IGNORE\n", 5840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_CONTENT; 5842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->checkIndex = 0; 5843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering CONTENT\n"); 5846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PARSER_PUBLIC_LITERAL: 5849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, 5850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: internal error, state == XML_PARSER_LITERAL\n", 5851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 5852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_CONTENT; 5853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->checkIndex = 0; 5854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "HPP: entering CONTENT\n"); 5857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5862df143a5041f03a22808b59c76698770b74692815Selim Gurundone: 5863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((avail == 0) && (terminate)) { 5864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlAutoCloseOnEnd(ctxt); 5865df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((ctxt->nameNr == 0) && (ctxt->instate != XML_PARSER_EOF)) { 5866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SAX: end of the document processing. 5868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_EOF; 5870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) 5871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->endDocument(ctxt->userData); 5872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->myDoc != NULL) && 5875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((terminate) || (ctxt->instate == XML_PARSER_EOF) || 5876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->instate == XML_PARSER_EPILOG))) { 5877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDtdPtr dtd; 5878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dtd = xmlGetIntSubset(ctxt->myDoc); 5879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd == NULL) 5880df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->myDoc->intSubset = 5881df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlCreateIntSubset(ctxt->myDoc, BAD_CAST "html", 5882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "-//W3C//DTD HTML 4.0 Transitional//EN", 5883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "http://www.w3.org/TR/REC-html40/loose.dtd"); 5884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "HPP: done %d\n", ret); 5887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseChunk: 5893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 5894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @chunk: an char array 5895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size: the size in byte of the chunk 5896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @terminate: last chunk indicator 5897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse a Chunk of memory 5899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns zero if no error, the xmlParserErrors otherwise. 5901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 5903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseChunk(htmlParserCtxtPtr ctxt, const char *chunk, int size, 5904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int terminate) { 5905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->input == NULL)) { 5906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, 5907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "htmlParseChunk: context error\n", NULL, NULL); 5908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(XML_ERR_INTERNAL_ERROR); 5909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((size > 0) && (chunk != NULL) && (ctxt->input != NULL) && 5911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->input->buf != NULL) && (ctxt->instate != XML_PARSER_EOF)) { 5912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int base = ctxt->input->base - ctxt->input->buf->buffer->content; 5913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int cur = ctxt->input->cur - ctxt->input->base; 5914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int res; 5915df143a5041f03a22808b59c76698770b74692815Selim Gurun 5916df143a5041f03a22808b59c76698770b74692815Selim Gurun res = xmlParserInputBufferPush(ctxt->input->buf, size, chunk); 5917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res < 0) { 5918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = XML_PARSER_EOF; 5919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->disableSAX = 1; 5920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (XML_PARSER_EOF); 5921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->base = ctxt->input->buf->buffer->content + base; 5923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->cur = ctxt->input->base + cur; 5924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->end = 5925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &ctxt->input->buf->buffer->content[ctxt->input->buf->buffer->use]; 5926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 5927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "HPP: pushed %d\n", size); 5928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 5931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((terminate) || (ctxt->input->buf->buffer->use > 80)) 5932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseTryOrFinish(ctxt, terminate); 5933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->instate != XML_PARSER_EOF) { 5935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->input != NULL) && ctxt->input->buf != NULL) { 5936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputBufferPtr in = ctxt->input->buf; 5937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((in->encoder != NULL) && (in->buffer != NULL) && 5938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (in->raw != NULL)) { 5939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbchars; 5940df143a5041f03a22808b59c76698770b74692815Selim Gurun 5941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbchars = xmlCharEncInFunc(in->encoder, in->buffer, in->raw); 5942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nbchars < 0) { 5943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseErr(ctxt, XML_ERR_INVALID_ENCODING, 5944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "encoder error\n", NULL, NULL); 5945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(XML_ERR_INVALID_ENCODING); 5946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseTryOrFinish(ctxt, terminate); 5951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (terminate) { 5952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->instate != XML_PARSER_EOF) && 5953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->instate != XML_PARSER_EPILOG) && 5954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->instate != XML_PARSER_MISC)) { 5955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = XML_ERR_DOCUMENT_END; 5956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->wellFormed = 0; 5957df143a5041f03a22808b59c76698770b74692815Selim Gurun } 5958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->instate != XML_PARSER_EOF) { 5959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) 5960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->endDocument(ctxt->userData); 5961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_EOF; 5963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5964df143a5041f03a22808b59c76698770b74692815Selim Gurun return((xmlParserErrors) ctxt->errNo); 5965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 5968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 5969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * User entry points * 5970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 5971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 5972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlCreatePushParserCtxt: 5975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @sax: a SAX handler 5976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @user_data: The user data returned on SAX callbacks 5977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @chunk: a pointer to an array of chars 5978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size: number of chars in the array 5979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename: an optional file name or URI 5980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @enc: an optional encoding 5981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a parser context for using the HTML parser in push mode 5983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The value of @filename is used for fetching external entities 5984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and error/warning reports. 5985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new parser context or NULL 5987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParserCtxtPtr 5989df143a5041f03a22808b59c76698770b74692815Selim GurunhtmlCreatePushParserCtxt(htmlSAXHandlerPtr sax, void *user_data, 5990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *chunk, int size, const char *filename, 5991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCharEncoding enc) { 5992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParserCtxtPtr ctxt; 5993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParserInputPtr inputStream; 5994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputBufferPtr buf; 5995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitParser(); 5997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf = xmlAllocParserInputBuffer(enc); 5999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buf == NULL) return(NULL); 6000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = htmlNewParserCtxt(); 6002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) { 6003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeParserInputBuffer(buf); 6004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(enc==XML_CHAR_ENCODING_UTF8 || buf->encoder) 6007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->charset=XML_CHAR_ENCODING_UTF8; 6008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sax != NULL) { 6009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->sax != (xmlSAXHandlerPtr) &htmlDefaultSAXHandler) 6010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->sax); 6011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax = (htmlSAXHandlerPtr) xmlMalloc(sizeof(htmlSAXHandler)); 6012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->sax == NULL) { 6013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(buf); 6014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt); 6015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(ctxt->sax, sax, sizeof(htmlSAXHandler)); 6018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (user_data != NULL) 6019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->userData = user_data; 6020df143a5041f03a22808b59c76698770b74692815Selim Gurun } 6021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (filename == NULL) { 6022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->directory = NULL; 6023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->directory = xmlParserGetDirectory(filename); 6025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputStream = htmlNewInputStream(ctxt); 6028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (inputStream == NULL) { 6029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeParserCtxt(ctxt); 6030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(buf); 6031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (filename == NULL) 6035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputStream->filename = NULL; 6036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputStream->filename = (char *) 6038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCanonicPath((const xmlChar *) filename); 6039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputStream->buf = buf; 6040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputStream->base = inputStream->buf->buffer->content; 6041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputStream->cur = inputStream->buf->buffer->content; 6042df143a5041f03a22808b59c76698770b74692815Selim Gurun inputStream->end = 6043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &inputStream->buf->buffer->content[inputStream->buf->buffer->use]; 6044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputPush(ctxt, inputStream); 6046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((size > 0) && (chunk != NULL) && (ctxt->input != NULL) && 6048df143a5041f03a22808b59c76698770b74692815Selim Gurun (ctxt->input->buf != NULL)) { 6049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int base = ctxt->input->base - ctxt->input->buf->buffer->content; 6050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int cur = ctxt->input->cur - ctxt->input->base; 6051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6052df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlParserInputBufferPush(ctxt->input->buf, size, chunk); 6053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->base = ctxt->input->buf->buffer->content + base; 6055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->cur = ctxt->input->base + cur; 6056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->end = 6057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &ctxt->input->buf->buffer->content[ctxt->input->buf->buffer->use]; 6058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PUSH 6059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "HPP: pushed %d\n", size); 6060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 6061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->progressive = 1; 6063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt); 6065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_PUSH_ENABLED */ 6067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlSAXParseDoc: 6070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: a pointer to an array of xmlChar 6071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: a free form C string describing the HTML document encoding, or NULL 6072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @sax: the SAX handler block 6073df143a5041f03a22808b59c76698770b74692815Selim Gurun * @userData: if using SAX, this pointer will be provided on callbacks. 6074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse an HTML in-memory document. If sax is not NULL, use the SAX callbacks 6076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to handle parse events. If sax is NULL, fallback to the default DOM 6077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * behavior and return a tree. 6078df143a5041f03a22808b59c76698770b74692815Selim Gurun * 6079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the resulting document tree unless SAX is NULL or the document is 6080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * not well formed. 6081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocPtr 6084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlSAXParseDoc(xmlChar *cur, const char *encoding, htmlSAXHandlerPtr sax, void *userData) { 6085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlDocPtr ret; 6086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParserCtxtPtr ctxt; 6087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitParser(); 6089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) return(NULL); 6091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = htmlCreateDocParserCtxt(cur, encoding); 6094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return(NULL); 6095df143a5041f03a22808b59c76698770b74692815Selim Gurun if (sax != NULL) { 6096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->sax != NULL) xmlFree (ctxt->sax); 6097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax = sax; 6098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->userData = userData; 6099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseDocument(ctxt); 6102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ctxt->myDoc; 6103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sax != NULL) { 6104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax = NULL; 6105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->userData = NULL; 6106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlFreeParserCtxt(ctxt); 6108df143a5041f03a22808b59c76698770b74692815Selim Gurun 6109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseDoc: 6114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: a pointer to an array of xmlChar 6115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: a free form C string describing the HTML document encoding, or NULL 6116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an HTML in-memory document and build a tree. 6118df143a5041f03a22808b59c76698770b74692815Selim Gurun * 6119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the resulting document tree 6120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocPtr 6123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseDoc(xmlChar *cur, const char *encoding) { 6124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(htmlSAXParseDoc(cur, encoding, NULL, NULL)); 6125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlCreateFileParserCtxt: 6130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename: the filename 6131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: a free form C string describing the HTML document encoding, or NULL 6132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6133df143a5041f03a22808b59c76698770b74692815Selim Gurun * Create a parser context for a file content. 6134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Automatic support for ZLIB/Compress compressed document is provided 6135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by default if found at compile-time. 6136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new parser context or NULL 6138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParserCtxtPtr 6140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlCreateFileParserCtxt(const char *filename, const char *encoding) 6141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParserCtxtPtr ctxt; 6143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParserInputPtr inputStream; 6144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *canonicFilename; 6145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* htmlCharEncoding enc; */ 6146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *content, *content_line = (xmlChar *) "charset="; 6147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (filename == NULL) 6149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = htmlNewParserCtxt(); 6152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) { 6153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project canonicFilename = (char *) xmlCanonicPath((const xmlChar *) filename); 6156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (canonicFilename == NULL) { 6157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_SAX1_ENABLED 6158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlDefaultSAXHandler.error != NULL) { 6159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDefaultSAXHandler.error(NULL, "out of memory\n"); 6160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 6162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeParserCtxt(ctxt); 6163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6165df143a5041f03a22808b59c76698770b74692815Selim Gurun 6166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputStream = xmlLoadExternalEntity(canonicFilename, NULL, ctxt); 6167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(canonicFilename); 6168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (inputStream == NULL) { 6169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeParserCtxt(ctxt); 6170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputPush(ctxt, inputStream); 6174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* set encoding */ 6176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (encoding) { 6177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = xmlMallocAtomic (xmlStrlen(content_line) + strlen(encoding) + 1); 6178df143a5041f03a22808b59c76698770b74692815Selim Gurun if (content) { 6179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcpy ((char *)content, (char *)content_line); 6180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strcat ((char *)content, (char *)encoding); 6181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlCheckEncoding (ctxt, content); 6182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree (content); 6183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6185df143a5041f03a22808b59c76698770b74692815Selim Gurun 6186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt); 6187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlSAXParseFile: 6191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename: the filename 6192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: a free form C string describing the HTML document encoding, or NULL 6193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @sax: the SAX handler block 6194df143a5041f03a22808b59c76698770b74692815Selim Gurun * @userData: if using SAX, this pointer will be provided on callbacks. 6195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an HTML file and build a tree. Automatic support for ZLIB/Compress 6197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * compressed document is provided by default if found at compile-time. 6198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * It use the given SAX function block to handle the parsing callback. 6199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If sax is NULL, fallback to the default DOM tree building routines. 6200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the resulting document tree unless SAX is NULL or the document is 6202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * not well formed. 6203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocPtr 6206df143a5041f03a22808b59c76698770b74692815Selim GurunhtmlSAXParseFile(const char *filename, const char *encoding, htmlSAXHandlerPtr sax, 6207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *userData) { 6208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlDocPtr ret; 6209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParserCtxtPtr ctxt; 6210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlSAXHandlerPtr oldsax = NULL; 6211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitParser(); 6213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = htmlCreateFileParserCtxt(filename, encoding); 6215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return(NULL); 6216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sax != NULL) { 6217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldsax = ctxt->sax; 6218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax = sax; 6219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->userData = userData; 6220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseDocument(ctxt); 6223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ctxt->myDoc; 6225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (sax != NULL) { 6226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax = oldsax; 6227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->userData = NULL; 6228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlFreeParserCtxt(ctxt); 6230df143a5041f03a22808b59c76698770b74692815Selim Gurun 6231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlParseFile: 6236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename: the filename 6237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: a free form C string describing the HTML document encoding, or NULL 6238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an HTML file and build a tree. Automatic support for ZLIB/Compress 6240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * compressed document is provided by default if found at compile-time. 6241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the resulting document tree 6243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocPtr 6246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlParseFile(const char *filename, const char *encoding) { 6247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(htmlSAXParseFile(filename, encoding, NULL, NULL)); 6248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlHandleOmittedElem: 6252df143a5041f03a22808b59c76698770b74692815Selim Gurun * @val: int 0 or 1 6253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set and return the previous value for handling HTML omitted tags. 6255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the last value for 0 for no handling, 1 for auto insertion. 6257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 6260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlHandleOmittedElem(int val) { 6261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int old = htmlOmittedDefaultValue; 6262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlOmittedDefaultValue = val; 6264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(old); 6265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlElementAllowedHere: 6269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @parent: HTML parent element 6270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elt: HTML element 6271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks whether an HTML element may be a direct child of a parent element. 6273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note - doesn't check for deprecated elements 6274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if allowed; 0 otherwise. 6276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 6278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlElementAllowedHere(const htmlElemDesc* parent, const xmlChar* elt) { 6279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char** p ; 6280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( ! elt || ! parent || ! parent->subelts ) 6282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return 0 ; 6283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for ( p = parent->subelts; *p; ++p ) 6285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( !xmlStrcmp((const xmlChar *)*p, elt) ) 6286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return 1 ; 6287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return 0 ; 6289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlElementStatusHere: 6292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @parent: HTML parent element 6293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elt: HTML element 6294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks whether an HTML element may be a direct child of a parent element. 6296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and if so whether it is valid or deprecated. 6297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns one of HTML_VALID, HTML_DEPRECATED, HTML_INVALID 6299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlStatus 6301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlElementStatusHere(const htmlElemDesc* parent, const htmlElemDesc* elt) { 6302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( ! parent || ! elt ) 6303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return HTML_INVALID ; 6304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( ! htmlElementAllowedHere(parent, (const xmlChar*) elt->name ) ) 6305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return HTML_INVALID ; 6306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return ( elt->dtd == 0 ) ? HTML_VALID : HTML_DEPRECATED ; 6308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlAttrAllowed: 6311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elt: HTML element 6312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: HTML attribute 6313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @legacy: whether to allow deprecated attributes 6314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks whether an attribute is valid for an element 6316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Has full knowledge of Required and Deprecated attributes 6317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns one of HTML_REQUIRED, HTML_VALID, HTML_DEPRECATED, HTML_INVALID 6319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlStatus 6321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlAttrAllowed(const htmlElemDesc* elt, const xmlChar* attr, int legacy) { 6322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char** p ; 6323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( !elt || ! attr ) 6325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return HTML_INVALID ; 6326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( elt->attrs_req ) 6328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for ( p = elt->attrs_req; *p; ++p) 6329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( !xmlStrcmp((const xmlChar*)*p, attr) ) 6330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return HTML_REQUIRED ; 6331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( elt->attrs_opt ) 6333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for ( p = elt->attrs_opt; *p; ++p) 6334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( !xmlStrcmp((const xmlChar*)*p, attr) ) 6335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return HTML_VALID ; 6336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( legacy && elt->attrs_depr ) 6338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for ( p = elt->attrs_depr; *p; ++p) 6339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( !xmlStrcmp((const xmlChar*)*p, attr) ) 6340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return HTML_DEPRECATED ; 6341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return HTML_INVALID ; 6343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlNodeStatus: 6346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: an htmlNodePtr in a tree 6347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @legacy: whether to allow deprecated elements (YES is faster here 6348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for Element nodes) 6349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks whether the tree node is valid. Experimental (the author 6351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * only uses the HTML enhancements in a SAX parser) 6352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Return: for Element nodes, a return from htmlElementAllowedHere (if 6354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * legacy allowed) or htmlElementStatusHere (otherwise). 6355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for Attribute nodes, a return from htmlAttrAllowed 6356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for other nodes, HTML_NA (no checks performed) 6357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlStatus 6359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlNodeStatus(const htmlNodePtr node, int legacy) { 6360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( ! node ) 6361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return HTML_INVALID ; 6362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch ( node->type ) { 6364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 6365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return legacy 6366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ? ( htmlElementAllowedHere ( 6367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlTagLookup(node->parent->name) , node->name 6368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ) ? HTML_VALID : HTML_INVALID ) 6369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project : htmlElementStatusHere( 6370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlTagLookup(node->parent->name) , 6371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlTagLookup(node->name) ) 6372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ; 6373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: 6374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return htmlAttrAllowed( 6375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlTagLookup(node->parent->name) , node->name, legacy) ; 6376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: return HTML_NA ; 6377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 6380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * New set (2.6.0) of simpler and more flexible APIs * 6382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 6384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * DICT_FREE: 6386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: a string 6387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a string if it is not owned by the "dict" dictionnary in the 6389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * current scope 6390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DICT_FREE(str) \ 6392df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((str) && ((!dict) || \ 6393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlDictOwns(dict, (const xmlChar *)(str)) == 0))) \ 6394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((char *)(str)); 6395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlCtxtReset: 6398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 6399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reset a parser context 6401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 6403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlCtxtReset(htmlParserCtxtPtr ctxt) 6404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr input; 6406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictPtr dict; 6407df143a5041f03a22808b59c76698770b74692815Selim Gurun 6408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 6409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 6410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitParser(); 6412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dict = ctxt->dict; 6413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((input = inputPop(ctxt)) != NULL) { /* Non consuming */ 6415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeInputStream(input); 6416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inputNr = 0; 6418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input = NULL; 6419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->spaceNr = 0; 6421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->spaceTab != NULL) { 6422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->spaceTab[0] = -1; 6423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->space = &ctxt->spaceTab[0]; 6424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->space = NULL; 6426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nodeNr = 0; 6430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->node = NULL; 6431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nameNr = 0; 6433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->name = NULL; 6434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DICT_FREE(ctxt->version); 6436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->version = NULL; 6437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DICT_FREE(ctxt->encoding); 6438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->encoding = NULL; 6439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DICT_FREE(ctxt->directory); 6440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->directory = NULL; 6441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DICT_FREE(ctxt->extSubURI); 6442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->extSubURI = NULL; 6443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DICT_FREE(ctxt->extSubSystem); 6444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->extSubSystem = NULL; 6445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->myDoc != NULL) 6446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(ctxt->myDoc); 6447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->myDoc = NULL; 6448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->standalone = -1; 6450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->hasExternalSubset = 0; 6451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->hasPErefs = 0; 6452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->html = 1; 6453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->external = 0; 6454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->instate = XML_PARSER_START; 6455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->token = 0; 6456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->wellFormed = 1; 6458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nsWellFormed = 1; 6459df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->disableSAX = 0; 6460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valid = 1; 6461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vctxt.userData = ctxt; 6462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vctxt.error = xmlParserValidityError; 6463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vctxt.warning = xmlParserValidityWarning; 6464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->record_info = 0; 6465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbChars = 0; 6466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->checkIndex = 0; 6467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->inSubset = 0; 6468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->errNo = XML_ERR_OK; 6469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->depth = 0; 6470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->charset = XML_CHAR_ENCODING_NONE; 6471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->catalogs = NULL; 6472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitNodeInfoSeq(&ctxt->node_seq); 6473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->attsDefault != NULL) { 6475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(ctxt->attsDefault, (xmlHashDeallocator) xmlFree); 6476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->attsDefault = NULL; 6477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->attsSpecial != NULL) { 6479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(ctxt->attsSpecial, NULL); 6480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->attsSpecial = NULL; 6481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlCtxtUseOptions: 6486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 6487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: a combination of htmlParserOption(s) 6488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies the options to the parser context 6490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, the set of unknown or unimplemented options 6492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in case of error. 6493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 6495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlCtxtUseOptions(htmlParserCtxtPtr ctxt, int options) 6496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 6498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 6499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (options & HTML_PARSE_NOWARNING) { 6501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->warning = NULL; 6502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vctxt.warning = NULL; 6503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project options -= XML_PARSE_NOWARNING; 6504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->options |= XML_PARSE_NOWARNING; 6505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (options & HTML_PARSE_NOERROR) { 6507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->error = NULL; 6508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->vctxt.error = NULL; 6509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->fatalError = NULL; 6510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project options -= XML_PARSE_NOERROR; 6511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->options |= XML_PARSE_NOERROR; 6512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (options & HTML_PARSE_PEDANTIC) { 6514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pedantic = 1; 6515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project options -= XML_PARSE_PEDANTIC; 6516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->options |= XML_PARSE_PEDANTIC; 6517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 6518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->pedantic = 0; 6519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (options & XML_PARSE_NOBLANKS) { 6520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->keepBlanks = 0; 6521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->sax->ignorableWhitespace = xmlSAX2IgnorableWhitespace; 6522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project options -= XML_PARSE_NOBLANKS; 6523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->options |= XML_PARSE_NOBLANKS; 6524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 6525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->keepBlanks = 1; 6526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (options & HTML_PARSE_RECOVER) { 6527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->recovery = 1; 6528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project options -= HTML_PARSE_RECOVER; 6529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 6530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->recovery = 0; 6531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (options & HTML_PARSE_COMPACT) { 6532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->options |= HTML_PARSE_COMPACT; 6533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project options -= HTML_PARSE_COMPACT; 6534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6535df143a5041f03a22808b59c76698770b74692815Selim Gurun if (options & XML_PARSE_HUGE) { 6536df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->options |= XML_PARSE_HUGE; 6537df143a5041f03a22808b59c76698770b74692815Selim Gurun options -= XML_PARSE_HUGE; 6538df143a5041f03a22808b59c76698770b74692815Selim Gurun } 6539df143a5041f03a22808b59c76698770b74692815Selim Gurun if (options & HTML_PARSE_NODEFDTD) { 6540df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->options |= HTML_PARSE_NODEFDTD; 6541df143a5041f03a22808b59c76698770b74692815Selim Gurun options -= HTML_PARSE_NODEFDTD; 6542df143a5041f03a22808b59c76698770b74692815Selim Gurun } 6543df143a5041f03a22808b59c76698770b74692815Selim Gurun if (options & HTML_PARSE_IGNORE_ENC) { 6544df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->options |= HTML_PARSE_IGNORE_ENC; 6545df143a5041f03a22808b59c76698770b74692815Selim Gurun options -= HTML_PARSE_IGNORE_ENC; 6546df143a5041f03a22808b59c76698770b74692815Selim Gurun } 6547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->dictNames = 0; 6548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (options); 6549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlDoRead: 6553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 6554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: the base URL to use for the document 6555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the document encoding, or NULL 6556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: a combination of htmlParserOption(s) 6557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @reuse: keep the context for reuse 6558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Common front-end for the htmlRead functions 6560df143a5041f03a22808b59c76698770b74692815Selim Gurun * 6561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the resulting document tree or NULL 6562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic htmlDocPtr 6564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDoRead(htmlParserCtxtPtr ctxt, const char *URL, const char *encoding, 6565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int options, int reuse) 6566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlDocPtr ret; 6568df143a5041f03a22808b59c76698770b74692815Selim Gurun 6569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlCtxtUseOptions(ctxt, options); 6570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->html = 1; 6571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (encoding != NULL) { 6572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCharEncodingHandlerPtr hdlr; 6573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hdlr = xmlFindCharEncodingHandler(encoding); 657560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (hdlr != NULL) { 6576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSwitchToEncoding(ctxt, hdlr); 657760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (ctxt->input->encoding != NULL) 657860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlFree((xmlChar *) ctxt->input->encoding); 657960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ctxt->input->encoding = xmlStrdup((xmlChar *)encoding); 658060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 6581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((URL != NULL) && (ctxt->input != NULL) && 6583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->input->filename == NULL)) 6584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->input->filename = (char *) xmlStrdup((const xmlChar *) URL); 6585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParseDocument(ctxt); 6586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ctxt->myDoc; 6587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->myDoc = NULL; 6588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!reuse) { 6589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->dictNames) && 6590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ret != NULL) && 6591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ret->dict == ctxt->dict)) 6592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->dict = NULL; 6593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeParserCtxt(ctxt); 6594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 6596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlReadDoc: 6600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: a pointer to a zero terminated string 6601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: the base URL to use for the document 6602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the document encoding, or NULL 6603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: a combination of htmlParserOption(s) 6604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an XML in-memory document and build a tree. 6606df143a5041f03a22808b59c76698770b74692815Selim Gurun * 6607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the resulting document tree 6608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocPtr 6610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlReadDoc(const xmlChar * cur, const char *URL, const char *encoding, int options) 6611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParserCtxtPtr ctxt; 6613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 6615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitParser(); 6618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = htmlCreateDocParserCtxt(cur, NULL); 6619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 6620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (htmlDoRead(ctxt, URL, encoding, options, 0)); 6622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlReadFile: 6626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename: a file or URL 6627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the document encoding, or NULL 6628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: a combination of htmlParserOption(s) 6629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an XML file from the filesystem or the network. 6631df143a5041f03a22808b59c76698770b74692815Selim Gurun * 6632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the resulting document tree 6633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocPtr 6635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlReadFile(const char *filename, const char *encoding, int options) 6636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParserCtxtPtr ctxt; 6638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitParser(); 6640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = htmlCreateFileParserCtxt(filename, encoding); 6641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 6642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (htmlDoRead(ctxt, NULL, NULL, options, 0)); 6644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlReadMemory: 6648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer: a pointer to a char array 6649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size: the size of the array 6650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: the base URL to use for the document 6651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the document encoding, or NULL 6652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: a combination of htmlParserOption(s) 6653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an XML in-memory document and build a tree. 6655df143a5041f03a22808b59c76698770b74692815Selim Gurun * 6656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the resulting document tree 6657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocPtr 6659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlReadMemory(const char *buffer, int size, const char *URL, const char *encoding, int options) 6660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParserCtxtPtr ctxt; 6662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitParser(); 6664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = xmlCreateMemoryParserCtxt(buffer, size); 6665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 6666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlDefaultSAXHandlerInit(); 6668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->sax != NULL) 6669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(ctxt->sax, &htmlDefaultSAXHandler, sizeof(xmlSAXHandlerV1)); 6670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (htmlDoRead(ctxt, URL, encoding, options, 0)); 6671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlReadFd: 6675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @fd: an open file descriptor 6676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: the base URL to use for the document 6677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the document encoding, or NULL 6678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: a combination of htmlParserOption(s) 6679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an XML from a file descriptor and build a tree. 6681df143a5041f03a22808b59c76698770b74692815Selim Gurun * 6682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the resulting document tree 6683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocPtr 6685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlReadFd(int fd, const char *URL, const char *encoding, int options) 6686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParserCtxtPtr ctxt; 6688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputBufferPtr input; 6689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr stream; 6690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (fd < 0) 6692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitParser(); 6695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE); 6696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input == NULL) 6697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = xmlNewParserCtxt(); 6699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) { 6700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeParserInputBuffer(input); 6701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); 6704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream == NULL) { 6705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeParserInputBuffer(input); 6706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeParserCtxt(ctxt); 6707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputPush(ctxt, stream); 6710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (htmlDoRead(ctxt, URL, encoding, options, 0)); 6711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlReadIO: 6715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ioread: an I/O read function 6716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ioclose: an I/O close function 6717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ioctx: an I/O handler 6718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: the base URL to use for the document 6719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the document encoding, or NULL 6720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: a combination of htmlParserOption(s) 6721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an HTML document from I/O functions and source and build a tree. 6723df143a5041f03a22808b59c76698770b74692815Selim Gurun * 6724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the resulting document tree 6725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocPtr 6727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlReadIO(xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, 6728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *ioctx, const char *URL, const char *encoding, int options) 6729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlParserCtxtPtr ctxt; 6731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputBufferPtr input; 6732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr stream; 6733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ioread == NULL) 6735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitParser(); 6737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, 6739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_CHAR_ENCODING_NONE); 6740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input == NULL) 6741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = htmlNewParserCtxt(); 6743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) { 6744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeParserInputBuffer(input); 6745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); 6748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream == NULL) { 6749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeParserInputBuffer(input); 6750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeParserCtxt(ctxt); 6751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputPush(ctxt, stream); 6754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (htmlDoRead(ctxt, URL, encoding, options, 0)); 6755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlCtxtReadDoc: 6759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 6760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: a pointer to a zero terminated string 6761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: the base URL to use for the document 6762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the document encoding, or NULL 6763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: a combination of htmlParserOption(s) 6764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an XML in-memory document and build a tree. 6766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This reuses the existing @ctxt parser context 6767df143a5041f03a22808b59c76698770b74692815Selim Gurun * 6768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the resulting document tree 6769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocPtr 6771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlCtxtReadDoc(htmlParserCtxtPtr ctxt, const xmlChar * cur, 6772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *URL, const char *encoding, int options) 6773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr stream; 6775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 6777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 6779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlCtxtReset(ctxt); 6782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream = xmlNewStringInputStream(ctxt, cur); 6784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream == NULL) { 6785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputPush(ctxt, stream); 6788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (htmlDoRead(ctxt, URL, encoding, options, 1)); 6789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlCtxtReadFile: 6793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 6794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename: a file or URL 6795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the document encoding, or NULL 6796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: a combination of htmlParserOption(s) 6797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an XML file from the filesystem or the network. 6799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This reuses the existing @ctxt parser context 6800df143a5041f03a22808b59c76698770b74692815Selim Gurun * 6801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the resulting document tree 6802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocPtr 6804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlCtxtReadFile(htmlParserCtxtPtr ctxt, const char *filename, 6805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *encoding, int options) 6806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr stream; 6808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (filename == NULL) 6810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 6812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlCtxtReset(ctxt); 6815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream = xmlLoadExternalEntity(filename, NULL, ctxt); 6817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream == NULL) { 6818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputPush(ctxt, stream); 6821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (htmlDoRead(ctxt, NULL, encoding, options, 1)); 6822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlCtxtReadMemory: 6826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 6827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer: a pointer to a char array 6828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size: the size of the array 6829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: the base URL to use for the document 6830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the document encoding, or NULL 6831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: a combination of htmlParserOption(s) 6832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an XML in-memory document and build a tree. 6834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This reuses the existing @ctxt parser context 6835df143a5041f03a22808b59c76698770b74692815Selim Gurun * 6836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the resulting document tree 6837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocPtr 6839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlCtxtReadMemory(htmlParserCtxtPtr ctxt, const char *buffer, int size, 6840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *URL, const char *encoding, int options) 6841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputBufferPtr input; 6843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr stream; 6844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 6846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buffer == NULL) 6848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlCtxtReset(ctxt); 6851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input = xmlParserInputBufferCreateMem(buffer, size, XML_CHAR_ENCODING_NONE); 6853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input == NULL) { 6854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); 6858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream == NULL) { 6859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeParserInputBuffer(input); 6860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputPush(ctxt, stream); 6864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (htmlDoRead(ctxt, URL, encoding, options, 1)); 6865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlCtxtReadFd: 6869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 6870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @fd: an open file descriptor 6871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: the base URL to use for the document 6872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the document encoding, or NULL 6873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: a combination of htmlParserOption(s) 6874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an XML from a file descriptor and build a tree. 6876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This reuses the existing @ctxt parser context 6877df143a5041f03a22808b59c76698770b74692815Selim Gurun * 6878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the resulting document tree 6879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocPtr 6881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlCtxtReadFd(htmlParserCtxtPtr ctxt, int fd, 6882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *URL, const char *encoding, int options) 6883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputBufferPtr input; 6885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr stream; 6886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (fd < 0) 6888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 6890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlCtxtReset(ctxt); 6893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE); 6896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input == NULL) 6897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); 6899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream == NULL) { 6900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeParserInputBuffer(input); 6901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputPush(ctxt, stream); 6904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (htmlDoRead(ctxt, URL, encoding, options, 1)); 6905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlCtxtReadIO: 6909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an HTML parser context 6910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ioread: an I/O read function 6911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ioclose: an I/O close function 6912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ioctx: an I/O handler 6913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: the base URL to use for the document 6914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the document encoding, or NULL 6915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: a combination of htmlParserOption(s) 6916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an HTML document from I/O functions and source and build a tree. 6918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This reuses the existing @ctxt parser context 6919df143a5041f03a22808b59c76698770b74692815Selim Gurun * 6920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the resulting document tree 6921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocPtr 6923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlCtxtReadIO(htmlParserCtxtPtr ctxt, xmlInputReadCallback ioread, 6924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInputCloseCallback ioclose, void *ioctx, 6925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *URL, 6926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *encoding, int options) 6927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputBufferPtr input; 6929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr stream; 6930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ioread == NULL) 6932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 6934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project htmlCtxtReset(ctxt); 6937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, 6939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_CHAR_ENCODING_NONE); 6940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input == NULL) 6941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); 6943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream == NULL) { 6944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeParserInputBuffer(input); 6945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 6946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inputPush(ctxt, stream); 6948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (htmlDoRead(ctxt, URL, encoding, options, 1)); 6949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_HTMLparser 6952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h" 6953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_HTML_ENABLED */ 6954