1*6777b538SAndroid Build Coastguard Worker /*
2*6777b538SAndroid Build Coastguard Worker * parserInternals.c : Internal routines (and obsolete ones) needed for the
3*6777b538SAndroid Build Coastguard Worker * XML and HTML parsers.
4*6777b538SAndroid Build Coastguard Worker *
5*6777b538SAndroid Build Coastguard Worker * See Copyright for the status of this software.
6*6777b538SAndroid Build Coastguard Worker *
7*6777b538SAndroid Build Coastguard Worker * [email protected]
8*6777b538SAndroid Build Coastguard Worker */
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker #define IN_LIBXML
11*6777b538SAndroid Build Coastguard Worker #include "libxml.h"
12*6777b538SAndroid Build Coastguard Worker
13*6777b538SAndroid Build Coastguard Worker #if defined(_WIN32)
14*6777b538SAndroid Build Coastguard Worker #define XML_DIR_SEP '\\'
15*6777b538SAndroid Build Coastguard Worker #else
16*6777b538SAndroid Build Coastguard Worker #define XML_DIR_SEP '/'
17*6777b538SAndroid Build Coastguard Worker #endif
18*6777b538SAndroid Build Coastguard Worker
19*6777b538SAndroid Build Coastguard Worker #include <string.h>
20*6777b538SAndroid Build Coastguard Worker #include <ctype.h>
21*6777b538SAndroid Build Coastguard Worker #include <stdlib.h>
22*6777b538SAndroid Build Coastguard Worker
23*6777b538SAndroid Build Coastguard Worker #include <libxml/xmlmemory.h>
24*6777b538SAndroid Build Coastguard Worker #include <libxml/tree.h>
25*6777b538SAndroid Build Coastguard Worker #include <libxml/parser.h>
26*6777b538SAndroid Build Coastguard Worker #include <libxml/parserInternals.h>
27*6777b538SAndroid Build Coastguard Worker #include <libxml/entities.h>
28*6777b538SAndroid Build Coastguard Worker #include <libxml/xmlerror.h>
29*6777b538SAndroid Build Coastguard Worker #include <libxml/encoding.h>
30*6777b538SAndroid Build Coastguard Worker #include <libxml/xmlIO.h>
31*6777b538SAndroid Build Coastguard Worker #include <libxml/uri.h>
32*6777b538SAndroid Build Coastguard Worker #include <libxml/dict.h>
33*6777b538SAndroid Build Coastguard Worker #include <libxml/xmlsave.h>
34*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_CATALOG_ENABLED
35*6777b538SAndroid Build Coastguard Worker #include <libxml/catalog.h>
36*6777b538SAndroid Build Coastguard Worker #endif
37*6777b538SAndroid Build Coastguard Worker #include <libxml/chvalid.h>
38*6777b538SAndroid Build Coastguard Worker #include <libxml/nanohttp.h>
39*6777b538SAndroid Build Coastguard Worker
40*6777b538SAndroid Build Coastguard Worker #define CUR(ctxt) ctxt->input->cur
41*6777b538SAndroid Build Coastguard Worker #define END(ctxt) ctxt->input->end
42*6777b538SAndroid Build Coastguard Worker
43*6777b538SAndroid Build Coastguard Worker #include "private/buf.h"
44*6777b538SAndroid Build Coastguard Worker #include "private/enc.h"
45*6777b538SAndroid Build Coastguard Worker #include "private/error.h"
46*6777b538SAndroid Build Coastguard Worker #include "private/io.h"
47*6777b538SAndroid Build Coastguard Worker #include "private/parser.h"
48*6777b538SAndroid Build Coastguard Worker
49*6777b538SAndroid Build Coastguard Worker #define XML_MAX_ERRORS 100
50*6777b538SAndroid Build Coastguard Worker
51*6777b538SAndroid Build Coastguard Worker /*
52*6777b538SAndroid Build Coastguard Worker * XML_MAX_AMPLIFICATION_DEFAULT is the default maximum allowed amplification
53*6777b538SAndroid Build Coastguard Worker * factor of serialized output after entity expansion.
54*6777b538SAndroid Build Coastguard Worker */
55*6777b538SAndroid Build Coastguard Worker #define XML_MAX_AMPLIFICATION_DEFAULT 5
56*6777b538SAndroid Build Coastguard Worker
57*6777b538SAndroid Build Coastguard Worker /*
58*6777b538SAndroid Build Coastguard Worker * Various global defaults for parsing
59*6777b538SAndroid Build Coastguard Worker */
60*6777b538SAndroid Build Coastguard Worker
61*6777b538SAndroid Build Coastguard Worker /**
62*6777b538SAndroid Build Coastguard Worker * xmlCheckVersion:
63*6777b538SAndroid Build Coastguard Worker * @version: the include version number
64*6777b538SAndroid Build Coastguard Worker *
65*6777b538SAndroid Build Coastguard Worker * check the compiled lib version against the include one.
66*6777b538SAndroid Build Coastguard Worker */
67*6777b538SAndroid Build Coastguard Worker void
xmlCheckVersion(int version)68*6777b538SAndroid Build Coastguard Worker xmlCheckVersion(int version) {
69*6777b538SAndroid Build Coastguard Worker int myversion = LIBXML_VERSION;
70*6777b538SAndroid Build Coastguard Worker
71*6777b538SAndroid Build Coastguard Worker xmlInitParser();
72*6777b538SAndroid Build Coastguard Worker
73*6777b538SAndroid Build Coastguard Worker if ((myversion / 10000) != (version / 10000)) {
74*6777b538SAndroid Build Coastguard Worker fprintf(stderr,
75*6777b538SAndroid Build Coastguard Worker "Fatal: program compiled against libxml %d using libxml %d\n",
76*6777b538SAndroid Build Coastguard Worker (version / 10000), (myversion / 10000));
77*6777b538SAndroid Build Coastguard Worker } else if ((myversion / 100) < (version / 100)) {
78*6777b538SAndroid Build Coastguard Worker fprintf(stderr,
79*6777b538SAndroid Build Coastguard Worker "Warning: program compiled against libxml %d using older %d\n",
80*6777b538SAndroid Build Coastguard Worker (version / 100), (myversion / 100));
81*6777b538SAndroid Build Coastguard Worker }
82*6777b538SAndroid Build Coastguard Worker }
83*6777b538SAndroid Build Coastguard Worker
84*6777b538SAndroid Build Coastguard Worker
85*6777b538SAndroid Build Coastguard Worker /************************************************************************
86*6777b538SAndroid Build Coastguard Worker * *
87*6777b538SAndroid Build Coastguard Worker * Some factorized error routines *
88*6777b538SAndroid Build Coastguard Worker * *
89*6777b538SAndroid Build Coastguard Worker ************************************************************************/
90*6777b538SAndroid Build Coastguard Worker
91*6777b538SAndroid Build Coastguard Worker
92*6777b538SAndroid Build Coastguard Worker /**
93*6777b538SAndroid Build Coastguard Worker * xmlCtxtSetErrorHandler:
94*6777b538SAndroid Build Coastguard Worker * @ctxt: an XML parser context
95*6777b538SAndroid Build Coastguard Worker * @handler: error handler
96*6777b538SAndroid Build Coastguard Worker * @data: data for error handler
97*6777b538SAndroid Build Coastguard Worker *
98*6777b538SAndroid Build Coastguard Worker * Register a callback function that will be called on errors and
99*6777b538SAndroid Build Coastguard Worker * warnings. If handler is NULL, the error handler will be deactivated.
100*6777b538SAndroid Build Coastguard Worker *
101*6777b538SAndroid Build Coastguard Worker * This is the recommended way to collect errors from the parser and
102*6777b538SAndroid Build Coastguard Worker * takes precedence over all other error reporting mechanisms.
103*6777b538SAndroid Build Coastguard Worker * These are (in order of precedence):
104*6777b538SAndroid Build Coastguard Worker *
105*6777b538SAndroid Build Coastguard Worker * - per-context structured handler (xmlCtxtSetErrorHandler)
106*6777b538SAndroid Build Coastguard Worker * - per-context structured "serror" SAX handler
107*6777b538SAndroid Build Coastguard Worker * - global structured handler (xmlSetStructuredErrorFunc)
108*6777b538SAndroid Build Coastguard Worker * - per-context generic "error" and "warning" SAX handlers
109*6777b538SAndroid Build Coastguard Worker * - global generic handler (xmlSetGenericErrorFunc)
110*6777b538SAndroid Build Coastguard Worker * - print to stderr
111*6777b538SAndroid Build Coastguard Worker *
112*6777b538SAndroid Build Coastguard Worker * Available since 2.13.0.
113*6777b538SAndroid Build Coastguard Worker */
114*6777b538SAndroid Build Coastguard Worker void
xmlCtxtSetErrorHandler(xmlParserCtxtPtr ctxt,xmlStructuredErrorFunc handler,void * data)115*6777b538SAndroid Build Coastguard Worker xmlCtxtSetErrorHandler(xmlParserCtxtPtr ctxt, xmlStructuredErrorFunc handler,
116*6777b538SAndroid Build Coastguard Worker void *data)
117*6777b538SAndroid Build Coastguard Worker {
118*6777b538SAndroid Build Coastguard Worker if (ctxt == NULL)
119*6777b538SAndroid Build Coastguard Worker return;
120*6777b538SAndroid Build Coastguard Worker ctxt->errorHandler = handler;
121*6777b538SAndroid Build Coastguard Worker ctxt->errorCtxt = data;
122*6777b538SAndroid Build Coastguard Worker }
123*6777b538SAndroid Build Coastguard Worker
124*6777b538SAndroid Build Coastguard Worker /**
125*6777b538SAndroid Build Coastguard Worker * xmlCtxtErrMemory:
126*6777b538SAndroid Build Coastguard Worker * @ctxt: an XML parser context
127*6777b538SAndroid Build Coastguard Worker * @domain: domain
128*6777b538SAndroid Build Coastguard Worker *
129*6777b538SAndroid Build Coastguard Worker * Handle an out-of-memory error
130*6777b538SAndroid Build Coastguard Worker */
131*6777b538SAndroid Build Coastguard Worker void
xmlCtxtErrMemory(xmlParserCtxtPtr ctxt)132*6777b538SAndroid Build Coastguard Worker xmlCtxtErrMemory(xmlParserCtxtPtr ctxt)
133*6777b538SAndroid Build Coastguard Worker {
134*6777b538SAndroid Build Coastguard Worker xmlStructuredErrorFunc schannel = NULL;
135*6777b538SAndroid Build Coastguard Worker xmlGenericErrorFunc channel = NULL;
136*6777b538SAndroid Build Coastguard Worker void *data;
137*6777b538SAndroid Build Coastguard Worker
138*6777b538SAndroid Build Coastguard Worker ctxt->errNo = XML_ERR_NO_MEMORY;
139*6777b538SAndroid Build Coastguard Worker ctxt->instate = XML_PARSER_EOF; /* TODO: Remove after refactoring */
140*6777b538SAndroid Build Coastguard Worker ctxt->wellFormed = 0;
141*6777b538SAndroid Build Coastguard Worker ctxt->disableSAX = 2;
142*6777b538SAndroid Build Coastguard Worker
143*6777b538SAndroid Build Coastguard Worker if (ctxt->errorHandler) {
144*6777b538SAndroid Build Coastguard Worker schannel = ctxt->errorHandler;
145*6777b538SAndroid Build Coastguard Worker data = ctxt->errorCtxt;
146*6777b538SAndroid Build Coastguard Worker } else if ((ctxt->sax->initialized == XML_SAX2_MAGIC) &&
147*6777b538SAndroid Build Coastguard Worker (ctxt->sax->serror != NULL)) {
148*6777b538SAndroid Build Coastguard Worker schannel = ctxt->sax->serror;
149*6777b538SAndroid Build Coastguard Worker data = ctxt->userData;
150*6777b538SAndroid Build Coastguard Worker } else {
151*6777b538SAndroid Build Coastguard Worker channel = ctxt->sax->error;
152*6777b538SAndroid Build Coastguard Worker data = ctxt->userData;
153*6777b538SAndroid Build Coastguard Worker }
154*6777b538SAndroid Build Coastguard Worker
155*6777b538SAndroid Build Coastguard Worker xmlRaiseMemoryError(schannel, channel, data, XML_FROM_PARSER,
156*6777b538SAndroid Build Coastguard Worker &ctxt->lastError);
157*6777b538SAndroid Build Coastguard Worker }
158*6777b538SAndroid Build Coastguard Worker
159*6777b538SAndroid Build Coastguard Worker /**
160*6777b538SAndroid Build Coastguard Worker * xmlCtxtErrIO:
161*6777b538SAndroid Build Coastguard Worker * @ctxt: parser context
162*6777b538SAndroid Build Coastguard Worker * @code: xmlParserErrors code
163*6777b538SAndroid Build Coastguard Worker * @uri: filename or URI (optional)
164*6777b538SAndroid Build Coastguard Worker *
165*6777b538SAndroid Build Coastguard Worker * If filename is empty, use the one from context input if available.
166*6777b538SAndroid Build Coastguard Worker *
167*6777b538SAndroid Build Coastguard Worker * Report an IO error to the parser context.
168*6777b538SAndroid Build Coastguard Worker */
169*6777b538SAndroid Build Coastguard Worker void
xmlCtxtErrIO(xmlParserCtxtPtr ctxt,int code,const char * uri)170*6777b538SAndroid Build Coastguard Worker xmlCtxtErrIO(xmlParserCtxtPtr ctxt, int code, const char *uri)
171*6777b538SAndroid Build Coastguard Worker {
172*6777b538SAndroid Build Coastguard Worker const char *errstr, *msg, *str1, *str2;
173*6777b538SAndroid Build Coastguard Worker xmlErrorLevel level;
174*6777b538SAndroid Build Coastguard Worker
175*6777b538SAndroid Build Coastguard Worker if (ctxt == NULL)
176*6777b538SAndroid Build Coastguard Worker return;
177*6777b538SAndroid Build Coastguard Worker
178*6777b538SAndroid Build Coastguard Worker /*
179*6777b538SAndroid Build Coastguard Worker * Don't report a well-formedness error if an external entity could
180*6777b538SAndroid Build Coastguard Worker * not be found. We assume that inputNr is zero for the document
181*6777b538SAndroid Build Coastguard Worker * entity which is somewhat fragile.
182*6777b538SAndroid Build Coastguard Worker */
183*6777b538SAndroid Build Coastguard Worker if ((ctxt->inputNr > 0) &&
184*6777b538SAndroid Build Coastguard Worker ((code == XML_IO_ENOENT) ||
185*6777b538SAndroid Build Coastguard Worker (code == XML_IO_NETWORK_ATTEMPT) ||
186*6777b538SAndroid Build Coastguard Worker (code == XML_IO_UNKNOWN))) {
187*6777b538SAndroid Build Coastguard Worker if (ctxt->validate == 0)
188*6777b538SAndroid Build Coastguard Worker level = XML_ERR_WARNING;
189*6777b538SAndroid Build Coastguard Worker else
190*6777b538SAndroid Build Coastguard Worker level = XML_ERR_ERROR;
191*6777b538SAndroid Build Coastguard Worker } else {
192*6777b538SAndroid Build Coastguard Worker level = XML_ERR_FATAL;
193*6777b538SAndroid Build Coastguard Worker }
194*6777b538SAndroid Build Coastguard Worker
195*6777b538SAndroid Build Coastguard Worker errstr = xmlErrString(code);
196*6777b538SAndroid Build Coastguard Worker
197*6777b538SAndroid Build Coastguard Worker if (uri == NULL) {
198*6777b538SAndroid Build Coastguard Worker msg = "%s\n";
199*6777b538SAndroid Build Coastguard Worker str1 = errstr;
200*6777b538SAndroid Build Coastguard Worker str2 = NULL;
201*6777b538SAndroid Build Coastguard Worker } else {
202*6777b538SAndroid Build Coastguard Worker msg = "failed to load \"%s\": %s\n";
203*6777b538SAndroid Build Coastguard Worker str1 = uri;
204*6777b538SAndroid Build Coastguard Worker str2 = errstr;
205*6777b538SAndroid Build Coastguard Worker }
206*6777b538SAndroid Build Coastguard Worker
207*6777b538SAndroid Build Coastguard Worker xmlCtxtErr(ctxt, NULL, XML_FROM_IO, code, level,
208*6777b538SAndroid Build Coastguard Worker (const xmlChar *) uri, NULL, NULL, 0,
209*6777b538SAndroid Build Coastguard Worker msg, str1, str2);
210*6777b538SAndroid Build Coastguard Worker }
211*6777b538SAndroid Build Coastguard Worker
212*6777b538SAndroid Build Coastguard Worker void
xmlCtxtVErr(xmlParserCtxtPtr ctxt,xmlNodePtr node,xmlErrorDomain domain,xmlParserErrors code,xmlErrorLevel level,const xmlChar * str1,const xmlChar * str2,const xmlChar * str3,int int1,const char * msg,va_list ap)213*6777b538SAndroid Build Coastguard Worker xmlCtxtVErr(xmlParserCtxtPtr ctxt, xmlNodePtr node, xmlErrorDomain domain,
214*6777b538SAndroid Build Coastguard Worker xmlParserErrors code, xmlErrorLevel level,
215*6777b538SAndroid Build Coastguard Worker const xmlChar *str1, const xmlChar *str2, const xmlChar *str3,
216*6777b538SAndroid Build Coastguard Worker int int1, const char *msg, va_list ap)
217*6777b538SAndroid Build Coastguard Worker {
218*6777b538SAndroid Build Coastguard Worker xmlStructuredErrorFunc schannel = NULL;
219*6777b538SAndroid Build Coastguard Worker xmlGenericErrorFunc channel = NULL;
220*6777b538SAndroid Build Coastguard Worker void *data = NULL;
221*6777b538SAndroid Build Coastguard Worker const char *file = NULL;
222*6777b538SAndroid Build Coastguard Worker int line = 0;
223*6777b538SAndroid Build Coastguard Worker int col = 0;
224*6777b538SAndroid Build Coastguard Worker int res;
225*6777b538SAndroid Build Coastguard Worker
226*6777b538SAndroid Build Coastguard Worker if (code == XML_ERR_NO_MEMORY) {
227*6777b538SAndroid Build Coastguard Worker xmlCtxtErrMemory(ctxt);
228*6777b538SAndroid Build Coastguard Worker return;
229*6777b538SAndroid Build Coastguard Worker }
230*6777b538SAndroid Build Coastguard Worker
231*6777b538SAndroid Build Coastguard Worker if (PARSER_STOPPED(ctxt))
232*6777b538SAndroid Build Coastguard Worker return;
233*6777b538SAndroid Build Coastguard Worker
234*6777b538SAndroid Build Coastguard Worker if (level == XML_ERR_WARNING) {
235*6777b538SAndroid Build Coastguard Worker if (ctxt->nbWarnings >= XML_MAX_ERRORS)
236*6777b538SAndroid Build Coastguard Worker return;
237*6777b538SAndroid Build Coastguard Worker ctxt->nbWarnings += 1;
238*6777b538SAndroid Build Coastguard Worker } else {
239*6777b538SAndroid Build Coastguard Worker if (ctxt->nbErrors >= XML_MAX_ERRORS)
240*6777b538SAndroid Build Coastguard Worker return;
241*6777b538SAndroid Build Coastguard Worker ctxt->nbErrors += 1;
242*6777b538SAndroid Build Coastguard Worker }
243*6777b538SAndroid Build Coastguard Worker
244*6777b538SAndroid Build Coastguard Worker if (((ctxt->options & XML_PARSE_NOERROR) == 0) &&
245*6777b538SAndroid Build Coastguard Worker ((level != XML_ERR_WARNING) ||
246*6777b538SAndroid Build Coastguard Worker ((ctxt->options & XML_PARSE_NOWARNING) == 0))) {
247*6777b538SAndroid Build Coastguard Worker if (ctxt->errorHandler) {
248*6777b538SAndroid Build Coastguard Worker schannel = ctxt->errorHandler;
249*6777b538SAndroid Build Coastguard Worker data = ctxt->errorCtxt;
250*6777b538SAndroid Build Coastguard Worker } else if ((ctxt->sax->initialized == XML_SAX2_MAGIC) &&
251*6777b538SAndroid Build Coastguard Worker (ctxt->sax->serror != NULL)) {
252*6777b538SAndroid Build Coastguard Worker schannel = ctxt->sax->serror;
253*6777b538SAndroid Build Coastguard Worker data = ctxt->userData;
254*6777b538SAndroid Build Coastguard Worker } else if ((domain == XML_FROM_VALID) || (domain == XML_FROM_DTD)) {
255*6777b538SAndroid Build Coastguard Worker if (level == XML_ERR_WARNING)
256*6777b538SAndroid Build Coastguard Worker channel = ctxt->vctxt.warning;
257*6777b538SAndroid Build Coastguard Worker else
258*6777b538SAndroid Build Coastguard Worker channel = ctxt->vctxt.error;
259*6777b538SAndroid Build Coastguard Worker data = ctxt->vctxt.userData;
260*6777b538SAndroid Build Coastguard Worker } else {
261*6777b538SAndroid Build Coastguard Worker if (level == XML_ERR_WARNING)
262*6777b538SAndroid Build Coastguard Worker channel = ctxt->sax->warning;
263*6777b538SAndroid Build Coastguard Worker else
264*6777b538SAndroid Build Coastguard Worker channel = ctxt->sax->error;
265*6777b538SAndroid Build Coastguard Worker data = ctxt->userData;
266*6777b538SAndroid Build Coastguard Worker }
267*6777b538SAndroid Build Coastguard Worker }
268*6777b538SAndroid Build Coastguard Worker
269*6777b538SAndroid Build Coastguard Worker if (ctxt->input != NULL) {
270*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr input = ctxt->input;
271*6777b538SAndroid Build Coastguard Worker
272*6777b538SAndroid Build Coastguard Worker if ((input->filename == NULL) &&
273*6777b538SAndroid Build Coastguard Worker (ctxt->inputNr > 1)) {
274*6777b538SAndroid Build Coastguard Worker input = ctxt->inputTab[ctxt->inputNr - 2];
275*6777b538SAndroid Build Coastguard Worker }
276*6777b538SAndroid Build Coastguard Worker file = input->filename;
277*6777b538SAndroid Build Coastguard Worker line = input->line;
278*6777b538SAndroid Build Coastguard Worker col = input->col;
279*6777b538SAndroid Build Coastguard Worker }
280*6777b538SAndroid Build Coastguard Worker
281*6777b538SAndroid Build Coastguard Worker res = xmlVRaiseError(schannel, channel, data, ctxt, node, domain, code,
282*6777b538SAndroid Build Coastguard Worker level, file, line, (const char *) str1,
283*6777b538SAndroid Build Coastguard Worker (const char *) str2, (const char *) str3, int1, col,
284*6777b538SAndroid Build Coastguard Worker msg, ap);
285*6777b538SAndroid Build Coastguard Worker
286*6777b538SAndroid Build Coastguard Worker if (res < 0) {
287*6777b538SAndroid Build Coastguard Worker xmlCtxtErrMemory(ctxt);
288*6777b538SAndroid Build Coastguard Worker return;
289*6777b538SAndroid Build Coastguard Worker }
290*6777b538SAndroid Build Coastguard Worker
291*6777b538SAndroid Build Coastguard Worker if (level >= XML_ERR_ERROR)
292*6777b538SAndroid Build Coastguard Worker ctxt->errNo = code;
293*6777b538SAndroid Build Coastguard Worker if (level == XML_ERR_FATAL) {
294*6777b538SAndroid Build Coastguard Worker ctxt->wellFormed = 0;
295*6777b538SAndroid Build Coastguard Worker if (ctxt->recovery == 0)
296*6777b538SAndroid Build Coastguard Worker ctxt->disableSAX = 1;
297*6777b538SAndroid Build Coastguard Worker }
298*6777b538SAndroid Build Coastguard Worker
299*6777b538SAndroid Build Coastguard Worker return;
300*6777b538SAndroid Build Coastguard Worker }
301*6777b538SAndroid Build Coastguard Worker
302*6777b538SAndroid Build Coastguard Worker void
xmlCtxtErr(xmlParserCtxtPtr ctxt,xmlNodePtr node,xmlErrorDomain domain,xmlParserErrors code,xmlErrorLevel level,const xmlChar * str1,const xmlChar * str2,const xmlChar * str3,int int1,const char * msg,...)303*6777b538SAndroid Build Coastguard Worker xmlCtxtErr(xmlParserCtxtPtr ctxt, xmlNodePtr node, xmlErrorDomain domain,
304*6777b538SAndroid Build Coastguard Worker xmlParserErrors code, xmlErrorLevel level,
305*6777b538SAndroid Build Coastguard Worker const xmlChar *str1, const xmlChar *str2, const xmlChar *str3,
306*6777b538SAndroid Build Coastguard Worker int int1, const char *msg, ...)
307*6777b538SAndroid Build Coastguard Worker {
308*6777b538SAndroid Build Coastguard Worker va_list ap;
309*6777b538SAndroid Build Coastguard Worker
310*6777b538SAndroid Build Coastguard Worker va_start(ap, msg);
311*6777b538SAndroid Build Coastguard Worker xmlCtxtVErr(ctxt, node, domain, code, level,
312*6777b538SAndroid Build Coastguard Worker str1, str2, str3, int1, msg, ap);
313*6777b538SAndroid Build Coastguard Worker va_end(ap);
314*6777b538SAndroid Build Coastguard Worker }
315*6777b538SAndroid Build Coastguard Worker
316*6777b538SAndroid Build Coastguard Worker /**
317*6777b538SAndroid Build Coastguard Worker * xmlFatalErr:
318*6777b538SAndroid Build Coastguard Worker * @ctxt: an XML parser context
319*6777b538SAndroid Build Coastguard Worker * @error: the error number
320*6777b538SAndroid Build Coastguard Worker * @info: extra information string
321*6777b538SAndroid Build Coastguard Worker *
322*6777b538SAndroid Build Coastguard Worker * Handle a fatal parser error, i.e. violating Well-Formedness constraints
323*6777b538SAndroid Build Coastguard Worker */
324*6777b538SAndroid Build Coastguard Worker void
xmlFatalErr(xmlParserCtxtPtr ctxt,xmlParserErrors code,const char * info)325*6777b538SAndroid Build Coastguard Worker xmlFatalErr(xmlParserCtxtPtr ctxt, xmlParserErrors code, const char *info)
326*6777b538SAndroid Build Coastguard Worker {
327*6777b538SAndroid Build Coastguard Worker const char *errmsg;
328*6777b538SAndroid Build Coastguard Worker xmlErrorLevel level;
329*6777b538SAndroid Build Coastguard Worker
330*6777b538SAndroid Build Coastguard Worker if (code == XML_ERR_UNSUPPORTED_ENCODING)
331*6777b538SAndroid Build Coastguard Worker level = XML_ERR_WARNING;
332*6777b538SAndroid Build Coastguard Worker else
333*6777b538SAndroid Build Coastguard Worker level = XML_ERR_FATAL;
334*6777b538SAndroid Build Coastguard Worker
335*6777b538SAndroid Build Coastguard Worker errmsg = xmlErrString(code);
336*6777b538SAndroid Build Coastguard Worker
337*6777b538SAndroid Build Coastguard Worker if (info == NULL) {
338*6777b538SAndroid Build Coastguard Worker xmlCtxtErr(ctxt, NULL, XML_FROM_PARSER, code, level,
339*6777b538SAndroid Build Coastguard Worker NULL, NULL, NULL, 0, "%s\n", errmsg);
340*6777b538SAndroid Build Coastguard Worker } else {
341*6777b538SAndroid Build Coastguard Worker xmlCtxtErr(ctxt, NULL, XML_FROM_PARSER, code, level,
342*6777b538SAndroid Build Coastguard Worker (const xmlChar *) info, NULL, NULL, 0,
343*6777b538SAndroid Build Coastguard Worker "%s: %s\n", errmsg, info);
344*6777b538SAndroid Build Coastguard Worker }
345*6777b538SAndroid Build Coastguard Worker }
346*6777b538SAndroid Build Coastguard Worker
347*6777b538SAndroid Build Coastguard Worker /**
348*6777b538SAndroid Build Coastguard Worker * xmlIsLetter:
349*6777b538SAndroid Build Coastguard Worker * @c: an unicode character (int)
350*6777b538SAndroid Build Coastguard Worker *
351*6777b538SAndroid Build Coastguard Worker * Check whether the character is allowed by the production
352*6777b538SAndroid Build Coastguard Worker * [84] Letter ::= BaseChar | Ideographic
353*6777b538SAndroid Build Coastguard Worker *
354*6777b538SAndroid Build Coastguard Worker * Returns 0 if not, non-zero otherwise
355*6777b538SAndroid Build Coastguard Worker */
356*6777b538SAndroid Build Coastguard Worker int
xmlIsLetter(int c)357*6777b538SAndroid Build Coastguard Worker xmlIsLetter(int c) {
358*6777b538SAndroid Build Coastguard Worker return(IS_BASECHAR(c) || IS_IDEOGRAPHIC(c));
359*6777b538SAndroid Build Coastguard Worker }
360*6777b538SAndroid Build Coastguard Worker
361*6777b538SAndroid Build Coastguard Worker /************************************************************************
362*6777b538SAndroid Build Coastguard Worker * *
363*6777b538SAndroid Build Coastguard Worker * Input handling functions for progressive parsing *
364*6777b538SAndroid Build Coastguard Worker * *
365*6777b538SAndroid Build Coastguard Worker ************************************************************************/
366*6777b538SAndroid Build Coastguard Worker
367*6777b538SAndroid Build Coastguard Worker /* we need to keep enough input to show errors in context */
368*6777b538SAndroid Build Coastguard Worker #define LINE_LEN 80
369*6777b538SAndroid Build Coastguard Worker
370*6777b538SAndroid Build Coastguard Worker /**
371*6777b538SAndroid Build Coastguard Worker * xmlHaltParser:
372*6777b538SAndroid Build Coastguard Worker * @ctxt: an XML parser context
373*6777b538SAndroid Build Coastguard Worker *
374*6777b538SAndroid Build Coastguard Worker * Blocks further parser processing don't override error
375*6777b538SAndroid Build Coastguard Worker * for internal use
376*6777b538SAndroid Build Coastguard Worker */
377*6777b538SAndroid Build Coastguard Worker void
xmlHaltParser(xmlParserCtxtPtr ctxt)378*6777b538SAndroid Build Coastguard Worker xmlHaltParser(xmlParserCtxtPtr ctxt) {
379*6777b538SAndroid Build Coastguard Worker if (ctxt == NULL)
380*6777b538SAndroid Build Coastguard Worker return;
381*6777b538SAndroid Build Coastguard Worker ctxt->instate = XML_PARSER_EOF; /* TODO: Remove after refactoring */
382*6777b538SAndroid Build Coastguard Worker ctxt->disableSAX = 2;
383*6777b538SAndroid Build Coastguard Worker }
384*6777b538SAndroid Build Coastguard Worker
385*6777b538SAndroid Build Coastguard Worker /**
386*6777b538SAndroid Build Coastguard Worker * xmlParserInputRead:
387*6777b538SAndroid Build Coastguard Worker * @in: an XML parser input
388*6777b538SAndroid Build Coastguard Worker * @len: an indicative size for the lookahead
389*6777b538SAndroid Build Coastguard Worker *
390*6777b538SAndroid Build Coastguard Worker * DEPRECATED: This function was internal and is deprecated.
391*6777b538SAndroid Build Coastguard Worker *
392*6777b538SAndroid Build Coastguard Worker * Returns -1 as this is an error to use it.
393*6777b538SAndroid Build Coastguard Worker */
394*6777b538SAndroid Build Coastguard Worker int
xmlParserInputRead(xmlParserInputPtr in ATTRIBUTE_UNUSED,int len ATTRIBUTE_UNUSED)395*6777b538SAndroid Build Coastguard Worker xmlParserInputRead(xmlParserInputPtr in ATTRIBUTE_UNUSED, int len ATTRIBUTE_UNUSED) {
396*6777b538SAndroid Build Coastguard Worker return(-1);
397*6777b538SAndroid Build Coastguard Worker }
398*6777b538SAndroid Build Coastguard Worker
399*6777b538SAndroid Build Coastguard Worker /**
400*6777b538SAndroid Build Coastguard Worker * xmlParserGrow:
401*6777b538SAndroid Build Coastguard Worker * @ctxt: an XML parser context
402*6777b538SAndroid Build Coastguard Worker *
403*6777b538SAndroid Build Coastguard Worker * Grow the input buffer.
404*6777b538SAndroid Build Coastguard Worker *
405*6777b538SAndroid Build Coastguard Worker * Returns the number of bytes read or -1 in case of error.
406*6777b538SAndroid Build Coastguard Worker */
407*6777b538SAndroid Build Coastguard Worker int
xmlParserGrow(xmlParserCtxtPtr ctxt)408*6777b538SAndroid Build Coastguard Worker xmlParserGrow(xmlParserCtxtPtr ctxt) {
409*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr in = ctxt->input;
410*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferPtr buf = in->buf;
411*6777b538SAndroid Build Coastguard Worker size_t curEnd = in->end - in->cur;
412*6777b538SAndroid Build Coastguard Worker size_t curBase = in->cur - in->base;
413*6777b538SAndroid Build Coastguard Worker size_t maxLength = (ctxt->options & XML_PARSE_HUGE) ?
414*6777b538SAndroid Build Coastguard Worker XML_MAX_HUGE_LENGTH :
415*6777b538SAndroid Build Coastguard Worker XML_MAX_LOOKUP_LIMIT;
416*6777b538SAndroid Build Coastguard Worker int ret;
417*6777b538SAndroid Build Coastguard Worker
418*6777b538SAndroid Build Coastguard Worker if (buf == NULL)
419*6777b538SAndroid Build Coastguard Worker return(0);
420*6777b538SAndroid Build Coastguard Worker /* Don't grow push parser buffer. */
421*6777b538SAndroid Build Coastguard Worker if (PARSER_PROGRESSIVE(ctxt))
422*6777b538SAndroid Build Coastguard Worker return(0);
423*6777b538SAndroid Build Coastguard Worker /* Don't grow memory buffers. */
424*6777b538SAndroid Build Coastguard Worker if ((buf->encoder == NULL) && (buf->readcallback == NULL))
425*6777b538SAndroid Build Coastguard Worker return(0);
426*6777b538SAndroid Build Coastguard Worker if (buf->error != 0)
427*6777b538SAndroid Build Coastguard Worker return(-1);
428*6777b538SAndroid Build Coastguard Worker
429*6777b538SAndroid Build Coastguard Worker if (curBase > maxLength) {
430*6777b538SAndroid Build Coastguard Worker xmlFatalErr(ctxt, XML_ERR_RESOURCE_LIMIT,
431*6777b538SAndroid Build Coastguard Worker "Buffer size limit exceeded, try XML_PARSE_HUGE\n");
432*6777b538SAndroid Build Coastguard Worker xmlHaltParser(ctxt);
433*6777b538SAndroid Build Coastguard Worker return(-1);
434*6777b538SAndroid Build Coastguard Worker }
435*6777b538SAndroid Build Coastguard Worker
436*6777b538SAndroid Build Coastguard Worker if (curEnd >= INPUT_CHUNK)
437*6777b538SAndroid Build Coastguard Worker return(0);
438*6777b538SAndroid Build Coastguard Worker
439*6777b538SAndroid Build Coastguard Worker ret = xmlParserInputBufferGrow(buf, INPUT_CHUNK);
440*6777b538SAndroid Build Coastguard Worker xmlBufUpdateInput(buf->buffer, in, curBase);
441*6777b538SAndroid Build Coastguard Worker
442*6777b538SAndroid Build Coastguard Worker if (ret < 0) {
443*6777b538SAndroid Build Coastguard Worker xmlCtxtErrIO(ctxt, buf->error, NULL);
444*6777b538SAndroid Build Coastguard Worker }
445*6777b538SAndroid Build Coastguard Worker
446*6777b538SAndroid Build Coastguard Worker return(ret);
447*6777b538SAndroid Build Coastguard Worker }
448*6777b538SAndroid Build Coastguard Worker
449*6777b538SAndroid Build Coastguard Worker /**
450*6777b538SAndroid Build Coastguard Worker * xmlParserInputGrow:
451*6777b538SAndroid Build Coastguard Worker * @in: an XML parser input
452*6777b538SAndroid Build Coastguard Worker * @len: an indicative size for the lookahead
453*6777b538SAndroid Build Coastguard Worker *
454*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Don't use.
455*6777b538SAndroid Build Coastguard Worker *
456*6777b538SAndroid Build Coastguard Worker * This function increase the input for the parser. It tries to
457*6777b538SAndroid Build Coastguard Worker * preserve pointers to the input buffer, and keep already read data
458*6777b538SAndroid Build Coastguard Worker *
459*6777b538SAndroid Build Coastguard Worker * Returns the amount of char read, or -1 in case of error, 0 indicate the
460*6777b538SAndroid Build Coastguard Worker * end of this entity
461*6777b538SAndroid Build Coastguard Worker */
462*6777b538SAndroid Build Coastguard Worker int
xmlParserInputGrow(xmlParserInputPtr in,int len)463*6777b538SAndroid Build Coastguard Worker xmlParserInputGrow(xmlParserInputPtr in, int len) {
464*6777b538SAndroid Build Coastguard Worker int ret;
465*6777b538SAndroid Build Coastguard Worker size_t indx;
466*6777b538SAndroid Build Coastguard Worker
467*6777b538SAndroid Build Coastguard Worker if ((in == NULL) || (len < 0)) return(-1);
468*6777b538SAndroid Build Coastguard Worker if (in->buf == NULL) return(-1);
469*6777b538SAndroid Build Coastguard Worker if (in->base == NULL) return(-1);
470*6777b538SAndroid Build Coastguard Worker if (in->cur == NULL) return(-1);
471*6777b538SAndroid Build Coastguard Worker if (in->buf->buffer == NULL) return(-1);
472*6777b538SAndroid Build Coastguard Worker
473*6777b538SAndroid Build Coastguard Worker /* Don't grow memory buffers. */
474*6777b538SAndroid Build Coastguard Worker if ((in->buf->encoder == NULL) && (in->buf->readcallback == NULL))
475*6777b538SAndroid Build Coastguard Worker return(0);
476*6777b538SAndroid Build Coastguard Worker
477*6777b538SAndroid Build Coastguard Worker indx = in->cur - in->base;
478*6777b538SAndroid Build Coastguard Worker if (xmlBufUse(in->buf->buffer) > (unsigned int) indx + INPUT_CHUNK) {
479*6777b538SAndroid Build Coastguard Worker return(0);
480*6777b538SAndroid Build Coastguard Worker }
481*6777b538SAndroid Build Coastguard Worker ret = xmlParserInputBufferGrow(in->buf, len);
482*6777b538SAndroid Build Coastguard Worker
483*6777b538SAndroid Build Coastguard Worker in->base = xmlBufContent(in->buf->buffer);
484*6777b538SAndroid Build Coastguard Worker if (in->base == NULL) {
485*6777b538SAndroid Build Coastguard Worker in->base = BAD_CAST "";
486*6777b538SAndroid Build Coastguard Worker in->cur = in->base;
487*6777b538SAndroid Build Coastguard Worker in->end = in->base;
488*6777b538SAndroid Build Coastguard Worker return(-1);
489*6777b538SAndroid Build Coastguard Worker }
490*6777b538SAndroid Build Coastguard Worker in->cur = in->base + indx;
491*6777b538SAndroid Build Coastguard Worker in->end = xmlBufEnd(in->buf->buffer);
492*6777b538SAndroid Build Coastguard Worker
493*6777b538SAndroid Build Coastguard Worker return(ret);
494*6777b538SAndroid Build Coastguard Worker }
495*6777b538SAndroid Build Coastguard Worker
496*6777b538SAndroid Build Coastguard Worker /**
497*6777b538SAndroid Build Coastguard Worker * xmlParserShrink:
498*6777b538SAndroid Build Coastguard Worker * @ctxt: an XML parser context
499*6777b538SAndroid Build Coastguard Worker *
500*6777b538SAndroid Build Coastguard Worker * Shrink the input buffer.
501*6777b538SAndroid Build Coastguard Worker */
502*6777b538SAndroid Build Coastguard Worker void
xmlParserShrink(xmlParserCtxtPtr ctxt)503*6777b538SAndroid Build Coastguard Worker xmlParserShrink(xmlParserCtxtPtr ctxt) {
504*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr in = ctxt->input;
505*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferPtr buf = in->buf;
506*6777b538SAndroid Build Coastguard Worker size_t used;
507*6777b538SAndroid Build Coastguard Worker
508*6777b538SAndroid Build Coastguard Worker if (buf == NULL)
509*6777b538SAndroid Build Coastguard Worker return;
510*6777b538SAndroid Build Coastguard Worker /* Don't shrink pull parser memory buffers. */
511*6777b538SAndroid Build Coastguard Worker if ((!PARSER_PROGRESSIVE(ctxt)) &&
512*6777b538SAndroid Build Coastguard Worker (buf->encoder == NULL) &&
513*6777b538SAndroid Build Coastguard Worker (buf->readcallback == NULL))
514*6777b538SAndroid Build Coastguard Worker return;
515*6777b538SAndroid Build Coastguard Worker
516*6777b538SAndroid Build Coastguard Worker used = in->cur - in->base;
517*6777b538SAndroid Build Coastguard Worker /*
518*6777b538SAndroid Build Coastguard Worker * Do not shrink on large buffers whose only a tiny fraction
519*6777b538SAndroid Build Coastguard Worker * was consumed
520*6777b538SAndroid Build Coastguard Worker */
521*6777b538SAndroid Build Coastguard Worker if (used > INPUT_CHUNK) {
522*6777b538SAndroid Build Coastguard Worker size_t res = xmlBufShrink(buf->buffer, used - LINE_LEN);
523*6777b538SAndroid Build Coastguard Worker
524*6777b538SAndroid Build Coastguard Worker if (res > 0) {
525*6777b538SAndroid Build Coastguard Worker used -= res;
526*6777b538SAndroid Build Coastguard Worker if ((res > ULONG_MAX) ||
527*6777b538SAndroid Build Coastguard Worker (in->consumed > ULONG_MAX - (unsigned long)res))
528*6777b538SAndroid Build Coastguard Worker in->consumed = ULONG_MAX;
529*6777b538SAndroid Build Coastguard Worker else
530*6777b538SAndroid Build Coastguard Worker in->consumed += res;
531*6777b538SAndroid Build Coastguard Worker }
532*6777b538SAndroid Build Coastguard Worker }
533*6777b538SAndroid Build Coastguard Worker
534*6777b538SAndroid Build Coastguard Worker xmlBufUpdateInput(buf->buffer, in, used);
535*6777b538SAndroid Build Coastguard Worker }
536*6777b538SAndroid Build Coastguard Worker
537*6777b538SAndroid Build Coastguard Worker /**
538*6777b538SAndroid Build Coastguard Worker * xmlParserInputShrink:
539*6777b538SAndroid Build Coastguard Worker * @in: an XML parser input
540*6777b538SAndroid Build Coastguard Worker *
541*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Don't use.
542*6777b538SAndroid Build Coastguard Worker *
543*6777b538SAndroid Build Coastguard Worker * This function removes used input for the parser.
544*6777b538SAndroid Build Coastguard Worker */
545*6777b538SAndroid Build Coastguard Worker void
xmlParserInputShrink(xmlParserInputPtr in)546*6777b538SAndroid Build Coastguard Worker xmlParserInputShrink(xmlParserInputPtr in) {
547*6777b538SAndroid Build Coastguard Worker size_t used;
548*6777b538SAndroid Build Coastguard Worker size_t ret;
549*6777b538SAndroid Build Coastguard Worker
550*6777b538SAndroid Build Coastguard Worker if (in == NULL) return;
551*6777b538SAndroid Build Coastguard Worker if (in->buf == NULL) return;
552*6777b538SAndroid Build Coastguard Worker if (in->base == NULL) return;
553*6777b538SAndroid Build Coastguard Worker if (in->cur == NULL) return;
554*6777b538SAndroid Build Coastguard Worker if (in->buf->buffer == NULL) return;
555*6777b538SAndroid Build Coastguard Worker
556*6777b538SAndroid Build Coastguard Worker used = in->cur - in->base;
557*6777b538SAndroid Build Coastguard Worker /*
558*6777b538SAndroid Build Coastguard Worker * Do not shrink on large buffers whose only a tiny fraction
559*6777b538SAndroid Build Coastguard Worker * was consumed
560*6777b538SAndroid Build Coastguard Worker */
561*6777b538SAndroid Build Coastguard Worker if (used > INPUT_CHUNK) {
562*6777b538SAndroid Build Coastguard Worker ret = xmlBufShrink(in->buf->buffer, used - LINE_LEN);
563*6777b538SAndroid Build Coastguard Worker if (ret > 0) {
564*6777b538SAndroid Build Coastguard Worker used -= ret;
565*6777b538SAndroid Build Coastguard Worker if ((ret > ULONG_MAX) ||
566*6777b538SAndroid Build Coastguard Worker (in->consumed > ULONG_MAX - (unsigned long)ret))
567*6777b538SAndroid Build Coastguard Worker in->consumed = ULONG_MAX;
568*6777b538SAndroid Build Coastguard Worker else
569*6777b538SAndroid Build Coastguard Worker in->consumed += ret;
570*6777b538SAndroid Build Coastguard Worker }
571*6777b538SAndroid Build Coastguard Worker }
572*6777b538SAndroid Build Coastguard Worker
573*6777b538SAndroid Build Coastguard Worker if (xmlBufUse(in->buf->buffer) <= INPUT_CHUNK) {
574*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferRead(in->buf, 2 * INPUT_CHUNK);
575*6777b538SAndroid Build Coastguard Worker }
576*6777b538SAndroid Build Coastguard Worker
577*6777b538SAndroid Build Coastguard Worker in->base = xmlBufContent(in->buf->buffer);
578*6777b538SAndroid Build Coastguard Worker if (in->base == NULL) {
579*6777b538SAndroid Build Coastguard Worker /* TODO: raise error */
580*6777b538SAndroid Build Coastguard Worker in->base = BAD_CAST "";
581*6777b538SAndroid Build Coastguard Worker in->cur = in->base;
582*6777b538SAndroid Build Coastguard Worker in->end = in->base;
583*6777b538SAndroid Build Coastguard Worker return;
584*6777b538SAndroid Build Coastguard Worker }
585*6777b538SAndroid Build Coastguard Worker in->cur = in->base + used;
586*6777b538SAndroid Build Coastguard Worker in->end = xmlBufEnd(in->buf->buffer);
587*6777b538SAndroid Build Coastguard Worker }
588*6777b538SAndroid Build Coastguard Worker
589*6777b538SAndroid Build Coastguard Worker /************************************************************************
590*6777b538SAndroid Build Coastguard Worker * *
591*6777b538SAndroid Build Coastguard Worker * UTF8 character input and related functions *
592*6777b538SAndroid Build Coastguard Worker * *
593*6777b538SAndroid Build Coastguard Worker ************************************************************************/
594*6777b538SAndroid Build Coastguard Worker
595*6777b538SAndroid Build Coastguard Worker /**
596*6777b538SAndroid Build Coastguard Worker * xmlNextChar:
597*6777b538SAndroid Build Coastguard Worker * @ctxt: the XML parser context
598*6777b538SAndroid Build Coastguard Worker *
599*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Internal function, do not use.
600*6777b538SAndroid Build Coastguard Worker *
601*6777b538SAndroid Build Coastguard Worker * Skip to the next char input char.
602*6777b538SAndroid Build Coastguard Worker */
603*6777b538SAndroid Build Coastguard Worker
604*6777b538SAndroid Build Coastguard Worker void
xmlNextChar(xmlParserCtxtPtr ctxt)605*6777b538SAndroid Build Coastguard Worker xmlNextChar(xmlParserCtxtPtr ctxt)
606*6777b538SAndroid Build Coastguard Worker {
607*6777b538SAndroid Build Coastguard Worker const unsigned char *cur;
608*6777b538SAndroid Build Coastguard Worker size_t avail;
609*6777b538SAndroid Build Coastguard Worker int c;
610*6777b538SAndroid Build Coastguard Worker
611*6777b538SAndroid Build Coastguard Worker if ((ctxt == NULL) || (ctxt->input == NULL))
612*6777b538SAndroid Build Coastguard Worker return;
613*6777b538SAndroid Build Coastguard Worker
614*6777b538SAndroid Build Coastguard Worker avail = ctxt->input->end - ctxt->input->cur;
615*6777b538SAndroid Build Coastguard Worker
616*6777b538SAndroid Build Coastguard Worker if (avail < INPUT_CHUNK) {
617*6777b538SAndroid Build Coastguard Worker xmlParserGrow(ctxt);
618*6777b538SAndroid Build Coastguard Worker if (ctxt->input->cur >= ctxt->input->end)
619*6777b538SAndroid Build Coastguard Worker return;
620*6777b538SAndroid Build Coastguard Worker avail = ctxt->input->end - ctxt->input->cur;
621*6777b538SAndroid Build Coastguard Worker }
622*6777b538SAndroid Build Coastguard Worker
623*6777b538SAndroid Build Coastguard Worker cur = ctxt->input->cur;
624*6777b538SAndroid Build Coastguard Worker c = *cur;
625*6777b538SAndroid Build Coastguard Worker
626*6777b538SAndroid Build Coastguard Worker if (c < 0x80) {
627*6777b538SAndroid Build Coastguard Worker if (c == '\n') {
628*6777b538SAndroid Build Coastguard Worker ctxt->input->cur++;
629*6777b538SAndroid Build Coastguard Worker ctxt->input->line++;
630*6777b538SAndroid Build Coastguard Worker ctxt->input->col = 1;
631*6777b538SAndroid Build Coastguard Worker } else if (c == '\r') {
632*6777b538SAndroid Build Coastguard Worker /*
633*6777b538SAndroid Build Coastguard Worker * 2.11 End-of-Line Handling
634*6777b538SAndroid Build Coastguard Worker * the literal two-character sequence "#xD#xA" or a standalone
635*6777b538SAndroid Build Coastguard Worker * literal #xD, an XML processor must pass to the application
636*6777b538SAndroid Build Coastguard Worker * the single character #xA.
637*6777b538SAndroid Build Coastguard Worker */
638*6777b538SAndroid Build Coastguard Worker ctxt->input->cur += ((cur[1] == '\n') ? 2 : 1);
639*6777b538SAndroid Build Coastguard Worker ctxt->input->line++;
640*6777b538SAndroid Build Coastguard Worker ctxt->input->col = 1;
641*6777b538SAndroid Build Coastguard Worker return;
642*6777b538SAndroid Build Coastguard Worker } else {
643*6777b538SAndroid Build Coastguard Worker ctxt->input->cur++;
644*6777b538SAndroid Build Coastguard Worker ctxt->input->col++;
645*6777b538SAndroid Build Coastguard Worker }
646*6777b538SAndroid Build Coastguard Worker } else {
647*6777b538SAndroid Build Coastguard Worker ctxt->input->col++;
648*6777b538SAndroid Build Coastguard Worker
649*6777b538SAndroid Build Coastguard Worker if ((avail < 2) || (cur[1] & 0xc0) != 0x80)
650*6777b538SAndroid Build Coastguard Worker goto encoding_error;
651*6777b538SAndroid Build Coastguard Worker
652*6777b538SAndroid Build Coastguard Worker if (c < 0xe0) {
653*6777b538SAndroid Build Coastguard Worker /* 2-byte code */
654*6777b538SAndroid Build Coastguard Worker if (c < 0xc2)
655*6777b538SAndroid Build Coastguard Worker goto encoding_error;
656*6777b538SAndroid Build Coastguard Worker ctxt->input->cur += 2;
657*6777b538SAndroid Build Coastguard Worker } else {
658*6777b538SAndroid Build Coastguard Worker unsigned int val = (c << 8) | cur[1];
659*6777b538SAndroid Build Coastguard Worker
660*6777b538SAndroid Build Coastguard Worker if ((avail < 3) || (cur[2] & 0xc0) != 0x80)
661*6777b538SAndroid Build Coastguard Worker goto encoding_error;
662*6777b538SAndroid Build Coastguard Worker
663*6777b538SAndroid Build Coastguard Worker if (c < 0xf0) {
664*6777b538SAndroid Build Coastguard Worker /* 3-byte code */
665*6777b538SAndroid Build Coastguard Worker if ((val < 0xe0a0) || ((val >= 0xeda0) && (val < 0xee00)))
666*6777b538SAndroid Build Coastguard Worker goto encoding_error;
667*6777b538SAndroid Build Coastguard Worker ctxt->input->cur += 3;
668*6777b538SAndroid Build Coastguard Worker } else {
669*6777b538SAndroid Build Coastguard Worker if ((avail < 4) || ((cur[3] & 0xc0) != 0x80))
670*6777b538SAndroid Build Coastguard Worker goto encoding_error;
671*6777b538SAndroid Build Coastguard Worker
672*6777b538SAndroid Build Coastguard Worker /* 4-byte code */
673*6777b538SAndroid Build Coastguard Worker if ((val < 0xf090) || (val >= 0xf490))
674*6777b538SAndroid Build Coastguard Worker goto encoding_error;
675*6777b538SAndroid Build Coastguard Worker ctxt->input->cur += 4;
676*6777b538SAndroid Build Coastguard Worker }
677*6777b538SAndroid Build Coastguard Worker }
678*6777b538SAndroid Build Coastguard Worker }
679*6777b538SAndroid Build Coastguard Worker
680*6777b538SAndroid Build Coastguard Worker return;
681*6777b538SAndroid Build Coastguard Worker
682*6777b538SAndroid Build Coastguard Worker encoding_error:
683*6777b538SAndroid Build Coastguard Worker /* Only report the first error */
684*6777b538SAndroid Build Coastguard Worker if ((ctxt->input->flags & XML_INPUT_ENCODING_ERROR) == 0) {
685*6777b538SAndroid Build Coastguard Worker xmlCtxtErrIO(ctxt, XML_ERR_INVALID_ENCODING, NULL);
686*6777b538SAndroid Build Coastguard Worker ctxt->input->flags |= XML_INPUT_ENCODING_ERROR;
687*6777b538SAndroid Build Coastguard Worker }
688*6777b538SAndroid Build Coastguard Worker ctxt->input->cur++;
689*6777b538SAndroid Build Coastguard Worker return;
690*6777b538SAndroid Build Coastguard Worker }
691*6777b538SAndroid Build Coastguard Worker
692*6777b538SAndroid Build Coastguard Worker /**
693*6777b538SAndroid Build Coastguard Worker * xmlCurrentChar:
694*6777b538SAndroid Build Coastguard Worker * @ctxt: the XML parser context
695*6777b538SAndroid Build Coastguard Worker * @len: pointer to the length of the char read
696*6777b538SAndroid Build Coastguard Worker *
697*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Internal function, do not use.
698*6777b538SAndroid Build Coastguard Worker *
699*6777b538SAndroid Build Coastguard Worker * The current char value, if using UTF-8 this may actually span multiple
700*6777b538SAndroid Build Coastguard Worker * bytes in the input buffer. Implement the end of line normalization:
701*6777b538SAndroid Build Coastguard Worker * 2.11 End-of-Line Handling
702*6777b538SAndroid Build Coastguard Worker * Wherever an external parsed entity or the literal entity value
703*6777b538SAndroid Build Coastguard Worker * of an internal parsed entity contains either the literal two-character
704*6777b538SAndroid Build Coastguard Worker * sequence "#xD#xA" or a standalone literal #xD, an XML processor
705*6777b538SAndroid Build Coastguard Worker * must pass to the application the single character #xA.
706*6777b538SAndroid Build Coastguard Worker * This behavior can conveniently be produced by normalizing all
707*6777b538SAndroid Build Coastguard Worker * line breaks to #xA on input, before parsing.)
708*6777b538SAndroid Build Coastguard Worker *
709*6777b538SAndroid Build Coastguard Worker * Returns the current char value and its length
710*6777b538SAndroid Build Coastguard Worker */
711*6777b538SAndroid Build Coastguard Worker
712*6777b538SAndroid Build Coastguard Worker int
xmlCurrentChar(xmlParserCtxtPtr ctxt,int * len)713*6777b538SAndroid Build Coastguard Worker xmlCurrentChar(xmlParserCtxtPtr ctxt, int *len) {
714*6777b538SAndroid Build Coastguard Worker const unsigned char *cur;
715*6777b538SAndroid Build Coastguard Worker size_t avail;
716*6777b538SAndroid Build Coastguard Worker int c;
717*6777b538SAndroid Build Coastguard Worker
718*6777b538SAndroid Build Coastguard Worker if ((ctxt == NULL) || (len == NULL) || (ctxt->input == NULL)) return(0);
719*6777b538SAndroid Build Coastguard Worker
720*6777b538SAndroid Build Coastguard Worker avail = ctxt->input->end - ctxt->input->cur;
721*6777b538SAndroid Build Coastguard Worker
722*6777b538SAndroid Build Coastguard Worker if (avail < INPUT_CHUNK) {
723*6777b538SAndroid Build Coastguard Worker xmlParserGrow(ctxt);
724*6777b538SAndroid Build Coastguard Worker avail = ctxt->input->end - ctxt->input->cur;
725*6777b538SAndroid Build Coastguard Worker }
726*6777b538SAndroid Build Coastguard Worker
727*6777b538SAndroid Build Coastguard Worker cur = ctxt->input->cur;
728*6777b538SAndroid Build Coastguard Worker c = *cur;
729*6777b538SAndroid Build Coastguard Worker
730*6777b538SAndroid Build Coastguard Worker if (c < 0x80) {
731*6777b538SAndroid Build Coastguard Worker /* 1-byte code */
732*6777b538SAndroid Build Coastguard Worker if (c < 0x20) {
733*6777b538SAndroid Build Coastguard Worker /*
734*6777b538SAndroid Build Coastguard Worker * 2.11 End-of-Line Handling
735*6777b538SAndroid Build Coastguard Worker * the literal two-character sequence "#xD#xA" or a standalone
736*6777b538SAndroid Build Coastguard Worker * literal #xD, an XML processor must pass to the application
737*6777b538SAndroid Build Coastguard Worker * the single character #xA.
738*6777b538SAndroid Build Coastguard Worker */
739*6777b538SAndroid Build Coastguard Worker if (c == '\r') {
740*6777b538SAndroid Build Coastguard Worker /*
741*6777b538SAndroid Build Coastguard Worker * TODO: This function shouldn't change the 'cur' pointer
742*6777b538SAndroid Build Coastguard Worker * as side effect, but the NEXTL macro in parser.c relies
743*6777b538SAndroid Build Coastguard Worker * on this behavior when incrementing line numbers.
744*6777b538SAndroid Build Coastguard Worker */
745*6777b538SAndroid Build Coastguard Worker if (cur[1] == '\n')
746*6777b538SAndroid Build Coastguard Worker ctxt->input->cur++;
747*6777b538SAndroid Build Coastguard Worker *len = 1;
748*6777b538SAndroid Build Coastguard Worker c = '\n';
749*6777b538SAndroid Build Coastguard Worker } else if (c == 0) {
750*6777b538SAndroid Build Coastguard Worker if (ctxt->input->cur >= ctxt->input->end) {
751*6777b538SAndroid Build Coastguard Worker *len = 0;
752*6777b538SAndroid Build Coastguard Worker } else {
753*6777b538SAndroid Build Coastguard Worker *len = 1;
754*6777b538SAndroid Build Coastguard Worker /*
755*6777b538SAndroid Build Coastguard Worker * TODO: Null bytes should be handled by callers,
756*6777b538SAndroid Build Coastguard Worker * but this can be tricky.
757*6777b538SAndroid Build Coastguard Worker */
758*6777b538SAndroid Build Coastguard Worker xmlFatalErr(ctxt, XML_ERR_INVALID_CHAR,
759*6777b538SAndroid Build Coastguard Worker "Char 0x0 out of allowed range\n");
760*6777b538SAndroid Build Coastguard Worker }
761*6777b538SAndroid Build Coastguard Worker } else {
762*6777b538SAndroid Build Coastguard Worker *len = 1;
763*6777b538SAndroid Build Coastguard Worker }
764*6777b538SAndroid Build Coastguard Worker } else {
765*6777b538SAndroid Build Coastguard Worker *len = 1;
766*6777b538SAndroid Build Coastguard Worker }
767*6777b538SAndroid Build Coastguard Worker
768*6777b538SAndroid Build Coastguard Worker return(c);
769*6777b538SAndroid Build Coastguard Worker } else {
770*6777b538SAndroid Build Coastguard Worker int val;
771*6777b538SAndroid Build Coastguard Worker
772*6777b538SAndroid Build Coastguard Worker if (avail < 2)
773*6777b538SAndroid Build Coastguard Worker goto incomplete_sequence;
774*6777b538SAndroid Build Coastguard Worker if ((cur[1] & 0xc0) != 0x80)
775*6777b538SAndroid Build Coastguard Worker goto encoding_error;
776*6777b538SAndroid Build Coastguard Worker
777*6777b538SAndroid Build Coastguard Worker if (c < 0xe0) {
778*6777b538SAndroid Build Coastguard Worker /* 2-byte code */
779*6777b538SAndroid Build Coastguard Worker if (c < 0xc2)
780*6777b538SAndroid Build Coastguard Worker goto encoding_error;
781*6777b538SAndroid Build Coastguard Worker val = (c & 0x1f) << 6;
782*6777b538SAndroid Build Coastguard Worker val |= cur[1] & 0x3f;
783*6777b538SAndroid Build Coastguard Worker *len = 2;
784*6777b538SAndroid Build Coastguard Worker } else {
785*6777b538SAndroid Build Coastguard Worker if (avail < 3)
786*6777b538SAndroid Build Coastguard Worker goto incomplete_sequence;
787*6777b538SAndroid Build Coastguard Worker if ((cur[2] & 0xc0) != 0x80)
788*6777b538SAndroid Build Coastguard Worker goto encoding_error;
789*6777b538SAndroid Build Coastguard Worker
790*6777b538SAndroid Build Coastguard Worker if (c < 0xf0) {
791*6777b538SAndroid Build Coastguard Worker /* 3-byte code */
792*6777b538SAndroid Build Coastguard Worker val = (c & 0xf) << 12;
793*6777b538SAndroid Build Coastguard Worker val |= (cur[1] & 0x3f) << 6;
794*6777b538SAndroid Build Coastguard Worker val |= cur[2] & 0x3f;
795*6777b538SAndroid Build Coastguard Worker if ((val < 0x800) || ((val >= 0xd800) && (val < 0xe000)))
796*6777b538SAndroid Build Coastguard Worker goto encoding_error;
797*6777b538SAndroid Build Coastguard Worker *len = 3;
798*6777b538SAndroid Build Coastguard Worker } else {
799*6777b538SAndroid Build Coastguard Worker if (avail < 4)
800*6777b538SAndroid Build Coastguard Worker goto incomplete_sequence;
801*6777b538SAndroid Build Coastguard Worker if ((cur[3] & 0xc0) != 0x80)
802*6777b538SAndroid Build Coastguard Worker goto encoding_error;
803*6777b538SAndroid Build Coastguard Worker
804*6777b538SAndroid Build Coastguard Worker /* 4-byte code */
805*6777b538SAndroid Build Coastguard Worker val = (c & 0x0f) << 18;
806*6777b538SAndroid Build Coastguard Worker val |= (cur[1] & 0x3f) << 12;
807*6777b538SAndroid Build Coastguard Worker val |= (cur[2] & 0x3f) << 6;
808*6777b538SAndroid Build Coastguard Worker val |= cur[3] & 0x3f;
809*6777b538SAndroid Build Coastguard Worker if ((val < 0x10000) || (val >= 0x110000))
810*6777b538SAndroid Build Coastguard Worker goto encoding_error;
811*6777b538SAndroid Build Coastguard Worker *len = 4;
812*6777b538SAndroid Build Coastguard Worker }
813*6777b538SAndroid Build Coastguard Worker }
814*6777b538SAndroid Build Coastguard Worker
815*6777b538SAndroid Build Coastguard Worker return(val);
816*6777b538SAndroid Build Coastguard Worker }
817*6777b538SAndroid Build Coastguard Worker
818*6777b538SAndroid Build Coastguard Worker encoding_error:
819*6777b538SAndroid Build Coastguard Worker /* Only report the first error */
820*6777b538SAndroid Build Coastguard Worker if ((ctxt->input->flags & XML_INPUT_ENCODING_ERROR) == 0) {
821*6777b538SAndroid Build Coastguard Worker xmlCtxtErrIO(ctxt, XML_ERR_INVALID_ENCODING, NULL);
822*6777b538SAndroid Build Coastguard Worker ctxt->input->flags |= XML_INPUT_ENCODING_ERROR;
823*6777b538SAndroid Build Coastguard Worker }
824*6777b538SAndroid Build Coastguard Worker *len = 1;
825*6777b538SAndroid Build Coastguard Worker return(0xFFFD); /* U+FFFD Replacement Character */
826*6777b538SAndroid Build Coastguard Worker
827*6777b538SAndroid Build Coastguard Worker incomplete_sequence:
828*6777b538SAndroid Build Coastguard Worker /*
829*6777b538SAndroid Build Coastguard Worker * An encoding problem may arise from a truncated input buffer
830*6777b538SAndroid Build Coastguard Worker * splitting a character in the middle. In that case do not raise
831*6777b538SAndroid Build Coastguard Worker * an error but return 0. This should only happen when push parsing
832*6777b538SAndroid Build Coastguard Worker * char data.
833*6777b538SAndroid Build Coastguard Worker */
834*6777b538SAndroid Build Coastguard Worker *len = 0;
835*6777b538SAndroid Build Coastguard Worker return(0);
836*6777b538SAndroid Build Coastguard Worker }
837*6777b538SAndroid Build Coastguard Worker
838*6777b538SAndroid Build Coastguard Worker /**
839*6777b538SAndroid Build Coastguard Worker * xmlStringCurrentChar:
840*6777b538SAndroid Build Coastguard Worker * @ctxt: the XML parser context
841*6777b538SAndroid Build Coastguard Worker * @cur: pointer to the beginning of the char
842*6777b538SAndroid Build Coastguard Worker * @len: pointer to the length of the char read
843*6777b538SAndroid Build Coastguard Worker *
844*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Internal function, do not use.
845*6777b538SAndroid Build Coastguard Worker *
846*6777b538SAndroid Build Coastguard Worker * The current char value, if using UTF-8 this may actually span multiple
847*6777b538SAndroid Build Coastguard Worker * bytes in the input buffer.
848*6777b538SAndroid Build Coastguard Worker *
849*6777b538SAndroid Build Coastguard Worker * Returns the current char value and its length
850*6777b538SAndroid Build Coastguard Worker */
851*6777b538SAndroid Build Coastguard Worker
852*6777b538SAndroid Build Coastguard Worker int
xmlStringCurrentChar(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED,const xmlChar * cur,int * len)853*6777b538SAndroid Build Coastguard Worker xmlStringCurrentChar(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED,
854*6777b538SAndroid Build Coastguard Worker const xmlChar *cur, int *len) {
855*6777b538SAndroid Build Coastguard Worker int c;
856*6777b538SAndroid Build Coastguard Worker
857*6777b538SAndroid Build Coastguard Worker if ((cur == NULL) || (len == NULL))
858*6777b538SAndroid Build Coastguard Worker return(0);
859*6777b538SAndroid Build Coastguard Worker
860*6777b538SAndroid Build Coastguard Worker /* cur is zero-terminated, so we can lie about its length. */
861*6777b538SAndroid Build Coastguard Worker *len = 4;
862*6777b538SAndroid Build Coastguard Worker c = xmlGetUTF8Char(cur, len);
863*6777b538SAndroid Build Coastguard Worker
864*6777b538SAndroid Build Coastguard Worker return((c < 0) ? 0 : c);
865*6777b538SAndroid Build Coastguard Worker }
866*6777b538SAndroid Build Coastguard Worker
867*6777b538SAndroid Build Coastguard Worker /**
868*6777b538SAndroid Build Coastguard Worker * xmlCopyCharMultiByte:
869*6777b538SAndroid Build Coastguard Worker * @out: pointer to an array of xmlChar
870*6777b538SAndroid Build Coastguard Worker * @val: the char value
871*6777b538SAndroid Build Coastguard Worker *
872*6777b538SAndroid Build Coastguard Worker * append the char value in the array
873*6777b538SAndroid Build Coastguard Worker *
874*6777b538SAndroid Build Coastguard Worker * Returns the number of xmlChar written
875*6777b538SAndroid Build Coastguard Worker */
876*6777b538SAndroid Build Coastguard Worker int
xmlCopyCharMultiByte(xmlChar * out,int val)877*6777b538SAndroid Build Coastguard Worker xmlCopyCharMultiByte(xmlChar *out, int val) {
878*6777b538SAndroid Build Coastguard Worker if ((out == NULL) || (val < 0)) return(0);
879*6777b538SAndroid Build Coastguard Worker /*
880*6777b538SAndroid Build Coastguard Worker * We are supposed to handle UTF8, check it's valid
881*6777b538SAndroid Build Coastguard Worker * From rfc2044: encoding of the Unicode values on UTF-8:
882*6777b538SAndroid Build Coastguard Worker *
883*6777b538SAndroid Build Coastguard Worker * UCS-4 range (hex.) UTF-8 octet sequence (binary)
884*6777b538SAndroid Build Coastguard Worker * 0000 0000-0000 007F 0xxxxxxx
885*6777b538SAndroid Build Coastguard Worker * 0000 0080-0000 07FF 110xxxxx 10xxxxxx
886*6777b538SAndroid Build Coastguard Worker * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
887*6777b538SAndroid Build Coastguard Worker */
888*6777b538SAndroid Build Coastguard Worker if (val >= 0x80) {
889*6777b538SAndroid Build Coastguard Worker xmlChar *savedout = out;
890*6777b538SAndroid Build Coastguard Worker int bits;
891*6777b538SAndroid Build Coastguard Worker if (val < 0x800) { *out++= (val >> 6) | 0xC0; bits= 0; }
892*6777b538SAndroid Build Coastguard Worker else if (val < 0x10000) { *out++= (val >> 12) | 0xE0; bits= 6;}
893*6777b538SAndroid Build Coastguard Worker else if (val < 0x110000) { *out++= (val >> 18) | 0xF0; bits= 12; }
894*6777b538SAndroid Build Coastguard Worker else {
895*6777b538SAndroid Build Coastguard Worker #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
896*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "xmlCopyCharMultiByte: codepoint out of range\n");
897*6777b538SAndroid Build Coastguard Worker abort();
898*6777b538SAndroid Build Coastguard Worker #endif
899*6777b538SAndroid Build Coastguard Worker return(0);
900*6777b538SAndroid Build Coastguard Worker }
901*6777b538SAndroid Build Coastguard Worker for ( ; bits >= 0; bits-= 6)
902*6777b538SAndroid Build Coastguard Worker *out++= ((val >> bits) & 0x3F) | 0x80 ;
903*6777b538SAndroid Build Coastguard Worker return (out - savedout);
904*6777b538SAndroid Build Coastguard Worker }
905*6777b538SAndroid Build Coastguard Worker *out = val;
906*6777b538SAndroid Build Coastguard Worker return 1;
907*6777b538SAndroid Build Coastguard Worker }
908*6777b538SAndroid Build Coastguard Worker
909*6777b538SAndroid Build Coastguard Worker /**
910*6777b538SAndroid Build Coastguard Worker * xmlCopyChar:
911*6777b538SAndroid Build Coastguard Worker * @len: Ignored, compatibility
912*6777b538SAndroid Build Coastguard Worker * @out: pointer to an array of xmlChar
913*6777b538SAndroid Build Coastguard Worker * @val: the char value
914*6777b538SAndroid Build Coastguard Worker *
915*6777b538SAndroid Build Coastguard Worker * append the char value in the array
916*6777b538SAndroid Build Coastguard Worker *
917*6777b538SAndroid Build Coastguard Worker * Returns the number of xmlChar written
918*6777b538SAndroid Build Coastguard Worker */
919*6777b538SAndroid Build Coastguard Worker
920*6777b538SAndroid Build Coastguard Worker int
xmlCopyChar(int len ATTRIBUTE_UNUSED,xmlChar * out,int val)921*6777b538SAndroid Build Coastguard Worker xmlCopyChar(int len ATTRIBUTE_UNUSED, xmlChar *out, int val) {
922*6777b538SAndroid Build Coastguard Worker if ((out == NULL) || (val < 0)) return(0);
923*6777b538SAndroid Build Coastguard Worker /* the len parameter is ignored */
924*6777b538SAndroid Build Coastguard Worker if (val >= 0x80) {
925*6777b538SAndroid Build Coastguard Worker return(xmlCopyCharMultiByte (out, val));
926*6777b538SAndroid Build Coastguard Worker }
927*6777b538SAndroid Build Coastguard Worker *out = val;
928*6777b538SAndroid Build Coastguard Worker return 1;
929*6777b538SAndroid Build Coastguard Worker }
930*6777b538SAndroid Build Coastguard Worker
931*6777b538SAndroid Build Coastguard Worker /************************************************************************
932*6777b538SAndroid Build Coastguard Worker * *
933*6777b538SAndroid Build Coastguard Worker * Commodity functions to switch encodings *
934*6777b538SAndroid Build Coastguard Worker * *
935*6777b538SAndroid Build Coastguard Worker ************************************************************************/
936*6777b538SAndroid Build Coastguard Worker
937*6777b538SAndroid Build Coastguard Worker static int
xmlDetectEBCDIC(xmlParserInputPtr input,xmlCharEncodingHandlerPtr * hout)938*6777b538SAndroid Build Coastguard Worker xmlDetectEBCDIC(xmlParserInputPtr input, xmlCharEncodingHandlerPtr *hout) {
939*6777b538SAndroid Build Coastguard Worker xmlChar out[200];
940*6777b538SAndroid Build Coastguard Worker xmlCharEncodingHandlerPtr handler;
941*6777b538SAndroid Build Coastguard Worker int inlen, outlen, res, i;
942*6777b538SAndroid Build Coastguard Worker
943*6777b538SAndroid Build Coastguard Worker *hout = NULL;
944*6777b538SAndroid Build Coastguard Worker
945*6777b538SAndroid Build Coastguard Worker /*
946*6777b538SAndroid Build Coastguard Worker * To detect the EBCDIC code page, we convert the first 200 bytes
947*6777b538SAndroid Build Coastguard Worker * to EBCDIC-US and try to find the encoding declaration.
948*6777b538SAndroid Build Coastguard Worker */
949*6777b538SAndroid Build Coastguard Worker res = xmlLookupCharEncodingHandler(XML_CHAR_ENCODING_EBCDIC, &handler);
950*6777b538SAndroid Build Coastguard Worker if (res != 0)
951*6777b538SAndroid Build Coastguard Worker return(res);
952*6777b538SAndroid Build Coastguard Worker outlen = sizeof(out) - 1;
953*6777b538SAndroid Build Coastguard Worker inlen = input->end - input->cur;
954*6777b538SAndroid Build Coastguard Worker res = xmlEncInputChunk(handler, out, &outlen, input->cur, &inlen);
955*6777b538SAndroid Build Coastguard Worker /*
956*6777b538SAndroid Build Coastguard Worker * Return the EBCDIC handler if decoding failed. The error will
957*6777b538SAndroid Build Coastguard Worker * be reported later.
958*6777b538SAndroid Build Coastguard Worker */
959*6777b538SAndroid Build Coastguard Worker if (res < 0)
960*6777b538SAndroid Build Coastguard Worker goto done;
961*6777b538SAndroid Build Coastguard Worker out[outlen] = 0;
962*6777b538SAndroid Build Coastguard Worker
963*6777b538SAndroid Build Coastguard Worker for (i = 0; i < outlen; i++) {
964*6777b538SAndroid Build Coastguard Worker if (out[i] == '>')
965*6777b538SAndroid Build Coastguard Worker break;
966*6777b538SAndroid Build Coastguard Worker if ((out[i] == 'e') &&
967*6777b538SAndroid Build Coastguard Worker (xmlStrncmp(out + i, BAD_CAST "encoding", 8) == 0)) {
968*6777b538SAndroid Build Coastguard Worker int start, cur, quote;
969*6777b538SAndroid Build Coastguard Worker
970*6777b538SAndroid Build Coastguard Worker i += 8;
971*6777b538SAndroid Build Coastguard Worker while (IS_BLANK_CH(out[i]))
972*6777b538SAndroid Build Coastguard Worker i += 1;
973*6777b538SAndroid Build Coastguard Worker if (out[i++] != '=')
974*6777b538SAndroid Build Coastguard Worker break;
975*6777b538SAndroid Build Coastguard Worker while (IS_BLANK_CH(out[i]))
976*6777b538SAndroid Build Coastguard Worker i += 1;
977*6777b538SAndroid Build Coastguard Worker quote = out[i++];
978*6777b538SAndroid Build Coastguard Worker if ((quote != '\'') && (quote != '"'))
979*6777b538SAndroid Build Coastguard Worker break;
980*6777b538SAndroid Build Coastguard Worker start = i;
981*6777b538SAndroid Build Coastguard Worker cur = out[i];
982*6777b538SAndroid Build Coastguard Worker while (((cur >= 'a') && (cur <= 'z')) ||
983*6777b538SAndroid Build Coastguard Worker ((cur >= 'A') && (cur <= 'Z')) ||
984*6777b538SAndroid Build Coastguard Worker ((cur >= '0') && (cur <= '9')) ||
985*6777b538SAndroid Build Coastguard Worker (cur == '.') || (cur == '_') ||
986*6777b538SAndroid Build Coastguard Worker (cur == '-'))
987*6777b538SAndroid Build Coastguard Worker cur = out[++i];
988*6777b538SAndroid Build Coastguard Worker if (cur != quote)
989*6777b538SAndroid Build Coastguard Worker break;
990*6777b538SAndroid Build Coastguard Worker out[i] = 0;
991*6777b538SAndroid Build Coastguard Worker xmlCharEncCloseFunc(handler);
992*6777b538SAndroid Build Coastguard Worker res = xmlOpenCharEncodingHandler((char *) out + start,
993*6777b538SAndroid Build Coastguard Worker /* output */ 0, &handler);
994*6777b538SAndroid Build Coastguard Worker if (res != 0)
995*6777b538SAndroid Build Coastguard Worker return(res);
996*6777b538SAndroid Build Coastguard Worker *hout = handler;
997*6777b538SAndroid Build Coastguard Worker return(0);
998*6777b538SAndroid Build Coastguard Worker }
999*6777b538SAndroid Build Coastguard Worker }
1000*6777b538SAndroid Build Coastguard Worker
1001*6777b538SAndroid Build Coastguard Worker done:
1002*6777b538SAndroid Build Coastguard Worker /*
1003*6777b538SAndroid Build Coastguard Worker * Encoding handlers are stateful, so we have to recreate them.
1004*6777b538SAndroid Build Coastguard Worker */
1005*6777b538SAndroid Build Coastguard Worker xmlCharEncCloseFunc(handler);
1006*6777b538SAndroid Build Coastguard Worker res = xmlLookupCharEncodingHandler(XML_CHAR_ENCODING_EBCDIC, &handler);
1007*6777b538SAndroid Build Coastguard Worker if (res != 0)
1008*6777b538SAndroid Build Coastguard Worker return(res);
1009*6777b538SAndroid Build Coastguard Worker *hout = handler;
1010*6777b538SAndroid Build Coastguard Worker return(0);
1011*6777b538SAndroid Build Coastguard Worker }
1012*6777b538SAndroid Build Coastguard Worker
1013*6777b538SAndroid Build Coastguard Worker /**
1014*6777b538SAndroid Build Coastguard Worker * xmlSwitchEncoding:
1015*6777b538SAndroid Build Coastguard Worker * @ctxt: the parser context
1016*6777b538SAndroid Build Coastguard Worker * @enc: the encoding value (number)
1017*6777b538SAndroid Build Coastguard Worker *
1018*6777b538SAndroid Build Coastguard Worker * Use encoding specified by enum to decode input data. This overrides
1019*6777b538SAndroid Build Coastguard Worker * the encoding found in the XML declaration.
1020*6777b538SAndroid Build Coastguard Worker *
1021*6777b538SAndroid Build Coastguard Worker * This function can also be used to override the encoding of chunks
1022*6777b538SAndroid Build Coastguard Worker * passed to xmlParseChunk.
1023*6777b538SAndroid Build Coastguard Worker *
1024*6777b538SAndroid Build Coastguard Worker * Returns 0 in case of success, -1 otherwise
1025*6777b538SAndroid Build Coastguard Worker */
1026*6777b538SAndroid Build Coastguard Worker int
xmlSwitchEncoding(xmlParserCtxtPtr ctxt,xmlCharEncoding enc)1027*6777b538SAndroid Build Coastguard Worker xmlSwitchEncoding(xmlParserCtxtPtr ctxt, xmlCharEncoding enc)
1028*6777b538SAndroid Build Coastguard Worker {
1029*6777b538SAndroid Build Coastguard Worker xmlCharEncodingHandlerPtr handler = NULL;
1030*6777b538SAndroid Build Coastguard Worker int ret;
1031*6777b538SAndroid Build Coastguard Worker int res;
1032*6777b538SAndroid Build Coastguard Worker
1033*6777b538SAndroid Build Coastguard Worker if ((ctxt == NULL) || (ctxt->input == NULL))
1034*6777b538SAndroid Build Coastguard Worker return(-1);
1035*6777b538SAndroid Build Coastguard Worker
1036*6777b538SAndroid Build Coastguard Worker switch (enc) {
1037*6777b538SAndroid Build Coastguard Worker case XML_CHAR_ENCODING_NONE:
1038*6777b538SAndroid Build Coastguard Worker case XML_CHAR_ENCODING_UTF8:
1039*6777b538SAndroid Build Coastguard Worker case XML_CHAR_ENCODING_ASCII:
1040*6777b538SAndroid Build Coastguard Worker res = 0;
1041*6777b538SAndroid Build Coastguard Worker break;
1042*6777b538SAndroid Build Coastguard Worker case XML_CHAR_ENCODING_EBCDIC:
1043*6777b538SAndroid Build Coastguard Worker res = xmlDetectEBCDIC(ctxt->input, &handler);
1044*6777b538SAndroid Build Coastguard Worker break;
1045*6777b538SAndroid Build Coastguard Worker default:
1046*6777b538SAndroid Build Coastguard Worker res = xmlLookupCharEncodingHandler(enc, &handler);
1047*6777b538SAndroid Build Coastguard Worker break;
1048*6777b538SAndroid Build Coastguard Worker }
1049*6777b538SAndroid Build Coastguard Worker
1050*6777b538SAndroid Build Coastguard Worker if (res != 0) {
1051*6777b538SAndroid Build Coastguard Worker const char *name = xmlGetCharEncodingName(enc);
1052*6777b538SAndroid Build Coastguard Worker
1053*6777b538SAndroid Build Coastguard Worker xmlFatalErr(ctxt, res, (name ? name : "<null>"));
1054*6777b538SAndroid Build Coastguard Worker return(-1);
1055*6777b538SAndroid Build Coastguard Worker }
1056*6777b538SAndroid Build Coastguard Worker
1057*6777b538SAndroid Build Coastguard Worker ret = xmlSwitchInputEncoding(ctxt, ctxt->input, handler);
1058*6777b538SAndroid Build Coastguard Worker
1059*6777b538SAndroid Build Coastguard Worker if ((ret >= 0) && (enc == XML_CHAR_ENCODING_NONE)) {
1060*6777b538SAndroid Build Coastguard Worker ctxt->input->flags &= ~XML_INPUT_HAS_ENCODING;
1061*6777b538SAndroid Build Coastguard Worker }
1062*6777b538SAndroid Build Coastguard Worker
1063*6777b538SAndroid Build Coastguard Worker return(ret);
1064*6777b538SAndroid Build Coastguard Worker }
1065*6777b538SAndroid Build Coastguard Worker
1066*6777b538SAndroid Build Coastguard Worker /**
1067*6777b538SAndroid Build Coastguard Worker * xmlSwitchEncodingName:
1068*6777b538SAndroid Build Coastguard Worker * @ctxt: the parser context, only for error reporting
1069*6777b538SAndroid Build Coastguard Worker * @input: the input strea,
1070*6777b538SAndroid Build Coastguard Worker * @encoding: the encoding name
1071*6777b538SAndroid Build Coastguard Worker *
1072*6777b538SAndroid Build Coastguard Worker * Returns 0 in case of success, -1 otherwise
1073*6777b538SAndroid Build Coastguard Worker */
1074*6777b538SAndroid Build Coastguard Worker static int
xmlSwitchInputEncodingName(xmlParserCtxtPtr ctxt,xmlParserInputPtr input,const char * encoding)1075*6777b538SAndroid Build Coastguard Worker xmlSwitchInputEncodingName(xmlParserCtxtPtr ctxt, xmlParserInputPtr input,
1076*6777b538SAndroid Build Coastguard Worker const char *encoding) {
1077*6777b538SAndroid Build Coastguard Worker xmlCharEncodingHandlerPtr handler;
1078*6777b538SAndroid Build Coastguard Worker int res;
1079*6777b538SAndroid Build Coastguard Worker
1080*6777b538SAndroid Build Coastguard Worker if (encoding == NULL)
1081*6777b538SAndroid Build Coastguard Worker return(-1);
1082*6777b538SAndroid Build Coastguard Worker
1083*6777b538SAndroid Build Coastguard Worker res = xmlOpenCharEncodingHandler(encoding, /* output */ 0, &handler);
1084*6777b538SAndroid Build Coastguard Worker if (res != 0) {
1085*6777b538SAndroid Build Coastguard Worker xmlFatalErr(ctxt, res, encoding);
1086*6777b538SAndroid Build Coastguard Worker return(-1);
1087*6777b538SAndroid Build Coastguard Worker }
1088*6777b538SAndroid Build Coastguard Worker
1089*6777b538SAndroid Build Coastguard Worker return(xmlSwitchInputEncoding(ctxt, input, handler));
1090*6777b538SAndroid Build Coastguard Worker }
1091*6777b538SAndroid Build Coastguard Worker
1092*6777b538SAndroid Build Coastguard Worker /**
1093*6777b538SAndroid Build Coastguard Worker * xmlSwitchEncodingName:
1094*6777b538SAndroid Build Coastguard Worker * @ctxt: the parser context
1095*6777b538SAndroid Build Coastguard Worker * @encoding: the encoding name
1096*6777b538SAndroid Build Coastguard Worker *
1097*6777b538SAndroid Build Coastguard Worker * Use specified encoding to decode input data. This overrides the
1098*6777b538SAndroid Build Coastguard Worker * encoding found in the XML declaration.
1099*6777b538SAndroid Build Coastguard Worker *
1100*6777b538SAndroid Build Coastguard Worker * This function can also be used to override the encoding of chunks
1101*6777b538SAndroid Build Coastguard Worker * passed to xmlParseChunk.
1102*6777b538SAndroid Build Coastguard Worker *
1103*6777b538SAndroid Build Coastguard Worker * Available since 2.13.0.
1104*6777b538SAndroid Build Coastguard Worker *
1105*6777b538SAndroid Build Coastguard Worker * Returns 0 in case of success, -1 otherwise
1106*6777b538SAndroid Build Coastguard Worker */
1107*6777b538SAndroid Build Coastguard Worker int
xmlSwitchEncodingName(xmlParserCtxtPtr ctxt,const char * encoding)1108*6777b538SAndroid Build Coastguard Worker xmlSwitchEncodingName(xmlParserCtxtPtr ctxt, const char *encoding) {
1109*6777b538SAndroid Build Coastguard Worker return(xmlSwitchInputEncodingName(ctxt, ctxt->input, encoding));
1110*6777b538SAndroid Build Coastguard Worker }
1111*6777b538SAndroid Build Coastguard Worker
1112*6777b538SAndroid Build Coastguard Worker /**
1113*6777b538SAndroid Build Coastguard Worker * xmlSwitchInputEncoding:
1114*6777b538SAndroid Build Coastguard Worker * @ctxt: the parser context, only for error reporting
1115*6777b538SAndroid Build Coastguard Worker * @input: the input stream
1116*6777b538SAndroid Build Coastguard Worker * @handler: the encoding handler
1117*6777b538SAndroid Build Coastguard Worker *
1118*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Internal function, don't use.
1119*6777b538SAndroid Build Coastguard Worker *
1120*6777b538SAndroid Build Coastguard Worker * Use encoding handler to decode input data.
1121*6777b538SAndroid Build Coastguard Worker *
1122*6777b538SAndroid Build Coastguard Worker * Returns 0 in case of success, -1 otherwise
1123*6777b538SAndroid Build Coastguard Worker */
1124*6777b538SAndroid Build Coastguard Worker int
xmlSwitchInputEncoding(xmlParserCtxtPtr ctxt,xmlParserInputPtr input,xmlCharEncodingHandlerPtr handler)1125*6777b538SAndroid Build Coastguard Worker xmlSwitchInputEncoding(xmlParserCtxtPtr ctxt, xmlParserInputPtr input,
1126*6777b538SAndroid Build Coastguard Worker xmlCharEncodingHandlerPtr handler)
1127*6777b538SAndroid Build Coastguard Worker {
1128*6777b538SAndroid Build Coastguard Worker int nbchars;
1129*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferPtr in;
1130*6777b538SAndroid Build Coastguard Worker
1131*6777b538SAndroid Build Coastguard Worker if ((input == NULL) || (input->buf == NULL)) {
1132*6777b538SAndroid Build Coastguard Worker xmlCharEncCloseFunc(handler);
1133*6777b538SAndroid Build Coastguard Worker return (-1);
1134*6777b538SAndroid Build Coastguard Worker }
1135*6777b538SAndroid Build Coastguard Worker in = input->buf;
1136*6777b538SAndroid Build Coastguard Worker
1137*6777b538SAndroid Build Coastguard Worker input->flags |= XML_INPUT_HAS_ENCODING;
1138*6777b538SAndroid Build Coastguard Worker
1139*6777b538SAndroid Build Coastguard Worker /*
1140*6777b538SAndroid Build Coastguard Worker * UTF-8 requires no encoding handler.
1141*6777b538SAndroid Build Coastguard Worker */
1142*6777b538SAndroid Build Coastguard Worker if ((handler != NULL) &&
1143*6777b538SAndroid Build Coastguard Worker (xmlStrcasecmp(BAD_CAST handler->name, BAD_CAST "UTF-8") == 0)) {
1144*6777b538SAndroid Build Coastguard Worker xmlCharEncCloseFunc(handler);
1145*6777b538SAndroid Build Coastguard Worker handler = NULL;
1146*6777b538SAndroid Build Coastguard Worker }
1147*6777b538SAndroid Build Coastguard Worker
1148*6777b538SAndroid Build Coastguard Worker if (in->encoder == handler)
1149*6777b538SAndroid Build Coastguard Worker return (0);
1150*6777b538SAndroid Build Coastguard Worker
1151*6777b538SAndroid Build Coastguard Worker if (in->encoder != NULL) {
1152*6777b538SAndroid Build Coastguard Worker /*
1153*6777b538SAndroid Build Coastguard Worker * Switching encodings during parsing is a really bad idea,
1154*6777b538SAndroid Build Coastguard Worker * but Chromium can switch between ISO-8859-1 and UTF-16 before
1155*6777b538SAndroid Build Coastguard Worker * separate calls to xmlParseChunk.
1156*6777b538SAndroid Build Coastguard Worker *
1157*6777b538SAndroid Build Coastguard Worker * TODO: We should check whether the "raw" input buffer is empty and
1158*6777b538SAndroid Build Coastguard Worker * convert the old content using the old encoder.
1159*6777b538SAndroid Build Coastguard Worker */
1160*6777b538SAndroid Build Coastguard Worker
1161*6777b538SAndroid Build Coastguard Worker xmlCharEncCloseFunc(in->encoder);
1162*6777b538SAndroid Build Coastguard Worker in->encoder = handler;
1163*6777b538SAndroid Build Coastguard Worker return (0);
1164*6777b538SAndroid Build Coastguard Worker }
1165*6777b538SAndroid Build Coastguard Worker
1166*6777b538SAndroid Build Coastguard Worker in->encoder = handler;
1167*6777b538SAndroid Build Coastguard Worker
1168*6777b538SAndroid Build Coastguard Worker /*
1169*6777b538SAndroid Build Coastguard Worker * Is there already some content down the pipe to convert ?
1170*6777b538SAndroid Build Coastguard Worker */
1171*6777b538SAndroid Build Coastguard Worker if (xmlBufIsEmpty(in->buffer) == 0) {
1172*6777b538SAndroid Build Coastguard Worker xmlBufPtr buf;
1173*6777b538SAndroid Build Coastguard Worker size_t processed;
1174*6777b538SAndroid Build Coastguard Worker
1175*6777b538SAndroid Build Coastguard Worker buf = xmlBufCreate();
1176*6777b538SAndroid Build Coastguard Worker if (buf == NULL) {
1177*6777b538SAndroid Build Coastguard Worker xmlCtxtErrMemory(ctxt);
1178*6777b538SAndroid Build Coastguard Worker return(-1);
1179*6777b538SAndroid Build Coastguard Worker }
1180*6777b538SAndroid Build Coastguard Worker
1181*6777b538SAndroid Build Coastguard Worker /*
1182*6777b538SAndroid Build Coastguard Worker * Shrink the current input buffer.
1183*6777b538SAndroid Build Coastguard Worker * Move it as the raw buffer and create a new input buffer
1184*6777b538SAndroid Build Coastguard Worker */
1185*6777b538SAndroid Build Coastguard Worker processed = input->cur - input->base;
1186*6777b538SAndroid Build Coastguard Worker xmlBufShrink(in->buffer, processed);
1187*6777b538SAndroid Build Coastguard Worker input->consumed += processed;
1188*6777b538SAndroid Build Coastguard Worker in->raw = in->buffer;
1189*6777b538SAndroid Build Coastguard Worker in->buffer = buf;
1190*6777b538SAndroid Build Coastguard Worker in->rawconsumed = processed;
1191*6777b538SAndroid Build Coastguard Worker
1192*6777b538SAndroid Build Coastguard Worker nbchars = xmlCharEncInput(in);
1193*6777b538SAndroid Build Coastguard Worker xmlBufResetInput(in->buffer, input);
1194*6777b538SAndroid Build Coastguard Worker if (nbchars == XML_ENC_ERR_MEMORY) {
1195*6777b538SAndroid Build Coastguard Worker xmlCtxtErrMemory(ctxt);
1196*6777b538SAndroid Build Coastguard Worker } else if (nbchars < 0) {
1197*6777b538SAndroid Build Coastguard Worker xmlCtxtErrIO(ctxt, in->error, NULL);
1198*6777b538SAndroid Build Coastguard Worker xmlHaltParser(ctxt);
1199*6777b538SAndroid Build Coastguard Worker return (-1);
1200*6777b538SAndroid Build Coastguard Worker }
1201*6777b538SAndroid Build Coastguard Worker }
1202*6777b538SAndroid Build Coastguard Worker return (0);
1203*6777b538SAndroid Build Coastguard Worker }
1204*6777b538SAndroid Build Coastguard Worker
1205*6777b538SAndroid Build Coastguard Worker /**
1206*6777b538SAndroid Build Coastguard Worker * xmlSwitchToEncoding:
1207*6777b538SAndroid Build Coastguard Worker * @ctxt: the parser context
1208*6777b538SAndroid Build Coastguard Worker * @handler: the encoding handler
1209*6777b538SAndroid Build Coastguard Worker *
1210*6777b538SAndroid Build Coastguard Worker * Use encoding handler to decode input data.
1211*6777b538SAndroid Build Coastguard Worker *
1212*6777b538SAndroid Build Coastguard Worker * This function can be used to enforce the encoding of chunks passed
1213*6777b538SAndroid Build Coastguard Worker * to xmlParseChunk.
1214*6777b538SAndroid Build Coastguard Worker *
1215*6777b538SAndroid Build Coastguard Worker * Returns 0 in case of success, -1 otherwise
1216*6777b538SAndroid Build Coastguard Worker */
1217*6777b538SAndroid Build Coastguard Worker int
xmlSwitchToEncoding(xmlParserCtxtPtr ctxt,xmlCharEncodingHandlerPtr handler)1218*6777b538SAndroid Build Coastguard Worker xmlSwitchToEncoding(xmlParserCtxtPtr ctxt, xmlCharEncodingHandlerPtr handler)
1219*6777b538SAndroid Build Coastguard Worker {
1220*6777b538SAndroid Build Coastguard Worker if (ctxt == NULL)
1221*6777b538SAndroid Build Coastguard Worker return(-1);
1222*6777b538SAndroid Build Coastguard Worker return(xmlSwitchInputEncoding(ctxt, ctxt->input, handler));
1223*6777b538SAndroid Build Coastguard Worker }
1224*6777b538SAndroid Build Coastguard Worker
1225*6777b538SAndroid Build Coastguard Worker /**
1226*6777b538SAndroid Build Coastguard Worker * xmlDetectEncoding:
1227*6777b538SAndroid Build Coastguard Worker * @ctxt: the parser context
1228*6777b538SAndroid Build Coastguard Worker *
1229*6777b538SAndroid Build Coastguard Worker * Handle optional BOM, detect and switch to encoding.
1230*6777b538SAndroid Build Coastguard Worker *
1231*6777b538SAndroid Build Coastguard Worker * Assumes that there are at least four bytes in the input buffer.
1232*6777b538SAndroid Build Coastguard Worker */
1233*6777b538SAndroid Build Coastguard Worker void
xmlDetectEncoding(xmlParserCtxtPtr ctxt)1234*6777b538SAndroid Build Coastguard Worker xmlDetectEncoding(xmlParserCtxtPtr ctxt) {
1235*6777b538SAndroid Build Coastguard Worker const xmlChar *in;
1236*6777b538SAndroid Build Coastguard Worker xmlCharEncoding enc;
1237*6777b538SAndroid Build Coastguard Worker int bomSize;
1238*6777b538SAndroid Build Coastguard Worker int autoFlag = 0;
1239*6777b538SAndroid Build Coastguard Worker
1240*6777b538SAndroid Build Coastguard Worker if (xmlParserGrow(ctxt) < 0)
1241*6777b538SAndroid Build Coastguard Worker return;
1242*6777b538SAndroid Build Coastguard Worker in = ctxt->input->cur;
1243*6777b538SAndroid Build Coastguard Worker if (ctxt->input->end - in < 4)
1244*6777b538SAndroid Build Coastguard Worker return;
1245*6777b538SAndroid Build Coastguard Worker
1246*6777b538SAndroid Build Coastguard Worker if (ctxt->input->flags & XML_INPUT_HAS_ENCODING) {
1247*6777b538SAndroid Build Coastguard Worker /*
1248*6777b538SAndroid Build Coastguard Worker * If the encoding was already set, only skip the BOM which was
1249*6777b538SAndroid Build Coastguard Worker * possibly decoded to UTF-8.
1250*6777b538SAndroid Build Coastguard Worker */
1251*6777b538SAndroid Build Coastguard Worker if ((in[0] == 0xEF) && (in[1] == 0xBB) && (in[2] == 0xBF)) {
1252*6777b538SAndroid Build Coastguard Worker ctxt->input->cur += 3;
1253*6777b538SAndroid Build Coastguard Worker }
1254*6777b538SAndroid Build Coastguard Worker
1255*6777b538SAndroid Build Coastguard Worker return;
1256*6777b538SAndroid Build Coastguard Worker }
1257*6777b538SAndroid Build Coastguard Worker
1258*6777b538SAndroid Build Coastguard Worker enc = XML_CHAR_ENCODING_NONE;
1259*6777b538SAndroid Build Coastguard Worker bomSize = 0;
1260*6777b538SAndroid Build Coastguard Worker
1261*6777b538SAndroid Build Coastguard Worker switch (in[0]) {
1262*6777b538SAndroid Build Coastguard Worker case 0x00:
1263*6777b538SAndroid Build Coastguard Worker if ((in[1] == 0x00) && (in[2] == 0x00) && (in[3] == 0x3C)) {
1264*6777b538SAndroid Build Coastguard Worker enc = XML_CHAR_ENCODING_UCS4BE;
1265*6777b538SAndroid Build Coastguard Worker autoFlag = XML_INPUT_AUTO_OTHER;
1266*6777b538SAndroid Build Coastguard Worker } else if ((in[1] == 0x3C) && (in[2] == 0x00) && (in[3] == 0x3F)) {
1267*6777b538SAndroid Build Coastguard Worker enc = XML_CHAR_ENCODING_UTF16BE;
1268*6777b538SAndroid Build Coastguard Worker autoFlag = XML_INPUT_AUTO_UTF16BE;
1269*6777b538SAndroid Build Coastguard Worker }
1270*6777b538SAndroid Build Coastguard Worker break;
1271*6777b538SAndroid Build Coastguard Worker
1272*6777b538SAndroid Build Coastguard Worker case 0x3C:
1273*6777b538SAndroid Build Coastguard Worker if (in[1] == 0x00) {
1274*6777b538SAndroid Build Coastguard Worker if ((in[2] == 0x00) && (in[3] == 0x00)) {
1275*6777b538SAndroid Build Coastguard Worker enc = XML_CHAR_ENCODING_UCS4LE;
1276*6777b538SAndroid Build Coastguard Worker autoFlag = XML_INPUT_AUTO_OTHER;
1277*6777b538SAndroid Build Coastguard Worker } else if ((in[2] == 0x3F) && (in[3] == 0x00)) {
1278*6777b538SAndroid Build Coastguard Worker enc = XML_CHAR_ENCODING_UTF16LE;
1279*6777b538SAndroid Build Coastguard Worker autoFlag = XML_INPUT_AUTO_UTF16LE;
1280*6777b538SAndroid Build Coastguard Worker }
1281*6777b538SAndroid Build Coastguard Worker }
1282*6777b538SAndroid Build Coastguard Worker break;
1283*6777b538SAndroid Build Coastguard Worker
1284*6777b538SAndroid Build Coastguard Worker case 0x4C:
1285*6777b538SAndroid Build Coastguard Worker if ((in[1] == 0x6F) && (in[2] == 0xA7) && (in[3] == 0x94)) {
1286*6777b538SAndroid Build Coastguard Worker enc = XML_CHAR_ENCODING_EBCDIC;
1287*6777b538SAndroid Build Coastguard Worker autoFlag = XML_INPUT_AUTO_OTHER;
1288*6777b538SAndroid Build Coastguard Worker }
1289*6777b538SAndroid Build Coastguard Worker break;
1290*6777b538SAndroid Build Coastguard Worker
1291*6777b538SAndroid Build Coastguard Worker case 0xEF:
1292*6777b538SAndroid Build Coastguard Worker if ((in[1] == 0xBB) && (in[2] == 0xBF)) {
1293*6777b538SAndroid Build Coastguard Worker enc = XML_CHAR_ENCODING_UTF8;
1294*6777b538SAndroid Build Coastguard Worker autoFlag = XML_INPUT_AUTO_UTF8;
1295*6777b538SAndroid Build Coastguard Worker bomSize = 3;
1296*6777b538SAndroid Build Coastguard Worker }
1297*6777b538SAndroid Build Coastguard Worker break;
1298*6777b538SAndroid Build Coastguard Worker
1299*6777b538SAndroid Build Coastguard Worker case 0xFE:
1300*6777b538SAndroid Build Coastguard Worker if (in[1] == 0xFF) {
1301*6777b538SAndroid Build Coastguard Worker enc = XML_CHAR_ENCODING_UTF16BE;
1302*6777b538SAndroid Build Coastguard Worker autoFlag = XML_INPUT_AUTO_UTF16BE;
1303*6777b538SAndroid Build Coastguard Worker bomSize = 2;
1304*6777b538SAndroid Build Coastguard Worker }
1305*6777b538SAndroid Build Coastguard Worker break;
1306*6777b538SAndroid Build Coastguard Worker
1307*6777b538SAndroid Build Coastguard Worker case 0xFF:
1308*6777b538SAndroid Build Coastguard Worker if (in[1] == 0xFE) {
1309*6777b538SAndroid Build Coastguard Worker enc = XML_CHAR_ENCODING_UTF16LE;
1310*6777b538SAndroid Build Coastguard Worker autoFlag = XML_INPUT_AUTO_UTF16LE;
1311*6777b538SAndroid Build Coastguard Worker bomSize = 2;
1312*6777b538SAndroid Build Coastguard Worker }
1313*6777b538SAndroid Build Coastguard Worker break;
1314*6777b538SAndroid Build Coastguard Worker }
1315*6777b538SAndroid Build Coastguard Worker
1316*6777b538SAndroid Build Coastguard Worker if (bomSize > 0) {
1317*6777b538SAndroid Build Coastguard Worker ctxt->input->cur += bomSize;
1318*6777b538SAndroid Build Coastguard Worker }
1319*6777b538SAndroid Build Coastguard Worker
1320*6777b538SAndroid Build Coastguard Worker if (enc != XML_CHAR_ENCODING_NONE) {
1321*6777b538SAndroid Build Coastguard Worker ctxt->input->flags |= autoFlag;
1322*6777b538SAndroid Build Coastguard Worker xmlSwitchEncoding(ctxt, enc);
1323*6777b538SAndroid Build Coastguard Worker }
1324*6777b538SAndroid Build Coastguard Worker }
1325*6777b538SAndroid Build Coastguard Worker
1326*6777b538SAndroid Build Coastguard Worker /**
1327*6777b538SAndroid Build Coastguard Worker * xmlSetDeclaredEncoding:
1328*6777b538SAndroid Build Coastguard Worker * @ctxt: the parser context
1329*6777b538SAndroid Build Coastguard Worker * @encoding: declared encoding
1330*6777b538SAndroid Build Coastguard Worker *
1331*6777b538SAndroid Build Coastguard Worker * Set the encoding from a declaration in the document.
1332*6777b538SAndroid Build Coastguard Worker *
1333*6777b538SAndroid Build Coastguard Worker * If no encoding was set yet, switch the encoding. Otherwise, only warn
1334*6777b538SAndroid Build Coastguard Worker * about encoding mismatches.
1335*6777b538SAndroid Build Coastguard Worker *
1336*6777b538SAndroid Build Coastguard Worker * Takes ownership of 'encoding'.
1337*6777b538SAndroid Build Coastguard Worker */
1338*6777b538SAndroid Build Coastguard Worker void
xmlSetDeclaredEncoding(xmlParserCtxtPtr ctxt,xmlChar * encoding)1339*6777b538SAndroid Build Coastguard Worker xmlSetDeclaredEncoding(xmlParserCtxtPtr ctxt, xmlChar *encoding) {
1340*6777b538SAndroid Build Coastguard Worker if (((ctxt->input->flags & XML_INPUT_HAS_ENCODING) == 0) &&
1341*6777b538SAndroid Build Coastguard Worker ((ctxt->options & XML_PARSE_IGNORE_ENC) == 0)) {
1342*6777b538SAndroid Build Coastguard Worker xmlSwitchEncodingName(ctxt, (const char *) encoding);
1343*6777b538SAndroid Build Coastguard Worker ctxt->input->flags |= XML_INPUT_USES_ENC_DECL;
1344*6777b538SAndroid Build Coastguard Worker } else if (ctxt->input->flags & XML_INPUT_AUTO_ENCODING) {
1345*6777b538SAndroid Build Coastguard Worker static const char *allowedUTF8[] = {
1346*6777b538SAndroid Build Coastguard Worker "UTF-8", "UTF8", NULL
1347*6777b538SAndroid Build Coastguard Worker };
1348*6777b538SAndroid Build Coastguard Worker static const char *allowedUTF16LE[] = {
1349*6777b538SAndroid Build Coastguard Worker "UTF-16", "UTF-16LE", "UTF16", NULL
1350*6777b538SAndroid Build Coastguard Worker };
1351*6777b538SAndroid Build Coastguard Worker static const char *allowedUTF16BE[] = {
1352*6777b538SAndroid Build Coastguard Worker "UTF-16", "UTF-16BE", "UTF16", NULL
1353*6777b538SAndroid Build Coastguard Worker };
1354*6777b538SAndroid Build Coastguard Worker const char **allowed = NULL;
1355*6777b538SAndroid Build Coastguard Worker const char *autoEnc = NULL;
1356*6777b538SAndroid Build Coastguard Worker
1357*6777b538SAndroid Build Coastguard Worker switch (ctxt->input->flags & XML_INPUT_AUTO_ENCODING) {
1358*6777b538SAndroid Build Coastguard Worker case XML_INPUT_AUTO_UTF8:
1359*6777b538SAndroid Build Coastguard Worker allowed = allowedUTF8;
1360*6777b538SAndroid Build Coastguard Worker autoEnc = "UTF-8";
1361*6777b538SAndroid Build Coastguard Worker break;
1362*6777b538SAndroid Build Coastguard Worker case XML_INPUT_AUTO_UTF16LE:
1363*6777b538SAndroid Build Coastguard Worker allowed = allowedUTF16LE;
1364*6777b538SAndroid Build Coastguard Worker autoEnc = "UTF-16LE";
1365*6777b538SAndroid Build Coastguard Worker break;
1366*6777b538SAndroid Build Coastguard Worker case XML_INPUT_AUTO_UTF16BE:
1367*6777b538SAndroid Build Coastguard Worker allowed = allowedUTF16BE;
1368*6777b538SAndroid Build Coastguard Worker autoEnc = "UTF-16BE";
1369*6777b538SAndroid Build Coastguard Worker break;
1370*6777b538SAndroid Build Coastguard Worker }
1371*6777b538SAndroid Build Coastguard Worker
1372*6777b538SAndroid Build Coastguard Worker if (allowed != NULL) {
1373*6777b538SAndroid Build Coastguard Worker const char **p;
1374*6777b538SAndroid Build Coastguard Worker int match = 0;
1375*6777b538SAndroid Build Coastguard Worker
1376*6777b538SAndroid Build Coastguard Worker for (p = allowed; *p != NULL; p++) {
1377*6777b538SAndroid Build Coastguard Worker if (xmlStrcasecmp(encoding, BAD_CAST *p) == 0) {
1378*6777b538SAndroid Build Coastguard Worker match = 1;
1379*6777b538SAndroid Build Coastguard Worker break;
1380*6777b538SAndroid Build Coastguard Worker }
1381*6777b538SAndroid Build Coastguard Worker }
1382*6777b538SAndroid Build Coastguard Worker
1383*6777b538SAndroid Build Coastguard Worker if (match == 0) {
1384*6777b538SAndroid Build Coastguard Worker xmlWarningMsg(ctxt, XML_WAR_ENCODING_MISMATCH,
1385*6777b538SAndroid Build Coastguard Worker "Encoding '%s' doesn't match "
1386*6777b538SAndroid Build Coastguard Worker "auto-detected '%s'\n",
1387*6777b538SAndroid Build Coastguard Worker encoding, BAD_CAST autoEnc);
1388*6777b538SAndroid Build Coastguard Worker xmlFree(encoding);
1389*6777b538SAndroid Build Coastguard Worker encoding = xmlStrdup(BAD_CAST autoEnc);
1390*6777b538SAndroid Build Coastguard Worker if (encoding == NULL)
1391*6777b538SAndroid Build Coastguard Worker xmlCtxtErrMemory(ctxt);
1392*6777b538SAndroid Build Coastguard Worker }
1393*6777b538SAndroid Build Coastguard Worker }
1394*6777b538SAndroid Build Coastguard Worker }
1395*6777b538SAndroid Build Coastguard Worker
1396*6777b538SAndroid Build Coastguard Worker if (ctxt->encoding != NULL)
1397*6777b538SAndroid Build Coastguard Worker xmlFree((xmlChar *) ctxt->encoding);
1398*6777b538SAndroid Build Coastguard Worker ctxt->encoding = encoding;
1399*6777b538SAndroid Build Coastguard Worker }
1400*6777b538SAndroid Build Coastguard Worker
1401*6777b538SAndroid Build Coastguard Worker /************************************************************************
1402*6777b538SAndroid Build Coastguard Worker * *
1403*6777b538SAndroid Build Coastguard Worker * Commodity functions to handle entities processing *
1404*6777b538SAndroid Build Coastguard Worker * *
1405*6777b538SAndroid Build Coastguard Worker ************************************************************************/
1406*6777b538SAndroid Build Coastguard Worker
1407*6777b538SAndroid Build Coastguard Worker /**
1408*6777b538SAndroid Build Coastguard Worker * xmlFreeInputStream:
1409*6777b538SAndroid Build Coastguard Worker * @input: an xmlParserInputPtr
1410*6777b538SAndroid Build Coastguard Worker *
1411*6777b538SAndroid Build Coastguard Worker * Free up an input stream.
1412*6777b538SAndroid Build Coastguard Worker */
1413*6777b538SAndroid Build Coastguard Worker void
xmlFreeInputStream(xmlParserInputPtr input)1414*6777b538SAndroid Build Coastguard Worker xmlFreeInputStream(xmlParserInputPtr input) {
1415*6777b538SAndroid Build Coastguard Worker if (input == NULL) return;
1416*6777b538SAndroid Build Coastguard Worker
1417*6777b538SAndroid Build Coastguard Worker if (input->filename != NULL) xmlFree((char *) input->filename);
1418*6777b538SAndroid Build Coastguard Worker if (input->version != NULL) xmlFree((char *) input->version);
1419*6777b538SAndroid Build Coastguard Worker if ((input->free != NULL) && (input->base != NULL))
1420*6777b538SAndroid Build Coastguard Worker input->free((xmlChar *) input->base);
1421*6777b538SAndroid Build Coastguard Worker if (input->buf != NULL)
1422*6777b538SAndroid Build Coastguard Worker xmlFreeParserInputBuffer(input->buf);
1423*6777b538SAndroid Build Coastguard Worker xmlFree(input);
1424*6777b538SAndroid Build Coastguard Worker }
1425*6777b538SAndroid Build Coastguard Worker
1426*6777b538SAndroid Build Coastguard Worker /**
1427*6777b538SAndroid Build Coastguard Worker * xmlNewInputStream:
1428*6777b538SAndroid Build Coastguard Worker * @ctxt: an XML parser context
1429*6777b538SAndroid Build Coastguard Worker *
1430*6777b538SAndroid Build Coastguard Worker * Create a new input stream structure.
1431*6777b538SAndroid Build Coastguard Worker *
1432*6777b538SAndroid Build Coastguard Worker * Returns the new input stream or NULL
1433*6777b538SAndroid Build Coastguard Worker */
1434*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr
xmlNewInputStream(xmlParserCtxtPtr ctxt)1435*6777b538SAndroid Build Coastguard Worker xmlNewInputStream(xmlParserCtxtPtr ctxt) {
1436*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr input;
1437*6777b538SAndroid Build Coastguard Worker
1438*6777b538SAndroid Build Coastguard Worker input = (xmlParserInputPtr) xmlMalloc(sizeof(xmlParserInput));
1439*6777b538SAndroid Build Coastguard Worker if (input == NULL) {
1440*6777b538SAndroid Build Coastguard Worker xmlCtxtErrMemory(ctxt);
1441*6777b538SAndroid Build Coastguard Worker return(NULL);
1442*6777b538SAndroid Build Coastguard Worker }
1443*6777b538SAndroid Build Coastguard Worker memset(input, 0, sizeof(xmlParserInput));
1444*6777b538SAndroid Build Coastguard Worker input->line = 1;
1445*6777b538SAndroid Build Coastguard Worker input->col = 1;
1446*6777b538SAndroid Build Coastguard Worker
1447*6777b538SAndroid Build Coastguard Worker /*
1448*6777b538SAndroid Build Coastguard Worker * If the context is NULL the id cannot be initialized, but that
1449*6777b538SAndroid Build Coastguard Worker * should not happen while parsing which is the situation where
1450*6777b538SAndroid Build Coastguard Worker * the id is actually needed.
1451*6777b538SAndroid Build Coastguard Worker */
1452*6777b538SAndroid Build Coastguard Worker if (ctxt != NULL) {
1453*6777b538SAndroid Build Coastguard Worker if (input->id >= INT_MAX) {
1454*6777b538SAndroid Build Coastguard Worker xmlCtxtErrMemory(ctxt);
1455*6777b538SAndroid Build Coastguard Worker return(NULL);
1456*6777b538SAndroid Build Coastguard Worker }
1457*6777b538SAndroid Build Coastguard Worker input->id = ctxt->input_id++;
1458*6777b538SAndroid Build Coastguard Worker }
1459*6777b538SAndroid Build Coastguard Worker
1460*6777b538SAndroid Build Coastguard Worker return(input);
1461*6777b538SAndroid Build Coastguard Worker }
1462*6777b538SAndroid Build Coastguard Worker
1463*6777b538SAndroid Build Coastguard Worker /**
1464*6777b538SAndroid Build Coastguard Worker * xmlNewInputURL:
1465*6777b538SAndroid Build Coastguard Worker * @ctxt: parser context
1466*6777b538SAndroid Build Coastguard Worker * @url: filename or URL
1467*6777b538SAndroid Build Coastguard Worker * @publicId: publid ID from doctype (optional)
1468*6777b538SAndroid Build Coastguard Worker * @encoding: character encoding (optional)
1469*6777b538SAndroid Build Coastguard Worker * @flags: unused, pass 0
1470*6777b538SAndroid Build Coastguard Worker *
1471*6777b538SAndroid Build Coastguard Worker * Creates a new parser input from the filesystem, the network or
1472*6777b538SAndroid Build Coastguard Worker * a user-defined resource loader.
1473*6777b538SAndroid Build Coastguard Worker *
1474*6777b538SAndroid Build Coastguard Worker * @url is a filename or URL. If if contains the substring "://",
1475*6777b538SAndroid Build Coastguard Worker * it is assumed to be a Legacy Extended IRI. Otherwise, it is
1476*6777b538SAndroid Build Coastguard Worker * treated as a filesystem path.
1477*6777b538SAndroid Build Coastguard Worker *
1478*6777b538SAndroid Build Coastguard Worker * @publicId is an optional XML public ID, typically from a doctype
1479*6777b538SAndroid Build Coastguard Worker * declaration. It is used for catalog lookups.
1480*6777b538SAndroid Build Coastguard Worker *
1481*6777b538SAndroid Build Coastguard Worker * If @encoding is specified, it will override any encodings found
1482*6777b538SAndroid Build Coastguard Worker * in XML declarations, text declarations, BOMs, etc. Pass NULL
1483*6777b538SAndroid Build Coastguard Worker * for auto-detection.
1484*6777b538SAndroid Build Coastguard Worker *
1485*6777b538SAndroid Build Coastguard Worker * The following resource loaders will be called if they were
1486*6777b538SAndroid Build Coastguard Worker * registered (in order of precedence):
1487*6777b538SAndroid Build Coastguard Worker *
1488*6777b538SAndroid Build Coastguard Worker * - the global external entity loader set with
1489*6777b538SAndroid Build Coastguard Worker * xmlSetExternalEntityLoader
1490*6777b538SAndroid Build Coastguard Worker * - the per-thread xmlParserInputBufferCreateFilenameFunc set with
1491*6777b538SAndroid Build Coastguard Worker * xmlParserInputBufferCreateFilenameDefault
1492*6777b538SAndroid Build Coastguard Worker * - the default loader which will return
1493*6777b538SAndroid Build Coastguard Worker * - the result from a matching global input callback set with
1494*6777b538SAndroid Build Coastguard Worker * xmlRegisterInputCallbacks
1495*6777b538SAndroid Build Coastguard Worker * - a HTTP resource if support is compiled in.
1496*6777b538SAndroid Build Coastguard Worker * - a file opened from the filesystem, with automatic detection
1497*6777b538SAndroid Build Coastguard Worker * of compressed files if support is compiled in.
1498*6777b538SAndroid Build Coastguard Worker *
1499*6777b538SAndroid Build Coastguard Worker * The returned input can be passed to xmlCtxtParseDocument or
1500*6777b538SAndroid Build Coastguard Worker * htmlCtxtParseDocument.
1501*6777b538SAndroid Build Coastguard Worker *
1502*6777b538SAndroid Build Coastguard Worker * This function should not be invoked from user-defined resource
1503*6777b538SAndroid Build Coastguard Worker * loaders to avoid infinite loops.
1504*6777b538SAndroid Build Coastguard Worker *
1505*6777b538SAndroid Build Coastguard Worker * Returns a new parser input.
1506*6777b538SAndroid Build Coastguard Worker */
1507*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr
xmlNewInputURL(xmlParserCtxtPtr ctxt,const char * url,const char * publicId,const char * encoding,int flags ATTRIBUTE_UNUSED)1508*6777b538SAndroid Build Coastguard Worker xmlNewInputURL(xmlParserCtxtPtr ctxt, const char *url, const char *publicId,
1509*6777b538SAndroid Build Coastguard Worker const char *encoding, int flags ATTRIBUTE_UNUSED) {
1510*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr input;
1511*6777b538SAndroid Build Coastguard Worker
1512*6777b538SAndroid Build Coastguard Worker if ((ctxt == NULL) || (url == NULL))
1513*6777b538SAndroid Build Coastguard Worker return(NULL);
1514*6777b538SAndroid Build Coastguard Worker
1515*6777b538SAndroid Build Coastguard Worker input = xmlLoadExternalEntity(url, publicId, ctxt);
1516*6777b538SAndroid Build Coastguard Worker if (input == NULL)
1517*6777b538SAndroid Build Coastguard Worker return(NULL);
1518*6777b538SAndroid Build Coastguard Worker
1519*6777b538SAndroid Build Coastguard Worker if (encoding != NULL)
1520*6777b538SAndroid Build Coastguard Worker xmlSwitchInputEncodingName(ctxt, input, encoding);
1521*6777b538SAndroid Build Coastguard Worker
1522*6777b538SAndroid Build Coastguard Worker return(input);
1523*6777b538SAndroid Build Coastguard Worker }
1524*6777b538SAndroid Build Coastguard Worker
1525*6777b538SAndroid Build Coastguard Worker /**
1526*6777b538SAndroid Build Coastguard Worker * xmlNewInputInternal:
1527*6777b538SAndroid Build Coastguard Worker * @ctxt: parser context
1528*6777b538SAndroid Build Coastguard Worker * @buf: parser input buffer
1529*6777b538SAndroid Build Coastguard Worker * @filename: filename or URL
1530*6777b538SAndroid Build Coastguard Worker * @encoding: character encoding (optional)
1531*6777b538SAndroid Build Coastguard Worker *
1532*6777b538SAndroid Build Coastguard Worker * Internal helper function.
1533*6777b538SAndroid Build Coastguard Worker *
1534*6777b538SAndroid Build Coastguard Worker * Returns a new parser input.
1535*6777b538SAndroid Build Coastguard Worker */
1536*6777b538SAndroid Build Coastguard Worker static xmlParserInputPtr
xmlNewInputInternal(xmlParserCtxtPtr ctxt,xmlParserInputBufferPtr buf,const char * filename,const char * encoding)1537*6777b538SAndroid Build Coastguard Worker xmlNewInputInternal(xmlParserCtxtPtr ctxt, xmlParserInputBufferPtr buf,
1538*6777b538SAndroid Build Coastguard Worker const char *filename, const char *encoding) {
1539*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr input;
1540*6777b538SAndroid Build Coastguard Worker
1541*6777b538SAndroid Build Coastguard Worker input = xmlNewInputStream(ctxt);
1542*6777b538SAndroid Build Coastguard Worker if (input == NULL) {
1543*6777b538SAndroid Build Coastguard Worker xmlFreeParserInputBuffer(buf);
1544*6777b538SAndroid Build Coastguard Worker return(NULL);
1545*6777b538SAndroid Build Coastguard Worker }
1546*6777b538SAndroid Build Coastguard Worker
1547*6777b538SAndroid Build Coastguard Worker input->buf = buf;
1548*6777b538SAndroid Build Coastguard Worker xmlBufResetInput(input->buf->buffer, input);
1549*6777b538SAndroid Build Coastguard Worker
1550*6777b538SAndroid Build Coastguard Worker if (filename != NULL) {
1551*6777b538SAndroid Build Coastguard Worker input->filename = xmlMemStrdup(filename);
1552*6777b538SAndroid Build Coastguard Worker if (input->filename == NULL) {
1553*6777b538SAndroid Build Coastguard Worker xmlCtxtErrMemory(ctxt);
1554*6777b538SAndroid Build Coastguard Worker xmlFreeInputStream(input);
1555*6777b538SAndroid Build Coastguard Worker return(NULL);
1556*6777b538SAndroid Build Coastguard Worker }
1557*6777b538SAndroid Build Coastguard Worker }
1558*6777b538SAndroid Build Coastguard Worker
1559*6777b538SAndroid Build Coastguard Worker if (encoding != NULL)
1560*6777b538SAndroid Build Coastguard Worker xmlSwitchInputEncodingName(ctxt, input, encoding);
1561*6777b538SAndroid Build Coastguard Worker
1562*6777b538SAndroid Build Coastguard Worker return(input);
1563*6777b538SAndroid Build Coastguard Worker }
1564*6777b538SAndroid Build Coastguard Worker
1565*6777b538SAndroid Build Coastguard Worker /**
1566*6777b538SAndroid Build Coastguard Worker * xmlNewInputMemory:
1567*6777b538SAndroid Build Coastguard Worker * @ctxt: parser context
1568*6777b538SAndroid Build Coastguard Worker * @url: base URL (optional)
1569*6777b538SAndroid Build Coastguard Worker * @mem: pointer to char array
1570*6777b538SAndroid Build Coastguard Worker * @size: size of array
1571*6777b538SAndroid Build Coastguard Worker * @encoding: character encoding (optional)
1572*6777b538SAndroid Build Coastguard Worker * @flags: optimization hints
1573*6777b538SAndroid Build Coastguard Worker *
1574*6777b538SAndroid Build Coastguard Worker * Creates a new parser input to read from a memory area.
1575*6777b538SAndroid Build Coastguard Worker *
1576*6777b538SAndroid Build Coastguard Worker * @url is used as base to resolve external entities and for
1577*6777b538SAndroid Build Coastguard Worker * error reporting.
1578*6777b538SAndroid Build Coastguard Worker *
1579*6777b538SAndroid Build Coastguard Worker * If the XML_INPUT_BUF_STATIC flag is set, the memory area must
1580*6777b538SAndroid Build Coastguard Worker * stay unchanged until parsing has finished. This can avoid
1581*6777b538SAndroid Build Coastguard Worker * temporary copies.
1582*6777b538SAndroid Build Coastguard Worker *
1583*6777b538SAndroid Build Coastguard Worker * If the XML_INPUT_BUF_ZERO_TERMINATED flag is set, the memory
1584*6777b538SAndroid Build Coastguard Worker * area must contain a zero byte after the buffer at position @size.
1585*6777b538SAndroid Build Coastguard Worker * This can avoid temporary copies.
1586*6777b538SAndroid Build Coastguard Worker *
1587*6777b538SAndroid Build Coastguard Worker * Returns a new parser input.
1588*6777b538SAndroid Build Coastguard Worker */
1589*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr
xmlNewInputMemory(xmlParserCtxtPtr ctxt,const char * url,const void * mem,size_t size,const char * encoding,int flags)1590*6777b538SAndroid Build Coastguard Worker xmlNewInputMemory(xmlParserCtxtPtr ctxt, const char *url,
1591*6777b538SAndroid Build Coastguard Worker const void *mem, size_t size,
1592*6777b538SAndroid Build Coastguard Worker const char *encoding, int flags) {
1593*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferPtr buf;
1594*6777b538SAndroid Build Coastguard Worker
1595*6777b538SAndroid Build Coastguard Worker if ((ctxt == NULL) || (mem == NULL))
1596*6777b538SAndroid Build Coastguard Worker return(NULL);
1597*6777b538SAndroid Build Coastguard Worker
1598*6777b538SAndroid Build Coastguard Worker buf = xmlNewInputBufferMemory(mem, size, flags, XML_CHAR_ENCODING_NONE);
1599*6777b538SAndroid Build Coastguard Worker if (buf == NULL) {
1600*6777b538SAndroid Build Coastguard Worker xmlCtxtErrMemory(ctxt);
1601*6777b538SAndroid Build Coastguard Worker return(NULL);
1602*6777b538SAndroid Build Coastguard Worker }
1603*6777b538SAndroid Build Coastguard Worker
1604*6777b538SAndroid Build Coastguard Worker return(xmlNewInputInternal(ctxt, buf, url, encoding));
1605*6777b538SAndroid Build Coastguard Worker }
1606*6777b538SAndroid Build Coastguard Worker
1607*6777b538SAndroid Build Coastguard Worker /**
1608*6777b538SAndroid Build Coastguard Worker * xmlNewInputString:
1609*6777b538SAndroid Build Coastguard Worker * @ctxt: parser context
1610*6777b538SAndroid Build Coastguard Worker * @url: base URL (optional)
1611*6777b538SAndroid Build Coastguard Worker * @str: zero-terminated string
1612*6777b538SAndroid Build Coastguard Worker * @encoding: character encoding (optional)
1613*6777b538SAndroid Build Coastguard Worker * @flags: optimization hints
1614*6777b538SAndroid Build Coastguard Worker *
1615*6777b538SAndroid Build Coastguard Worker * Creates a new parser input to read from a zero-terminated string.
1616*6777b538SAndroid Build Coastguard Worker *
1617*6777b538SAndroid Build Coastguard Worker * @url is used as base to resolve external entities and for
1618*6777b538SAndroid Build Coastguard Worker * error reporting.
1619*6777b538SAndroid Build Coastguard Worker *
1620*6777b538SAndroid Build Coastguard Worker * If the XML_INPUT_BUF_STATIC flag is set, the string must
1621*6777b538SAndroid Build Coastguard Worker * stay unchanged until parsing has finished. This can avoid
1622*6777b538SAndroid Build Coastguard Worker * temporary copies.
1623*6777b538SAndroid Build Coastguard Worker *
1624*6777b538SAndroid Build Coastguard Worker * Returns a new parser input.
1625*6777b538SAndroid Build Coastguard Worker */
1626*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr
xmlNewInputString(xmlParserCtxtPtr ctxt,const char * url,const char * str,const char * encoding,int flags)1627*6777b538SAndroid Build Coastguard Worker xmlNewInputString(xmlParserCtxtPtr ctxt, const char *url,
1628*6777b538SAndroid Build Coastguard Worker const char *str, const char *encoding, int flags) {
1629*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferPtr buf;
1630*6777b538SAndroid Build Coastguard Worker
1631*6777b538SAndroid Build Coastguard Worker if ((ctxt == NULL) || (str == NULL))
1632*6777b538SAndroid Build Coastguard Worker return(NULL);
1633*6777b538SAndroid Build Coastguard Worker
1634*6777b538SAndroid Build Coastguard Worker buf = xmlNewInputBufferString(str, flags);
1635*6777b538SAndroid Build Coastguard Worker if (buf == NULL) {
1636*6777b538SAndroid Build Coastguard Worker xmlCtxtErrMemory(ctxt);
1637*6777b538SAndroid Build Coastguard Worker return(NULL);
1638*6777b538SAndroid Build Coastguard Worker }
1639*6777b538SAndroid Build Coastguard Worker
1640*6777b538SAndroid Build Coastguard Worker return(xmlNewInputInternal(ctxt, buf, url, encoding));
1641*6777b538SAndroid Build Coastguard Worker }
1642*6777b538SAndroid Build Coastguard Worker
1643*6777b538SAndroid Build Coastguard Worker /**
1644*6777b538SAndroid Build Coastguard Worker * xmlNewInputFd:
1645*6777b538SAndroid Build Coastguard Worker * @ctxt: parser context
1646*6777b538SAndroid Build Coastguard Worker * @url: base URL (optional)
1647*6777b538SAndroid Build Coastguard Worker * @fd: file descriptor
1648*6777b538SAndroid Build Coastguard Worker * @encoding: character encoding (optional)
1649*6777b538SAndroid Build Coastguard Worker * @flags: unused, pass 0
1650*6777b538SAndroid Build Coastguard Worker *
1651*6777b538SAndroid Build Coastguard Worker * Creates a new parser input to read from a zero-terminated string.
1652*6777b538SAndroid Build Coastguard Worker *
1653*6777b538SAndroid Build Coastguard Worker * @url is used as base to resolve external entities and for
1654*6777b538SAndroid Build Coastguard Worker * error reporting.
1655*6777b538SAndroid Build Coastguard Worker *
1656*6777b538SAndroid Build Coastguard Worker * @fd is closed after parsing has finished.
1657*6777b538SAndroid Build Coastguard Worker *
1658*6777b538SAndroid Build Coastguard Worker * Returns a new parser input.
1659*6777b538SAndroid Build Coastguard Worker */
1660*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr
xmlNewInputFd(xmlParserCtxtPtr ctxt,const char * url,int fd,const char * encoding,int flags ATTRIBUTE_UNUSED)1661*6777b538SAndroid Build Coastguard Worker xmlNewInputFd(xmlParserCtxtPtr ctxt, const char *url,
1662*6777b538SAndroid Build Coastguard Worker int fd, const char *encoding, int flags ATTRIBUTE_UNUSED) {
1663*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferPtr buf;
1664*6777b538SAndroid Build Coastguard Worker
1665*6777b538SAndroid Build Coastguard Worker if ((ctxt == NULL) || (fd < 0))
1666*6777b538SAndroid Build Coastguard Worker return(NULL);
1667*6777b538SAndroid Build Coastguard Worker
1668*6777b538SAndroid Build Coastguard Worker buf = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE);
1669*6777b538SAndroid Build Coastguard Worker if (buf == NULL) {
1670*6777b538SAndroid Build Coastguard Worker xmlCtxtErrMemory(ctxt);
1671*6777b538SAndroid Build Coastguard Worker return(NULL);
1672*6777b538SAndroid Build Coastguard Worker }
1673*6777b538SAndroid Build Coastguard Worker
1674*6777b538SAndroid Build Coastguard Worker return(xmlNewInputInternal(ctxt, buf, url, encoding));
1675*6777b538SAndroid Build Coastguard Worker }
1676*6777b538SAndroid Build Coastguard Worker
1677*6777b538SAndroid Build Coastguard Worker /**
1678*6777b538SAndroid Build Coastguard Worker * xmlNewInputIO:
1679*6777b538SAndroid Build Coastguard Worker * @ctxt: parser context
1680*6777b538SAndroid Build Coastguard Worker * @url: base URL (optional)
1681*6777b538SAndroid Build Coastguard Worker * @ioRead: read callback
1682*6777b538SAndroid Build Coastguard Worker * @ioClose: close callback (optional)
1683*6777b538SAndroid Build Coastguard Worker * @ioCtxt: IO context
1684*6777b538SAndroid Build Coastguard Worker * @encoding: character encoding (optional)
1685*6777b538SAndroid Build Coastguard Worker * @flags: unused, pass 0
1686*6777b538SAndroid Build Coastguard Worker *
1687*6777b538SAndroid Build Coastguard Worker * Creates a new parser input to read from input callbacks and
1688*6777b538SAndroid Build Coastguard Worker * cintext.
1689*6777b538SAndroid Build Coastguard Worker *
1690*6777b538SAndroid Build Coastguard Worker * @url is used as base to resolve external entities and for
1691*6777b538SAndroid Build Coastguard Worker * error reporting.
1692*6777b538SAndroid Build Coastguard Worker *
1693*6777b538SAndroid Build Coastguard Worker * @ioRead is called to read new data into a provided buffer.
1694*6777b538SAndroid Build Coastguard Worker * It must return the number of bytes written into the buffer
1695*6777b538SAndroid Build Coastguard Worker * ot a negative xmlParserErrors code on failure.
1696*6777b538SAndroid Build Coastguard Worker *
1697*6777b538SAndroid Build Coastguard Worker * @ioClose is called after parsing has finished.
1698*6777b538SAndroid Build Coastguard Worker *
1699*6777b538SAndroid Build Coastguard Worker * @ioCtxt is an opaque pointer passed to the callbacks.
1700*6777b538SAndroid Build Coastguard Worker *
1701*6777b538SAndroid Build Coastguard Worker * Returns a new parser input.
1702*6777b538SAndroid Build Coastguard Worker */
1703*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr
xmlNewInputIO(xmlParserCtxtPtr ctxt,const char * url,xmlInputReadCallback ioRead,xmlInputCloseCallback ioClose,void * ioCtxt,const char * encoding,int flags ATTRIBUTE_UNUSED)1704*6777b538SAndroid Build Coastguard Worker xmlNewInputIO(xmlParserCtxtPtr ctxt, const char *url,
1705*6777b538SAndroid Build Coastguard Worker xmlInputReadCallback ioRead, xmlInputCloseCallback ioClose,
1706*6777b538SAndroid Build Coastguard Worker void *ioCtxt,
1707*6777b538SAndroid Build Coastguard Worker const char *encoding, int flags ATTRIBUTE_UNUSED) {
1708*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferPtr buf;
1709*6777b538SAndroid Build Coastguard Worker
1710*6777b538SAndroid Build Coastguard Worker if ((ctxt == NULL) || (ioRead == NULL))
1711*6777b538SAndroid Build Coastguard Worker return(NULL);
1712*6777b538SAndroid Build Coastguard Worker
1713*6777b538SAndroid Build Coastguard Worker buf = xmlAllocParserInputBuffer(XML_CHAR_ENCODING_NONE);
1714*6777b538SAndroid Build Coastguard Worker if (buf == NULL) {
1715*6777b538SAndroid Build Coastguard Worker xmlCtxtErrMemory(ctxt);
1716*6777b538SAndroid Build Coastguard Worker if (ioClose != NULL)
1717*6777b538SAndroid Build Coastguard Worker ioClose(ioCtxt);
1718*6777b538SAndroid Build Coastguard Worker return(NULL);
1719*6777b538SAndroid Build Coastguard Worker }
1720*6777b538SAndroid Build Coastguard Worker
1721*6777b538SAndroid Build Coastguard Worker buf->context = ioCtxt;
1722*6777b538SAndroid Build Coastguard Worker buf->readcallback = ioRead;
1723*6777b538SAndroid Build Coastguard Worker buf->closecallback = ioClose;
1724*6777b538SAndroid Build Coastguard Worker
1725*6777b538SAndroid Build Coastguard Worker return(xmlNewInputInternal(ctxt, buf, url, encoding));
1726*6777b538SAndroid Build Coastguard Worker }
1727*6777b538SAndroid Build Coastguard Worker
1728*6777b538SAndroid Build Coastguard Worker /**
1729*6777b538SAndroid Build Coastguard Worker * xmlNewInputPush:
1730*6777b538SAndroid Build Coastguard Worker * @ctxt: parser context
1731*6777b538SAndroid Build Coastguard Worker * @url: base URL (optional)
1732*6777b538SAndroid Build Coastguard Worker * @chunk: pointer to char array
1733*6777b538SAndroid Build Coastguard Worker * @size: size of array
1734*6777b538SAndroid Build Coastguard Worker * @encoding: character encoding (optional)
1735*6777b538SAndroid Build Coastguard Worker *
1736*6777b538SAndroid Build Coastguard Worker * Creates a new parser input for a push parser.
1737*6777b538SAndroid Build Coastguard Worker *
1738*6777b538SAndroid Build Coastguard Worker * Returns a new parser input.
1739*6777b538SAndroid Build Coastguard Worker */
1740*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr
xmlNewInputPush(xmlParserCtxtPtr ctxt,const char * url,const char * chunk,int size,const char * encoding)1741*6777b538SAndroid Build Coastguard Worker xmlNewInputPush(xmlParserCtxtPtr ctxt, const char *url,
1742*6777b538SAndroid Build Coastguard Worker const char *chunk, int size, const char *encoding) {
1743*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferPtr buf;
1744*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr input;
1745*6777b538SAndroid Build Coastguard Worker
1746*6777b538SAndroid Build Coastguard Worker buf = xmlAllocParserInputBuffer(XML_CHAR_ENCODING_NONE);
1747*6777b538SAndroid Build Coastguard Worker if (buf == NULL) {
1748*6777b538SAndroid Build Coastguard Worker xmlCtxtErrMemory(ctxt);
1749*6777b538SAndroid Build Coastguard Worker return(NULL);
1750*6777b538SAndroid Build Coastguard Worker }
1751*6777b538SAndroid Build Coastguard Worker
1752*6777b538SAndroid Build Coastguard Worker input = xmlNewInputInternal(ctxt, buf, url, encoding);
1753*6777b538SAndroid Build Coastguard Worker if (input == NULL)
1754*6777b538SAndroid Build Coastguard Worker return(NULL);
1755*6777b538SAndroid Build Coastguard Worker
1756*6777b538SAndroid Build Coastguard Worker input->flags |= XML_INPUT_PROGRESSIVE;
1757*6777b538SAndroid Build Coastguard Worker
1758*6777b538SAndroid Build Coastguard Worker if ((size > 0) && (chunk != NULL)) {
1759*6777b538SAndroid Build Coastguard Worker int res;
1760*6777b538SAndroid Build Coastguard Worker
1761*6777b538SAndroid Build Coastguard Worker res = xmlParserInputBufferPush(input->buf, size, chunk);
1762*6777b538SAndroid Build Coastguard Worker xmlBufResetInput(input->buf->buffer, input);
1763*6777b538SAndroid Build Coastguard Worker if (res < 0) {
1764*6777b538SAndroid Build Coastguard Worker xmlCtxtErrIO(ctxt, input->buf->error, NULL);
1765*6777b538SAndroid Build Coastguard Worker xmlFreeInputStream(input);
1766*6777b538SAndroid Build Coastguard Worker return(NULL);
1767*6777b538SAndroid Build Coastguard Worker }
1768*6777b538SAndroid Build Coastguard Worker }
1769*6777b538SAndroid Build Coastguard Worker
1770*6777b538SAndroid Build Coastguard Worker return(input);
1771*6777b538SAndroid Build Coastguard Worker }
1772*6777b538SAndroid Build Coastguard Worker
1773*6777b538SAndroid Build Coastguard Worker /**
1774*6777b538SAndroid Build Coastguard Worker * xmlNewIOInputStream:
1775*6777b538SAndroid Build Coastguard Worker * @ctxt: an XML parser context
1776*6777b538SAndroid Build Coastguard Worker * @input: an I/O Input
1777*6777b538SAndroid Build Coastguard Worker * @enc: the charset encoding if known
1778*6777b538SAndroid Build Coastguard Worker *
1779*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Use xmlNewInputURL, xmlNewInputMemory, etc.
1780*6777b538SAndroid Build Coastguard Worker *
1781*6777b538SAndroid Build Coastguard Worker * Create a new input stream structure encapsulating the @input into
1782*6777b538SAndroid Build Coastguard Worker * a stream suitable for the parser.
1783*6777b538SAndroid Build Coastguard Worker *
1784*6777b538SAndroid Build Coastguard Worker * Returns the new input stream or NULL
1785*6777b538SAndroid Build Coastguard Worker */
1786*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr
xmlNewIOInputStream(xmlParserCtxtPtr ctxt,xmlParserInputBufferPtr buf,xmlCharEncoding enc)1787*6777b538SAndroid Build Coastguard Worker xmlNewIOInputStream(xmlParserCtxtPtr ctxt, xmlParserInputBufferPtr buf,
1788*6777b538SAndroid Build Coastguard Worker xmlCharEncoding enc) {
1789*6777b538SAndroid Build Coastguard Worker const char *encoding;
1790*6777b538SAndroid Build Coastguard Worker
1791*6777b538SAndroid Build Coastguard Worker if (buf == NULL)
1792*6777b538SAndroid Build Coastguard Worker return(NULL);
1793*6777b538SAndroid Build Coastguard Worker
1794*6777b538SAndroid Build Coastguard Worker encoding = xmlGetCharEncodingName(enc);
1795*6777b538SAndroid Build Coastguard Worker return(xmlNewInputInternal(ctxt, buf, NULL, encoding));
1796*6777b538SAndroid Build Coastguard Worker }
1797*6777b538SAndroid Build Coastguard Worker
1798*6777b538SAndroid Build Coastguard Worker /**
1799*6777b538SAndroid Build Coastguard Worker * xmlNewEntityInputStream:
1800*6777b538SAndroid Build Coastguard Worker * @ctxt: an XML parser context
1801*6777b538SAndroid Build Coastguard Worker * @entity: an Entity pointer
1802*6777b538SAndroid Build Coastguard Worker *
1803*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Internal function, do not use.
1804*6777b538SAndroid Build Coastguard Worker *
1805*6777b538SAndroid Build Coastguard Worker * Create a new input stream based on an xmlEntityPtr
1806*6777b538SAndroid Build Coastguard Worker *
1807*6777b538SAndroid Build Coastguard Worker * Returns the new input stream or NULL
1808*6777b538SAndroid Build Coastguard Worker */
1809*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr
xmlNewEntityInputStream(xmlParserCtxtPtr ctxt,xmlEntityPtr ent)1810*6777b538SAndroid Build Coastguard Worker xmlNewEntityInputStream(xmlParserCtxtPtr ctxt, xmlEntityPtr ent) {
1811*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr input;
1812*6777b538SAndroid Build Coastguard Worker
1813*6777b538SAndroid Build Coastguard Worker if ((ctxt == NULL) || (ent == NULL))
1814*6777b538SAndroid Build Coastguard Worker return(NULL);
1815*6777b538SAndroid Build Coastguard Worker
1816*6777b538SAndroid Build Coastguard Worker if (ent->content != NULL) {
1817*6777b538SAndroid Build Coastguard Worker input = xmlNewInputString(ctxt, NULL, (const char *) ent->content,
1818*6777b538SAndroid Build Coastguard Worker NULL, XML_INPUT_BUF_STATIC);
1819*6777b538SAndroid Build Coastguard Worker } else if (ent->URI != NULL) {
1820*6777b538SAndroid Build Coastguard Worker input = xmlLoadExternalEntity((char *) ent->URI,
1821*6777b538SAndroid Build Coastguard Worker (char *) ent->ExternalID, ctxt);
1822*6777b538SAndroid Build Coastguard Worker } else {
1823*6777b538SAndroid Build Coastguard Worker input = xmlNewInputMemory(ctxt, NULL, "", 0, NULL,
1824*6777b538SAndroid Build Coastguard Worker XML_INPUT_BUF_STATIC |
1825*6777b538SAndroid Build Coastguard Worker XML_INPUT_BUF_ZERO_TERMINATED);
1826*6777b538SAndroid Build Coastguard Worker }
1827*6777b538SAndroid Build Coastguard Worker
1828*6777b538SAndroid Build Coastguard Worker if (input == NULL)
1829*6777b538SAndroid Build Coastguard Worker return(NULL);
1830*6777b538SAndroid Build Coastguard Worker
1831*6777b538SAndroid Build Coastguard Worker input->entity = ent;
1832*6777b538SAndroid Build Coastguard Worker
1833*6777b538SAndroid Build Coastguard Worker return(input);
1834*6777b538SAndroid Build Coastguard Worker }
1835*6777b538SAndroid Build Coastguard Worker
1836*6777b538SAndroid Build Coastguard Worker /**
1837*6777b538SAndroid Build Coastguard Worker * xmlNewStringInputStream:
1838*6777b538SAndroid Build Coastguard Worker * @ctxt: an XML parser context
1839*6777b538SAndroid Build Coastguard Worker * @buffer: an memory buffer
1840*6777b538SAndroid Build Coastguard Worker *
1841*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Use xmlNewInputString.
1842*6777b538SAndroid Build Coastguard Worker *
1843*6777b538SAndroid Build Coastguard Worker * Create a new input stream based on a memory buffer.
1844*6777b538SAndroid Build Coastguard Worker *
1845*6777b538SAndroid Build Coastguard Worker * Returns the new input stream
1846*6777b538SAndroid Build Coastguard Worker */
1847*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr
xmlNewStringInputStream(xmlParserCtxtPtr ctxt,const xmlChar * buffer)1848*6777b538SAndroid Build Coastguard Worker xmlNewStringInputStream(xmlParserCtxtPtr ctxt, const xmlChar *buffer) {
1849*6777b538SAndroid Build Coastguard Worker return(xmlNewInputString(ctxt, NULL, (const char *) buffer, NULL, 0));
1850*6777b538SAndroid Build Coastguard Worker }
1851*6777b538SAndroid Build Coastguard Worker
1852*6777b538SAndroid Build Coastguard Worker
1853*6777b538SAndroid Build Coastguard Worker /****************************************************************
1854*6777b538SAndroid Build Coastguard Worker * *
1855*6777b538SAndroid Build Coastguard Worker * External entities loading *
1856*6777b538SAndroid Build Coastguard Worker * *
1857*6777b538SAndroid Build Coastguard Worker ****************************************************************/
1858*6777b538SAndroid Build Coastguard Worker
1859*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_CATALOG_ENABLED
1860*6777b538SAndroid Build Coastguard Worker
1861*6777b538SAndroid Build Coastguard Worker /**
1862*6777b538SAndroid Build Coastguard Worker * xmlResolveResourceFromCatalog:
1863*6777b538SAndroid Build Coastguard Worker * @URL: the URL for the entity to load
1864*6777b538SAndroid Build Coastguard Worker * @ID: the System ID for the entity to load
1865*6777b538SAndroid Build Coastguard Worker * @ctxt: the context in which the entity is called or NULL
1866*6777b538SAndroid Build Coastguard Worker *
1867*6777b538SAndroid Build Coastguard Worker * Resolves the URL and ID against the appropriate catalog.
1868*6777b538SAndroid Build Coastguard Worker * This function is used by xmlDefaultExternalEntityLoader and
1869*6777b538SAndroid Build Coastguard Worker * xmlNoNetExternalEntityLoader.
1870*6777b538SAndroid Build Coastguard Worker *
1871*6777b538SAndroid Build Coastguard Worker * Returns a new allocated URL, or NULL.
1872*6777b538SAndroid Build Coastguard Worker */
1873*6777b538SAndroid Build Coastguard Worker static xmlChar *
xmlResolveResourceFromCatalog(const char * URL,const char * ID,xmlParserCtxtPtr ctxt)1874*6777b538SAndroid Build Coastguard Worker xmlResolveResourceFromCatalog(const char *URL, const char *ID,
1875*6777b538SAndroid Build Coastguard Worker xmlParserCtxtPtr ctxt) {
1876*6777b538SAndroid Build Coastguard Worker xmlChar *resource = NULL;
1877*6777b538SAndroid Build Coastguard Worker xmlCatalogAllow pref;
1878*6777b538SAndroid Build Coastguard Worker
1879*6777b538SAndroid Build Coastguard Worker /*
1880*6777b538SAndroid Build Coastguard Worker * If the resource doesn't exists as a file,
1881*6777b538SAndroid Build Coastguard Worker * try to load it from the resource pointed in the catalogs
1882*6777b538SAndroid Build Coastguard Worker */
1883*6777b538SAndroid Build Coastguard Worker pref = xmlCatalogGetDefaults();
1884*6777b538SAndroid Build Coastguard Worker
1885*6777b538SAndroid Build Coastguard Worker if ((pref != XML_CATA_ALLOW_NONE) && (!xmlNoNetExists(URL))) {
1886*6777b538SAndroid Build Coastguard Worker /*
1887*6777b538SAndroid Build Coastguard Worker * Do a local lookup
1888*6777b538SAndroid Build Coastguard Worker */
1889*6777b538SAndroid Build Coastguard Worker if ((ctxt != NULL) && (ctxt->catalogs != NULL) &&
1890*6777b538SAndroid Build Coastguard Worker ((pref == XML_CATA_ALLOW_ALL) ||
1891*6777b538SAndroid Build Coastguard Worker (pref == XML_CATA_ALLOW_DOCUMENT))) {
1892*6777b538SAndroid Build Coastguard Worker resource = xmlCatalogLocalResolve(ctxt->catalogs,
1893*6777b538SAndroid Build Coastguard Worker (const xmlChar *)ID,
1894*6777b538SAndroid Build Coastguard Worker (const xmlChar *)URL);
1895*6777b538SAndroid Build Coastguard Worker }
1896*6777b538SAndroid Build Coastguard Worker /*
1897*6777b538SAndroid Build Coastguard Worker * Try a global lookup
1898*6777b538SAndroid Build Coastguard Worker */
1899*6777b538SAndroid Build Coastguard Worker if ((resource == NULL) &&
1900*6777b538SAndroid Build Coastguard Worker ((pref == XML_CATA_ALLOW_ALL) ||
1901*6777b538SAndroid Build Coastguard Worker (pref == XML_CATA_ALLOW_GLOBAL))) {
1902*6777b538SAndroid Build Coastguard Worker resource = xmlCatalogResolve((const xmlChar *)ID,
1903*6777b538SAndroid Build Coastguard Worker (const xmlChar *)URL);
1904*6777b538SAndroid Build Coastguard Worker }
1905*6777b538SAndroid Build Coastguard Worker if ((resource == NULL) && (URL != NULL))
1906*6777b538SAndroid Build Coastguard Worker resource = xmlStrdup((const xmlChar *) URL);
1907*6777b538SAndroid Build Coastguard Worker
1908*6777b538SAndroid Build Coastguard Worker /*
1909*6777b538SAndroid Build Coastguard Worker * TODO: do an URI lookup on the reference
1910*6777b538SAndroid Build Coastguard Worker */
1911*6777b538SAndroid Build Coastguard Worker if ((resource != NULL) && (!xmlNoNetExists((const char *)resource))) {
1912*6777b538SAndroid Build Coastguard Worker xmlChar *tmp = NULL;
1913*6777b538SAndroid Build Coastguard Worker
1914*6777b538SAndroid Build Coastguard Worker if ((ctxt != NULL) && (ctxt->catalogs != NULL) &&
1915*6777b538SAndroid Build Coastguard Worker ((pref == XML_CATA_ALLOW_ALL) ||
1916*6777b538SAndroid Build Coastguard Worker (pref == XML_CATA_ALLOW_DOCUMENT))) {
1917*6777b538SAndroid Build Coastguard Worker tmp = xmlCatalogLocalResolveURI(ctxt->catalogs, resource);
1918*6777b538SAndroid Build Coastguard Worker }
1919*6777b538SAndroid Build Coastguard Worker if ((tmp == NULL) &&
1920*6777b538SAndroid Build Coastguard Worker ((pref == XML_CATA_ALLOW_ALL) ||
1921*6777b538SAndroid Build Coastguard Worker (pref == XML_CATA_ALLOW_GLOBAL))) {
1922*6777b538SAndroid Build Coastguard Worker tmp = xmlCatalogResolveURI(resource);
1923*6777b538SAndroid Build Coastguard Worker }
1924*6777b538SAndroid Build Coastguard Worker
1925*6777b538SAndroid Build Coastguard Worker if (tmp != NULL) {
1926*6777b538SAndroid Build Coastguard Worker xmlFree(resource);
1927*6777b538SAndroid Build Coastguard Worker resource = tmp;
1928*6777b538SAndroid Build Coastguard Worker }
1929*6777b538SAndroid Build Coastguard Worker }
1930*6777b538SAndroid Build Coastguard Worker }
1931*6777b538SAndroid Build Coastguard Worker
1932*6777b538SAndroid Build Coastguard Worker return resource;
1933*6777b538SAndroid Build Coastguard Worker }
1934*6777b538SAndroid Build Coastguard Worker
1935*6777b538SAndroid Build Coastguard Worker #endif
1936*6777b538SAndroid Build Coastguard Worker
1937*6777b538SAndroid Build Coastguard Worker /**
1938*6777b538SAndroid Build Coastguard Worker * xmlCheckHTTPInput:
1939*6777b538SAndroid Build Coastguard Worker * @ctxt: an XML parser context
1940*6777b538SAndroid Build Coastguard Worker * @ret: an XML parser input
1941*6777b538SAndroid Build Coastguard Worker *
1942*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Internal function, don't use.
1943*6777b538SAndroid Build Coastguard Worker *
1944*6777b538SAndroid Build Coastguard Worker * Check an input in case it was created from an HTTP stream, in that
1945*6777b538SAndroid Build Coastguard Worker * case it will handle encoding and update of the base URL in case of
1946*6777b538SAndroid Build Coastguard Worker * redirection. It also checks for HTTP errors in which case the input
1947*6777b538SAndroid Build Coastguard Worker * is cleanly freed up and an appropriate error is raised in context
1948*6777b538SAndroid Build Coastguard Worker *
1949*6777b538SAndroid Build Coastguard Worker * Returns the input or NULL in case of HTTP error.
1950*6777b538SAndroid Build Coastguard Worker */
1951*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr
xmlCheckHTTPInput(xmlParserCtxtPtr ctxt,xmlParserInputPtr ret)1952*6777b538SAndroid Build Coastguard Worker xmlCheckHTTPInput(xmlParserCtxtPtr ctxt, xmlParserInputPtr ret) {
1953*6777b538SAndroid Build Coastguard Worker /* Avoid unused variable warning if features are disabled. */
1954*6777b538SAndroid Build Coastguard Worker (void) ctxt;
1955*6777b538SAndroid Build Coastguard Worker
1956*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_HTTP_ENABLED
1957*6777b538SAndroid Build Coastguard Worker if ((ret != NULL) && (ret->buf != NULL) &&
1958*6777b538SAndroid Build Coastguard Worker (ret->buf->readcallback == xmlIOHTTPRead) &&
1959*6777b538SAndroid Build Coastguard Worker (ret->buf->context != NULL)) {
1960*6777b538SAndroid Build Coastguard Worker const char *encoding;
1961*6777b538SAndroid Build Coastguard Worker const char *redir;
1962*6777b538SAndroid Build Coastguard Worker const char *mime;
1963*6777b538SAndroid Build Coastguard Worker int code;
1964*6777b538SAndroid Build Coastguard Worker
1965*6777b538SAndroid Build Coastguard Worker code = xmlNanoHTTPReturnCode(ret->buf->context);
1966*6777b538SAndroid Build Coastguard Worker if (code >= 400) {
1967*6777b538SAndroid Build Coastguard Worker /* fatal error */
1968*6777b538SAndroid Build Coastguard Worker if (ret->filename != NULL)
1969*6777b538SAndroid Build Coastguard Worker xmlCtxtErrIO(ctxt, XML_IO_LOAD_ERROR, ret->filename);
1970*6777b538SAndroid Build Coastguard Worker else
1971*6777b538SAndroid Build Coastguard Worker xmlCtxtErrIO(ctxt, XML_IO_LOAD_ERROR, "<null>");
1972*6777b538SAndroid Build Coastguard Worker xmlFreeInputStream(ret);
1973*6777b538SAndroid Build Coastguard Worker ret = NULL;
1974*6777b538SAndroid Build Coastguard Worker } else {
1975*6777b538SAndroid Build Coastguard Worker
1976*6777b538SAndroid Build Coastguard Worker mime = xmlNanoHTTPMimeType(ret->buf->context);
1977*6777b538SAndroid Build Coastguard Worker if ((xmlStrstr(BAD_CAST mime, BAD_CAST "/xml")) ||
1978*6777b538SAndroid Build Coastguard Worker (xmlStrstr(BAD_CAST mime, BAD_CAST "+xml"))) {
1979*6777b538SAndroid Build Coastguard Worker encoding = xmlNanoHTTPEncoding(ret->buf->context);
1980*6777b538SAndroid Build Coastguard Worker if (encoding != NULL)
1981*6777b538SAndroid Build Coastguard Worker xmlSwitchEncodingName(ctxt, encoding);
1982*6777b538SAndroid Build Coastguard Worker #if 0
1983*6777b538SAndroid Build Coastguard Worker } else if (xmlStrstr(BAD_CAST mime, BAD_CAST "html")) {
1984*6777b538SAndroid Build Coastguard Worker #endif
1985*6777b538SAndroid Build Coastguard Worker }
1986*6777b538SAndroid Build Coastguard Worker redir = xmlNanoHTTPRedir(ret->buf->context);
1987*6777b538SAndroid Build Coastguard Worker if (redir != NULL) {
1988*6777b538SAndroid Build Coastguard Worker if (ret->filename != NULL)
1989*6777b538SAndroid Build Coastguard Worker xmlFree((xmlChar *) ret->filename);
1990*6777b538SAndroid Build Coastguard Worker ret->filename =
1991*6777b538SAndroid Build Coastguard Worker (char *) xmlStrdup((const xmlChar *) redir);
1992*6777b538SAndroid Build Coastguard Worker }
1993*6777b538SAndroid Build Coastguard Worker }
1994*6777b538SAndroid Build Coastguard Worker }
1995*6777b538SAndroid Build Coastguard Worker #endif
1996*6777b538SAndroid Build Coastguard Worker return(ret);
1997*6777b538SAndroid Build Coastguard Worker }
1998*6777b538SAndroid Build Coastguard Worker
1999*6777b538SAndroid Build Coastguard Worker /**
2000*6777b538SAndroid Build Coastguard Worker * xmlNewInputFromFile:
2001*6777b538SAndroid Build Coastguard Worker * @ctxt: an XML parser context
2002*6777b538SAndroid Build Coastguard Worker * @filename: the filename to use as entity
2003*6777b538SAndroid Build Coastguard Worker *
2004*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Use xmlNewInputURL.
2005*6777b538SAndroid Build Coastguard Worker *
2006*6777b538SAndroid Build Coastguard Worker * Create a new input stream based on a file or an URL.
2007*6777b538SAndroid Build Coastguard Worker *
2008*6777b538SAndroid Build Coastguard Worker * Returns the new input stream or NULL in case of error
2009*6777b538SAndroid Build Coastguard Worker */
2010*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr
xmlNewInputFromFile(xmlParserCtxtPtr ctxt,const char * filename)2011*6777b538SAndroid Build Coastguard Worker xmlNewInputFromFile(xmlParserCtxtPtr ctxt, const char *filename) {
2012*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferPtr buf;
2013*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr inputStream;
2014*6777b538SAndroid Build Coastguard Worker xmlChar *URI = NULL;
2015*6777b538SAndroid Build Coastguard Worker int code;
2016*6777b538SAndroid Build Coastguard Worker
2017*6777b538SAndroid Build Coastguard Worker if ((ctxt == NULL) || (filename == NULL))
2018*6777b538SAndroid Build Coastguard Worker return(NULL);
2019*6777b538SAndroid Build Coastguard Worker
2020*6777b538SAndroid Build Coastguard Worker code = xmlParserInputBufferCreateFilenameSafe(filename,
2021*6777b538SAndroid Build Coastguard Worker XML_CHAR_ENCODING_NONE, &buf);
2022*6777b538SAndroid Build Coastguard Worker if (buf == NULL) {
2023*6777b538SAndroid Build Coastguard Worker xmlCtxtErrIO(ctxt, code, filename);
2024*6777b538SAndroid Build Coastguard Worker return(NULL);
2025*6777b538SAndroid Build Coastguard Worker }
2026*6777b538SAndroid Build Coastguard Worker
2027*6777b538SAndroid Build Coastguard Worker inputStream = xmlNewInputStream(ctxt);
2028*6777b538SAndroid Build Coastguard Worker if (inputStream == NULL) {
2029*6777b538SAndroid Build Coastguard Worker xmlFreeParserInputBuffer(buf);
2030*6777b538SAndroid Build Coastguard Worker return(NULL);
2031*6777b538SAndroid Build Coastguard Worker }
2032*6777b538SAndroid Build Coastguard Worker
2033*6777b538SAndroid Build Coastguard Worker inputStream->buf = buf;
2034*6777b538SAndroid Build Coastguard Worker inputStream = xmlCheckHTTPInput(ctxt, inputStream);
2035*6777b538SAndroid Build Coastguard Worker if (inputStream == NULL)
2036*6777b538SAndroid Build Coastguard Worker return(NULL);
2037*6777b538SAndroid Build Coastguard Worker
2038*6777b538SAndroid Build Coastguard Worker if (inputStream->filename == NULL)
2039*6777b538SAndroid Build Coastguard Worker URI = xmlStrdup((xmlChar *) filename);
2040*6777b538SAndroid Build Coastguard Worker else
2041*6777b538SAndroid Build Coastguard Worker URI = xmlStrdup((xmlChar *) inputStream->filename);
2042*6777b538SAndroid Build Coastguard Worker if (inputStream->filename != NULL) xmlFree((char *)inputStream->filename);
2043*6777b538SAndroid Build Coastguard Worker inputStream->filename = (char *) xmlCanonicPath((const xmlChar *) URI);
2044*6777b538SAndroid Build Coastguard Worker if (URI != NULL) xmlFree((char *) URI);
2045*6777b538SAndroid Build Coastguard Worker
2046*6777b538SAndroid Build Coastguard Worker xmlBufResetInput(inputStream->buf->buffer, inputStream);
2047*6777b538SAndroid Build Coastguard Worker
2048*6777b538SAndroid Build Coastguard Worker return(inputStream);
2049*6777b538SAndroid Build Coastguard Worker }
2050*6777b538SAndroid Build Coastguard Worker
2051*6777b538SAndroid Build Coastguard Worker /**
2052*6777b538SAndroid Build Coastguard Worker * xmlDefaultExternalEntityLoader:
2053*6777b538SAndroid Build Coastguard Worker * @URL: the URL for the entity to load
2054*6777b538SAndroid Build Coastguard Worker * @ID: the System ID for the entity to load
2055*6777b538SAndroid Build Coastguard Worker * @ctxt: the context in which the entity is called or NULL
2056*6777b538SAndroid Build Coastguard Worker *
2057*6777b538SAndroid Build Coastguard Worker * By default we don't load external entities, yet.
2058*6777b538SAndroid Build Coastguard Worker *
2059*6777b538SAndroid Build Coastguard Worker * Returns a new allocated xmlParserInputPtr, or NULL.
2060*6777b538SAndroid Build Coastguard Worker */
2061*6777b538SAndroid Build Coastguard Worker static xmlParserInputPtr
xmlDefaultExternalEntityLoader(const char * URL,const char * ID,xmlParserCtxtPtr ctxt)2062*6777b538SAndroid Build Coastguard Worker xmlDefaultExternalEntityLoader(const char *URL, const char *ID,
2063*6777b538SAndroid Build Coastguard Worker xmlParserCtxtPtr ctxt)
2064*6777b538SAndroid Build Coastguard Worker {
2065*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr ret = NULL;
2066*6777b538SAndroid Build Coastguard Worker xmlChar *resource = NULL;
2067*6777b538SAndroid Build Coastguard Worker
2068*6777b538SAndroid Build Coastguard Worker if (URL == NULL)
2069*6777b538SAndroid Build Coastguard Worker return(NULL);
2070*6777b538SAndroid Build Coastguard Worker
2071*6777b538SAndroid Build Coastguard Worker if ((ctxt != NULL) && (ctxt->options & XML_PARSE_NONET)) {
2072*6777b538SAndroid Build Coastguard Worker int options = ctxt->options;
2073*6777b538SAndroid Build Coastguard Worker
2074*6777b538SAndroid Build Coastguard Worker ctxt->options -= XML_PARSE_NONET;
2075*6777b538SAndroid Build Coastguard Worker ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt);
2076*6777b538SAndroid Build Coastguard Worker ctxt->options = options;
2077*6777b538SAndroid Build Coastguard Worker return(ret);
2078*6777b538SAndroid Build Coastguard Worker }
2079*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_CATALOG_ENABLED
2080*6777b538SAndroid Build Coastguard Worker resource = xmlResolveResourceFromCatalog(URL, ID, ctxt);
2081*6777b538SAndroid Build Coastguard Worker #endif
2082*6777b538SAndroid Build Coastguard Worker
2083*6777b538SAndroid Build Coastguard Worker if (resource == NULL)
2084*6777b538SAndroid Build Coastguard Worker resource = (xmlChar *) URL;
2085*6777b538SAndroid Build Coastguard Worker
2086*6777b538SAndroid Build Coastguard Worker ret = xmlNewInputFromFile(ctxt, (const char *) resource);
2087*6777b538SAndroid Build Coastguard Worker if ((resource != NULL) && (resource != (xmlChar *) URL))
2088*6777b538SAndroid Build Coastguard Worker xmlFree(resource);
2089*6777b538SAndroid Build Coastguard Worker return (ret);
2090*6777b538SAndroid Build Coastguard Worker }
2091*6777b538SAndroid Build Coastguard Worker
2092*6777b538SAndroid Build Coastguard Worker /**
2093*6777b538SAndroid Build Coastguard Worker * xmlNoNetExternalEntityLoader:
2094*6777b538SAndroid Build Coastguard Worker * @URL: the URL for the entity to load
2095*6777b538SAndroid Build Coastguard Worker * @ID: the System ID for the entity to load
2096*6777b538SAndroid Build Coastguard Worker * @ctxt: the context in which the entity is called or NULL
2097*6777b538SAndroid Build Coastguard Worker *
2098*6777b538SAndroid Build Coastguard Worker * A specific entity loader disabling network accesses, though still
2099*6777b538SAndroid Build Coastguard Worker * allowing local catalog accesses for resolution.
2100*6777b538SAndroid Build Coastguard Worker *
2101*6777b538SAndroid Build Coastguard Worker * Returns a new allocated xmlParserInputPtr, or NULL.
2102*6777b538SAndroid Build Coastguard Worker */
2103*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr
xmlNoNetExternalEntityLoader(const char * URL,const char * ID,xmlParserCtxtPtr ctxt)2104*6777b538SAndroid Build Coastguard Worker xmlNoNetExternalEntityLoader(const char *URL, const char *ID,
2105*6777b538SAndroid Build Coastguard Worker xmlParserCtxtPtr ctxt) {
2106*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr input = NULL;
2107*6777b538SAndroid Build Coastguard Worker xmlChar *resource = NULL;
2108*6777b538SAndroid Build Coastguard Worker
2109*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_CATALOG_ENABLED
2110*6777b538SAndroid Build Coastguard Worker resource = xmlResolveResourceFromCatalog(URL, ID, ctxt);
2111*6777b538SAndroid Build Coastguard Worker #endif
2112*6777b538SAndroid Build Coastguard Worker
2113*6777b538SAndroid Build Coastguard Worker if (resource == NULL)
2114*6777b538SAndroid Build Coastguard Worker resource = (xmlChar *) URL;
2115*6777b538SAndroid Build Coastguard Worker
2116*6777b538SAndroid Build Coastguard Worker if (resource != NULL) {
2117*6777b538SAndroid Build Coastguard Worker if ((!xmlStrncasecmp(BAD_CAST resource, BAD_CAST "ftp://", 6)) ||
2118*6777b538SAndroid Build Coastguard Worker (!xmlStrncasecmp(BAD_CAST resource, BAD_CAST "http://", 7))) {
2119*6777b538SAndroid Build Coastguard Worker xmlCtxtErrIO(ctxt, XML_IO_NETWORK_ATTEMPT,
2120*6777b538SAndroid Build Coastguard Worker (const char *) resource);
2121*6777b538SAndroid Build Coastguard Worker /*
2122*6777b538SAndroid Build Coastguard Worker * Also forward the error directly to the global error
2123*6777b538SAndroid Build Coastguard Worker * handler, which the XML::LibXML test suite expects.
2124*6777b538SAndroid Build Coastguard Worker */
2125*6777b538SAndroid Build Coastguard Worker __xmlIOErr(XML_FROM_IO, XML_IO_NETWORK_ATTEMPT,
2126*6777b538SAndroid Build Coastguard Worker (const char *) resource);
2127*6777b538SAndroid Build Coastguard Worker if (resource != (xmlChar *) URL)
2128*6777b538SAndroid Build Coastguard Worker xmlFree(resource);
2129*6777b538SAndroid Build Coastguard Worker return(NULL);
2130*6777b538SAndroid Build Coastguard Worker }
2131*6777b538SAndroid Build Coastguard Worker }
2132*6777b538SAndroid Build Coastguard Worker input = xmlDefaultExternalEntityLoader((const char *) resource, ID, ctxt);
2133*6777b538SAndroid Build Coastguard Worker if (resource != (xmlChar *) URL)
2134*6777b538SAndroid Build Coastguard Worker xmlFree(resource);
2135*6777b538SAndroid Build Coastguard Worker return(input);
2136*6777b538SAndroid Build Coastguard Worker }
2137*6777b538SAndroid Build Coastguard Worker
2138*6777b538SAndroid Build Coastguard Worker /*
2139*6777b538SAndroid Build Coastguard Worker * This global has to die eventually
2140*6777b538SAndroid Build Coastguard Worker */
2141*6777b538SAndroid Build Coastguard Worker static xmlExternalEntityLoader
2142*6777b538SAndroid Build Coastguard Worker xmlCurrentExternalEntityLoader = xmlDefaultExternalEntityLoader;
2143*6777b538SAndroid Build Coastguard Worker
2144*6777b538SAndroid Build Coastguard Worker /**
2145*6777b538SAndroid Build Coastguard Worker * xmlSetExternalEntityLoader:
2146*6777b538SAndroid Build Coastguard Worker * @f: the new entity resolver function
2147*6777b538SAndroid Build Coastguard Worker *
2148*6777b538SAndroid Build Coastguard Worker * Changes the defaultexternal entity resolver function for the application
2149*6777b538SAndroid Build Coastguard Worker */
2150*6777b538SAndroid Build Coastguard Worker void
xmlSetExternalEntityLoader(xmlExternalEntityLoader f)2151*6777b538SAndroid Build Coastguard Worker xmlSetExternalEntityLoader(xmlExternalEntityLoader f) {
2152*6777b538SAndroid Build Coastguard Worker xmlCurrentExternalEntityLoader = f;
2153*6777b538SAndroid Build Coastguard Worker }
2154*6777b538SAndroid Build Coastguard Worker
2155*6777b538SAndroid Build Coastguard Worker /**
2156*6777b538SAndroid Build Coastguard Worker * xmlGetExternalEntityLoader:
2157*6777b538SAndroid Build Coastguard Worker *
2158*6777b538SAndroid Build Coastguard Worker * Get the default external entity resolver function for the application
2159*6777b538SAndroid Build Coastguard Worker *
2160*6777b538SAndroid Build Coastguard Worker * Returns the xmlExternalEntityLoader function pointer
2161*6777b538SAndroid Build Coastguard Worker */
2162*6777b538SAndroid Build Coastguard Worker xmlExternalEntityLoader
xmlGetExternalEntityLoader(void)2163*6777b538SAndroid Build Coastguard Worker xmlGetExternalEntityLoader(void) {
2164*6777b538SAndroid Build Coastguard Worker return(xmlCurrentExternalEntityLoader);
2165*6777b538SAndroid Build Coastguard Worker }
2166*6777b538SAndroid Build Coastguard Worker
2167*6777b538SAndroid Build Coastguard Worker /**
2168*6777b538SAndroid Build Coastguard Worker * xmlLoadExternalEntity:
2169*6777b538SAndroid Build Coastguard Worker * @URL: the URL for the entity to load
2170*6777b538SAndroid Build Coastguard Worker * @ID: the Public ID for the entity to load
2171*6777b538SAndroid Build Coastguard Worker * @ctxt: the context in which the entity is called or NULL
2172*6777b538SAndroid Build Coastguard Worker *
2173*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Use xmlNewInputURL.
2174*6777b538SAndroid Build Coastguard Worker *
2175*6777b538SAndroid Build Coastguard Worker * Returns the xmlParserInputPtr or NULL
2176*6777b538SAndroid Build Coastguard Worker */
2177*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr
xmlLoadExternalEntity(const char * URL,const char * ID,xmlParserCtxtPtr ctxt)2178*6777b538SAndroid Build Coastguard Worker xmlLoadExternalEntity(const char *URL, const char *ID,
2179*6777b538SAndroid Build Coastguard Worker xmlParserCtxtPtr ctxt) {
2180*6777b538SAndroid Build Coastguard Worker char *canonicFilename;
2181*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr ret;
2182*6777b538SAndroid Build Coastguard Worker
2183*6777b538SAndroid Build Coastguard Worker if (URL == NULL)
2184*6777b538SAndroid Build Coastguard Worker return(NULL);
2185*6777b538SAndroid Build Coastguard Worker
2186*6777b538SAndroid Build Coastguard Worker canonicFilename = (char *) xmlCanonicPath((const xmlChar *) URL);
2187*6777b538SAndroid Build Coastguard Worker if (canonicFilename == NULL) {
2188*6777b538SAndroid Build Coastguard Worker xmlCtxtErrMemory(ctxt);
2189*6777b538SAndroid Build Coastguard Worker return(NULL);
2190*6777b538SAndroid Build Coastguard Worker }
2191*6777b538SAndroid Build Coastguard Worker
2192*6777b538SAndroid Build Coastguard Worker ret = xmlCurrentExternalEntityLoader(canonicFilename, ID, ctxt);
2193*6777b538SAndroid Build Coastguard Worker xmlFree(canonicFilename);
2194*6777b538SAndroid Build Coastguard Worker return(ret);
2195*6777b538SAndroid Build Coastguard Worker }
2196*6777b538SAndroid Build Coastguard Worker
2197*6777b538SAndroid Build Coastguard Worker /************************************************************************
2198*6777b538SAndroid Build Coastguard Worker * *
2199*6777b538SAndroid Build Coastguard Worker * Commodity functions to handle parser contexts *
2200*6777b538SAndroid Build Coastguard Worker * *
2201*6777b538SAndroid Build Coastguard Worker ************************************************************************/
2202*6777b538SAndroid Build Coastguard Worker
2203*6777b538SAndroid Build Coastguard Worker /**
2204*6777b538SAndroid Build Coastguard Worker * xmlInitSAXParserCtxt:
2205*6777b538SAndroid Build Coastguard Worker * @ctxt: XML parser context
2206*6777b538SAndroid Build Coastguard Worker * @sax: SAX handlert
2207*6777b538SAndroid Build Coastguard Worker * @userData: user data
2208*6777b538SAndroid Build Coastguard Worker *
2209*6777b538SAndroid Build Coastguard Worker * Initialize a SAX parser context
2210*6777b538SAndroid Build Coastguard Worker *
2211*6777b538SAndroid Build Coastguard Worker * Returns 0 in case of success and -1 in case of error
2212*6777b538SAndroid Build Coastguard Worker */
2213*6777b538SAndroid Build Coastguard Worker
2214*6777b538SAndroid Build Coastguard Worker static int
xmlInitSAXParserCtxt(xmlParserCtxtPtr ctxt,const xmlSAXHandler * sax,void * userData)2215*6777b538SAndroid Build Coastguard Worker xmlInitSAXParserCtxt(xmlParserCtxtPtr ctxt, const xmlSAXHandler *sax,
2216*6777b538SAndroid Build Coastguard Worker void *userData)
2217*6777b538SAndroid Build Coastguard Worker {
2218*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr input;
2219*6777b538SAndroid Build Coastguard Worker
2220*6777b538SAndroid Build Coastguard Worker if (ctxt == NULL)
2221*6777b538SAndroid Build Coastguard Worker return(-1);
2222*6777b538SAndroid Build Coastguard Worker
2223*6777b538SAndroid Build Coastguard Worker if (ctxt->dict == NULL)
2224*6777b538SAndroid Build Coastguard Worker ctxt->dict = xmlDictCreate();
2225*6777b538SAndroid Build Coastguard Worker if (ctxt->dict == NULL)
2226*6777b538SAndroid Build Coastguard Worker return(-1);
2227*6777b538SAndroid Build Coastguard Worker xmlDictSetLimit(ctxt->dict, XML_MAX_DICTIONARY_LIMIT);
2228*6777b538SAndroid Build Coastguard Worker
2229*6777b538SAndroid Build Coastguard Worker if (ctxt->sax == NULL)
2230*6777b538SAndroid Build Coastguard Worker ctxt->sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler));
2231*6777b538SAndroid Build Coastguard Worker if (ctxt->sax == NULL)
2232*6777b538SAndroid Build Coastguard Worker return(-1);
2233*6777b538SAndroid Build Coastguard Worker if (sax == NULL) {
2234*6777b538SAndroid Build Coastguard Worker memset(ctxt->sax, 0, sizeof(xmlSAXHandler));
2235*6777b538SAndroid Build Coastguard Worker xmlSAXVersion(ctxt->sax, 2);
2236*6777b538SAndroid Build Coastguard Worker ctxt->userData = ctxt;
2237*6777b538SAndroid Build Coastguard Worker } else {
2238*6777b538SAndroid Build Coastguard Worker if (sax->initialized == XML_SAX2_MAGIC) {
2239*6777b538SAndroid Build Coastguard Worker memcpy(ctxt->sax, sax, sizeof(xmlSAXHandler));
2240*6777b538SAndroid Build Coastguard Worker } else {
2241*6777b538SAndroid Build Coastguard Worker memset(ctxt->sax, 0, sizeof(xmlSAXHandler));
2242*6777b538SAndroid Build Coastguard Worker memcpy(ctxt->sax, sax, sizeof(xmlSAXHandlerV1));
2243*6777b538SAndroid Build Coastguard Worker }
2244*6777b538SAndroid Build Coastguard Worker ctxt->userData = userData ? userData : ctxt;
2245*6777b538SAndroid Build Coastguard Worker }
2246*6777b538SAndroid Build Coastguard Worker
2247*6777b538SAndroid Build Coastguard Worker ctxt->maxatts = 0;
2248*6777b538SAndroid Build Coastguard Worker ctxt->atts = NULL;
2249*6777b538SAndroid Build Coastguard Worker /* Allocate the Input stack */
2250*6777b538SAndroid Build Coastguard Worker if (ctxt->inputTab == NULL) {
2251*6777b538SAndroid Build Coastguard Worker ctxt->inputTab = (xmlParserInputPtr *)
2252*6777b538SAndroid Build Coastguard Worker xmlMalloc(5 * sizeof(xmlParserInputPtr));
2253*6777b538SAndroid Build Coastguard Worker ctxt->inputMax = 5;
2254*6777b538SAndroid Build Coastguard Worker }
2255*6777b538SAndroid Build Coastguard Worker if (ctxt->inputTab == NULL)
2256*6777b538SAndroid Build Coastguard Worker return(-1);
2257*6777b538SAndroid Build Coastguard Worker while ((input = inputPop(ctxt)) != NULL) { /* Non consuming */
2258*6777b538SAndroid Build Coastguard Worker xmlFreeInputStream(input);
2259*6777b538SAndroid Build Coastguard Worker }
2260*6777b538SAndroid Build Coastguard Worker ctxt->inputNr = 0;
2261*6777b538SAndroid Build Coastguard Worker ctxt->input = NULL;
2262*6777b538SAndroid Build Coastguard Worker
2263*6777b538SAndroid Build Coastguard Worker ctxt->version = NULL;
2264*6777b538SAndroid Build Coastguard Worker ctxt->encoding = NULL;
2265*6777b538SAndroid Build Coastguard Worker ctxt->standalone = -1;
2266*6777b538SAndroid Build Coastguard Worker ctxt->hasExternalSubset = 0;
2267*6777b538SAndroid Build Coastguard Worker ctxt->hasPErefs = 0;
2268*6777b538SAndroid Build Coastguard Worker ctxt->html = 0;
2269*6777b538SAndroid Build Coastguard Worker ctxt->instate = XML_PARSER_START;
2270*6777b538SAndroid Build Coastguard Worker
2271*6777b538SAndroid Build Coastguard Worker /* Allocate the Node stack */
2272*6777b538SAndroid Build Coastguard Worker if (ctxt->nodeTab == NULL) {
2273*6777b538SAndroid Build Coastguard Worker ctxt->nodeTab = (xmlNodePtr *) xmlMalloc(10 * sizeof(xmlNodePtr));
2274*6777b538SAndroid Build Coastguard Worker ctxt->nodeMax = 10;
2275*6777b538SAndroid Build Coastguard Worker }
2276*6777b538SAndroid Build Coastguard Worker if (ctxt->nodeTab == NULL)
2277*6777b538SAndroid Build Coastguard Worker return(-1);
2278*6777b538SAndroid Build Coastguard Worker ctxt->nodeNr = 0;
2279*6777b538SAndroid Build Coastguard Worker ctxt->node = NULL;
2280*6777b538SAndroid Build Coastguard Worker
2281*6777b538SAndroid Build Coastguard Worker /* Allocate the Name stack */
2282*6777b538SAndroid Build Coastguard Worker if (ctxt->nameTab == NULL) {
2283*6777b538SAndroid Build Coastguard Worker ctxt->nameTab = (const xmlChar **) xmlMalloc(10 * sizeof(xmlChar *));
2284*6777b538SAndroid Build Coastguard Worker ctxt->nameMax = 10;
2285*6777b538SAndroid Build Coastguard Worker }
2286*6777b538SAndroid Build Coastguard Worker if (ctxt->nameTab == NULL)
2287*6777b538SAndroid Build Coastguard Worker return(-1);
2288*6777b538SAndroid Build Coastguard Worker ctxt->nameNr = 0;
2289*6777b538SAndroid Build Coastguard Worker ctxt->name = NULL;
2290*6777b538SAndroid Build Coastguard Worker
2291*6777b538SAndroid Build Coastguard Worker /* Allocate the space stack */
2292*6777b538SAndroid Build Coastguard Worker if (ctxt->spaceTab == NULL) {
2293*6777b538SAndroid Build Coastguard Worker ctxt->spaceTab = (int *) xmlMalloc(10 * sizeof(int));
2294*6777b538SAndroid Build Coastguard Worker ctxt->spaceMax = 10;
2295*6777b538SAndroid Build Coastguard Worker }
2296*6777b538SAndroid Build Coastguard Worker if (ctxt->spaceTab == NULL)
2297*6777b538SAndroid Build Coastguard Worker return(-1);
2298*6777b538SAndroid Build Coastguard Worker ctxt->spaceNr = 1;
2299*6777b538SAndroid Build Coastguard Worker ctxt->spaceMax = 10;
2300*6777b538SAndroid Build Coastguard Worker ctxt->spaceTab[0] = -1;
2301*6777b538SAndroid Build Coastguard Worker ctxt->space = &ctxt->spaceTab[0];
2302*6777b538SAndroid Build Coastguard Worker ctxt->myDoc = NULL;
2303*6777b538SAndroid Build Coastguard Worker ctxt->wellFormed = 1;
2304*6777b538SAndroid Build Coastguard Worker ctxt->nsWellFormed = 1;
2305*6777b538SAndroid Build Coastguard Worker ctxt->valid = 1;
2306*6777b538SAndroid Build Coastguard Worker
2307*6777b538SAndroid Build Coastguard Worker ctxt->options = XML_PARSE_NODICT;
2308*6777b538SAndroid Build Coastguard Worker
2309*6777b538SAndroid Build Coastguard Worker /*
2310*6777b538SAndroid Build Coastguard Worker * Initialize some parser options from deprecated global variables.
2311*6777b538SAndroid Build Coastguard Worker * Note that the "modern" API taking options arguments or
2312*6777b538SAndroid Build Coastguard Worker * xmlCtxtSetOptions will ignore these defaults. They're only
2313*6777b538SAndroid Build Coastguard Worker * relevant if old API functions like xmlParseFile are used.
2314*6777b538SAndroid Build Coastguard Worker */
2315*6777b538SAndroid Build Coastguard Worker ctxt->loadsubset = xmlLoadExtDtdDefaultValue;
2316*6777b538SAndroid Build Coastguard Worker if (ctxt->loadsubset) {
2317*6777b538SAndroid Build Coastguard Worker ctxt->options |= XML_PARSE_DTDLOAD;
2318*6777b538SAndroid Build Coastguard Worker }
2319*6777b538SAndroid Build Coastguard Worker ctxt->validate = xmlDoValidityCheckingDefaultValue;
2320*6777b538SAndroid Build Coastguard Worker if (ctxt->validate) {
2321*6777b538SAndroid Build Coastguard Worker ctxt->options |= XML_PARSE_DTDVALID;
2322*6777b538SAndroid Build Coastguard Worker }
2323*6777b538SAndroid Build Coastguard Worker ctxt->pedantic = xmlPedanticParserDefaultValue;
2324*6777b538SAndroid Build Coastguard Worker if (ctxt->pedantic) {
2325*6777b538SAndroid Build Coastguard Worker ctxt->options |= XML_PARSE_PEDANTIC;
2326*6777b538SAndroid Build Coastguard Worker }
2327*6777b538SAndroid Build Coastguard Worker ctxt->linenumbers = xmlLineNumbersDefaultValue;
2328*6777b538SAndroid Build Coastguard Worker ctxt->keepBlanks = xmlKeepBlanksDefaultValue;
2329*6777b538SAndroid Build Coastguard Worker if (ctxt->keepBlanks == 0) {
2330*6777b538SAndroid Build Coastguard Worker ctxt->sax->ignorableWhitespace = xmlSAX2IgnorableWhitespace;
2331*6777b538SAndroid Build Coastguard Worker ctxt->options |= XML_PARSE_NOBLANKS;
2332*6777b538SAndroid Build Coastguard Worker }
2333*6777b538SAndroid Build Coastguard Worker ctxt->replaceEntities = xmlSubstituteEntitiesDefaultValue;
2334*6777b538SAndroid Build Coastguard Worker if (ctxt->replaceEntities) {
2335*6777b538SAndroid Build Coastguard Worker ctxt->options |= XML_PARSE_NOENT;
2336*6777b538SAndroid Build Coastguard Worker }
2337*6777b538SAndroid Build Coastguard Worker if (xmlGetWarningsDefaultValue == 0)
2338*6777b538SAndroid Build Coastguard Worker ctxt->options |= XML_PARSE_NOWARNING;
2339*6777b538SAndroid Build Coastguard Worker
2340*6777b538SAndroid Build Coastguard Worker ctxt->vctxt.flags = XML_VCTXT_USE_PCTXT;
2341*6777b538SAndroid Build Coastguard Worker ctxt->vctxt.userData = ctxt;
2342*6777b538SAndroid Build Coastguard Worker ctxt->vctxt.error = xmlParserValidityError;
2343*6777b538SAndroid Build Coastguard Worker ctxt->vctxt.warning = xmlParserValidityWarning;
2344*6777b538SAndroid Build Coastguard Worker
2345*6777b538SAndroid Build Coastguard Worker ctxt->record_info = 0;
2346*6777b538SAndroid Build Coastguard Worker ctxt->checkIndex = 0;
2347*6777b538SAndroid Build Coastguard Worker ctxt->inSubset = 0;
2348*6777b538SAndroid Build Coastguard Worker ctxt->errNo = XML_ERR_OK;
2349*6777b538SAndroid Build Coastguard Worker ctxt->depth = 0;
2350*6777b538SAndroid Build Coastguard Worker ctxt->catalogs = NULL;
2351*6777b538SAndroid Build Coastguard Worker ctxt->sizeentities = 0;
2352*6777b538SAndroid Build Coastguard Worker ctxt->sizeentcopy = 0;
2353*6777b538SAndroid Build Coastguard Worker ctxt->input_id = 1;
2354*6777b538SAndroid Build Coastguard Worker ctxt->maxAmpl = XML_MAX_AMPLIFICATION_DEFAULT;
2355*6777b538SAndroid Build Coastguard Worker xmlInitNodeInfoSeq(&ctxt->node_seq);
2356*6777b538SAndroid Build Coastguard Worker
2357*6777b538SAndroid Build Coastguard Worker if (ctxt->nsdb == NULL) {
2358*6777b538SAndroid Build Coastguard Worker ctxt->nsdb = xmlParserNsCreate();
2359*6777b538SAndroid Build Coastguard Worker if (ctxt->nsdb == NULL) {
2360*6777b538SAndroid Build Coastguard Worker xmlCtxtErrMemory(ctxt);
2361*6777b538SAndroid Build Coastguard Worker return(-1);
2362*6777b538SAndroid Build Coastguard Worker }
2363*6777b538SAndroid Build Coastguard Worker }
2364*6777b538SAndroid Build Coastguard Worker
2365*6777b538SAndroid Build Coastguard Worker return(0);
2366*6777b538SAndroid Build Coastguard Worker }
2367*6777b538SAndroid Build Coastguard Worker
2368*6777b538SAndroid Build Coastguard Worker /**
2369*6777b538SAndroid Build Coastguard Worker * xmlInitParserCtxt:
2370*6777b538SAndroid Build Coastguard Worker * @ctxt: an XML parser context
2371*6777b538SAndroid Build Coastguard Worker *
2372*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Internal function which will be made private in a future
2373*6777b538SAndroid Build Coastguard Worker * version.
2374*6777b538SAndroid Build Coastguard Worker *
2375*6777b538SAndroid Build Coastguard Worker * Initialize a parser context
2376*6777b538SAndroid Build Coastguard Worker *
2377*6777b538SAndroid Build Coastguard Worker * Returns 0 in case of success and -1 in case of error
2378*6777b538SAndroid Build Coastguard Worker */
2379*6777b538SAndroid Build Coastguard Worker
2380*6777b538SAndroid Build Coastguard Worker int
xmlInitParserCtxt(xmlParserCtxtPtr ctxt)2381*6777b538SAndroid Build Coastguard Worker xmlInitParserCtxt(xmlParserCtxtPtr ctxt)
2382*6777b538SAndroid Build Coastguard Worker {
2383*6777b538SAndroid Build Coastguard Worker return(xmlInitSAXParserCtxt(ctxt, NULL, NULL));
2384*6777b538SAndroid Build Coastguard Worker }
2385*6777b538SAndroid Build Coastguard Worker
2386*6777b538SAndroid Build Coastguard Worker /**
2387*6777b538SAndroid Build Coastguard Worker * xmlFreeParserCtxt:
2388*6777b538SAndroid Build Coastguard Worker * @ctxt: an XML parser context
2389*6777b538SAndroid Build Coastguard Worker *
2390*6777b538SAndroid Build Coastguard Worker * Free all the memory used by a parser context. However the parsed
2391*6777b538SAndroid Build Coastguard Worker * document in ctxt->myDoc is not freed.
2392*6777b538SAndroid Build Coastguard Worker */
2393*6777b538SAndroid Build Coastguard Worker
2394*6777b538SAndroid Build Coastguard Worker void
xmlFreeParserCtxt(xmlParserCtxtPtr ctxt)2395*6777b538SAndroid Build Coastguard Worker xmlFreeParserCtxt(xmlParserCtxtPtr ctxt)
2396*6777b538SAndroid Build Coastguard Worker {
2397*6777b538SAndroid Build Coastguard Worker xmlParserInputPtr input;
2398*6777b538SAndroid Build Coastguard Worker
2399*6777b538SAndroid Build Coastguard Worker if (ctxt == NULL) return;
2400*6777b538SAndroid Build Coastguard Worker
2401*6777b538SAndroid Build Coastguard Worker while ((input = inputPop(ctxt)) != NULL) { /* Non consuming */
2402*6777b538SAndroid Build Coastguard Worker xmlFreeInputStream(input);
2403*6777b538SAndroid Build Coastguard Worker }
2404*6777b538SAndroid Build Coastguard Worker if (ctxt->spaceTab != NULL) xmlFree(ctxt->spaceTab);
2405*6777b538SAndroid Build Coastguard Worker if (ctxt->nameTab != NULL) xmlFree((xmlChar * *)ctxt->nameTab);
2406*6777b538SAndroid Build Coastguard Worker if (ctxt->nodeTab != NULL) xmlFree(ctxt->nodeTab);
2407*6777b538SAndroid Build Coastguard Worker if (ctxt->nodeInfoTab != NULL) xmlFree(ctxt->nodeInfoTab);
2408*6777b538SAndroid Build Coastguard Worker if (ctxt->inputTab != NULL) xmlFree(ctxt->inputTab);
2409*6777b538SAndroid Build Coastguard Worker if (ctxt->version != NULL) xmlFree((char *) ctxt->version);
2410*6777b538SAndroid Build Coastguard Worker if (ctxt->encoding != NULL) xmlFree((char *) ctxt->encoding);
2411*6777b538SAndroid Build Coastguard Worker if (ctxt->extSubURI != NULL) xmlFree((char *) ctxt->extSubURI);
2412*6777b538SAndroid Build Coastguard Worker if (ctxt->extSubSystem != NULL) xmlFree((char *) ctxt->extSubSystem);
2413*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_SAX1_ENABLED
2414*6777b538SAndroid Build Coastguard Worker if ((ctxt->sax != NULL) &&
2415*6777b538SAndroid Build Coastguard Worker (ctxt->sax != (xmlSAXHandlerPtr) &xmlDefaultSAXHandler))
2416*6777b538SAndroid Build Coastguard Worker #else
2417*6777b538SAndroid Build Coastguard Worker if (ctxt->sax != NULL)
2418*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_SAX1_ENABLED */
2419*6777b538SAndroid Build Coastguard Worker xmlFree(ctxt->sax);
2420*6777b538SAndroid Build Coastguard Worker if (ctxt->vctxt.nodeTab != NULL) xmlFree(ctxt->vctxt.nodeTab);
2421*6777b538SAndroid Build Coastguard Worker if (ctxt->atts != NULL) xmlFree((xmlChar * *)ctxt->atts);
2422*6777b538SAndroid Build Coastguard Worker if (ctxt->dict != NULL) xmlDictFree(ctxt->dict);
2423*6777b538SAndroid Build Coastguard Worker if (ctxt->nsTab != NULL) xmlFree(ctxt->nsTab);
2424*6777b538SAndroid Build Coastguard Worker if (ctxt->nsdb != NULL) xmlParserNsFree(ctxt->nsdb);
2425*6777b538SAndroid Build Coastguard Worker if (ctxt->attrHash != NULL) xmlFree(ctxt->attrHash);
2426*6777b538SAndroid Build Coastguard Worker if (ctxt->pushTab != NULL) xmlFree(ctxt->pushTab);
2427*6777b538SAndroid Build Coastguard Worker if (ctxt->attallocs != NULL) xmlFree(ctxt->attallocs);
2428*6777b538SAndroid Build Coastguard Worker if (ctxt->attsDefault != NULL)
2429*6777b538SAndroid Build Coastguard Worker xmlHashFree(ctxt->attsDefault, xmlHashDefaultDeallocator);
2430*6777b538SAndroid Build Coastguard Worker if (ctxt->attsSpecial != NULL)
2431*6777b538SAndroid Build Coastguard Worker xmlHashFree(ctxt->attsSpecial, NULL);
2432*6777b538SAndroid Build Coastguard Worker if (ctxt->freeElems != NULL) {
2433*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur, next;
2434*6777b538SAndroid Build Coastguard Worker
2435*6777b538SAndroid Build Coastguard Worker cur = ctxt->freeElems;
2436*6777b538SAndroid Build Coastguard Worker while (cur != NULL) {
2437*6777b538SAndroid Build Coastguard Worker next = cur->next;
2438*6777b538SAndroid Build Coastguard Worker xmlFree(cur);
2439*6777b538SAndroid Build Coastguard Worker cur = next;
2440*6777b538SAndroid Build Coastguard Worker }
2441*6777b538SAndroid Build Coastguard Worker }
2442*6777b538SAndroid Build Coastguard Worker if (ctxt->freeAttrs != NULL) {
2443*6777b538SAndroid Build Coastguard Worker xmlAttrPtr cur, next;
2444*6777b538SAndroid Build Coastguard Worker
2445*6777b538SAndroid Build Coastguard Worker cur = ctxt->freeAttrs;
2446*6777b538SAndroid Build Coastguard Worker while (cur != NULL) {
2447*6777b538SAndroid Build Coastguard Worker next = cur->next;
2448*6777b538SAndroid Build Coastguard Worker xmlFree(cur);
2449*6777b538SAndroid Build Coastguard Worker cur = next;
2450*6777b538SAndroid Build Coastguard Worker }
2451*6777b538SAndroid Build Coastguard Worker }
2452*6777b538SAndroid Build Coastguard Worker /*
2453*6777b538SAndroid Build Coastguard Worker * cleanup the error strings
2454*6777b538SAndroid Build Coastguard Worker */
2455*6777b538SAndroid Build Coastguard Worker if (ctxt->lastError.message != NULL)
2456*6777b538SAndroid Build Coastguard Worker xmlFree(ctxt->lastError.message);
2457*6777b538SAndroid Build Coastguard Worker if (ctxt->lastError.file != NULL)
2458*6777b538SAndroid Build Coastguard Worker xmlFree(ctxt->lastError.file);
2459*6777b538SAndroid Build Coastguard Worker if (ctxt->lastError.str1 != NULL)
2460*6777b538SAndroid Build Coastguard Worker xmlFree(ctxt->lastError.str1);
2461*6777b538SAndroid Build Coastguard Worker if (ctxt->lastError.str2 != NULL)
2462*6777b538SAndroid Build Coastguard Worker xmlFree(ctxt->lastError.str2);
2463*6777b538SAndroid Build Coastguard Worker if (ctxt->lastError.str3 != NULL)
2464*6777b538SAndroid Build Coastguard Worker xmlFree(ctxt->lastError.str3);
2465*6777b538SAndroid Build Coastguard Worker
2466*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_CATALOG_ENABLED
2467*6777b538SAndroid Build Coastguard Worker if (ctxt->catalogs != NULL)
2468*6777b538SAndroid Build Coastguard Worker xmlCatalogFreeLocal(ctxt->catalogs);
2469*6777b538SAndroid Build Coastguard Worker #endif
2470*6777b538SAndroid Build Coastguard Worker xmlFree(ctxt);
2471*6777b538SAndroid Build Coastguard Worker }
2472*6777b538SAndroid Build Coastguard Worker
2473*6777b538SAndroid Build Coastguard Worker /**
2474*6777b538SAndroid Build Coastguard Worker * xmlNewParserCtxt:
2475*6777b538SAndroid Build Coastguard Worker *
2476*6777b538SAndroid Build Coastguard Worker * Allocate and initialize a new parser context.
2477*6777b538SAndroid Build Coastguard Worker *
2478*6777b538SAndroid Build Coastguard Worker * Returns the xmlParserCtxtPtr or NULL
2479*6777b538SAndroid Build Coastguard Worker */
2480*6777b538SAndroid Build Coastguard Worker
2481*6777b538SAndroid Build Coastguard Worker xmlParserCtxtPtr
xmlNewParserCtxt(void)2482*6777b538SAndroid Build Coastguard Worker xmlNewParserCtxt(void)
2483*6777b538SAndroid Build Coastguard Worker {
2484*6777b538SAndroid Build Coastguard Worker return(xmlNewSAXParserCtxt(NULL, NULL));
2485*6777b538SAndroid Build Coastguard Worker }
2486*6777b538SAndroid Build Coastguard Worker
2487*6777b538SAndroid Build Coastguard Worker /**
2488*6777b538SAndroid Build Coastguard Worker * xmlNewSAXParserCtxt:
2489*6777b538SAndroid Build Coastguard Worker * @sax: SAX handler
2490*6777b538SAndroid Build Coastguard Worker * @userData: user data
2491*6777b538SAndroid Build Coastguard Worker *
2492*6777b538SAndroid Build Coastguard Worker * Allocate and initialize a new SAX parser context. If userData is NULL,
2493*6777b538SAndroid Build Coastguard Worker * the parser context will be passed as user data.
2494*6777b538SAndroid Build Coastguard Worker *
2495*6777b538SAndroid Build Coastguard Worker * Available since 2.11.0. If you want support older versions,
2496*6777b538SAndroid Build Coastguard Worker * it's best to invoke xmlNewParserCtxt and set ctxt->sax with
2497*6777b538SAndroid Build Coastguard Worker * struct assignment.
2498*6777b538SAndroid Build Coastguard Worker *
2499*6777b538SAndroid Build Coastguard Worker * Returns the xmlParserCtxtPtr or NULL if memory allocation failed.
2500*6777b538SAndroid Build Coastguard Worker */
2501*6777b538SAndroid Build Coastguard Worker
2502*6777b538SAndroid Build Coastguard Worker xmlParserCtxtPtr
xmlNewSAXParserCtxt(const xmlSAXHandler * sax,void * userData)2503*6777b538SAndroid Build Coastguard Worker xmlNewSAXParserCtxt(const xmlSAXHandler *sax, void *userData)
2504*6777b538SAndroid Build Coastguard Worker {
2505*6777b538SAndroid Build Coastguard Worker xmlParserCtxtPtr ctxt;
2506*6777b538SAndroid Build Coastguard Worker
2507*6777b538SAndroid Build Coastguard Worker xmlInitParser();
2508*6777b538SAndroid Build Coastguard Worker
2509*6777b538SAndroid Build Coastguard Worker ctxt = (xmlParserCtxtPtr) xmlMalloc(sizeof(xmlParserCtxt));
2510*6777b538SAndroid Build Coastguard Worker if (ctxt == NULL)
2511*6777b538SAndroid Build Coastguard Worker return(NULL);
2512*6777b538SAndroid Build Coastguard Worker memset(ctxt, 0, sizeof(xmlParserCtxt));
2513*6777b538SAndroid Build Coastguard Worker if (xmlInitSAXParserCtxt(ctxt, sax, userData) < 0) {
2514*6777b538SAndroid Build Coastguard Worker xmlFreeParserCtxt(ctxt);
2515*6777b538SAndroid Build Coastguard Worker return(NULL);
2516*6777b538SAndroid Build Coastguard Worker }
2517*6777b538SAndroid Build Coastguard Worker return(ctxt);
2518*6777b538SAndroid Build Coastguard Worker }
2519*6777b538SAndroid Build Coastguard Worker
2520*6777b538SAndroid Build Coastguard Worker /************************************************************************
2521*6777b538SAndroid Build Coastguard Worker * *
2522*6777b538SAndroid Build Coastguard Worker * Handling of node information *
2523*6777b538SAndroid Build Coastguard Worker * *
2524*6777b538SAndroid Build Coastguard Worker ************************************************************************/
2525*6777b538SAndroid Build Coastguard Worker
2526*6777b538SAndroid Build Coastguard Worker /**
2527*6777b538SAndroid Build Coastguard Worker * xmlClearParserCtxt:
2528*6777b538SAndroid Build Coastguard Worker * @ctxt: an XML parser context
2529*6777b538SAndroid Build Coastguard Worker *
2530*6777b538SAndroid Build Coastguard Worker * Clear (release owned resources) and reinitialize a parser context
2531*6777b538SAndroid Build Coastguard Worker */
2532*6777b538SAndroid Build Coastguard Worker
2533*6777b538SAndroid Build Coastguard Worker void
xmlClearParserCtxt(xmlParserCtxtPtr ctxt)2534*6777b538SAndroid Build Coastguard Worker xmlClearParserCtxt(xmlParserCtxtPtr ctxt)
2535*6777b538SAndroid Build Coastguard Worker {
2536*6777b538SAndroid Build Coastguard Worker if (ctxt==NULL)
2537*6777b538SAndroid Build Coastguard Worker return;
2538*6777b538SAndroid Build Coastguard Worker xmlClearNodeInfoSeq(&ctxt->node_seq);
2539*6777b538SAndroid Build Coastguard Worker xmlCtxtReset(ctxt);
2540*6777b538SAndroid Build Coastguard Worker }
2541*6777b538SAndroid Build Coastguard Worker
2542*6777b538SAndroid Build Coastguard Worker
2543*6777b538SAndroid Build Coastguard Worker /**
2544*6777b538SAndroid Build Coastguard Worker * xmlParserFindNodeInfo:
2545*6777b538SAndroid Build Coastguard Worker * @ctx: an XML parser context
2546*6777b538SAndroid Build Coastguard Worker * @node: an XML node within the tree
2547*6777b538SAndroid Build Coastguard Worker *
2548*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Don't use.
2549*6777b538SAndroid Build Coastguard Worker *
2550*6777b538SAndroid Build Coastguard Worker * Find the parser node info struct for a given node
2551*6777b538SAndroid Build Coastguard Worker *
2552*6777b538SAndroid Build Coastguard Worker * Returns an xmlParserNodeInfo block pointer or NULL
2553*6777b538SAndroid Build Coastguard Worker */
2554*6777b538SAndroid Build Coastguard Worker const xmlParserNodeInfo *
xmlParserFindNodeInfo(xmlParserCtxtPtr ctx,xmlNodePtr node)2555*6777b538SAndroid Build Coastguard Worker xmlParserFindNodeInfo(xmlParserCtxtPtr ctx, xmlNodePtr node)
2556*6777b538SAndroid Build Coastguard Worker {
2557*6777b538SAndroid Build Coastguard Worker unsigned long pos;
2558*6777b538SAndroid Build Coastguard Worker
2559*6777b538SAndroid Build Coastguard Worker if ((ctx == NULL) || (node == NULL))
2560*6777b538SAndroid Build Coastguard Worker return (NULL);
2561*6777b538SAndroid Build Coastguard Worker /* Find position where node should be at */
2562*6777b538SAndroid Build Coastguard Worker pos = xmlParserFindNodeInfoIndex(&ctx->node_seq, node);
2563*6777b538SAndroid Build Coastguard Worker if (pos < ctx->node_seq.length
2564*6777b538SAndroid Build Coastguard Worker && ctx->node_seq.buffer[pos].node == node)
2565*6777b538SAndroid Build Coastguard Worker return &ctx->node_seq.buffer[pos];
2566*6777b538SAndroid Build Coastguard Worker else
2567*6777b538SAndroid Build Coastguard Worker return NULL;
2568*6777b538SAndroid Build Coastguard Worker }
2569*6777b538SAndroid Build Coastguard Worker
2570*6777b538SAndroid Build Coastguard Worker
2571*6777b538SAndroid Build Coastguard Worker /**
2572*6777b538SAndroid Build Coastguard Worker * xmlInitNodeInfoSeq:
2573*6777b538SAndroid Build Coastguard Worker * @seq: a node info sequence pointer
2574*6777b538SAndroid Build Coastguard Worker *
2575*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Don't use.
2576*6777b538SAndroid Build Coastguard Worker *
2577*6777b538SAndroid Build Coastguard Worker * -- Initialize (set to initial state) node info sequence
2578*6777b538SAndroid Build Coastguard Worker */
2579*6777b538SAndroid Build Coastguard Worker void
xmlInitNodeInfoSeq(xmlParserNodeInfoSeqPtr seq)2580*6777b538SAndroid Build Coastguard Worker xmlInitNodeInfoSeq(xmlParserNodeInfoSeqPtr seq)
2581*6777b538SAndroid Build Coastguard Worker {
2582*6777b538SAndroid Build Coastguard Worker if (seq == NULL)
2583*6777b538SAndroid Build Coastguard Worker return;
2584*6777b538SAndroid Build Coastguard Worker seq->length = 0;
2585*6777b538SAndroid Build Coastguard Worker seq->maximum = 0;
2586*6777b538SAndroid Build Coastguard Worker seq->buffer = NULL;
2587*6777b538SAndroid Build Coastguard Worker }
2588*6777b538SAndroid Build Coastguard Worker
2589*6777b538SAndroid Build Coastguard Worker /**
2590*6777b538SAndroid Build Coastguard Worker * xmlClearNodeInfoSeq:
2591*6777b538SAndroid Build Coastguard Worker * @seq: a node info sequence pointer
2592*6777b538SAndroid Build Coastguard Worker *
2593*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Don't use.
2594*6777b538SAndroid Build Coastguard Worker *
2595*6777b538SAndroid Build Coastguard Worker * -- Clear (release memory and reinitialize) node
2596*6777b538SAndroid Build Coastguard Worker * info sequence
2597*6777b538SAndroid Build Coastguard Worker */
2598*6777b538SAndroid Build Coastguard Worker void
xmlClearNodeInfoSeq(xmlParserNodeInfoSeqPtr seq)2599*6777b538SAndroid Build Coastguard Worker xmlClearNodeInfoSeq(xmlParserNodeInfoSeqPtr seq)
2600*6777b538SAndroid Build Coastguard Worker {
2601*6777b538SAndroid Build Coastguard Worker if (seq == NULL)
2602*6777b538SAndroid Build Coastguard Worker return;
2603*6777b538SAndroid Build Coastguard Worker if (seq->buffer != NULL)
2604*6777b538SAndroid Build Coastguard Worker xmlFree(seq->buffer);
2605*6777b538SAndroid Build Coastguard Worker xmlInitNodeInfoSeq(seq);
2606*6777b538SAndroid Build Coastguard Worker }
2607*6777b538SAndroid Build Coastguard Worker
2608*6777b538SAndroid Build Coastguard Worker /**
2609*6777b538SAndroid Build Coastguard Worker * xmlParserFindNodeInfoIndex:
2610*6777b538SAndroid Build Coastguard Worker * @seq: a node info sequence pointer
2611*6777b538SAndroid Build Coastguard Worker * @node: an XML node pointer
2612*6777b538SAndroid Build Coastguard Worker *
2613*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Don't use.
2614*6777b538SAndroid Build Coastguard Worker *
2615*6777b538SAndroid Build Coastguard Worker * xmlParserFindNodeInfoIndex : Find the index that the info record for
2616*6777b538SAndroid Build Coastguard Worker * the given node is or should be at in a sorted sequence
2617*6777b538SAndroid Build Coastguard Worker *
2618*6777b538SAndroid Build Coastguard Worker * Returns a long indicating the position of the record
2619*6777b538SAndroid Build Coastguard Worker */
2620*6777b538SAndroid Build Coastguard Worker unsigned long
xmlParserFindNodeInfoIndex(xmlParserNodeInfoSeqPtr seq,xmlNodePtr node)2621*6777b538SAndroid Build Coastguard Worker xmlParserFindNodeInfoIndex(xmlParserNodeInfoSeqPtr seq,
2622*6777b538SAndroid Build Coastguard Worker xmlNodePtr node)
2623*6777b538SAndroid Build Coastguard Worker {
2624*6777b538SAndroid Build Coastguard Worker unsigned long upper, lower, middle;
2625*6777b538SAndroid Build Coastguard Worker int found = 0;
2626*6777b538SAndroid Build Coastguard Worker
2627*6777b538SAndroid Build Coastguard Worker if ((seq == NULL) || (node == NULL))
2628*6777b538SAndroid Build Coastguard Worker return ((unsigned long) -1);
2629*6777b538SAndroid Build Coastguard Worker
2630*6777b538SAndroid Build Coastguard Worker /* Do a binary search for the key */
2631*6777b538SAndroid Build Coastguard Worker lower = 1;
2632*6777b538SAndroid Build Coastguard Worker upper = seq->length;
2633*6777b538SAndroid Build Coastguard Worker middle = 0;
2634*6777b538SAndroid Build Coastguard Worker while (lower <= upper && !found) {
2635*6777b538SAndroid Build Coastguard Worker middle = lower + (upper - lower) / 2;
2636*6777b538SAndroid Build Coastguard Worker if (node == seq->buffer[middle - 1].node)
2637*6777b538SAndroid Build Coastguard Worker found = 1;
2638*6777b538SAndroid Build Coastguard Worker else if (node < seq->buffer[middle - 1].node)
2639*6777b538SAndroid Build Coastguard Worker upper = middle - 1;
2640*6777b538SAndroid Build Coastguard Worker else
2641*6777b538SAndroid Build Coastguard Worker lower = middle + 1;
2642*6777b538SAndroid Build Coastguard Worker }
2643*6777b538SAndroid Build Coastguard Worker
2644*6777b538SAndroid Build Coastguard Worker /* Return position */
2645*6777b538SAndroid Build Coastguard Worker if (middle == 0 || seq->buffer[middle - 1].node < node)
2646*6777b538SAndroid Build Coastguard Worker return middle;
2647*6777b538SAndroid Build Coastguard Worker else
2648*6777b538SAndroid Build Coastguard Worker return middle - 1;
2649*6777b538SAndroid Build Coastguard Worker }
2650*6777b538SAndroid Build Coastguard Worker
2651*6777b538SAndroid Build Coastguard Worker
2652*6777b538SAndroid Build Coastguard Worker /**
2653*6777b538SAndroid Build Coastguard Worker * xmlParserAddNodeInfo:
2654*6777b538SAndroid Build Coastguard Worker * @ctxt: an XML parser context
2655*6777b538SAndroid Build Coastguard Worker * @info: a node info sequence pointer
2656*6777b538SAndroid Build Coastguard Worker *
2657*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Don't use.
2658*6777b538SAndroid Build Coastguard Worker *
2659*6777b538SAndroid Build Coastguard Worker * Insert node info record into the sorted sequence
2660*6777b538SAndroid Build Coastguard Worker */
2661*6777b538SAndroid Build Coastguard Worker void
xmlParserAddNodeInfo(xmlParserCtxtPtr ctxt,xmlParserNodeInfoPtr info)2662*6777b538SAndroid Build Coastguard Worker xmlParserAddNodeInfo(xmlParserCtxtPtr ctxt,
2663*6777b538SAndroid Build Coastguard Worker xmlParserNodeInfoPtr info)
2664*6777b538SAndroid Build Coastguard Worker {
2665*6777b538SAndroid Build Coastguard Worker unsigned long pos;
2666*6777b538SAndroid Build Coastguard Worker
2667*6777b538SAndroid Build Coastguard Worker if ((ctxt == NULL) || (info == NULL)) return;
2668*6777b538SAndroid Build Coastguard Worker
2669*6777b538SAndroid Build Coastguard Worker /* Find pos and check to see if node is already in the sequence */
2670*6777b538SAndroid Build Coastguard Worker pos = xmlParserFindNodeInfoIndex(&ctxt->node_seq, (xmlNodePtr)
2671*6777b538SAndroid Build Coastguard Worker info->node);
2672*6777b538SAndroid Build Coastguard Worker
2673*6777b538SAndroid Build Coastguard Worker if ((pos < ctxt->node_seq.length) &&
2674*6777b538SAndroid Build Coastguard Worker (ctxt->node_seq.buffer != NULL) &&
2675*6777b538SAndroid Build Coastguard Worker (ctxt->node_seq.buffer[pos].node == info->node)) {
2676*6777b538SAndroid Build Coastguard Worker ctxt->node_seq.buffer[pos] = *info;
2677*6777b538SAndroid Build Coastguard Worker }
2678*6777b538SAndroid Build Coastguard Worker
2679*6777b538SAndroid Build Coastguard Worker /* Otherwise, we need to add new node to buffer */
2680*6777b538SAndroid Build Coastguard Worker else {
2681*6777b538SAndroid Build Coastguard Worker if ((ctxt->node_seq.length + 1 > ctxt->node_seq.maximum) ||
2682*6777b538SAndroid Build Coastguard Worker (ctxt->node_seq.buffer == NULL)) {
2683*6777b538SAndroid Build Coastguard Worker xmlParserNodeInfo *tmp_buffer;
2684*6777b538SAndroid Build Coastguard Worker unsigned int byte_size;
2685*6777b538SAndroid Build Coastguard Worker
2686*6777b538SAndroid Build Coastguard Worker if (ctxt->node_seq.maximum == 0)
2687*6777b538SAndroid Build Coastguard Worker ctxt->node_seq.maximum = 2;
2688*6777b538SAndroid Build Coastguard Worker byte_size = (sizeof(*ctxt->node_seq.buffer) *
2689*6777b538SAndroid Build Coastguard Worker (2 * ctxt->node_seq.maximum));
2690*6777b538SAndroid Build Coastguard Worker
2691*6777b538SAndroid Build Coastguard Worker if (ctxt->node_seq.buffer == NULL)
2692*6777b538SAndroid Build Coastguard Worker tmp_buffer = (xmlParserNodeInfo *) xmlMalloc(byte_size);
2693*6777b538SAndroid Build Coastguard Worker else
2694*6777b538SAndroid Build Coastguard Worker tmp_buffer =
2695*6777b538SAndroid Build Coastguard Worker (xmlParserNodeInfo *) xmlRealloc(ctxt->node_seq.buffer,
2696*6777b538SAndroid Build Coastguard Worker byte_size);
2697*6777b538SAndroid Build Coastguard Worker
2698*6777b538SAndroid Build Coastguard Worker if (tmp_buffer == NULL) {
2699*6777b538SAndroid Build Coastguard Worker xmlCtxtErrMemory(ctxt);
2700*6777b538SAndroid Build Coastguard Worker return;
2701*6777b538SAndroid Build Coastguard Worker }
2702*6777b538SAndroid Build Coastguard Worker ctxt->node_seq.buffer = tmp_buffer;
2703*6777b538SAndroid Build Coastguard Worker ctxt->node_seq.maximum *= 2;
2704*6777b538SAndroid Build Coastguard Worker }
2705*6777b538SAndroid Build Coastguard Worker
2706*6777b538SAndroid Build Coastguard Worker /* If position is not at end, move elements out of the way */
2707*6777b538SAndroid Build Coastguard Worker if (pos != ctxt->node_seq.length) {
2708*6777b538SAndroid Build Coastguard Worker unsigned long i;
2709*6777b538SAndroid Build Coastguard Worker
2710*6777b538SAndroid Build Coastguard Worker for (i = ctxt->node_seq.length; i > pos; i--)
2711*6777b538SAndroid Build Coastguard Worker ctxt->node_seq.buffer[i] = ctxt->node_seq.buffer[i - 1];
2712*6777b538SAndroid Build Coastguard Worker }
2713*6777b538SAndroid Build Coastguard Worker
2714*6777b538SAndroid Build Coastguard Worker /* Copy element and increase length */
2715*6777b538SAndroid Build Coastguard Worker ctxt->node_seq.buffer[pos] = *info;
2716*6777b538SAndroid Build Coastguard Worker ctxt->node_seq.length++;
2717*6777b538SAndroid Build Coastguard Worker }
2718*6777b538SAndroid Build Coastguard Worker }
2719*6777b538SAndroid Build Coastguard Worker
2720*6777b538SAndroid Build Coastguard Worker /************************************************************************
2721*6777b538SAndroid Build Coastguard Worker * *
2722*6777b538SAndroid Build Coastguard Worker * Defaults settings *
2723*6777b538SAndroid Build Coastguard Worker * *
2724*6777b538SAndroid Build Coastguard Worker ************************************************************************/
2725*6777b538SAndroid Build Coastguard Worker /**
2726*6777b538SAndroid Build Coastguard Worker * xmlPedanticParserDefault:
2727*6777b538SAndroid Build Coastguard Worker * @val: int 0 or 1
2728*6777b538SAndroid Build Coastguard Worker *
2729*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Use the modern options API with XML_PARSE_PEDANTIC.
2730*6777b538SAndroid Build Coastguard Worker *
2731*6777b538SAndroid Build Coastguard Worker * Set and return the previous value for enabling pedantic warnings.
2732*6777b538SAndroid Build Coastguard Worker *
2733*6777b538SAndroid Build Coastguard Worker * Returns the last value for 0 for no substitution, 1 for substitution.
2734*6777b538SAndroid Build Coastguard Worker */
2735*6777b538SAndroid Build Coastguard Worker
2736*6777b538SAndroid Build Coastguard Worker int
xmlPedanticParserDefault(int val)2737*6777b538SAndroid Build Coastguard Worker xmlPedanticParserDefault(int val) {
2738*6777b538SAndroid Build Coastguard Worker int old = xmlPedanticParserDefaultValue;
2739*6777b538SAndroid Build Coastguard Worker
2740*6777b538SAndroid Build Coastguard Worker xmlPedanticParserDefaultValue = val;
2741*6777b538SAndroid Build Coastguard Worker return(old);
2742*6777b538SAndroid Build Coastguard Worker }
2743*6777b538SAndroid Build Coastguard Worker
2744*6777b538SAndroid Build Coastguard Worker /**
2745*6777b538SAndroid Build Coastguard Worker * xmlLineNumbersDefault:
2746*6777b538SAndroid Build Coastguard Worker * @val: int 0 or 1
2747*6777b538SAndroid Build Coastguard Worker *
2748*6777b538SAndroid Build Coastguard Worker * DEPRECATED: The modern options API always enables line numbers.
2749*6777b538SAndroid Build Coastguard Worker *
2750*6777b538SAndroid Build Coastguard Worker * Set and return the previous value for enabling line numbers in elements
2751*6777b538SAndroid Build Coastguard Worker * contents. This may break on old application and is turned off by default.
2752*6777b538SAndroid Build Coastguard Worker *
2753*6777b538SAndroid Build Coastguard Worker * Returns the last value for 0 for no substitution, 1 for substitution.
2754*6777b538SAndroid Build Coastguard Worker */
2755*6777b538SAndroid Build Coastguard Worker
2756*6777b538SAndroid Build Coastguard Worker int
xmlLineNumbersDefault(int val)2757*6777b538SAndroid Build Coastguard Worker xmlLineNumbersDefault(int val) {
2758*6777b538SAndroid Build Coastguard Worker int old = xmlLineNumbersDefaultValue;
2759*6777b538SAndroid Build Coastguard Worker
2760*6777b538SAndroid Build Coastguard Worker xmlLineNumbersDefaultValue = val;
2761*6777b538SAndroid Build Coastguard Worker return(old);
2762*6777b538SAndroid Build Coastguard Worker }
2763*6777b538SAndroid Build Coastguard Worker
2764*6777b538SAndroid Build Coastguard Worker /**
2765*6777b538SAndroid Build Coastguard Worker * xmlSubstituteEntitiesDefault:
2766*6777b538SAndroid Build Coastguard Worker * @val: int 0 or 1
2767*6777b538SAndroid Build Coastguard Worker *
2768*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Use the modern options API with XML_PARSE_NOENT.
2769*6777b538SAndroid Build Coastguard Worker *
2770*6777b538SAndroid Build Coastguard Worker * Set and return the previous value for default entity support.
2771*6777b538SAndroid Build Coastguard Worker * Initially the parser always keep entity references instead of substituting
2772*6777b538SAndroid Build Coastguard Worker * entity values in the output. This function has to be used to change the
2773*6777b538SAndroid Build Coastguard Worker * default parser behavior
2774*6777b538SAndroid Build Coastguard Worker * SAX::substituteEntities() has to be used for changing that on a file by
2775*6777b538SAndroid Build Coastguard Worker * file basis.
2776*6777b538SAndroid Build Coastguard Worker *
2777*6777b538SAndroid Build Coastguard Worker * Returns the last value for 0 for no substitution, 1 for substitution.
2778*6777b538SAndroid Build Coastguard Worker */
2779*6777b538SAndroid Build Coastguard Worker
2780*6777b538SAndroid Build Coastguard Worker int
xmlSubstituteEntitiesDefault(int val)2781*6777b538SAndroid Build Coastguard Worker xmlSubstituteEntitiesDefault(int val) {
2782*6777b538SAndroid Build Coastguard Worker int old = xmlSubstituteEntitiesDefaultValue;
2783*6777b538SAndroid Build Coastguard Worker
2784*6777b538SAndroid Build Coastguard Worker xmlSubstituteEntitiesDefaultValue = val;
2785*6777b538SAndroid Build Coastguard Worker return(old);
2786*6777b538SAndroid Build Coastguard Worker }
2787*6777b538SAndroid Build Coastguard Worker
2788*6777b538SAndroid Build Coastguard Worker /**
2789*6777b538SAndroid Build Coastguard Worker * xmlKeepBlanksDefault:
2790*6777b538SAndroid Build Coastguard Worker * @val: int 0 or 1
2791*6777b538SAndroid Build Coastguard Worker *
2792*6777b538SAndroid Build Coastguard Worker * DEPRECATED: Use the modern options API with XML_PARSE_NOBLANKS.
2793*6777b538SAndroid Build Coastguard Worker *
2794*6777b538SAndroid Build Coastguard Worker * Set and return the previous value for default blanks text nodes support.
2795*6777b538SAndroid Build Coastguard Worker * The 1.x version of the parser used an heuristic to try to detect
2796*6777b538SAndroid Build Coastguard Worker * ignorable white spaces. As a result the SAX callback was generating
2797*6777b538SAndroid Build Coastguard Worker * xmlSAX2IgnorableWhitespace() callbacks instead of characters() one, and when
2798*6777b538SAndroid Build Coastguard Worker * using the DOM output text nodes containing those blanks were not generated.
2799*6777b538SAndroid Build Coastguard Worker * The 2.x and later version will switch to the XML standard way and
2800*6777b538SAndroid Build Coastguard Worker * ignorableWhitespace() are only generated when running the parser in
2801*6777b538SAndroid Build Coastguard Worker * validating mode and when the current element doesn't allow CDATA or
2802*6777b538SAndroid Build Coastguard Worker * mixed content.
2803*6777b538SAndroid Build Coastguard Worker * This function is provided as a way to force the standard behavior
2804*6777b538SAndroid Build Coastguard Worker * on 1.X libs and to switch back to the old mode for compatibility when
2805*6777b538SAndroid Build Coastguard Worker * running 1.X client code on 2.X . Upgrade of 1.X code should be done
2806*6777b538SAndroid Build Coastguard Worker * by using xmlIsBlankNode() commodity function to detect the "empty"
2807*6777b538SAndroid Build Coastguard Worker * nodes generated.
2808*6777b538SAndroid Build Coastguard Worker * This value also affect autogeneration of indentation when saving code
2809*6777b538SAndroid Build Coastguard Worker * if blanks sections are kept, indentation is not generated.
2810*6777b538SAndroid Build Coastguard Worker *
2811*6777b538SAndroid Build Coastguard Worker * Returns the last value for 0 for no substitution, 1 for substitution.
2812*6777b538SAndroid Build Coastguard Worker */
2813*6777b538SAndroid Build Coastguard Worker
2814*6777b538SAndroid Build Coastguard Worker int
xmlKeepBlanksDefault(int val)2815*6777b538SAndroid Build Coastguard Worker xmlKeepBlanksDefault(int val) {
2816*6777b538SAndroid Build Coastguard Worker int old = xmlKeepBlanksDefaultValue;
2817*6777b538SAndroid Build Coastguard Worker
2818*6777b538SAndroid Build Coastguard Worker xmlKeepBlanksDefaultValue = val;
2819*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
2820*6777b538SAndroid Build Coastguard Worker if (!val)
2821*6777b538SAndroid Build Coastguard Worker xmlIndentTreeOutput = 1;
2822*6777b538SAndroid Build Coastguard Worker #endif
2823*6777b538SAndroid Build Coastguard Worker return(old);
2824*6777b538SAndroid Build Coastguard Worker }
2825*6777b538SAndroid Build Coastguard Worker
2826