xref: /aosp_15_r20/external/cronet/third_party/libxml/src/parserInternals.c (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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