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