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