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