xref: /aosp_15_r20/external/cronet/third_party/libxml/src/xmlIO.c (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker /*
2*6777b538SAndroid Build Coastguard Worker  * xmlIO.c : implementation of the I/O interfaces used by the parser
3*6777b538SAndroid Build Coastguard Worker  *
4*6777b538SAndroid Build Coastguard Worker  * See Copyright for the status of this software.
5*6777b538SAndroid Build Coastguard Worker  *
6*6777b538SAndroid Build Coastguard Worker  * [email protected]
7*6777b538SAndroid Build Coastguard Worker  */
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #define IN_LIBXML
10*6777b538SAndroid Build Coastguard Worker #include "libxml.h"
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker #include <string.h>
13*6777b538SAndroid Build Coastguard Worker #include <stdlib.h>
14*6777b538SAndroid Build Coastguard Worker #include <errno.h>
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker #ifdef HAVE_SYS_STAT_H
17*6777b538SAndroid Build Coastguard Worker #include <sys/stat.h>
18*6777b538SAndroid Build Coastguard Worker #endif
19*6777b538SAndroid Build Coastguard Worker #ifdef HAVE_FCNTL_H
20*6777b538SAndroid Build Coastguard Worker #include <fcntl.h>
21*6777b538SAndroid Build Coastguard Worker #endif
22*6777b538SAndroid Build Coastguard Worker #ifdef HAVE_UNISTD_H
23*6777b538SAndroid Build Coastguard Worker #include <unistd.h>
24*6777b538SAndroid Build Coastguard Worker #endif
25*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_ZLIB_ENABLED
26*6777b538SAndroid Build Coastguard Worker #include <zlib.h>
27*6777b538SAndroid Build Coastguard Worker #endif
28*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_LZMA_ENABLED
29*6777b538SAndroid Build Coastguard Worker #include <lzma.h>
30*6777b538SAndroid Build Coastguard Worker #endif
31*6777b538SAndroid Build Coastguard Worker 
32*6777b538SAndroid Build Coastguard Worker #if defined(_WIN32)
33*6777b538SAndroid Build Coastguard Worker #define WIN32_LEAN_AND_MEAN
34*6777b538SAndroid Build Coastguard Worker #include <windows.h>
35*6777b538SAndroid Build Coastguard Worker #include <io.h>
36*6777b538SAndroid Build Coastguard Worker #include <direct.h>
37*6777b538SAndroid Build Coastguard Worker #endif
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker #include <libxml/xmlIO.h>
40*6777b538SAndroid Build Coastguard Worker #include <libxml/xmlmemory.h>
41*6777b538SAndroid Build Coastguard Worker #include <libxml/uri.h>
42*6777b538SAndroid Build Coastguard Worker #include <libxml/nanohttp.h>
43*6777b538SAndroid Build Coastguard Worker #include <libxml/nanoftp.h>
44*6777b538SAndroid Build Coastguard Worker #include <libxml/xmlerror.h>
45*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_CATALOG_ENABLED
46*6777b538SAndroid Build Coastguard Worker #include <libxml/catalog.h>
47*6777b538SAndroid Build Coastguard Worker #endif
48*6777b538SAndroid Build Coastguard Worker 
49*6777b538SAndroid Build Coastguard Worker #include "private/buf.h"
50*6777b538SAndroid Build Coastguard Worker #include "private/enc.h"
51*6777b538SAndroid Build Coastguard Worker #include "private/error.h"
52*6777b538SAndroid Build Coastguard Worker #include "private/io.h"
53*6777b538SAndroid Build Coastguard Worker #include "private/parser.h"
54*6777b538SAndroid Build Coastguard Worker 
55*6777b538SAndroid Build Coastguard Worker /* #define VERBOSE_FAILURE */
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker #define MINLEN 4000
58*6777b538SAndroid Build Coastguard Worker 
59*6777b538SAndroid Build Coastguard Worker #ifndef STDOUT_FILENO
60*6777b538SAndroid Build Coastguard Worker   #define STDOUT_FILENO 1
61*6777b538SAndroid Build Coastguard Worker #endif
62*6777b538SAndroid Build Coastguard Worker 
63*6777b538SAndroid Build Coastguard Worker #ifndef S_ISDIR
64*6777b538SAndroid Build Coastguard Worker #  ifdef _S_ISDIR
65*6777b538SAndroid Build Coastguard Worker #    define S_ISDIR(x) _S_ISDIR(x)
66*6777b538SAndroid Build Coastguard Worker #  elif defined(S_IFDIR)
67*6777b538SAndroid Build Coastguard Worker #    ifdef S_IFMT
68*6777b538SAndroid Build Coastguard Worker #      define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
69*6777b538SAndroid Build Coastguard Worker #    elif defined(_S_IFMT)
70*6777b538SAndroid Build Coastguard Worker #      define S_ISDIR(m) (((m) & _S_IFMT) == S_IFDIR)
71*6777b538SAndroid Build Coastguard Worker #    endif
72*6777b538SAndroid Build Coastguard Worker #  endif
73*6777b538SAndroid Build Coastguard Worker #endif
74*6777b538SAndroid Build Coastguard Worker 
75*6777b538SAndroid Build Coastguard Worker /*
76*6777b538SAndroid Build Coastguard Worker  * Input I/O callback sets
77*6777b538SAndroid Build Coastguard Worker  */
78*6777b538SAndroid Build Coastguard Worker typedef struct _xmlInputCallback {
79*6777b538SAndroid Build Coastguard Worker     xmlInputMatchCallback matchcallback;
80*6777b538SAndroid Build Coastguard Worker     xmlInputOpenCallback opencallback;
81*6777b538SAndroid Build Coastguard Worker     xmlInputReadCallback readcallback;
82*6777b538SAndroid Build Coastguard Worker     xmlInputCloseCallback closecallback;
83*6777b538SAndroid Build Coastguard Worker } xmlInputCallback;
84*6777b538SAndroid Build Coastguard Worker 
85*6777b538SAndroid Build Coastguard Worker /* This dummy function only marks default IO in the callback table */
86*6777b538SAndroid Build Coastguard Worker static int
87*6777b538SAndroid Build Coastguard Worker xmlIODefaultMatch(const char *filename);
88*6777b538SAndroid Build Coastguard Worker 
89*6777b538SAndroid Build Coastguard Worker #define MAX_INPUT_CALLBACK 10
90*6777b538SAndroid Build Coastguard Worker 
91*6777b538SAndroid Build Coastguard Worker static xmlInputCallback xmlInputCallbackTable[MAX_INPUT_CALLBACK];
92*6777b538SAndroid Build Coastguard Worker static int xmlInputCallbackNr;
93*6777b538SAndroid Build Coastguard Worker 
94*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
95*6777b538SAndroid Build Coastguard Worker /*
96*6777b538SAndroid Build Coastguard Worker  * Output I/O callback sets
97*6777b538SAndroid Build Coastguard Worker  */
98*6777b538SAndroid Build Coastguard Worker typedef struct _xmlOutputCallback {
99*6777b538SAndroid Build Coastguard Worker     xmlOutputMatchCallback matchcallback;
100*6777b538SAndroid Build Coastguard Worker     xmlOutputOpenCallback opencallback;
101*6777b538SAndroid Build Coastguard Worker     xmlOutputWriteCallback writecallback;
102*6777b538SAndroid Build Coastguard Worker     xmlOutputCloseCallback closecallback;
103*6777b538SAndroid Build Coastguard Worker } xmlOutputCallback;
104*6777b538SAndroid Build Coastguard Worker 
105*6777b538SAndroid Build Coastguard Worker #define MAX_OUTPUT_CALLBACK 10
106*6777b538SAndroid Build Coastguard Worker 
107*6777b538SAndroid Build Coastguard Worker static xmlOutputCallback xmlOutputCallbackTable[MAX_OUTPUT_CALLBACK];
108*6777b538SAndroid Build Coastguard Worker static int xmlOutputCallbackNr;
109*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_OUTPUT_ENABLED */
110*6777b538SAndroid Build Coastguard Worker 
111*6777b538SAndroid Build Coastguard Worker /************************************************************************
112*6777b538SAndroid Build Coastguard Worker  *									*
113*6777b538SAndroid Build Coastguard Worker  *			Error handling					*
114*6777b538SAndroid Build Coastguard Worker  *									*
115*6777b538SAndroid Build Coastguard Worker  ************************************************************************/
116*6777b538SAndroid Build Coastguard Worker 
117*6777b538SAndroid Build Coastguard Worker /**
118*6777b538SAndroid Build Coastguard Worker  * xmlIOErrMemory:
119*6777b538SAndroid Build Coastguard Worker  * @extra:  extra information
120*6777b538SAndroid Build Coastguard Worker  *
121*6777b538SAndroid Build Coastguard Worker  * Handle an out of memory condition
122*6777b538SAndroid Build Coastguard Worker  */
123*6777b538SAndroid Build Coastguard Worker static void
xmlIOErrMemory(void)124*6777b538SAndroid Build Coastguard Worker xmlIOErrMemory(void)
125*6777b538SAndroid Build Coastguard Worker {
126*6777b538SAndroid Build Coastguard Worker     xmlRaiseMemoryError(NULL, NULL, NULL, XML_FROM_IO, NULL);
127*6777b538SAndroid Build Coastguard Worker }
128*6777b538SAndroid Build Coastguard Worker 
129*6777b538SAndroid Build Coastguard Worker /**
130*6777b538SAndroid Build Coastguard Worker  * __xmlIOErr:
131*6777b538SAndroid Build Coastguard Worker  * @code:  the error number
132*6777b538SAndroid Build Coastguard Worker  * @
133*6777b538SAndroid Build Coastguard Worker  * @extra:  extra information
134*6777b538SAndroid Build Coastguard Worker  *
135*6777b538SAndroid Build Coastguard Worker  * Handle an I/O error
136*6777b538SAndroid Build Coastguard Worker  */
137*6777b538SAndroid Build Coastguard Worker int
__xmlIOErr(int domain,int code,const char * extra)138*6777b538SAndroid Build Coastguard Worker __xmlIOErr(int domain, int code, const char *extra)
139*6777b538SAndroid Build Coastguard Worker {
140*6777b538SAndroid Build Coastguard Worker     xmlStructuredErrorFunc schannel = NULL;
141*6777b538SAndroid Build Coastguard Worker     xmlGenericErrorFunc channel = NULL;
142*6777b538SAndroid Build Coastguard Worker     void *data = NULL;
143*6777b538SAndroid Build Coastguard Worker     const char *fmt, *arg;
144*6777b538SAndroid Build Coastguard Worker     int res;
145*6777b538SAndroid Build Coastguard Worker 
146*6777b538SAndroid Build Coastguard Worker     if (code == 0) {
147*6777b538SAndroid Build Coastguard Worker 	if (errno == 0) code = XML_IO_UNKNOWN;
148*6777b538SAndroid Build Coastguard Worker #ifdef EACCES
149*6777b538SAndroid Build Coastguard Worker         else if (errno == EACCES) code = XML_IO_EACCES;
150*6777b538SAndroid Build Coastguard Worker #endif
151*6777b538SAndroid Build Coastguard Worker #ifdef EAGAIN
152*6777b538SAndroid Build Coastguard Worker         else if (errno == EAGAIN) code = XML_IO_EAGAIN;
153*6777b538SAndroid Build Coastguard Worker #endif
154*6777b538SAndroid Build Coastguard Worker #ifdef EBADF
155*6777b538SAndroid Build Coastguard Worker         else if (errno == EBADF) code = XML_IO_EBADF;
156*6777b538SAndroid Build Coastguard Worker #endif
157*6777b538SAndroid Build Coastguard Worker #ifdef EBADMSG
158*6777b538SAndroid Build Coastguard Worker         else if (errno == EBADMSG) code = XML_IO_EBADMSG;
159*6777b538SAndroid Build Coastguard Worker #endif
160*6777b538SAndroid Build Coastguard Worker #ifdef EBUSY
161*6777b538SAndroid Build Coastguard Worker         else if (errno == EBUSY) code = XML_IO_EBUSY;
162*6777b538SAndroid Build Coastguard Worker #endif
163*6777b538SAndroid Build Coastguard Worker #ifdef ECANCELED
164*6777b538SAndroid Build Coastguard Worker         else if (errno == ECANCELED) code = XML_IO_ECANCELED;
165*6777b538SAndroid Build Coastguard Worker #endif
166*6777b538SAndroid Build Coastguard Worker #ifdef ECHILD
167*6777b538SAndroid Build Coastguard Worker         else if (errno == ECHILD) code = XML_IO_ECHILD;
168*6777b538SAndroid Build Coastguard Worker #endif
169*6777b538SAndroid Build Coastguard Worker #ifdef EDEADLK
170*6777b538SAndroid Build Coastguard Worker         else if (errno == EDEADLK) code = XML_IO_EDEADLK;
171*6777b538SAndroid Build Coastguard Worker #endif
172*6777b538SAndroid Build Coastguard Worker #ifdef EDOM
173*6777b538SAndroid Build Coastguard Worker         else if (errno == EDOM) code = XML_IO_EDOM;
174*6777b538SAndroid Build Coastguard Worker #endif
175*6777b538SAndroid Build Coastguard Worker #ifdef EEXIST
176*6777b538SAndroid Build Coastguard Worker         else if (errno == EEXIST) code = XML_IO_EEXIST;
177*6777b538SAndroid Build Coastguard Worker #endif
178*6777b538SAndroid Build Coastguard Worker #ifdef EFAULT
179*6777b538SAndroid Build Coastguard Worker         else if (errno == EFAULT) code = XML_IO_EFAULT;
180*6777b538SAndroid Build Coastguard Worker #endif
181*6777b538SAndroid Build Coastguard Worker #ifdef EFBIG
182*6777b538SAndroid Build Coastguard Worker         else if (errno == EFBIG) code = XML_IO_EFBIG;
183*6777b538SAndroid Build Coastguard Worker #endif
184*6777b538SAndroid Build Coastguard Worker #ifdef EINPROGRESS
185*6777b538SAndroid Build Coastguard Worker         else if (errno == EINPROGRESS) code = XML_IO_EINPROGRESS;
186*6777b538SAndroid Build Coastguard Worker #endif
187*6777b538SAndroid Build Coastguard Worker #ifdef EINTR
188*6777b538SAndroid Build Coastguard Worker         else if (errno == EINTR) code = XML_IO_EINTR;
189*6777b538SAndroid Build Coastguard Worker #endif
190*6777b538SAndroid Build Coastguard Worker #ifdef EINVAL
191*6777b538SAndroid Build Coastguard Worker         else if (errno == EINVAL) code = XML_IO_EINVAL;
192*6777b538SAndroid Build Coastguard Worker #endif
193*6777b538SAndroid Build Coastguard Worker #ifdef EIO
194*6777b538SAndroid Build Coastguard Worker         else if (errno == EIO) code = XML_IO_EIO;
195*6777b538SAndroid Build Coastguard Worker #endif
196*6777b538SAndroid Build Coastguard Worker #ifdef EISDIR
197*6777b538SAndroid Build Coastguard Worker         else if (errno == EISDIR) code = XML_IO_EISDIR;
198*6777b538SAndroid Build Coastguard Worker #endif
199*6777b538SAndroid Build Coastguard Worker #ifdef EMFILE
200*6777b538SAndroid Build Coastguard Worker         else if (errno == EMFILE) code = XML_IO_EMFILE;
201*6777b538SAndroid Build Coastguard Worker #endif
202*6777b538SAndroid Build Coastguard Worker #ifdef EMLINK
203*6777b538SAndroid Build Coastguard Worker         else if (errno == EMLINK) code = XML_IO_EMLINK;
204*6777b538SAndroid Build Coastguard Worker #endif
205*6777b538SAndroid Build Coastguard Worker #ifdef EMSGSIZE
206*6777b538SAndroid Build Coastguard Worker         else if (errno == EMSGSIZE) code = XML_IO_EMSGSIZE;
207*6777b538SAndroid Build Coastguard Worker #endif
208*6777b538SAndroid Build Coastguard Worker #ifdef ENAMETOOLONG
209*6777b538SAndroid Build Coastguard Worker         else if (errno == ENAMETOOLONG) code = XML_IO_ENAMETOOLONG;
210*6777b538SAndroid Build Coastguard Worker #endif
211*6777b538SAndroid Build Coastguard Worker #ifdef ENFILE
212*6777b538SAndroid Build Coastguard Worker         else if (errno == ENFILE) code = XML_IO_ENFILE;
213*6777b538SAndroid Build Coastguard Worker #endif
214*6777b538SAndroid Build Coastguard Worker #ifdef ENODEV
215*6777b538SAndroid Build Coastguard Worker         else if (errno == ENODEV) code = XML_IO_ENODEV;
216*6777b538SAndroid Build Coastguard Worker #endif
217*6777b538SAndroid Build Coastguard Worker #ifdef ENOENT
218*6777b538SAndroid Build Coastguard Worker         else if (errno == ENOENT) code = XML_IO_ENOENT;
219*6777b538SAndroid Build Coastguard Worker #endif
220*6777b538SAndroid Build Coastguard Worker #ifdef ENOEXEC
221*6777b538SAndroid Build Coastguard Worker         else if (errno == ENOEXEC) code = XML_IO_ENOEXEC;
222*6777b538SAndroid Build Coastguard Worker #endif
223*6777b538SAndroid Build Coastguard Worker #ifdef ENOLCK
224*6777b538SAndroid Build Coastguard Worker         else if (errno == ENOLCK) code = XML_IO_ENOLCK;
225*6777b538SAndroid Build Coastguard Worker #endif
226*6777b538SAndroid Build Coastguard Worker #ifdef ENOMEM
227*6777b538SAndroid Build Coastguard Worker         else if (errno == ENOMEM) code = XML_IO_ENOMEM;
228*6777b538SAndroid Build Coastguard Worker #endif
229*6777b538SAndroid Build Coastguard Worker #ifdef ENOSPC
230*6777b538SAndroid Build Coastguard Worker         else if (errno == ENOSPC) code = XML_IO_ENOSPC;
231*6777b538SAndroid Build Coastguard Worker #endif
232*6777b538SAndroid Build Coastguard Worker #ifdef ENOSYS
233*6777b538SAndroid Build Coastguard Worker         else if (errno == ENOSYS) code = XML_IO_ENOSYS;
234*6777b538SAndroid Build Coastguard Worker #endif
235*6777b538SAndroid Build Coastguard Worker #ifdef ENOTDIR
236*6777b538SAndroid Build Coastguard Worker         else if (errno == ENOTDIR) code = XML_IO_ENOTDIR;
237*6777b538SAndroid Build Coastguard Worker #endif
238*6777b538SAndroid Build Coastguard Worker #ifdef ENOTEMPTY
239*6777b538SAndroid Build Coastguard Worker         else if (errno == ENOTEMPTY) code = XML_IO_ENOTEMPTY;
240*6777b538SAndroid Build Coastguard Worker #endif
241*6777b538SAndroid Build Coastguard Worker #ifdef ENOTSUP
242*6777b538SAndroid Build Coastguard Worker         else if (errno == ENOTSUP) code = XML_IO_ENOTSUP;
243*6777b538SAndroid Build Coastguard Worker #endif
244*6777b538SAndroid Build Coastguard Worker #ifdef ENOTTY
245*6777b538SAndroid Build Coastguard Worker         else if (errno == ENOTTY) code = XML_IO_ENOTTY;
246*6777b538SAndroid Build Coastguard Worker #endif
247*6777b538SAndroid Build Coastguard Worker #ifdef ENXIO
248*6777b538SAndroid Build Coastguard Worker         else if (errno == ENXIO) code = XML_IO_ENXIO;
249*6777b538SAndroid Build Coastguard Worker #endif
250*6777b538SAndroid Build Coastguard Worker #ifdef EPERM
251*6777b538SAndroid Build Coastguard Worker         else if (errno == EPERM) code = XML_IO_EPERM;
252*6777b538SAndroid Build Coastguard Worker #endif
253*6777b538SAndroid Build Coastguard Worker #ifdef EPIPE
254*6777b538SAndroid Build Coastguard Worker         else if (errno == EPIPE) code = XML_IO_EPIPE;
255*6777b538SAndroid Build Coastguard Worker #endif
256*6777b538SAndroid Build Coastguard Worker #ifdef ERANGE
257*6777b538SAndroid Build Coastguard Worker         else if (errno == ERANGE) code = XML_IO_ERANGE;
258*6777b538SAndroid Build Coastguard Worker #endif
259*6777b538SAndroid Build Coastguard Worker #ifdef EROFS
260*6777b538SAndroid Build Coastguard Worker         else if (errno == EROFS) code = XML_IO_EROFS;
261*6777b538SAndroid Build Coastguard Worker #endif
262*6777b538SAndroid Build Coastguard Worker #ifdef ESPIPE
263*6777b538SAndroid Build Coastguard Worker         else if (errno == ESPIPE) code = XML_IO_ESPIPE;
264*6777b538SAndroid Build Coastguard Worker #endif
265*6777b538SAndroid Build Coastguard Worker #ifdef ESRCH
266*6777b538SAndroid Build Coastguard Worker         else if (errno == ESRCH) code = XML_IO_ESRCH;
267*6777b538SAndroid Build Coastguard Worker #endif
268*6777b538SAndroid Build Coastguard Worker #ifdef ETIMEDOUT
269*6777b538SAndroid Build Coastguard Worker         else if (errno == ETIMEDOUT) code = XML_IO_ETIMEDOUT;
270*6777b538SAndroid Build Coastguard Worker #endif
271*6777b538SAndroid Build Coastguard Worker #ifdef EXDEV
272*6777b538SAndroid Build Coastguard Worker         else if (errno == EXDEV) code = XML_IO_EXDEV;
273*6777b538SAndroid Build Coastguard Worker #endif
274*6777b538SAndroid Build Coastguard Worker #ifdef ENOTSOCK
275*6777b538SAndroid Build Coastguard Worker         else if (errno == ENOTSOCK) code = XML_IO_ENOTSOCK;
276*6777b538SAndroid Build Coastguard Worker #endif
277*6777b538SAndroid Build Coastguard Worker #ifdef EISCONN
278*6777b538SAndroid Build Coastguard Worker         else if (errno == EISCONN) code = XML_IO_EISCONN;
279*6777b538SAndroid Build Coastguard Worker #endif
280*6777b538SAndroid Build Coastguard Worker #ifdef ECONNREFUSED
281*6777b538SAndroid Build Coastguard Worker         else if (errno == ECONNREFUSED) code = XML_IO_ECONNREFUSED;
282*6777b538SAndroid Build Coastguard Worker #endif
283*6777b538SAndroid Build Coastguard Worker #ifdef ETIMEDOUT
284*6777b538SAndroid Build Coastguard Worker         else if (errno == ETIMEDOUT) code = XML_IO_ETIMEDOUT;
285*6777b538SAndroid Build Coastguard Worker #endif
286*6777b538SAndroid Build Coastguard Worker #ifdef ENETUNREACH
287*6777b538SAndroid Build Coastguard Worker         else if (errno == ENETUNREACH) code = XML_IO_ENETUNREACH;
288*6777b538SAndroid Build Coastguard Worker #endif
289*6777b538SAndroid Build Coastguard Worker #ifdef EADDRINUSE
290*6777b538SAndroid Build Coastguard Worker         else if (errno == EADDRINUSE) code = XML_IO_EADDRINUSE;
291*6777b538SAndroid Build Coastguard Worker #endif
292*6777b538SAndroid Build Coastguard Worker #ifdef EINPROGRESS
293*6777b538SAndroid Build Coastguard Worker         else if (errno == EINPROGRESS) code = XML_IO_EINPROGRESS;
294*6777b538SAndroid Build Coastguard Worker #endif
295*6777b538SAndroid Build Coastguard Worker #ifdef EALREADY
296*6777b538SAndroid Build Coastguard Worker         else if (errno == EALREADY) code = XML_IO_EALREADY;
297*6777b538SAndroid Build Coastguard Worker #endif
298*6777b538SAndroid Build Coastguard Worker #ifdef EAFNOSUPPORT
299*6777b538SAndroid Build Coastguard Worker         else if (errno == EAFNOSUPPORT) code = XML_IO_EAFNOSUPPORT;
300*6777b538SAndroid Build Coastguard Worker #endif
301*6777b538SAndroid Build Coastguard Worker         else code = XML_IO_UNKNOWN;
302*6777b538SAndroid Build Coastguard Worker     }
303*6777b538SAndroid Build Coastguard Worker 
304*6777b538SAndroid Build Coastguard Worker     if (xmlStructuredError) {
305*6777b538SAndroid Build Coastguard Worker         schannel = xmlStructuredError;
306*6777b538SAndroid Build Coastguard Worker         data = xmlStructuredErrorContext;
307*6777b538SAndroid Build Coastguard Worker     } else {
308*6777b538SAndroid Build Coastguard Worker         channel = xmlGenericError;
309*6777b538SAndroid Build Coastguard Worker         data = xmlGenericErrorContext;
310*6777b538SAndroid Build Coastguard Worker     }
311*6777b538SAndroid Build Coastguard Worker 
312*6777b538SAndroid Build Coastguard Worker     if (code == XML_IO_NETWORK_ATTEMPT) {
313*6777b538SAndroid Build Coastguard Worker         fmt = "Attempt to load network entity %s";
314*6777b538SAndroid Build Coastguard Worker         arg = extra;
315*6777b538SAndroid Build Coastguard Worker     } else {
316*6777b538SAndroid Build Coastguard Worker         fmt = "%s";
317*6777b538SAndroid Build Coastguard Worker         arg = xmlErrString(code);
318*6777b538SAndroid Build Coastguard Worker     }
319*6777b538SAndroid Build Coastguard Worker 
320*6777b538SAndroid Build Coastguard Worker     res = __xmlRaiseError(schannel, channel, data, NULL, NULL,
321*6777b538SAndroid Build Coastguard Worker                           domain, code, XML_ERR_ERROR, NULL, 0,
322*6777b538SAndroid Build Coastguard Worker                           extra, NULL, NULL, 0, 0,
323*6777b538SAndroid Build Coastguard Worker                           fmt, arg);
324*6777b538SAndroid Build Coastguard Worker     if (res < 0) {
325*6777b538SAndroid Build Coastguard Worker         xmlIOErrMemory();
326*6777b538SAndroid Build Coastguard Worker         return(XML_ERR_NO_MEMORY);
327*6777b538SAndroid Build Coastguard Worker     }
328*6777b538SAndroid Build Coastguard Worker 
329*6777b538SAndroid Build Coastguard Worker     return(code);
330*6777b538SAndroid Build Coastguard Worker }
331*6777b538SAndroid Build Coastguard Worker 
332*6777b538SAndroid Build Coastguard Worker /**
333*6777b538SAndroid Build Coastguard Worker  * xmlIOErr:
334*6777b538SAndroid Build Coastguard Worker  * @code:  the error number
335*6777b538SAndroid Build Coastguard Worker  * @extra:  extra information
336*6777b538SAndroid Build Coastguard Worker  *
337*6777b538SAndroid Build Coastguard Worker  * Handle an I/O error
338*6777b538SAndroid Build Coastguard Worker  */
339*6777b538SAndroid Build Coastguard Worker static int
xmlIOErr(int code,const char * extra)340*6777b538SAndroid Build Coastguard Worker xmlIOErr(int code, const char *extra)
341*6777b538SAndroid Build Coastguard Worker {
342*6777b538SAndroid Build Coastguard Worker     return(__xmlIOErr(XML_FROM_IO, code, extra));
343*6777b538SAndroid Build Coastguard Worker }
344*6777b538SAndroid Build Coastguard Worker 
345*6777b538SAndroid Build Coastguard Worker /************************************************************************
346*6777b538SAndroid Build Coastguard Worker  *									*
347*6777b538SAndroid Build Coastguard Worker  *		Standard I/O for file accesses				*
348*6777b538SAndroid Build Coastguard Worker  *									*
349*6777b538SAndroid Build Coastguard Worker  ************************************************************************/
350*6777b538SAndroid Build Coastguard Worker 
351*6777b538SAndroid Build Coastguard Worker #if defined(_WIN32)
352*6777b538SAndroid Build Coastguard Worker 
353*6777b538SAndroid Build Coastguard Worker /**
354*6777b538SAndroid Build Coastguard Worker  * __xmlIOWin32UTF8ToWChar:
355*6777b538SAndroid Build Coastguard Worker  * @u8String:  uft-8 string
356*6777b538SAndroid Build Coastguard Worker  *
357*6777b538SAndroid Build Coastguard Worker  * Convert a string from utf-8 to wchar (WINDOWS ONLY!)
358*6777b538SAndroid Build Coastguard Worker  */
359*6777b538SAndroid Build Coastguard Worker static wchar_t *
__xmlIOWin32UTF8ToWChar(const char * u8String)360*6777b538SAndroid Build Coastguard Worker __xmlIOWin32UTF8ToWChar(const char *u8String)
361*6777b538SAndroid Build Coastguard Worker {
362*6777b538SAndroid Build Coastguard Worker     wchar_t *wString = NULL;
363*6777b538SAndroid Build Coastguard Worker     int i;
364*6777b538SAndroid Build Coastguard Worker 
365*6777b538SAndroid Build Coastguard Worker     if (u8String) {
366*6777b538SAndroid Build Coastguard Worker         int wLen =
367*6777b538SAndroid Build Coastguard Worker             MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, u8String,
368*6777b538SAndroid Build Coastguard Worker                                 -1, NULL, 0);
369*6777b538SAndroid Build Coastguard Worker         if (wLen) {
370*6777b538SAndroid Build Coastguard Worker             wString = xmlMalloc(wLen * sizeof(wchar_t));
371*6777b538SAndroid Build Coastguard Worker             if (wString) {
372*6777b538SAndroid Build Coastguard Worker                 if (MultiByteToWideChar
373*6777b538SAndroid Build Coastguard Worker                     (CP_UTF8, 0, u8String, -1, wString, wLen) == 0) {
374*6777b538SAndroid Build Coastguard Worker                     xmlFree(wString);
375*6777b538SAndroid Build Coastguard Worker                     wString = NULL;
376*6777b538SAndroid Build Coastguard Worker                 }
377*6777b538SAndroid Build Coastguard Worker             }
378*6777b538SAndroid Build Coastguard Worker 
379*6777b538SAndroid Build Coastguard Worker             /*
380*6777b538SAndroid Build Coastguard Worker              * Convert to backward slash
381*6777b538SAndroid Build Coastguard Worker              */
382*6777b538SAndroid Build Coastguard Worker             for (i = 0; wString[i] != 0; i++) {
383*6777b538SAndroid Build Coastguard Worker                 if (wString[i] == '/')
384*6777b538SAndroid Build Coastguard Worker                     wString[i] = '\\';
385*6777b538SAndroid Build Coastguard Worker             }
386*6777b538SAndroid Build Coastguard Worker         }
387*6777b538SAndroid Build Coastguard Worker     }
388*6777b538SAndroid Build Coastguard Worker 
389*6777b538SAndroid Build Coastguard Worker     return wString;
390*6777b538SAndroid Build Coastguard Worker }
391*6777b538SAndroid Build Coastguard Worker 
392*6777b538SAndroid Build Coastguard Worker #endif
393*6777b538SAndroid Build Coastguard Worker 
394*6777b538SAndroid Build Coastguard Worker /**
395*6777b538SAndroid Build Coastguard Worker  * xmlNormalizeWindowsPath:
396*6777b538SAndroid Build Coastguard Worker  * @path: the input file path
397*6777b538SAndroid Build Coastguard Worker  *
398*6777b538SAndroid Build Coastguard Worker  * DEPRECATED: This never really worked.
399*6777b538SAndroid Build Coastguard Worker  *
400*6777b538SAndroid Build Coastguard Worker  * Returns a copy of path.
401*6777b538SAndroid Build Coastguard Worker  */
402*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlNormalizeWindowsPath(const xmlChar * path)403*6777b538SAndroid Build Coastguard Worker xmlNormalizeWindowsPath(const xmlChar *path)
404*6777b538SAndroid Build Coastguard Worker {
405*6777b538SAndroid Build Coastguard Worker     return xmlStrdup(path);
406*6777b538SAndroid Build Coastguard Worker }
407*6777b538SAndroid Build Coastguard Worker 
408*6777b538SAndroid Build Coastguard Worker /**
409*6777b538SAndroid Build Coastguard Worker  * xmlCheckFilename:
410*6777b538SAndroid Build Coastguard Worker  * @path:  the path to check
411*6777b538SAndroid Build Coastguard Worker  *
412*6777b538SAndroid Build Coastguard Worker  * DEPRECATED: Internal function, don't use.
413*6777b538SAndroid Build Coastguard Worker  *
414*6777b538SAndroid Build Coastguard Worker  * if stat is not available on the target machine,
415*6777b538SAndroid Build Coastguard Worker  * returns 1.  if stat fails, returns 0 (if calling
416*6777b538SAndroid Build Coastguard Worker  * stat on the filename fails, it can't be right).
417*6777b538SAndroid Build Coastguard Worker  * if stat succeeds and the file is a directory,
418*6777b538SAndroid Build Coastguard Worker  * returns 2.  otherwise returns 1.
419*6777b538SAndroid Build Coastguard Worker  */
420*6777b538SAndroid Build Coastguard Worker int
xmlCheckFilename(const char * path)421*6777b538SAndroid Build Coastguard Worker xmlCheckFilename(const char *path)
422*6777b538SAndroid Build Coastguard Worker {
423*6777b538SAndroid Build Coastguard Worker #ifdef HAVE_STAT
424*6777b538SAndroid Build Coastguard Worker #if defined(_WIN32)
425*6777b538SAndroid Build Coastguard Worker     struct _stat stat_buffer;
426*6777b538SAndroid Build Coastguard Worker #else
427*6777b538SAndroid Build Coastguard Worker     struct stat stat_buffer;
428*6777b538SAndroid Build Coastguard Worker #endif
429*6777b538SAndroid Build Coastguard Worker     int res;
430*6777b538SAndroid Build Coastguard Worker #endif
431*6777b538SAndroid Build Coastguard Worker 
432*6777b538SAndroid Build Coastguard Worker     if (path == NULL)
433*6777b538SAndroid Build Coastguard Worker 	return(0);
434*6777b538SAndroid Build Coastguard Worker 
435*6777b538SAndroid Build Coastguard Worker #ifdef HAVE_STAT
436*6777b538SAndroid Build Coastguard Worker #if defined(_WIN32)
437*6777b538SAndroid Build Coastguard Worker     {
438*6777b538SAndroid Build Coastguard Worker         wchar_t *wpath;
439*6777b538SAndroid Build Coastguard Worker 
440*6777b538SAndroid Build Coastguard Worker         /*
441*6777b538SAndroid Build Coastguard Worker          * On Windows stat and wstat do not work with long pathname,
442*6777b538SAndroid Build Coastguard Worker          * which start with '\\?\'
443*6777b538SAndroid Build Coastguard Worker          */
444*6777b538SAndroid Build Coastguard Worker         if ((path[0] == '\\') && (path[1] == '\\') && (path[2] == '?') &&
445*6777b538SAndroid Build Coastguard Worker             (path[3] == '\\') )
446*6777b538SAndroid Build Coastguard Worker                 return 1;
447*6777b538SAndroid Build Coastguard Worker 
448*6777b538SAndroid Build Coastguard Worker         wpath = __xmlIOWin32UTF8ToWChar(path);
449*6777b538SAndroid Build Coastguard Worker         if (wpath == NULL)
450*6777b538SAndroid Build Coastguard Worker             return(0);
451*6777b538SAndroid Build Coastguard Worker         res = _wstat(wpath, &stat_buffer);
452*6777b538SAndroid Build Coastguard Worker         xmlFree(wpath);
453*6777b538SAndroid Build Coastguard Worker     }
454*6777b538SAndroid Build Coastguard Worker #else
455*6777b538SAndroid Build Coastguard Worker     res = stat(path, &stat_buffer);
456*6777b538SAndroid Build Coastguard Worker #endif
457*6777b538SAndroid Build Coastguard Worker 
458*6777b538SAndroid Build Coastguard Worker     if (res < 0)
459*6777b538SAndroid Build Coastguard Worker         return 0;
460*6777b538SAndroid Build Coastguard Worker 
461*6777b538SAndroid Build Coastguard Worker #ifdef S_ISDIR
462*6777b538SAndroid Build Coastguard Worker     if (S_ISDIR(stat_buffer.st_mode))
463*6777b538SAndroid Build Coastguard Worker         return 2;
464*6777b538SAndroid Build Coastguard Worker #endif
465*6777b538SAndroid Build Coastguard Worker #endif /* HAVE_STAT */
466*6777b538SAndroid Build Coastguard Worker 
467*6777b538SAndroid Build Coastguard Worker     return 1;
468*6777b538SAndroid Build Coastguard Worker }
469*6777b538SAndroid Build Coastguard Worker 
470*6777b538SAndroid Build Coastguard Worker static int
xmlConvertUriToPath(const char * uri,char ** out)471*6777b538SAndroid Build Coastguard Worker xmlConvertUriToPath(const char *uri, char **out) {
472*6777b538SAndroid Build Coastguard Worker     const char *escaped;
473*6777b538SAndroid Build Coastguard Worker     char *unescaped;
474*6777b538SAndroid Build Coastguard Worker 
475*6777b538SAndroid Build Coastguard Worker     *out = NULL;
476*6777b538SAndroid Build Coastguard Worker 
477*6777b538SAndroid Build Coastguard Worker     if (!xmlStrncasecmp(BAD_CAST uri, BAD_CAST "file://localhost/", 17)) {
478*6777b538SAndroid Build Coastguard Worker 	escaped = &uri[16];
479*6777b538SAndroid Build Coastguard Worker     } else if (!xmlStrncasecmp(BAD_CAST uri, BAD_CAST "file:///", 8)) {
480*6777b538SAndroid Build Coastguard Worker 	escaped = &uri[7];
481*6777b538SAndroid Build Coastguard Worker     } else if (!xmlStrncasecmp(BAD_CAST uri, BAD_CAST "file:/", 6)) {
482*6777b538SAndroid Build Coastguard Worker         /* lots of generators seems to lazy to read RFC 1738 */
483*6777b538SAndroid Build Coastguard Worker 	escaped = &uri[5];
484*6777b538SAndroid Build Coastguard Worker     } else {
485*6777b538SAndroid Build Coastguard Worker         return(1);
486*6777b538SAndroid Build Coastguard Worker     }
487*6777b538SAndroid Build Coastguard Worker 
488*6777b538SAndroid Build Coastguard Worker #ifdef _WIN32
489*6777b538SAndroid Build Coastguard Worker     /* Ignore slash like in file:///C:/file.txt */
490*6777b538SAndroid Build Coastguard Worker     escaped += 1;
491*6777b538SAndroid Build Coastguard Worker #endif
492*6777b538SAndroid Build Coastguard Worker 
493*6777b538SAndroid Build Coastguard Worker     unescaped = xmlURIUnescapeString(escaped, 0, NULL);
494*6777b538SAndroid Build Coastguard Worker     if (unescaped == NULL)
495*6777b538SAndroid Build Coastguard Worker         return(-1);
496*6777b538SAndroid Build Coastguard Worker 
497*6777b538SAndroid Build Coastguard Worker     *out = unescaped;
498*6777b538SAndroid Build Coastguard Worker     return(0);
499*6777b538SAndroid Build Coastguard Worker }
500*6777b538SAndroid Build Coastguard Worker 
501*6777b538SAndroid Build Coastguard Worker /**
502*6777b538SAndroid Build Coastguard Worker  * xmlFdOpen:
503*6777b538SAndroid Build Coastguard Worker  * @filename:  the URI for matching
504*6777b538SAndroid Build Coastguard Worker  * @out:  pointer to resulting context
505*6777b538SAndroid Build Coastguard Worker  *
506*6777b538SAndroid Build Coastguard Worker  * Returns an xmlParserErrors code
507*6777b538SAndroid Build Coastguard Worker  */
508*6777b538SAndroid Build Coastguard Worker static int
xmlFdOpen(const char * filename,int write,int * out)509*6777b538SAndroid Build Coastguard Worker xmlFdOpen(const char *filename, int write, int *out) {
510*6777b538SAndroid Build Coastguard Worker     char *fromUri = NULL;
511*6777b538SAndroid Build Coastguard Worker     int flags;
512*6777b538SAndroid Build Coastguard Worker     int fd;
513*6777b538SAndroid Build Coastguard Worker     int ret;
514*6777b538SAndroid Build Coastguard Worker 
515*6777b538SAndroid Build Coastguard Worker     *out = -1;
516*6777b538SAndroid Build Coastguard Worker     if (filename == NULL)
517*6777b538SAndroid Build Coastguard Worker         return(XML_ERR_ARGUMENT);
518*6777b538SAndroid Build Coastguard Worker 
519*6777b538SAndroid Build Coastguard Worker     if (xmlConvertUriToPath(filename, &fromUri) < 0)
520*6777b538SAndroid Build Coastguard Worker         return(XML_ERR_NO_MEMORY);
521*6777b538SAndroid Build Coastguard Worker 
522*6777b538SAndroid Build Coastguard Worker     if (fromUri != NULL)
523*6777b538SAndroid Build Coastguard Worker         filename = fromUri;
524*6777b538SAndroid Build Coastguard Worker 
525*6777b538SAndroid Build Coastguard Worker #if defined(_WIN32)
526*6777b538SAndroid Build Coastguard Worker     {
527*6777b538SAndroid Build Coastguard Worker         wchar_t *wpath;
528*6777b538SAndroid Build Coastguard Worker 
529*6777b538SAndroid Build Coastguard Worker         wpath = __xmlIOWin32UTF8ToWChar(filename);
530*6777b538SAndroid Build Coastguard Worker         if (wpath == NULL) {
531*6777b538SAndroid Build Coastguard Worker             xmlFree(fromUri);
532*6777b538SAndroid Build Coastguard Worker             return(XML_ERR_NO_MEMORY);
533*6777b538SAndroid Build Coastguard Worker         }
534*6777b538SAndroid Build Coastguard Worker         if (write)
535*6777b538SAndroid Build Coastguard Worker             flags = _O_WRONLY | _O_CREAT | _O_TRUNC;
536*6777b538SAndroid Build Coastguard Worker         else
537*6777b538SAndroid Build Coastguard Worker             flags = _O_RDONLY;
538*6777b538SAndroid Build Coastguard Worker 	fd = _wopen(wpath, flags | _O_BINARY, 0777);
539*6777b538SAndroid Build Coastguard Worker         xmlFree(wpath);
540*6777b538SAndroid Build Coastguard Worker     }
541*6777b538SAndroid Build Coastguard Worker #else
542*6777b538SAndroid Build Coastguard Worker     if (write)
543*6777b538SAndroid Build Coastguard Worker         flags = O_WRONLY | O_CREAT | O_TRUNC;
544*6777b538SAndroid Build Coastguard Worker     else
545*6777b538SAndroid Build Coastguard Worker         flags = O_RDONLY;
546*6777b538SAndroid Build Coastguard Worker     fd = open(filename, flags, 0777);
547*6777b538SAndroid Build Coastguard Worker #endif /* WIN32 */
548*6777b538SAndroid Build Coastguard Worker 
549*6777b538SAndroid Build Coastguard Worker     if (fd < 0) {
550*6777b538SAndroid Build Coastguard Worker         /*
551*6777b538SAndroid Build Coastguard Worker          * Windows and possibly other platforms return EINVAL
552*6777b538SAndroid Build Coastguard Worker          * for invalid filenames.
553*6777b538SAndroid Build Coastguard Worker          */
554*6777b538SAndroid Build Coastguard Worker         if ((errno == ENOENT) || (errno == EINVAL)) {
555*6777b538SAndroid Build Coastguard Worker             ret = XML_IO_ENOENT;
556*6777b538SAndroid Build Coastguard Worker         } else {
557*6777b538SAndroid Build Coastguard Worker             /*
558*6777b538SAndroid Build Coastguard Worker              * This error won't be forwarded to the parser context
559*6777b538SAndroid Build Coastguard Worker              * which will report it a second time.
560*6777b538SAndroid Build Coastguard Worker              */
561*6777b538SAndroid Build Coastguard Worker             ret = xmlIOErr(0, filename);
562*6777b538SAndroid Build Coastguard Worker         }
563*6777b538SAndroid Build Coastguard Worker     } else {
564*6777b538SAndroid Build Coastguard Worker         *out = fd;
565*6777b538SAndroid Build Coastguard Worker         ret = XML_ERR_OK;
566*6777b538SAndroid Build Coastguard Worker     }
567*6777b538SAndroid Build Coastguard Worker 
568*6777b538SAndroid Build Coastguard Worker     xmlFree(fromUri);
569*6777b538SAndroid Build Coastguard Worker     return(ret);
570*6777b538SAndroid Build Coastguard Worker }
571*6777b538SAndroid Build Coastguard Worker 
572*6777b538SAndroid Build Coastguard Worker /**
573*6777b538SAndroid Build Coastguard Worker  * xmlFdRead:
574*6777b538SAndroid Build Coastguard Worker  * @context:  the I/O context
575*6777b538SAndroid Build Coastguard Worker  * @buffer:  where to drop data
576*6777b538SAndroid Build Coastguard Worker  * @len:  number of bytes to read
577*6777b538SAndroid Build Coastguard Worker  *
578*6777b538SAndroid Build Coastguard Worker  * Read @len bytes to @buffer from the I/O channel.
579*6777b538SAndroid Build Coastguard Worker  *
580*6777b538SAndroid Build Coastguard Worker  * Returns the number of bytes read
581*6777b538SAndroid Build Coastguard Worker  */
582*6777b538SAndroid Build Coastguard Worker static int
xmlFdRead(void * context,char * buffer,int len)583*6777b538SAndroid Build Coastguard Worker xmlFdRead(void *context, char *buffer, int len) {
584*6777b538SAndroid Build Coastguard Worker     int fd = (int) (ptrdiff_t) context;
585*6777b538SAndroid Build Coastguard Worker     int ret = 0;
586*6777b538SAndroid Build Coastguard Worker     int bytes;
587*6777b538SAndroid Build Coastguard Worker 
588*6777b538SAndroid Build Coastguard Worker     while (len > 0) {
589*6777b538SAndroid Build Coastguard Worker         bytes = read(fd, buffer, len);
590*6777b538SAndroid Build Coastguard Worker         if (bytes < 0) {
591*6777b538SAndroid Build Coastguard Worker             /*
592*6777b538SAndroid Build Coastguard Worker              * If we already got some bytes, return them without
593*6777b538SAndroid Build Coastguard Worker              * raising an error.
594*6777b538SAndroid Build Coastguard Worker              */
595*6777b538SAndroid Build Coastguard Worker             if (ret > 0)
596*6777b538SAndroid Build Coastguard Worker                 break;
597*6777b538SAndroid Build Coastguard Worker             return(-xmlIOErr(0, "read()"));
598*6777b538SAndroid Build Coastguard Worker         }
599*6777b538SAndroid Build Coastguard Worker         if (bytes == 0)
600*6777b538SAndroid Build Coastguard Worker             break;
601*6777b538SAndroid Build Coastguard Worker         ret += bytes;
602*6777b538SAndroid Build Coastguard Worker         buffer += bytes;
603*6777b538SAndroid Build Coastguard Worker         len -= bytes;
604*6777b538SAndroid Build Coastguard Worker     }
605*6777b538SAndroid Build Coastguard Worker 
606*6777b538SAndroid Build Coastguard Worker     return(ret);
607*6777b538SAndroid Build Coastguard Worker }
608*6777b538SAndroid Build Coastguard Worker 
609*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
610*6777b538SAndroid Build Coastguard Worker /**
611*6777b538SAndroid Build Coastguard Worker  * xmlFdWrite:
612*6777b538SAndroid Build Coastguard Worker  * @context:  the I/O context
613*6777b538SAndroid Build Coastguard Worker  * @buffer:  where to get data
614*6777b538SAndroid Build Coastguard Worker  * @len:  number of bytes to write
615*6777b538SAndroid Build Coastguard Worker  *
616*6777b538SAndroid Build Coastguard Worker  * Write @len bytes from @buffer to the I/O channel.
617*6777b538SAndroid Build Coastguard Worker  *
618*6777b538SAndroid Build Coastguard Worker  * Returns the number of bytes written
619*6777b538SAndroid Build Coastguard Worker  */
620*6777b538SAndroid Build Coastguard Worker static int
xmlFdWrite(void * context,const char * buffer,int len)621*6777b538SAndroid Build Coastguard Worker xmlFdWrite(void *context, const char *buffer, int len) {
622*6777b538SAndroid Build Coastguard Worker     int fd = (int) (ptrdiff_t) context;
623*6777b538SAndroid Build Coastguard Worker     int ret = 0;
624*6777b538SAndroid Build Coastguard Worker     int bytes;
625*6777b538SAndroid Build Coastguard Worker 
626*6777b538SAndroid Build Coastguard Worker     while (len > 0) {
627*6777b538SAndroid Build Coastguard Worker 	bytes = write(fd, buffer, len);
628*6777b538SAndroid Build Coastguard Worker 	if (bytes < 0)
629*6777b538SAndroid Build Coastguard Worker             return(-xmlIOErr(0, "write()"));
630*6777b538SAndroid Build Coastguard Worker         ret += bytes;
631*6777b538SAndroid Build Coastguard Worker         buffer += bytes;
632*6777b538SAndroid Build Coastguard Worker         len -= bytes;
633*6777b538SAndroid Build Coastguard Worker     }
634*6777b538SAndroid Build Coastguard Worker 
635*6777b538SAndroid Build Coastguard Worker     return(ret);
636*6777b538SAndroid Build Coastguard Worker }
637*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_OUTPUT_ENABLED */
638*6777b538SAndroid Build Coastguard Worker 
639*6777b538SAndroid Build Coastguard Worker /**
640*6777b538SAndroid Build Coastguard Worker  * xmlFdClose:
641*6777b538SAndroid Build Coastguard Worker  * @context:  the I/O context
642*6777b538SAndroid Build Coastguard Worker  *
643*6777b538SAndroid Build Coastguard Worker  * Close an I/O channel
644*6777b538SAndroid Build Coastguard Worker  *
645*6777b538SAndroid Build Coastguard Worker  * Returns 0 in case of success and error code otherwise
646*6777b538SAndroid Build Coastguard Worker  */
647*6777b538SAndroid Build Coastguard Worker static int
xmlFdClose(void * context)648*6777b538SAndroid Build Coastguard Worker xmlFdClose (void * context) {
649*6777b538SAndroid Build Coastguard Worker     int ret;
650*6777b538SAndroid Build Coastguard Worker 
651*6777b538SAndroid Build Coastguard Worker     ret = close((int) (ptrdiff_t) context);
652*6777b538SAndroid Build Coastguard Worker     if (ret < 0)
653*6777b538SAndroid Build Coastguard Worker         return(xmlIOErr(0, "close()"));
654*6777b538SAndroid Build Coastguard Worker 
655*6777b538SAndroid Build Coastguard Worker     return(XML_ERR_OK);
656*6777b538SAndroid Build Coastguard Worker }
657*6777b538SAndroid Build Coastguard Worker 
658*6777b538SAndroid Build Coastguard Worker /**
659*6777b538SAndroid Build Coastguard Worker  * xmlFileMatch:
660*6777b538SAndroid Build Coastguard Worker  * @filename:  the URI for matching
661*6777b538SAndroid Build Coastguard Worker  *
662*6777b538SAndroid Build Coastguard Worker  * DEPRECATED: Internal function, don't use.
663*6777b538SAndroid Build Coastguard Worker  *
664*6777b538SAndroid Build Coastguard Worker  * Returns 1 if matches, 0 otherwise
665*6777b538SAndroid Build Coastguard Worker  */
666*6777b538SAndroid Build Coastguard Worker int
xmlFileMatch(const char * filename ATTRIBUTE_UNUSED)667*6777b538SAndroid Build Coastguard Worker xmlFileMatch (const char *filename ATTRIBUTE_UNUSED) {
668*6777b538SAndroid Build Coastguard Worker     return(1);
669*6777b538SAndroid Build Coastguard Worker }
670*6777b538SAndroid Build Coastguard Worker 
671*6777b538SAndroid Build Coastguard Worker /**
672*6777b538SAndroid Build Coastguard Worker  * xmlFileOpenSafe:
673*6777b538SAndroid Build Coastguard Worker  * @filename:  the URI for matching
674*6777b538SAndroid Build Coastguard Worker  * @out:  pointer to resulting context
675*6777b538SAndroid Build Coastguard Worker  *
676*6777b538SAndroid Build Coastguard Worker  * input from FILE *
677*6777b538SAndroid Build Coastguard Worker  *
678*6777b538SAndroid Build Coastguard Worker  * Returns an I/O context or NULL in case of error
679*6777b538SAndroid Build Coastguard Worker  */
680*6777b538SAndroid Build Coastguard Worker static int
xmlFileOpenSafe(const char * filename,int write,void ** out)681*6777b538SAndroid Build Coastguard Worker xmlFileOpenSafe(const char *filename, int write, void **out) {
682*6777b538SAndroid Build Coastguard Worker     char *fromUri = NULL;
683*6777b538SAndroid Build Coastguard Worker     FILE *fd;
684*6777b538SAndroid Build Coastguard Worker     int ret = XML_ERR_OK;
685*6777b538SAndroid Build Coastguard Worker 
686*6777b538SAndroid Build Coastguard Worker     *out = NULL;
687*6777b538SAndroid Build Coastguard Worker     if (filename == NULL)
688*6777b538SAndroid Build Coastguard Worker         return(XML_ERR_ARGUMENT);
689*6777b538SAndroid Build Coastguard Worker 
690*6777b538SAndroid Build Coastguard Worker     if (xmlConvertUriToPath(filename, &fromUri) < 0)
691*6777b538SAndroid Build Coastguard Worker         return(XML_ERR_NO_MEMORY);
692*6777b538SAndroid Build Coastguard Worker 
693*6777b538SAndroid Build Coastguard Worker     if (fromUri != NULL)
694*6777b538SAndroid Build Coastguard Worker         filename = fromUri;
695*6777b538SAndroid Build Coastguard Worker 
696*6777b538SAndroid Build Coastguard Worker #if defined(_WIN32)
697*6777b538SAndroid Build Coastguard Worker     {
698*6777b538SAndroid Build Coastguard Worker         wchar_t *wpath;
699*6777b538SAndroid Build Coastguard Worker 
700*6777b538SAndroid Build Coastguard Worker         wpath = __xmlIOWin32UTF8ToWChar(filename);
701*6777b538SAndroid Build Coastguard Worker         if (wpath == NULL) {
702*6777b538SAndroid Build Coastguard Worker             xmlFree(fromUri);
703*6777b538SAndroid Build Coastguard Worker             return(XML_ERR_NO_MEMORY);
704*6777b538SAndroid Build Coastguard Worker         }
705*6777b538SAndroid Build Coastguard Worker 	fd = _wfopen(wpath, write ? L"wb" : L"rb");
706*6777b538SAndroid Build Coastguard Worker         xmlFree(wpath);
707*6777b538SAndroid Build Coastguard Worker     }
708*6777b538SAndroid Build Coastguard Worker #else
709*6777b538SAndroid Build Coastguard Worker     fd = fopen(filename, write ? "wb" : "rb");
710*6777b538SAndroid Build Coastguard Worker #endif /* WIN32 */
711*6777b538SAndroid Build Coastguard Worker 
712*6777b538SAndroid Build Coastguard Worker     if (fd == NULL) {
713*6777b538SAndroid Build Coastguard Worker         /*
714*6777b538SAndroid Build Coastguard Worker          * Windows and possibly other platforms return EINVAL
715*6777b538SAndroid Build Coastguard Worker          * for invalid filenames.
716*6777b538SAndroid Build Coastguard Worker          */
717*6777b538SAndroid Build Coastguard Worker         if ((errno == ENOENT) || (errno == EINVAL)) {
718*6777b538SAndroid Build Coastguard Worker             ret = XML_IO_ENOENT;
719*6777b538SAndroid Build Coastguard Worker         } else {
720*6777b538SAndroid Build Coastguard Worker             /*
721*6777b538SAndroid Build Coastguard Worker              * This error won't be forwarded to the parser context
722*6777b538SAndroid Build Coastguard Worker              * which will report it a second time.
723*6777b538SAndroid Build Coastguard Worker              */
724*6777b538SAndroid Build Coastguard Worker             ret = xmlIOErr(0, filename);
725*6777b538SAndroid Build Coastguard Worker         }
726*6777b538SAndroid Build Coastguard Worker     }
727*6777b538SAndroid Build Coastguard Worker 
728*6777b538SAndroid Build Coastguard Worker     *out = fd;
729*6777b538SAndroid Build Coastguard Worker     xmlFree(fromUri);
730*6777b538SAndroid Build Coastguard Worker     return(ret);
731*6777b538SAndroid Build Coastguard Worker }
732*6777b538SAndroid Build Coastguard Worker 
733*6777b538SAndroid Build Coastguard Worker /**
734*6777b538SAndroid Build Coastguard Worker  * xmlFileOpen:
735*6777b538SAndroid Build Coastguard Worker  * @filename:  the URI for matching
736*6777b538SAndroid Build Coastguard Worker  *
737*6777b538SAndroid Build Coastguard Worker  * DEPRECATED: Internal function, don't use.
738*6777b538SAndroid Build Coastguard Worker  *
739*6777b538SAndroid Build Coastguard Worker  * Returns an IO context or NULL in case or failure
740*6777b538SAndroid Build Coastguard Worker  */
741*6777b538SAndroid Build Coastguard Worker void *
xmlFileOpen(const char * filename)742*6777b538SAndroid Build Coastguard Worker xmlFileOpen(const char *filename) {
743*6777b538SAndroid Build Coastguard Worker     void *context;
744*6777b538SAndroid Build Coastguard Worker 
745*6777b538SAndroid Build Coastguard Worker     xmlFileOpenSafe(filename, 0, &context);
746*6777b538SAndroid Build Coastguard Worker     return(context);
747*6777b538SAndroid Build Coastguard Worker }
748*6777b538SAndroid Build Coastguard Worker 
749*6777b538SAndroid Build Coastguard Worker /**
750*6777b538SAndroid Build Coastguard Worker  * xmlFileRead:
751*6777b538SAndroid Build Coastguard Worker  * @context:  the I/O context
752*6777b538SAndroid Build Coastguard Worker  * @buffer:  where to drop data
753*6777b538SAndroid Build Coastguard Worker  * @len:  number of bytes to write
754*6777b538SAndroid Build Coastguard Worker  *
755*6777b538SAndroid Build Coastguard Worker  * DEPRECATED: Internal function, don't use.
756*6777b538SAndroid Build Coastguard Worker  *
757*6777b538SAndroid Build Coastguard Worker  * Returns the number of bytes read or < 0 in case of failure
758*6777b538SAndroid Build Coastguard Worker  */
759*6777b538SAndroid Build Coastguard Worker int
xmlFileRead(void * context,char * buffer,int len)760*6777b538SAndroid Build Coastguard Worker xmlFileRead(void * context, char * buffer, int len) {
761*6777b538SAndroid Build Coastguard Worker     FILE *file = context;
762*6777b538SAndroid Build Coastguard Worker     size_t bytes;
763*6777b538SAndroid Build Coastguard Worker 
764*6777b538SAndroid Build Coastguard Worker     if ((context == NULL) || (buffer == NULL))
765*6777b538SAndroid Build Coastguard Worker         return(-1);
766*6777b538SAndroid Build Coastguard Worker 
767*6777b538SAndroid Build Coastguard Worker     /*
768*6777b538SAndroid Build Coastguard Worker      * The C standard doesn't mandate that fread sets errno, only
769*6777b538SAndroid Build Coastguard Worker      * POSIX does. The Windows documentation isn't really clear.
770*6777b538SAndroid Build Coastguard Worker      * Set errno to zero which will be reported as unknown error
771*6777b538SAndroid Build Coastguard Worker      * if fread fails without setting errno.
772*6777b538SAndroid Build Coastguard Worker      */
773*6777b538SAndroid Build Coastguard Worker     errno = 0;
774*6777b538SAndroid Build Coastguard Worker     bytes = fread(buffer, 1, len, file);
775*6777b538SAndroid Build Coastguard Worker     if ((bytes < (size_t) len) && (ferror(file)))
776*6777b538SAndroid Build Coastguard Worker         return(-xmlIOErr(0, "fread()"));
777*6777b538SAndroid Build Coastguard Worker 
778*6777b538SAndroid Build Coastguard Worker     return(len);
779*6777b538SAndroid Build Coastguard Worker }
780*6777b538SAndroid Build Coastguard Worker 
781*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
782*6777b538SAndroid Build Coastguard Worker /**
783*6777b538SAndroid Build Coastguard Worker  * xmlFileWrite:
784*6777b538SAndroid Build Coastguard Worker  * @context:  the I/O context
785*6777b538SAndroid Build Coastguard Worker  * @buffer:  where to drop data
786*6777b538SAndroid Build Coastguard Worker  * @len:  number of bytes to write
787*6777b538SAndroid Build Coastguard Worker  *
788*6777b538SAndroid Build Coastguard Worker  * Write @len bytes from @buffer to the I/O channel.
789*6777b538SAndroid Build Coastguard Worker  *
790*6777b538SAndroid Build Coastguard Worker  * Returns the number of bytes written
791*6777b538SAndroid Build Coastguard Worker  */
792*6777b538SAndroid Build Coastguard Worker static int
xmlFileWrite(void * context,const char * buffer,int len)793*6777b538SAndroid Build Coastguard Worker xmlFileWrite(void *context, const char *buffer, int len) {
794*6777b538SAndroid Build Coastguard Worker     FILE *file = context;
795*6777b538SAndroid Build Coastguard Worker     size_t bytes;
796*6777b538SAndroid Build Coastguard Worker 
797*6777b538SAndroid Build Coastguard Worker     if ((context == NULL) || (buffer == NULL))
798*6777b538SAndroid Build Coastguard Worker         return(-1);
799*6777b538SAndroid Build Coastguard Worker 
800*6777b538SAndroid Build Coastguard Worker     errno = 0;
801*6777b538SAndroid Build Coastguard Worker     bytes = fwrite(buffer, 1, len, file);
802*6777b538SAndroid Build Coastguard Worker     if (bytes < (size_t) len)
803*6777b538SAndroid Build Coastguard Worker         return(-xmlIOErr(0, "fwrite()"));
804*6777b538SAndroid Build Coastguard Worker 
805*6777b538SAndroid Build Coastguard Worker     return(len);
806*6777b538SAndroid Build Coastguard Worker }
807*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_OUTPUT_ENABLED */
808*6777b538SAndroid Build Coastguard Worker 
809*6777b538SAndroid Build Coastguard Worker /**
810*6777b538SAndroid Build Coastguard Worker  * xmlFileFlush:
811*6777b538SAndroid Build Coastguard Worker  * @context:  the I/O context
812*6777b538SAndroid Build Coastguard Worker  *
813*6777b538SAndroid Build Coastguard Worker  * Flush an I/O channel
814*6777b538SAndroid Build Coastguard Worker  */
815*6777b538SAndroid Build Coastguard Worker static int
xmlFileFlush(void * context)816*6777b538SAndroid Build Coastguard Worker xmlFileFlush (void * context) {
817*6777b538SAndroid Build Coastguard Worker     FILE *file = context;
818*6777b538SAndroid Build Coastguard Worker 
819*6777b538SAndroid Build Coastguard Worker     if (file == NULL)
820*6777b538SAndroid Build Coastguard Worker         return(-1);
821*6777b538SAndroid Build Coastguard Worker 
822*6777b538SAndroid Build Coastguard Worker     if (fflush(file) != 0)
823*6777b538SAndroid Build Coastguard Worker         return(xmlIOErr(0, "fflush()"));
824*6777b538SAndroid Build Coastguard Worker 
825*6777b538SAndroid Build Coastguard Worker     return(XML_ERR_OK);
826*6777b538SAndroid Build Coastguard Worker }
827*6777b538SAndroid Build Coastguard Worker 
828*6777b538SAndroid Build Coastguard Worker /**
829*6777b538SAndroid Build Coastguard Worker  * xmlFileClose:
830*6777b538SAndroid Build Coastguard Worker  * @context:  the I/O context
831*6777b538SAndroid Build Coastguard Worker  *
832*6777b538SAndroid Build Coastguard Worker  * DEPRECATED: Internal function, don't use.
833*6777b538SAndroid Build Coastguard Worker  *
834*6777b538SAndroid Build Coastguard Worker  * Returns 0 or -1 an error code case of error
835*6777b538SAndroid Build Coastguard Worker  */
836*6777b538SAndroid Build Coastguard Worker int
xmlFileClose(void * context)837*6777b538SAndroid Build Coastguard Worker xmlFileClose (void * context) {
838*6777b538SAndroid Build Coastguard Worker     FILE *file = context;
839*6777b538SAndroid Build Coastguard Worker 
840*6777b538SAndroid Build Coastguard Worker     if (context == NULL)
841*6777b538SAndroid Build Coastguard Worker         return(-1);
842*6777b538SAndroid Build Coastguard Worker 
843*6777b538SAndroid Build Coastguard Worker     if (file == stdin)
844*6777b538SAndroid Build Coastguard Worker         return(0);
845*6777b538SAndroid Build Coastguard Worker     if ((file == stdout) || (file == stderr))
846*6777b538SAndroid Build Coastguard Worker         return(xmlFileFlush(file));
847*6777b538SAndroid Build Coastguard Worker 
848*6777b538SAndroid Build Coastguard Worker     if (fclose(file) != 0)
849*6777b538SAndroid Build Coastguard Worker         return(xmlIOErr(0, "fclose()"));
850*6777b538SAndroid Build Coastguard Worker 
851*6777b538SAndroid Build Coastguard Worker     return(0);
852*6777b538SAndroid Build Coastguard Worker }
853*6777b538SAndroid Build Coastguard Worker 
854*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
855*6777b538SAndroid Build Coastguard Worker /**
856*6777b538SAndroid Build Coastguard Worker  * xmlBufferWrite:
857*6777b538SAndroid Build Coastguard Worker  * @context:  the xmlBuffer
858*6777b538SAndroid Build Coastguard Worker  * @buffer:  the data to write
859*6777b538SAndroid Build Coastguard Worker  * @len:  number of bytes to write
860*6777b538SAndroid Build Coastguard Worker  *
861*6777b538SAndroid Build Coastguard Worker  * Write @len bytes from @buffer to the xml buffer
862*6777b538SAndroid Build Coastguard Worker  *
863*6777b538SAndroid Build Coastguard Worker  * Returns the number of bytes written or a negative xmlParserErrors
864*6777b538SAndroid Build Coastguard Worker  * value.
865*6777b538SAndroid Build Coastguard Worker  */
866*6777b538SAndroid Build Coastguard Worker static int
xmlBufferWrite(void * context,const char * buffer,int len)867*6777b538SAndroid Build Coastguard Worker xmlBufferWrite (void * context, const char * buffer, int len) {
868*6777b538SAndroid Build Coastguard Worker     int ret;
869*6777b538SAndroid Build Coastguard Worker 
870*6777b538SAndroid Build Coastguard Worker     ret = xmlBufferAdd((xmlBufferPtr) context, (const xmlChar *) buffer, len);
871*6777b538SAndroid Build Coastguard Worker     if (ret != 0)
872*6777b538SAndroid Build Coastguard Worker         return(-XML_ERR_NO_MEMORY);
873*6777b538SAndroid Build Coastguard Worker     return(len);
874*6777b538SAndroid Build Coastguard Worker }
875*6777b538SAndroid Build Coastguard Worker #endif
876*6777b538SAndroid Build Coastguard Worker 
877*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_ZLIB_ENABLED
878*6777b538SAndroid Build Coastguard Worker /************************************************************************
879*6777b538SAndroid Build Coastguard Worker  *									*
880*6777b538SAndroid Build Coastguard Worker  *		I/O for compressed file accesses			*
881*6777b538SAndroid Build Coastguard Worker  *									*
882*6777b538SAndroid Build Coastguard Worker  ************************************************************************/
883*6777b538SAndroid Build Coastguard Worker 
884*6777b538SAndroid Build Coastguard Worker /**
885*6777b538SAndroid Build Coastguard Worker  * xmlGzfileRead:
886*6777b538SAndroid Build Coastguard Worker  * @context:  the I/O context
887*6777b538SAndroid Build Coastguard Worker  * @buffer:  where to drop data
888*6777b538SAndroid Build Coastguard Worker  * @len:  number of bytes to write
889*6777b538SAndroid Build Coastguard Worker  *
890*6777b538SAndroid Build Coastguard Worker  * Read @len bytes to @buffer from the compressed I/O channel.
891*6777b538SAndroid Build Coastguard Worker  *
892*6777b538SAndroid Build Coastguard Worker  * Returns the number of bytes read.
893*6777b538SAndroid Build Coastguard Worker  */
894*6777b538SAndroid Build Coastguard Worker static int
xmlGzfileRead(void * context,char * buffer,int len)895*6777b538SAndroid Build Coastguard Worker xmlGzfileRead (void * context, char * buffer, int len) {
896*6777b538SAndroid Build Coastguard Worker     int ret;
897*6777b538SAndroid Build Coastguard Worker 
898*6777b538SAndroid Build Coastguard Worker     ret = gzread((gzFile) context, &buffer[0], len);
899*6777b538SAndroid Build Coastguard Worker     if (ret < 0) xmlIOErr(0, "gzread()");
900*6777b538SAndroid Build Coastguard Worker     return(ret);
901*6777b538SAndroid Build Coastguard Worker }
902*6777b538SAndroid Build Coastguard Worker 
903*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
904*6777b538SAndroid Build Coastguard Worker /**
905*6777b538SAndroid Build Coastguard Worker  * xmlGzfileWrite:
906*6777b538SAndroid Build Coastguard Worker  * @context:  the I/O context
907*6777b538SAndroid Build Coastguard Worker  * @buffer:  where to drop data
908*6777b538SAndroid Build Coastguard Worker  * @len:  number of bytes to write
909*6777b538SAndroid Build Coastguard Worker  *
910*6777b538SAndroid Build Coastguard Worker  * Write @len bytes from @buffer to the compressed I/O channel.
911*6777b538SAndroid Build Coastguard Worker  *
912*6777b538SAndroid Build Coastguard Worker  * Returns the number of bytes written
913*6777b538SAndroid Build Coastguard Worker  */
914*6777b538SAndroid Build Coastguard Worker static int
xmlGzfileWrite(void * context,const char * buffer,int len)915*6777b538SAndroid Build Coastguard Worker xmlGzfileWrite (void * context, const char * buffer, int len) {
916*6777b538SAndroid Build Coastguard Worker     int ret;
917*6777b538SAndroid Build Coastguard Worker 
918*6777b538SAndroid Build Coastguard Worker     ret = gzwrite((gzFile) context, (char *) &buffer[0], len);
919*6777b538SAndroid Build Coastguard Worker     if (ret < 0) xmlIOErr(0, "gzwrite()");
920*6777b538SAndroid Build Coastguard Worker     return(ret);
921*6777b538SAndroid Build Coastguard Worker }
922*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_OUTPUT_ENABLED */
923*6777b538SAndroid Build Coastguard Worker 
924*6777b538SAndroid Build Coastguard Worker /**
925*6777b538SAndroid Build Coastguard Worker  * xmlGzfileClose:
926*6777b538SAndroid Build Coastguard Worker  * @context:  the I/O context
927*6777b538SAndroid Build Coastguard Worker  *
928*6777b538SAndroid Build Coastguard Worker  * Close a compressed I/O channel
929*6777b538SAndroid Build Coastguard Worker  */
930*6777b538SAndroid Build Coastguard Worker static int
xmlGzfileClose(void * context)931*6777b538SAndroid Build Coastguard Worker xmlGzfileClose (void * context) {
932*6777b538SAndroid Build Coastguard Worker     int ret;
933*6777b538SAndroid Build Coastguard Worker 
934*6777b538SAndroid Build Coastguard Worker     ret =  (gzclose((gzFile) context) == Z_OK ) ? 0 : -1;
935*6777b538SAndroid Build Coastguard Worker     if (ret < 0) xmlIOErr(0, "gzclose()");
936*6777b538SAndroid Build Coastguard Worker     return(ret);
937*6777b538SAndroid Build Coastguard Worker }
938*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_ZLIB_ENABLED */
939*6777b538SAndroid Build Coastguard Worker 
940*6777b538SAndroid Build Coastguard Worker /************************************************************************
941*6777b538SAndroid Build Coastguard Worker  *									*
942*6777b538SAndroid Build Coastguard Worker  *		I/O for compressed file accesses			*
943*6777b538SAndroid Build Coastguard Worker  *									*
944*6777b538SAndroid Build Coastguard Worker  ************************************************************************/
945*6777b538SAndroid Build Coastguard Worker 
946*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_LZMA_ENABLED
947*6777b538SAndroid Build Coastguard Worker 
948*6777b538SAndroid Build Coastguard Worker #include "private/xzlib.h"
949*6777b538SAndroid Build Coastguard Worker 
950*6777b538SAndroid Build Coastguard Worker /**
951*6777b538SAndroid Build Coastguard Worker  * xmlXzfileRead:
952*6777b538SAndroid Build Coastguard Worker  * @context:  the I/O context
953*6777b538SAndroid Build Coastguard Worker  * @buffer:  where to drop data
954*6777b538SAndroid Build Coastguard Worker  * @len:  number of bytes to write
955*6777b538SAndroid Build Coastguard Worker  *
956*6777b538SAndroid Build Coastguard Worker  * Read @len bytes to @buffer from the compressed I/O channel.
957*6777b538SAndroid Build Coastguard Worker  *
958*6777b538SAndroid Build Coastguard Worker  * Returns the number of bytes written
959*6777b538SAndroid Build Coastguard Worker  */
960*6777b538SAndroid Build Coastguard Worker static int
xmlXzfileRead(void * context,char * buffer,int len)961*6777b538SAndroid Build Coastguard Worker xmlXzfileRead (void * context, char * buffer, int len) {
962*6777b538SAndroid Build Coastguard Worker     int ret;
963*6777b538SAndroid Build Coastguard Worker 
964*6777b538SAndroid Build Coastguard Worker     ret = __libxml2_xzread((xzFile) context, &buffer[0], len);
965*6777b538SAndroid Build Coastguard Worker     if (ret < 0) xmlIOErr(0, "xzread()");
966*6777b538SAndroid Build Coastguard Worker     return(ret);
967*6777b538SAndroid Build Coastguard Worker }
968*6777b538SAndroid Build Coastguard Worker 
969*6777b538SAndroid Build Coastguard Worker /**
970*6777b538SAndroid Build Coastguard Worker  * xmlXzfileClose:
971*6777b538SAndroid Build Coastguard Worker  * @context:  the I/O context
972*6777b538SAndroid Build Coastguard Worker  *
973*6777b538SAndroid Build Coastguard Worker  * Close a compressed I/O channel
974*6777b538SAndroid Build Coastguard Worker  */
975*6777b538SAndroid Build Coastguard Worker static int
xmlXzfileClose(void * context)976*6777b538SAndroid Build Coastguard Worker xmlXzfileClose (void * context) {
977*6777b538SAndroid Build Coastguard Worker     int ret;
978*6777b538SAndroid Build Coastguard Worker 
979*6777b538SAndroid Build Coastguard Worker     ret =  (__libxml2_xzclose((xzFile) context) == LZMA_OK ) ? 0 : -1;
980*6777b538SAndroid Build Coastguard Worker     if (ret < 0) xmlIOErr(0, "xzclose()");
981*6777b538SAndroid Build Coastguard Worker     return(ret);
982*6777b538SAndroid Build Coastguard Worker }
983*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_LZMA_ENABLED */
984*6777b538SAndroid Build Coastguard Worker 
985*6777b538SAndroid Build Coastguard Worker /************************************************************************
986*6777b538SAndroid Build Coastguard Worker  *									*
987*6777b538SAndroid Build Coastguard Worker  *			I/O for HTTP file accesses			*
988*6777b538SAndroid Build Coastguard Worker  *									*
989*6777b538SAndroid Build Coastguard Worker  ************************************************************************/
990*6777b538SAndroid Build Coastguard Worker 
991*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_HTTP_ENABLED
992*6777b538SAndroid Build Coastguard Worker /**
993*6777b538SAndroid Build Coastguard Worker  * xmlIOHTTPMatch:
994*6777b538SAndroid Build Coastguard Worker  * @filename:  the URI for matching
995*6777b538SAndroid Build Coastguard Worker  *
996*6777b538SAndroid Build Coastguard Worker  * DEPRECATED: Internal function, don't use.
997*6777b538SAndroid Build Coastguard Worker  *
998*6777b538SAndroid Build Coastguard Worker  * check if the URI matches an HTTP one
999*6777b538SAndroid Build Coastguard Worker  *
1000*6777b538SAndroid Build Coastguard Worker  * Returns 1 if matches, 0 otherwise
1001*6777b538SAndroid Build Coastguard Worker  */
1002*6777b538SAndroid Build Coastguard Worker int
xmlIOHTTPMatch(const char * filename)1003*6777b538SAndroid Build Coastguard Worker xmlIOHTTPMatch (const char *filename) {
1004*6777b538SAndroid Build Coastguard Worker     if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "http://", 7))
1005*6777b538SAndroid Build Coastguard Worker 	return(1);
1006*6777b538SAndroid Build Coastguard Worker     return(0);
1007*6777b538SAndroid Build Coastguard Worker }
1008*6777b538SAndroid Build Coastguard Worker 
1009*6777b538SAndroid Build Coastguard Worker /**
1010*6777b538SAndroid Build Coastguard Worker  * xmlIOHTTPOpen:
1011*6777b538SAndroid Build Coastguard Worker  * @filename:  the URI for matching
1012*6777b538SAndroid Build Coastguard Worker  *
1013*6777b538SAndroid Build Coastguard Worker  * DEPRECATED: Internal function, don't use.
1014*6777b538SAndroid Build Coastguard Worker  *
1015*6777b538SAndroid Build Coastguard Worker  * open an HTTP I/O channel
1016*6777b538SAndroid Build Coastguard Worker  *
1017*6777b538SAndroid Build Coastguard Worker  * Returns an I/O context or NULL in case of error
1018*6777b538SAndroid Build Coastguard Worker  */
1019*6777b538SAndroid Build Coastguard Worker void *
xmlIOHTTPOpen(const char * filename)1020*6777b538SAndroid Build Coastguard Worker xmlIOHTTPOpen (const char *filename) {
1021*6777b538SAndroid Build Coastguard Worker     return(xmlNanoHTTPOpen(filename, NULL));
1022*6777b538SAndroid Build Coastguard Worker }
1023*6777b538SAndroid Build Coastguard Worker 
1024*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
1025*6777b538SAndroid Build Coastguard Worker /**
1026*6777b538SAndroid Build Coastguard Worker  * xmlIOHTTPOpenW:
1027*6777b538SAndroid Build Coastguard Worker  * @post_uri:  The destination URI for the document
1028*6777b538SAndroid Build Coastguard Worker  * @compression:  The compression desired for the document.
1029*6777b538SAndroid Build Coastguard Worker  *
1030*6777b538SAndroid Build Coastguard Worker  * DEPRECATED: Support for HTTP POST has been removed.
1031*6777b538SAndroid Build Coastguard Worker  *
1032*6777b538SAndroid Build Coastguard Worker  * Returns NULL.
1033*6777b538SAndroid Build Coastguard Worker  */
1034*6777b538SAndroid Build Coastguard Worker void *
xmlIOHTTPOpenW(const char * post_uri ATTRIBUTE_UNUSED,int compression ATTRIBUTE_UNUSED)1035*6777b538SAndroid Build Coastguard Worker xmlIOHTTPOpenW(const char *post_uri ATTRIBUTE_UNUSED,
1036*6777b538SAndroid Build Coastguard Worker                int compression ATTRIBUTE_UNUSED)
1037*6777b538SAndroid Build Coastguard Worker {
1038*6777b538SAndroid Build Coastguard Worker     return(NULL);
1039*6777b538SAndroid Build Coastguard Worker }
1040*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_OUTPUT_ENABLED */
1041*6777b538SAndroid Build Coastguard Worker 
1042*6777b538SAndroid Build Coastguard Worker /**
1043*6777b538SAndroid Build Coastguard Worker  * xmlIOHTTPRead:
1044*6777b538SAndroid Build Coastguard Worker  * @context:  the I/O context
1045*6777b538SAndroid Build Coastguard Worker  * @buffer:  where to drop data
1046*6777b538SAndroid Build Coastguard Worker  * @len:  number of bytes to write
1047*6777b538SAndroid Build Coastguard Worker  *
1048*6777b538SAndroid Build Coastguard Worker  * DEPRECATED: Internal function, don't use.
1049*6777b538SAndroid Build Coastguard Worker  *
1050*6777b538SAndroid Build Coastguard Worker  * Read @len bytes to @buffer from the I/O channel.
1051*6777b538SAndroid Build Coastguard Worker  *
1052*6777b538SAndroid Build Coastguard Worker  * Returns the number of bytes written
1053*6777b538SAndroid Build Coastguard Worker  */
1054*6777b538SAndroid Build Coastguard Worker int
xmlIOHTTPRead(void * context,char * buffer,int len)1055*6777b538SAndroid Build Coastguard Worker xmlIOHTTPRead(void * context, char * buffer, int len) {
1056*6777b538SAndroid Build Coastguard Worker     if ((buffer == NULL) || (len < 0)) return(-1);
1057*6777b538SAndroid Build Coastguard Worker     return(xmlNanoHTTPRead(context, &buffer[0], len));
1058*6777b538SAndroid Build Coastguard Worker }
1059*6777b538SAndroid Build Coastguard Worker 
1060*6777b538SAndroid Build Coastguard Worker /**
1061*6777b538SAndroid Build Coastguard Worker  * xmlIOHTTPClose:
1062*6777b538SAndroid Build Coastguard Worker  * @context:  the I/O context
1063*6777b538SAndroid Build Coastguard Worker  *
1064*6777b538SAndroid Build Coastguard Worker  * DEPRECATED: Internal function, don't use.
1065*6777b538SAndroid Build Coastguard Worker  *
1066*6777b538SAndroid Build Coastguard Worker  * Close an HTTP I/O channel
1067*6777b538SAndroid Build Coastguard Worker  *
1068*6777b538SAndroid Build Coastguard Worker  * Returns 0
1069*6777b538SAndroid Build Coastguard Worker  */
1070*6777b538SAndroid Build Coastguard Worker int
xmlIOHTTPClose(void * context)1071*6777b538SAndroid Build Coastguard Worker xmlIOHTTPClose (void * context) {
1072*6777b538SAndroid Build Coastguard Worker     xmlNanoHTTPClose(context);
1073*6777b538SAndroid Build Coastguard Worker     return 0;
1074*6777b538SAndroid Build Coastguard Worker }
1075*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_HTTP_ENABLED */
1076*6777b538SAndroid Build Coastguard Worker 
1077*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_FTP_ENABLED
1078*6777b538SAndroid Build Coastguard Worker /************************************************************************
1079*6777b538SAndroid Build Coastguard Worker  *									*
1080*6777b538SAndroid Build Coastguard Worker  *			I/O for FTP file accesses			*
1081*6777b538SAndroid Build Coastguard Worker  *									*
1082*6777b538SAndroid Build Coastguard Worker  ************************************************************************/
1083*6777b538SAndroid Build Coastguard Worker /**
1084*6777b538SAndroid Build Coastguard Worker  * xmlIOFTPMatch:
1085*6777b538SAndroid Build Coastguard Worker  * @filename:  the URI for matching
1086*6777b538SAndroid Build Coastguard Worker  *
1087*6777b538SAndroid Build Coastguard Worker  * DEPRECATED: Internal function, don't use.
1088*6777b538SAndroid Build Coastguard Worker  *
1089*6777b538SAndroid Build Coastguard Worker  * check if the URI matches an FTP one
1090*6777b538SAndroid Build Coastguard Worker  *
1091*6777b538SAndroid Build Coastguard Worker  * Returns 1 if matches, 0 otherwise
1092*6777b538SAndroid Build Coastguard Worker  */
1093*6777b538SAndroid Build Coastguard Worker int
xmlIOFTPMatch(const char * filename)1094*6777b538SAndroid Build Coastguard Worker xmlIOFTPMatch (const char *filename) {
1095*6777b538SAndroid Build Coastguard Worker     if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "ftp://", 6))
1096*6777b538SAndroid Build Coastguard Worker 	return(1);
1097*6777b538SAndroid Build Coastguard Worker     return(0);
1098*6777b538SAndroid Build Coastguard Worker }
1099*6777b538SAndroid Build Coastguard Worker 
1100*6777b538SAndroid Build Coastguard Worker /**
1101*6777b538SAndroid Build Coastguard Worker  * xmlIOFTPOpen:
1102*6777b538SAndroid Build Coastguard Worker  * @filename:  the URI for matching
1103*6777b538SAndroid Build Coastguard Worker  *
1104*6777b538SAndroid Build Coastguard Worker  * DEPRECATED: Internal function, don't use.
1105*6777b538SAndroid Build Coastguard Worker  *
1106*6777b538SAndroid Build Coastguard Worker  * open an FTP I/O channel
1107*6777b538SAndroid Build Coastguard Worker  *
1108*6777b538SAndroid Build Coastguard Worker  * Returns an I/O context or NULL in case of error
1109*6777b538SAndroid Build Coastguard Worker  */
1110*6777b538SAndroid Build Coastguard Worker void *
xmlIOFTPOpen(const char * filename)1111*6777b538SAndroid Build Coastguard Worker xmlIOFTPOpen (const char *filename) {
1112*6777b538SAndroid Build Coastguard Worker     return(xmlNanoFTPOpen(filename));
1113*6777b538SAndroid Build Coastguard Worker }
1114*6777b538SAndroid Build Coastguard Worker 
1115*6777b538SAndroid Build Coastguard Worker /**
1116*6777b538SAndroid Build Coastguard Worker  * xmlIOFTPRead:
1117*6777b538SAndroid Build Coastguard Worker  * @context:  the I/O context
1118*6777b538SAndroid Build Coastguard Worker  * @buffer:  where to drop data
1119*6777b538SAndroid Build Coastguard Worker  * @len:  number of bytes to write
1120*6777b538SAndroid Build Coastguard Worker  *
1121*6777b538SAndroid Build Coastguard Worker  * DEPRECATED: Internal function, don't use.
1122*6777b538SAndroid Build Coastguard Worker  *
1123*6777b538SAndroid Build Coastguard Worker  * Read @len bytes to @buffer from the I/O channel.
1124*6777b538SAndroid Build Coastguard Worker  *
1125*6777b538SAndroid Build Coastguard Worker  * Returns the number of bytes written
1126*6777b538SAndroid Build Coastguard Worker  */
1127*6777b538SAndroid Build Coastguard Worker int
xmlIOFTPRead(void * context,char * buffer,int len)1128*6777b538SAndroid Build Coastguard Worker xmlIOFTPRead(void * context, char * buffer, int len) {
1129*6777b538SAndroid Build Coastguard Worker     if ((buffer == NULL) || (len < 0)) return(-1);
1130*6777b538SAndroid Build Coastguard Worker     return(xmlNanoFTPRead(context, &buffer[0], len));
1131*6777b538SAndroid Build Coastguard Worker }
1132*6777b538SAndroid Build Coastguard Worker 
1133*6777b538SAndroid Build Coastguard Worker /**
1134*6777b538SAndroid Build Coastguard Worker  * xmlIOFTPClose:
1135*6777b538SAndroid Build Coastguard Worker  * @context:  the I/O context
1136*6777b538SAndroid Build Coastguard Worker  *
1137*6777b538SAndroid Build Coastguard Worker  * DEPRECATED: Internal function, don't use.
1138*6777b538SAndroid Build Coastguard Worker  *
1139*6777b538SAndroid Build Coastguard Worker  * Close an FTP I/O channel
1140*6777b538SAndroid Build Coastguard Worker  *
1141*6777b538SAndroid Build Coastguard Worker  * Returns 0
1142*6777b538SAndroid Build Coastguard Worker  */
1143*6777b538SAndroid Build Coastguard Worker int
xmlIOFTPClose(void * context)1144*6777b538SAndroid Build Coastguard Worker xmlIOFTPClose (void * context) {
1145*6777b538SAndroid Build Coastguard Worker     return ( xmlNanoFTPClose(context) );
1146*6777b538SAndroid Build Coastguard Worker }
1147*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_FTP_ENABLED */
1148*6777b538SAndroid Build Coastguard Worker 
1149*6777b538SAndroid Build Coastguard Worker /************************************************************************
1150*6777b538SAndroid Build Coastguard Worker  *									*
1151*6777b538SAndroid Build Coastguard Worker  *			Input/output buffers				*
1152*6777b538SAndroid Build Coastguard Worker  *									*
1153*6777b538SAndroid Build Coastguard Worker  ************************************************************************/
1154*6777b538SAndroid Build Coastguard Worker 
1155*6777b538SAndroid Build Coastguard Worker static int
xmlIODefaultMatch(const char * filename ATTRIBUTE_UNUSED)1156*6777b538SAndroid Build Coastguard Worker xmlIODefaultMatch(const char *filename ATTRIBUTE_UNUSED) {
1157*6777b538SAndroid Build Coastguard Worker     return(1);
1158*6777b538SAndroid Build Coastguard Worker }
1159*6777b538SAndroid Build Coastguard Worker 
1160*6777b538SAndroid Build Coastguard Worker /**
1161*6777b538SAndroid Build Coastguard Worker  * xmlInputDefaultOpen:
1162*6777b538SAndroid Build Coastguard Worker  * @buf:  input buffer to be filled
1163*6777b538SAndroid Build Coastguard Worker  * @filename:  filename or URI
1164*6777b538SAndroid Build Coastguard Worker  *
1165*6777b538SAndroid Build Coastguard Worker  * Returns an xmlParserErrors code.
1166*6777b538SAndroid Build Coastguard Worker  */
1167*6777b538SAndroid Build Coastguard Worker static int
xmlInputDefaultOpen(xmlParserInputBufferPtr buf,const char * filename)1168*6777b538SAndroid Build Coastguard Worker xmlInputDefaultOpen(xmlParserInputBufferPtr buf, const char *filename) {
1169*6777b538SAndroid Build Coastguard Worker     int ret;
1170*6777b538SAndroid Build Coastguard Worker     int fd;
1171*6777b538SAndroid Build Coastguard Worker 
1172*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_FTP_ENABLED
1173*6777b538SAndroid Build Coastguard Worker     if (xmlIOFTPMatch(filename)) {
1174*6777b538SAndroid Build Coastguard Worker         buf->context = xmlIOFTPOpen(filename);
1175*6777b538SAndroid Build Coastguard Worker 
1176*6777b538SAndroid Build Coastguard Worker         if (buf->context != NULL) {
1177*6777b538SAndroid Build Coastguard Worker             buf->readcallback = xmlIOFTPRead;
1178*6777b538SAndroid Build Coastguard Worker             buf->closecallback = xmlIOFTPClose;
1179*6777b538SAndroid Build Coastguard Worker             return(XML_ERR_OK);
1180*6777b538SAndroid Build Coastguard Worker         }
1181*6777b538SAndroid Build Coastguard Worker     }
1182*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_FTP_ENABLED */
1183*6777b538SAndroid Build Coastguard Worker 
1184*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_HTTP_ENABLED
1185*6777b538SAndroid Build Coastguard Worker     if (xmlIOHTTPMatch(filename)) {
1186*6777b538SAndroid Build Coastguard Worker         buf->context = xmlIOHTTPOpen(filename);
1187*6777b538SAndroid Build Coastguard Worker 
1188*6777b538SAndroid Build Coastguard Worker         if (buf->context != NULL) {
1189*6777b538SAndroid Build Coastguard Worker             buf->readcallback = xmlIOHTTPRead;
1190*6777b538SAndroid Build Coastguard Worker             buf->closecallback = xmlIOHTTPClose;
1191*6777b538SAndroid Build Coastguard Worker             return(XML_ERR_OK);
1192*6777b538SAndroid Build Coastguard Worker         }
1193*6777b538SAndroid Build Coastguard Worker     }
1194*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_HTTP_ENABLED */
1195*6777b538SAndroid Build Coastguard Worker 
1196*6777b538SAndroid Build Coastguard Worker     if (!xmlFileMatch(filename))
1197*6777b538SAndroid Build Coastguard Worker         return(XML_IO_ENOENT);
1198*6777b538SAndroid Build Coastguard Worker 
1199*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_LZMA_ENABLED
1200*6777b538SAndroid Build Coastguard Worker     {
1201*6777b538SAndroid Build Coastguard Worker         xzFile xzStream;
1202*6777b538SAndroid Build Coastguard Worker 
1203*6777b538SAndroid Build Coastguard Worker         ret = xmlFdOpen(filename, 0, &fd);
1204*6777b538SAndroid Build Coastguard Worker         if (ret != XML_ERR_OK)
1205*6777b538SAndroid Build Coastguard Worker             return(ret);
1206*6777b538SAndroid Build Coastguard Worker 
1207*6777b538SAndroid Build Coastguard Worker         xzStream = __libxml2_xzdopen(filename, fd, "rb");
1208*6777b538SAndroid Build Coastguard Worker 
1209*6777b538SAndroid Build Coastguard Worker         if (xzStream == NULL) {
1210*6777b538SAndroid Build Coastguard Worker             close(fd);
1211*6777b538SAndroid Build Coastguard Worker         } else {
1212*6777b538SAndroid Build Coastguard Worker             if (__libxml2_xzcompressed(xzStream) > 0) {
1213*6777b538SAndroid Build Coastguard Worker                 buf->context = xzStream;
1214*6777b538SAndroid Build Coastguard Worker                 buf->readcallback = xmlXzfileRead;
1215*6777b538SAndroid Build Coastguard Worker                 buf->closecallback = xmlXzfileClose;
1216*6777b538SAndroid Build Coastguard Worker                 buf->compressed = 1;
1217*6777b538SAndroid Build Coastguard Worker 
1218*6777b538SAndroid Build Coastguard Worker                 return(XML_ERR_OK);
1219*6777b538SAndroid Build Coastguard Worker             }
1220*6777b538SAndroid Build Coastguard Worker 
1221*6777b538SAndroid Build Coastguard Worker             xmlXzfileClose(xzStream);
1222*6777b538SAndroid Build Coastguard Worker         }
1223*6777b538SAndroid Build Coastguard Worker     }
1224*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_LZMA_ENABLED */
1225*6777b538SAndroid Build Coastguard Worker 
1226*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_ZLIB_ENABLED
1227*6777b538SAndroid Build Coastguard Worker     {
1228*6777b538SAndroid Build Coastguard Worker         gzFile gzStream;
1229*6777b538SAndroid Build Coastguard Worker 
1230*6777b538SAndroid Build Coastguard Worker         ret = xmlFdOpen(filename, 0, &fd);
1231*6777b538SAndroid Build Coastguard Worker         if (ret != XML_ERR_OK)
1232*6777b538SAndroid Build Coastguard Worker             return(ret);
1233*6777b538SAndroid Build Coastguard Worker 
1234*6777b538SAndroid Build Coastguard Worker         gzStream = gzdopen(fd, "rb");
1235*6777b538SAndroid Build Coastguard Worker 
1236*6777b538SAndroid Build Coastguard Worker         if (gzStream == NULL) {
1237*6777b538SAndroid Build Coastguard Worker             close(fd);
1238*6777b538SAndroid Build Coastguard Worker         } else {
1239*6777b538SAndroid Build Coastguard Worker             char buff4[4];
1240*6777b538SAndroid Build Coastguard Worker 
1241*6777b538SAndroid Build Coastguard Worker             if ((gzread(gzStream, buff4, 4) > 0) &&
1242*6777b538SAndroid Build Coastguard Worker                 (gzdirect(gzStream) == 0)) {
1243*6777b538SAndroid Build Coastguard Worker                 gzrewind(gzStream);
1244*6777b538SAndroid Build Coastguard Worker 
1245*6777b538SAndroid Build Coastguard Worker                 buf->context = gzStream;
1246*6777b538SAndroid Build Coastguard Worker                 buf->readcallback = xmlGzfileRead;
1247*6777b538SAndroid Build Coastguard Worker                 buf->closecallback = xmlGzfileClose;
1248*6777b538SAndroid Build Coastguard Worker                 buf->compressed = 1;
1249*6777b538SAndroid Build Coastguard Worker 
1250*6777b538SAndroid Build Coastguard Worker                 return(XML_ERR_OK);
1251*6777b538SAndroid Build Coastguard Worker             }
1252*6777b538SAndroid Build Coastguard Worker 
1253*6777b538SAndroid Build Coastguard Worker             xmlGzfileClose(gzStream);
1254*6777b538SAndroid Build Coastguard Worker         }
1255*6777b538SAndroid Build Coastguard Worker     }
1256*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_ZLIB_ENABLED */
1257*6777b538SAndroid Build Coastguard Worker 
1258*6777b538SAndroid Build Coastguard Worker     ret = xmlFdOpen(filename, 0, &fd);
1259*6777b538SAndroid Build Coastguard Worker     if (ret != XML_ERR_OK)
1260*6777b538SAndroid Build Coastguard Worker         return(ret);
1261*6777b538SAndroid Build Coastguard Worker 
1262*6777b538SAndroid Build Coastguard Worker     buf->context = (void *) (ptrdiff_t) fd;
1263*6777b538SAndroid Build Coastguard Worker     buf->readcallback = xmlFdRead;
1264*6777b538SAndroid Build Coastguard Worker     buf->closecallback = xmlFdClose;
1265*6777b538SAndroid Build Coastguard Worker     return(XML_ERR_OK);
1266*6777b538SAndroid Build Coastguard Worker }
1267*6777b538SAndroid Build Coastguard Worker 
1268*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
1269*6777b538SAndroid Build Coastguard Worker /**
1270*6777b538SAndroid Build Coastguard Worker  * xmlOutputDefaultOpen:
1271*6777b538SAndroid Build Coastguard Worker  * @buf:  input buffer to be filled
1272*6777b538SAndroid Build Coastguard Worker  * @filename:  filename or URI
1273*6777b538SAndroid Build Coastguard Worker  * @compression:  compression level or 0
1274*6777b538SAndroid Build Coastguard Worker  * @is_file_uri:  whether filename is a file URI
1275*6777b538SAndroid Build Coastguard Worker  *
1276*6777b538SAndroid Build Coastguard Worker  * Returns an xmlParserErrors code.
1277*6777b538SAndroid Build Coastguard Worker  */
1278*6777b538SAndroid Build Coastguard Worker static int
xmlOutputDefaultOpen(xmlOutputBufferPtr buf,const char * filename,int compression)1279*6777b538SAndroid Build Coastguard Worker xmlOutputDefaultOpen(xmlOutputBufferPtr buf, const char *filename,
1280*6777b538SAndroid Build Coastguard Worker                      int compression) {
1281*6777b538SAndroid Build Coastguard Worker     int fd;
1282*6777b538SAndroid Build Coastguard Worker 
1283*6777b538SAndroid Build Coastguard Worker     (void) compression;
1284*6777b538SAndroid Build Coastguard Worker 
1285*6777b538SAndroid Build Coastguard Worker     if (!strcmp(filename, "-")) {
1286*6777b538SAndroid Build Coastguard Worker         fd = dup(STDOUT_FILENO);
1287*6777b538SAndroid Build Coastguard Worker 
1288*6777b538SAndroid Build Coastguard Worker         if (fd < 0)
1289*6777b538SAndroid Build Coastguard Worker             return(xmlIOErr(0, "dup()"));
1290*6777b538SAndroid Build Coastguard Worker     } else {
1291*6777b538SAndroid Build Coastguard Worker         int ret;
1292*6777b538SAndroid Build Coastguard Worker 
1293*6777b538SAndroid Build Coastguard Worker         ret = xmlFdOpen(filename, /* write */ 1, &fd);
1294*6777b538SAndroid Build Coastguard Worker         if (ret != XML_ERR_OK)
1295*6777b538SAndroid Build Coastguard Worker             return(ret);
1296*6777b538SAndroid Build Coastguard Worker     }
1297*6777b538SAndroid Build Coastguard Worker 
1298*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_ZLIB_ENABLED
1299*6777b538SAndroid Build Coastguard Worker     if ((compression > 0) && (compression <= 9)) {
1300*6777b538SAndroid Build Coastguard Worker         gzFile gzStream;
1301*6777b538SAndroid Build Coastguard Worker         char mode[15];
1302*6777b538SAndroid Build Coastguard Worker 
1303*6777b538SAndroid Build Coastguard Worker         snprintf(mode, sizeof(mode), "wb%d", compression);
1304*6777b538SAndroid Build Coastguard Worker         gzStream = gzdopen(fd, mode);
1305*6777b538SAndroid Build Coastguard Worker 
1306*6777b538SAndroid Build Coastguard Worker         if (gzStream == NULL) {
1307*6777b538SAndroid Build Coastguard Worker             close(fd);
1308*6777b538SAndroid Build Coastguard Worker             return(xmlIOErr(XML_IO_UNKNOWN, "gzdopen()"));
1309*6777b538SAndroid Build Coastguard Worker         }
1310*6777b538SAndroid Build Coastguard Worker 
1311*6777b538SAndroid Build Coastguard Worker         buf->context = gzStream;
1312*6777b538SAndroid Build Coastguard Worker         buf->writecallback = xmlGzfileWrite;
1313*6777b538SAndroid Build Coastguard Worker         buf->closecallback = xmlGzfileClose;
1314*6777b538SAndroid Build Coastguard Worker 
1315*6777b538SAndroid Build Coastguard Worker         return(XML_ERR_OK);
1316*6777b538SAndroid Build Coastguard Worker     }
1317*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_ZLIB_ENABLED */
1318*6777b538SAndroid Build Coastguard Worker 
1319*6777b538SAndroid Build Coastguard Worker     buf->context = (void *) (ptrdiff_t) fd;
1320*6777b538SAndroid Build Coastguard Worker     buf->writecallback = xmlFdWrite;
1321*6777b538SAndroid Build Coastguard Worker     buf->closecallback = xmlFdClose;
1322*6777b538SAndroid Build Coastguard Worker     return(XML_ERR_OK);
1323*6777b538SAndroid Build Coastguard Worker }
1324*6777b538SAndroid Build Coastguard Worker #endif
1325*6777b538SAndroid Build Coastguard Worker 
1326*6777b538SAndroid Build Coastguard Worker /**
1327*6777b538SAndroid Build Coastguard Worker  * xmlAllocParserInputBuffer:
1328*6777b538SAndroid Build Coastguard Worker  * @enc:  the charset encoding if known (deprecated)
1329*6777b538SAndroid Build Coastguard Worker  *
1330*6777b538SAndroid Build Coastguard Worker  * Create a buffered parser input for progressive parsing.
1331*6777b538SAndroid Build Coastguard Worker  *
1332*6777b538SAndroid Build Coastguard Worker  * The encoding argument is deprecated and should be set to
1333*6777b538SAndroid Build Coastguard Worker  * XML_CHAR_ENCODING_NONE. The encoding can be changed with
1334*6777b538SAndroid Build Coastguard Worker  * xmlSwitchEncoding or xmlSwitchEncodingName later on.
1335*6777b538SAndroid Build Coastguard Worker  *
1336*6777b538SAndroid Build Coastguard Worker  * Returns the new parser input or NULL
1337*6777b538SAndroid Build Coastguard Worker  */
1338*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferPtr
xmlAllocParserInputBuffer(xmlCharEncoding enc)1339*6777b538SAndroid Build Coastguard Worker xmlAllocParserInputBuffer(xmlCharEncoding enc) {
1340*6777b538SAndroid Build Coastguard Worker     xmlParserInputBufferPtr ret;
1341*6777b538SAndroid Build Coastguard Worker 
1342*6777b538SAndroid Build Coastguard Worker     ret = (xmlParserInputBufferPtr) xmlMalloc(sizeof(xmlParserInputBuffer));
1343*6777b538SAndroid Build Coastguard Worker     if (ret == NULL) {
1344*6777b538SAndroid Build Coastguard Worker 	return(NULL);
1345*6777b538SAndroid Build Coastguard Worker     }
1346*6777b538SAndroid Build Coastguard Worker     memset(ret, 0, sizeof(xmlParserInputBuffer));
1347*6777b538SAndroid Build Coastguard Worker     ret->buffer = xmlBufCreateSize(2 * xmlDefaultBufferSize);
1348*6777b538SAndroid Build Coastguard Worker     if (ret->buffer == NULL) {
1349*6777b538SAndroid Build Coastguard Worker         xmlFree(ret);
1350*6777b538SAndroid Build Coastguard Worker 	return(NULL);
1351*6777b538SAndroid Build Coastguard Worker     }
1352*6777b538SAndroid Build Coastguard Worker     xmlBufSetAllocationScheme(ret->buffer, XML_BUFFER_ALLOC_DOUBLEIT);
1353*6777b538SAndroid Build Coastguard Worker     if (enc != XML_CHAR_ENCODING_NONE) {
1354*6777b538SAndroid Build Coastguard Worker         if (xmlLookupCharEncodingHandler(enc, &ret->encoder) != 0) {
1355*6777b538SAndroid Build Coastguard Worker             /* We can't handle errors properly here. */
1356*6777b538SAndroid Build Coastguard Worker             xmlFreeParserInputBuffer(ret);
1357*6777b538SAndroid Build Coastguard Worker             return(NULL);
1358*6777b538SAndroid Build Coastguard Worker         }
1359*6777b538SAndroid Build Coastguard Worker     }
1360*6777b538SAndroid Build Coastguard Worker     if (ret->encoder != NULL)
1361*6777b538SAndroid Build Coastguard Worker         ret->raw = xmlBufCreateSize(2 * xmlDefaultBufferSize);
1362*6777b538SAndroid Build Coastguard Worker     else
1363*6777b538SAndroid Build Coastguard Worker         ret->raw = NULL;
1364*6777b538SAndroid Build Coastguard Worker     ret->readcallback = NULL;
1365*6777b538SAndroid Build Coastguard Worker     ret->closecallback = NULL;
1366*6777b538SAndroid Build Coastguard Worker     ret->context = NULL;
1367*6777b538SAndroid Build Coastguard Worker     ret->compressed = -1;
1368*6777b538SAndroid Build Coastguard Worker     ret->rawconsumed = 0;
1369*6777b538SAndroid Build Coastguard Worker 
1370*6777b538SAndroid Build Coastguard Worker     return(ret);
1371*6777b538SAndroid Build Coastguard Worker }
1372*6777b538SAndroid Build Coastguard Worker 
1373*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
1374*6777b538SAndroid Build Coastguard Worker /**
1375*6777b538SAndroid Build Coastguard Worker  * xmlAllocOutputBuffer:
1376*6777b538SAndroid Build Coastguard Worker  * @encoder:  the encoding converter or NULL
1377*6777b538SAndroid Build Coastguard Worker  *
1378*6777b538SAndroid Build Coastguard Worker  * Create a buffered parser output
1379*6777b538SAndroid Build Coastguard Worker  *
1380*6777b538SAndroid Build Coastguard Worker  * Returns the new parser output or NULL
1381*6777b538SAndroid Build Coastguard Worker  */
1382*6777b538SAndroid Build Coastguard Worker xmlOutputBufferPtr
xmlAllocOutputBuffer(xmlCharEncodingHandlerPtr encoder)1383*6777b538SAndroid Build Coastguard Worker xmlAllocOutputBuffer(xmlCharEncodingHandlerPtr encoder) {
1384*6777b538SAndroid Build Coastguard Worker     xmlOutputBufferPtr ret;
1385*6777b538SAndroid Build Coastguard Worker 
1386*6777b538SAndroid Build Coastguard Worker     ret = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer));
1387*6777b538SAndroid Build Coastguard Worker     if (ret == NULL) {
1388*6777b538SAndroid Build Coastguard Worker 	return(NULL);
1389*6777b538SAndroid Build Coastguard Worker     }
1390*6777b538SAndroid Build Coastguard Worker     memset(ret, 0, sizeof(xmlOutputBuffer));
1391*6777b538SAndroid Build Coastguard Worker     ret->buffer = xmlBufCreate();
1392*6777b538SAndroid Build Coastguard Worker     if (ret->buffer == NULL) {
1393*6777b538SAndroid Build Coastguard Worker         xmlFree(ret);
1394*6777b538SAndroid Build Coastguard Worker 	return(NULL);
1395*6777b538SAndroid Build Coastguard Worker     }
1396*6777b538SAndroid Build Coastguard Worker     xmlBufSetAllocationScheme(ret->buffer, XML_BUFFER_ALLOC_DOUBLEIT);
1397*6777b538SAndroid Build Coastguard Worker 
1398*6777b538SAndroid Build Coastguard Worker     ret->encoder = encoder;
1399*6777b538SAndroid Build Coastguard Worker     if (encoder != NULL) {
1400*6777b538SAndroid Build Coastguard Worker         ret->conv = xmlBufCreateSize(4000);
1401*6777b538SAndroid Build Coastguard Worker 	if (ret->conv == NULL) {
1402*6777b538SAndroid Build Coastguard Worker             xmlBufFree(ret->buffer);
1403*6777b538SAndroid Build Coastguard Worker 	    xmlFree(ret);
1404*6777b538SAndroid Build Coastguard Worker 	    return(NULL);
1405*6777b538SAndroid Build Coastguard Worker 	}
1406*6777b538SAndroid Build Coastguard Worker 
1407*6777b538SAndroid Build Coastguard Worker 	/*
1408*6777b538SAndroid Build Coastguard Worker 	 * This call is designed to initiate the encoder state
1409*6777b538SAndroid Build Coastguard Worker 	 */
1410*6777b538SAndroid Build Coastguard Worker 	xmlCharEncOutput(ret, 1);
1411*6777b538SAndroid Build Coastguard Worker     } else
1412*6777b538SAndroid Build Coastguard Worker         ret->conv = NULL;
1413*6777b538SAndroid Build Coastguard Worker     ret->writecallback = NULL;
1414*6777b538SAndroid Build Coastguard Worker     ret->closecallback = NULL;
1415*6777b538SAndroid Build Coastguard Worker     ret->context = NULL;
1416*6777b538SAndroid Build Coastguard Worker     ret->written = 0;
1417*6777b538SAndroid Build Coastguard Worker 
1418*6777b538SAndroid Build Coastguard Worker     return(ret);
1419*6777b538SAndroid Build Coastguard Worker }
1420*6777b538SAndroid Build Coastguard Worker 
1421*6777b538SAndroid Build Coastguard Worker /**
1422*6777b538SAndroid Build Coastguard Worker  * xmlAllocOutputBufferInternal:
1423*6777b538SAndroid Build Coastguard Worker  * @encoder:  the encoding converter or NULL
1424*6777b538SAndroid Build Coastguard Worker  *
1425*6777b538SAndroid Build Coastguard Worker  * Create a buffered parser output
1426*6777b538SAndroid Build Coastguard Worker  *
1427*6777b538SAndroid Build Coastguard Worker  * Returns the new parser output or NULL
1428*6777b538SAndroid Build Coastguard Worker  */
1429*6777b538SAndroid Build Coastguard Worker xmlOutputBufferPtr
xmlAllocOutputBufferInternal(xmlCharEncodingHandlerPtr encoder)1430*6777b538SAndroid Build Coastguard Worker xmlAllocOutputBufferInternal(xmlCharEncodingHandlerPtr encoder) {
1431*6777b538SAndroid Build Coastguard Worker     xmlOutputBufferPtr ret;
1432*6777b538SAndroid Build Coastguard Worker 
1433*6777b538SAndroid Build Coastguard Worker     ret = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer));
1434*6777b538SAndroid Build Coastguard Worker     if (ret == NULL) {
1435*6777b538SAndroid Build Coastguard Worker 	return(NULL);
1436*6777b538SAndroid Build Coastguard Worker     }
1437*6777b538SAndroid Build Coastguard Worker     memset(ret, 0, sizeof(xmlOutputBuffer));
1438*6777b538SAndroid Build Coastguard Worker     ret->buffer = xmlBufCreate();
1439*6777b538SAndroid Build Coastguard Worker     if (ret->buffer == NULL) {
1440*6777b538SAndroid Build Coastguard Worker         xmlFree(ret);
1441*6777b538SAndroid Build Coastguard Worker 	return(NULL);
1442*6777b538SAndroid Build Coastguard Worker     }
1443*6777b538SAndroid Build Coastguard Worker 
1444*6777b538SAndroid Build Coastguard Worker 
1445*6777b538SAndroid Build Coastguard Worker     /*
1446*6777b538SAndroid Build Coastguard Worker      * For conversion buffers we use the special IO handling
1447*6777b538SAndroid Build Coastguard Worker      */
1448*6777b538SAndroid Build Coastguard Worker     xmlBufSetAllocationScheme(ret->buffer, XML_BUFFER_ALLOC_IO);
1449*6777b538SAndroid Build Coastguard Worker 
1450*6777b538SAndroid Build Coastguard Worker     ret->encoder = encoder;
1451*6777b538SAndroid Build Coastguard Worker     if (encoder != NULL) {
1452*6777b538SAndroid Build Coastguard Worker         ret->conv = xmlBufCreateSize(4000);
1453*6777b538SAndroid Build Coastguard Worker 	if (ret->conv == NULL) {
1454*6777b538SAndroid Build Coastguard Worker             xmlBufFree(ret->buffer);
1455*6777b538SAndroid Build Coastguard Worker 	    xmlFree(ret);
1456*6777b538SAndroid Build Coastguard Worker 	    return(NULL);
1457*6777b538SAndroid Build Coastguard Worker 	}
1458*6777b538SAndroid Build Coastguard Worker 
1459*6777b538SAndroid Build Coastguard Worker 	/*
1460*6777b538SAndroid Build Coastguard Worker 	 * This call is designed to initiate the encoder state
1461*6777b538SAndroid Build Coastguard Worker 	 */
1462*6777b538SAndroid Build Coastguard Worker         xmlCharEncOutput(ret, 1);
1463*6777b538SAndroid Build Coastguard Worker     } else
1464*6777b538SAndroid Build Coastguard Worker         ret->conv = NULL;
1465*6777b538SAndroid Build Coastguard Worker     ret->writecallback = NULL;
1466*6777b538SAndroid Build Coastguard Worker     ret->closecallback = NULL;
1467*6777b538SAndroid Build Coastguard Worker     ret->context = NULL;
1468*6777b538SAndroid Build Coastguard Worker     ret->written = 0;
1469*6777b538SAndroid Build Coastguard Worker 
1470*6777b538SAndroid Build Coastguard Worker     return(ret);
1471*6777b538SAndroid Build Coastguard Worker }
1472*6777b538SAndroid Build Coastguard Worker 
1473*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_OUTPUT_ENABLED */
1474*6777b538SAndroid Build Coastguard Worker 
1475*6777b538SAndroid Build Coastguard Worker /**
1476*6777b538SAndroid Build Coastguard Worker  * xmlFreeParserInputBuffer:
1477*6777b538SAndroid Build Coastguard Worker  * @in:  a buffered parser input
1478*6777b538SAndroid Build Coastguard Worker  *
1479*6777b538SAndroid Build Coastguard Worker  * Free up the memory used by a buffered parser input
1480*6777b538SAndroid Build Coastguard Worker  */
1481*6777b538SAndroid Build Coastguard Worker void
xmlFreeParserInputBuffer(xmlParserInputBufferPtr in)1482*6777b538SAndroid Build Coastguard Worker xmlFreeParserInputBuffer(xmlParserInputBufferPtr in) {
1483*6777b538SAndroid Build Coastguard Worker     if (in == NULL) return;
1484*6777b538SAndroid Build Coastguard Worker 
1485*6777b538SAndroid Build Coastguard Worker     if (in->raw) {
1486*6777b538SAndroid Build Coastguard Worker         xmlBufFree(in->raw);
1487*6777b538SAndroid Build Coastguard Worker 	in->raw = NULL;
1488*6777b538SAndroid Build Coastguard Worker     }
1489*6777b538SAndroid Build Coastguard Worker     if (in->encoder != NULL) {
1490*6777b538SAndroid Build Coastguard Worker         xmlCharEncCloseFunc(in->encoder);
1491*6777b538SAndroid Build Coastguard Worker     }
1492*6777b538SAndroid Build Coastguard Worker     if (in->closecallback != NULL) {
1493*6777b538SAndroid Build Coastguard Worker 	in->closecallback(in->context);
1494*6777b538SAndroid Build Coastguard Worker     }
1495*6777b538SAndroid Build Coastguard Worker     if (in->buffer != NULL) {
1496*6777b538SAndroid Build Coastguard Worker         xmlBufFree(in->buffer);
1497*6777b538SAndroid Build Coastguard Worker 	in->buffer = NULL;
1498*6777b538SAndroid Build Coastguard Worker     }
1499*6777b538SAndroid Build Coastguard Worker 
1500*6777b538SAndroid Build Coastguard Worker     xmlFree(in);
1501*6777b538SAndroid Build Coastguard Worker }
1502*6777b538SAndroid Build Coastguard Worker 
1503*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
1504*6777b538SAndroid Build Coastguard Worker /**
1505*6777b538SAndroid Build Coastguard Worker  * xmlOutputBufferClose:
1506*6777b538SAndroid Build Coastguard Worker  * @out:  a buffered output
1507*6777b538SAndroid Build Coastguard Worker  *
1508*6777b538SAndroid Build Coastguard Worker  * flushes and close the output I/O channel
1509*6777b538SAndroid Build Coastguard Worker  * and free up all the associated resources
1510*6777b538SAndroid Build Coastguard Worker  *
1511*6777b538SAndroid Build Coastguard Worker  * Returns the number of byte written or a negative xmlParserErrors
1512*6777b538SAndroid Build Coastguard Worker  * code in case of error.
1513*6777b538SAndroid Build Coastguard Worker  */
1514*6777b538SAndroid Build Coastguard Worker int
xmlOutputBufferClose(xmlOutputBufferPtr out)1515*6777b538SAndroid Build Coastguard Worker xmlOutputBufferClose(xmlOutputBufferPtr out)
1516*6777b538SAndroid Build Coastguard Worker {
1517*6777b538SAndroid Build Coastguard Worker     int ret;
1518*6777b538SAndroid Build Coastguard Worker 
1519*6777b538SAndroid Build Coastguard Worker     if (out == NULL)
1520*6777b538SAndroid Build Coastguard Worker         return (-1);
1521*6777b538SAndroid Build Coastguard Worker 
1522*6777b538SAndroid Build Coastguard Worker     if (out->writecallback != NULL)
1523*6777b538SAndroid Build Coastguard Worker         xmlOutputBufferFlush(out);
1524*6777b538SAndroid Build Coastguard Worker 
1525*6777b538SAndroid Build Coastguard Worker     if (out->closecallback != NULL) {
1526*6777b538SAndroid Build Coastguard Worker         int code = out->closecallback(out->context);
1527*6777b538SAndroid Build Coastguard Worker 
1528*6777b538SAndroid Build Coastguard Worker         if ((code != XML_ERR_OK) && (out->error == XML_ERR_OK)) {
1529*6777b538SAndroid Build Coastguard Worker             if (code < 0)
1530*6777b538SAndroid Build Coastguard Worker                 out->error = XML_IO_UNKNOWN;
1531*6777b538SAndroid Build Coastguard Worker             else
1532*6777b538SAndroid Build Coastguard Worker                 out->error = code;
1533*6777b538SAndroid Build Coastguard Worker         }
1534*6777b538SAndroid Build Coastguard Worker     }
1535*6777b538SAndroid Build Coastguard Worker 
1536*6777b538SAndroid Build Coastguard Worker     if (out->error != XML_ERR_OK)
1537*6777b538SAndroid Build Coastguard Worker         ret = -out->error;
1538*6777b538SAndroid Build Coastguard Worker     else
1539*6777b538SAndroid Build Coastguard Worker         ret = out->written;
1540*6777b538SAndroid Build Coastguard Worker 
1541*6777b538SAndroid Build Coastguard Worker     if (out->conv) {
1542*6777b538SAndroid Build Coastguard Worker         xmlBufFree(out->conv);
1543*6777b538SAndroid Build Coastguard Worker         out->conv = NULL;
1544*6777b538SAndroid Build Coastguard Worker     }
1545*6777b538SAndroid Build Coastguard Worker     if (out->encoder != NULL) {
1546*6777b538SAndroid Build Coastguard Worker         xmlCharEncCloseFunc(out->encoder);
1547*6777b538SAndroid Build Coastguard Worker     }
1548*6777b538SAndroid Build Coastguard Worker     if (out->buffer != NULL) {
1549*6777b538SAndroid Build Coastguard Worker         xmlBufFree(out->buffer);
1550*6777b538SAndroid Build Coastguard Worker         out->buffer = NULL;
1551*6777b538SAndroid Build Coastguard Worker     }
1552*6777b538SAndroid Build Coastguard Worker 
1553*6777b538SAndroid Build Coastguard Worker     xmlFree(out);
1554*6777b538SAndroid Build Coastguard Worker 
1555*6777b538SAndroid Build Coastguard Worker     return(ret);
1556*6777b538SAndroid Build Coastguard Worker }
1557*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_OUTPUT_ENABLED */
1558*6777b538SAndroid Build Coastguard Worker 
1559*6777b538SAndroid Build Coastguard Worker /**
1560*6777b538SAndroid Build Coastguard Worker  * xmlParserInputBufferCreateFilenameInt:
1561*6777b538SAndroid Build Coastguard Worker  * @URI:  the filename or URI
1562*6777b538SAndroid Build Coastguard Worker  * @enc:  encoding enum (deprecated)
1563*6777b538SAndroid Build Coastguard Worker  * @out:  pointer to resulting input buffer
1564*6777b538SAndroid Build Coastguard Worker  *
1565*6777b538SAndroid Build Coastguard Worker  * Returns an xmlParserErrors code.
1566*6777b538SAndroid Build Coastguard Worker  */
1567*6777b538SAndroid Build Coastguard Worker static int
xmlParserInputBufferCreateFilenameInt(const char * URI,xmlCharEncoding enc,xmlParserInputBufferPtr * out)1568*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferCreateFilenameInt(const char *URI, xmlCharEncoding enc,
1569*6777b538SAndroid Build Coastguard Worker                                       xmlParserInputBufferPtr *out) {
1570*6777b538SAndroid Build Coastguard Worker     xmlParserInputBufferPtr buf;
1571*6777b538SAndroid Build Coastguard Worker     int ret;
1572*6777b538SAndroid Build Coastguard Worker     int i;
1573*6777b538SAndroid Build Coastguard Worker 
1574*6777b538SAndroid Build Coastguard Worker     *out = NULL;
1575*6777b538SAndroid Build Coastguard Worker     if (URI == NULL)
1576*6777b538SAndroid Build Coastguard Worker         return(XML_ERR_ARGUMENT);
1577*6777b538SAndroid Build Coastguard Worker 
1578*6777b538SAndroid Build Coastguard Worker     /*
1579*6777b538SAndroid Build Coastguard Worker      * Allocate the Input buffer front-end.
1580*6777b538SAndroid Build Coastguard Worker      */
1581*6777b538SAndroid Build Coastguard Worker     buf = xmlAllocParserInputBuffer(enc);
1582*6777b538SAndroid Build Coastguard Worker     if (buf == NULL)
1583*6777b538SAndroid Build Coastguard Worker         return(XML_ERR_NO_MEMORY);
1584*6777b538SAndroid Build Coastguard Worker 
1585*6777b538SAndroid Build Coastguard Worker     /*
1586*6777b538SAndroid Build Coastguard Worker      * Try to find one of the input accept method accepting that scheme
1587*6777b538SAndroid Build Coastguard Worker      * Go in reverse to give precedence to user defined handlers.
1588*6777b538SAndroid Build Coastguard Worker      */
1589*6777b538SAndroid Build Coastguard Worker     ret = XML_IO_ENOENT;
1590*6777b538SAndroid Build Coastguard Worker     for (i = xmlInputCallbackNr - 1; i >= 0; i--) {
1591*6777b538SAndroid Build Coastguard Worker         xmlInputCallback *cb = &xmlInputCallbackTable[i];
1592*6777b538SAndroid Build Coastguard Worker 
1593*6777b538SAndroid Build Coastguard Worker         if (cb->matchcallback == xmlIODefaultMatch) {
1594*6777b538SAndroid Build Coastguard Worker             ret = xmlInputDefaultOpen(buf, URI);
1595*6777b538SAndroid Build Coastguard Worker 
1596*6777b538SAndroid Build Coastguard Worker             if ((ret == XML_ERR_OK) || (ret != XML_IO_ENOENT))
1597*6777b538SAndroid Build Coastguard Worker                 break;
1598*6777b538SAndroid Build Coastguard Worker         } else if ((cb->matchcallback != NULL) &&
1599*6777b538SAndroid Build Coastguard Worker                    (cb->matchcallback(URI) != 0)) {
1600*6777b538SAndroid Build Coastguard Worker             buf->context = cb->opencallback(URI);
1601*6777b538SAndroid Build Coastguard Worker             if (buf->context != NULL) {
1602*6777b538SAndroid Build Coastguard Worker                 buf->readcallback = cb->readcallback;
1603*6777b538SAndroid Build Coastguard Worker                 buf->closecallback = cb->closecallback;
1604*6777b538SAndroid Build Coastguard Worker                 ret = XML_ERR_OK;
1605*6777b538SAndroid Build Coastguard Worker                 break;
1606*6777b538SAndroid Build Coastguard Worker             }
1607*6777b538SAndroid Build Coastguard Worker         }
1608*6777b538SAndroid Build Coastguard Worker     }
1609*6777b538SAndroid Build Coastguard Worker     if (ret != XML_ERR_OK) {
1610*6777b538SAndroid Build Coastguard Worker         xmlFreeParserInputBuffer(buf);
1611*6777b538SAndroid Build Coastguard Worker         *out = NULL;
1612*6777b538SAndroid Build Coastguard Worker 	return(ret);
1613*6777b538SAndroid Build Coastguard Worker     }
1614*6777b538SAndroid Build Coastguard Worker 
1615*6777b538SAndroid Build Coastguard Worker     *out = buf;
1616*6777b538SAndroid Build Coastguard Worker     return(ret);
1617*6777b538SAndroid Build Coastguard Worker }
1618*6777b538SAndroid Build Coastguard Worker 
1619*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferPtr
__xmlParserInputBufferCreateFilename(const char * URI,xmlCharEncoding enc)1620*6777b538SAndroid Build Coastguard Worker __xmlParserInputBufferCreateFilename(const char *URI, xmlCharEncoding enc) {
1621*6777b538SAndroid Build Coastguard Worker     xmlParserInputBufferPtr ret;
1622*6777b538SAndroid Build Coastguard Worker 
1623*6777b538SAndroid Build Coastguard Worker     xmlParserInputBufferCreateFilenameInt(URI, enc, &ret);
1624*6777b538SAndroid Build Coastguard Worker     return(ret);
1625*6777b538SAndroid Build Coastguard Worker }
1626*6777b538SAndroid Build Coastguard Worker 
1627*6777b538SAndroid Build Coastguard Worker /**
1628*6777b538SAndroid Build Coastguard Worker  * xmlParserInputBufferCreateFilename:
1629*6777b538SAndroid Build Coastguard Worker  * @URI:  a C string containing the URI or filename
1630*6777b538SAndroid Build Coastguard Worker  * @enc:  the charset encoding if known
1631*6777b538SAndroid Build Coastguard Worker  *
1632*6777b538SAndroid Build Coastguard Worker  * Create a buffered parser input for the progressive parsing of a file
1633*6777b538SAndroid Build Coastguard Worker  * Automatic support for ZLIB/Compress compressed document is provided
1634*6777b538SAndroid Build Coastguard Worker  * by default if found at compile-time.
1635*6777b538SAndroid Build Coastguard Worker  * Do an encoding check if enc == XML_CHAR_ENCODING_NONE
1636*6777b538SAndroid Build Coastguard Worker  *
1637*6777b538SAndroid Build Coastguard Worker  * Returns the new parser input or NULL
1638*6777b538SAndroid Build Coastguard Worker  */
1639*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferPtr
xmlParserInputBufferCreateFilename(const char * URI,xmlCharEncoding enc)1640*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferCreateFilename(const char *URI, xmlCharEncoding enc) {
1641*6777b538SAndroid Build Coastguard Worker     if (xmlParserInputBufferCreateFilenameValue != NULL)
1642*6777b538SAndroid Build Coastguard Worker         return(xmlParserInputBufferCreateFilenameValue(URI, enc));
1643*6777b538SAndroid Build Coastguard Worker 
1644*6777b538SAndroid Build Coastguard Worker     return(__xmlParserInputBufferCreateFilename(URI, enc));
1645*6777b538SAndroid Build Coastguard Worker }
1646*6777b538SAndroid Build Coastguard Worker 
1647*6777b538SAndroid Build Coastguard Worker /**
1648*6777b538SAndroid Build Coastguard Worker  * xmlParserInputBufferCreateFilenameSafe:
1649*6777b538SAndroid Build Coastguard Worker  * @URI:  the filename or URI
1650*6777b538SAndroid Build Coastguard Worker  * @enc:  encoding enum (deprecated)
1651*6777b538SAndroid Build Coastguard Worker  * @out:  pointer to resulting input buffer
1652*6777b538SAndroid Build Coastguard Worker  *
1653*6777b538SAndroid Build Coastguard Worker  * Returns an xmlParserErrors code.
1654*6777b538SAndroid Build Coastguard Worker  */
1655*6777b538SAndroid Build Coastguard Worker int
xmlParserInputBufferCreateFilenameSafe(const char * URI,xmlCharEncoding enc,xmlParserInputBufferPtr * out)1656*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferCreateFilenameSafe(const char *URI, xmlCharEncoding enc,
1657*6777b538SAndroid Build Coastguard Worker                                        xmlParserInputBufferPtr *out) {
1658*6777b538SAndroid Build Coastguard Worker     if (xmlParserInputBufferCreateFilenameValue != NULL) {
1659*6777b538SAndroid Build Coastguard Worker         *out = xmlParserInputBufferCreateFilenameValue(URI, enc);
1660*6777b538SAndroid Build Coastguard Worker 
1661*6777b538SAndroid Build Coastguard Worker         if (*out == NULL)
1662*6777b538SAndroid Build Coastguard Worker             return(XML_IO_ENOENT);
1663*6777b538SAndroid Build Coastguard Worker         return(XML_ERR_OK);
1664*6777b538SAndroid Build Coastguard Worker     }
1665*6777b538SAndroid Build Coastguard Worker 
1666*6777b538SAndroid Build Coastguard Worker     return(xmlParserInputBufferCreateFilenameInt(URI, enc, out));
1667*6777b538SAndroid Build Coastguard Worker }
1668*6777b538SAndroid Build Coastguard Worker 
1669*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
1670*6777b538SAndroid Build Coastguard Worker xmlOutputBufferPtr
__xmlOutputBufferCreateFilename(const char * URI,xmlCharEncodingHandlerPtr encoder,int compression)1671*6777b538SAndroid Build Coastguard Worker __xmlOutputBufferCreateFilename(const char *URI,
1672*6777b538SAndroid Build Coastguard Worker                               xmlCharEncodingHandlerPtr encoder,
1673*6777b538SAndroid Build Coastguard Worker                               int compression) {
1674*6777b538SAndroid Build Coastguard Worker     xmlOutputBufferPtr ret;
1675*6777b538SAndroid Build Coastguard Worker     xmlURIPtr puri;
1676*6777b538SAndroid Build Coastguard Worker     int i = 0;
1677*6777b538SAndroid Build Coastguard Worker     char *unescaped = NULL;
1678*6777b538SAndroid Build Coastguard Worker 
1679*6777b538SAndroid Build Coastguard Worker     if (URI == NULL)
1680*6777b538SAndroid Build Coastguard Worker         return(NULL);
1681*6777b538SAndroid Build Coastguard Worker 
1682*6777b538SAndroid Build Coastguard Worker     puri = xmlParseURI(URI);
1683*6777b538SAndroid Build Coastguard Worker     if (puri != NULL) {
1684*6777b538SAndroid Build Coastguard Worker         /*
1685*6777b538SAndroid Build Coastguard Worker          * try to limit the damages of the URI unescaping code.
1686*6777b538SAndroid Build Coastguard Worker          */
1687*6777b538SAndroid Build Coastguard Worker         if (puri->scheme == NULL) {
1688*6777b538SAndroid Build Coastguard Worker             unescaped = xmlURIUnescapeString(URI, 0, NULL);
1689*6777b538SAndroid Build Coastguard Worker              if (unescaped == NULL) {
1690*6777b538SAndroid Build Coastguard Worker                  xmlFreeURI(puri);
1691*6777b538SAndroid Build Coastguard Worker                  return(NULL);
1692*6777b538SAndroid Build Coastguard Worker              }
1693*6777b538SAndroid Build Coastguard Worker              URI = unescaped;
1694*6777b538SAndroid Build Coastguard Worker         }
1695*6777b538SAndroid Build Coastguard Worker         xmlFreeURI(puri);
1696*6777b538SAndroid Build Coastguard Worker     }
1697*6777b538SAndroid Build Coastguard Worker 
1698*6777b538SAndroid Build Coastguard Worker     /*
1699*6777b538SAndroid Build Coastguard Worker      * Allocate the Output buffer front-end.
1700*6777b538SAndroid Build Coastguard Worker      */
1701*6777b538SAndroid Build Coastguard Worker     ret = xmlAllocOutputBufferInternal(encoder);
1702*6777b538SAndroid Build Coastguard Worker     if (ret == NULL) {
1703*6777b538SAndroid Build Coastguard Worker         xmlFree(unescaped);
1704*6777b538SAndroid Build Coastguard Worker         return(NULL);
1705*6777b538SAndroid Build Coastguard Worker     }
1706*6777b538SAndroid Build Coastguard Worker 
1707*6777b538SAndroid Build Coastguard Worker     /*
1708*6777b538SAndroid Build Coastguard Worker      * Try to find one of the output accept method accepting that scheme
1709*6777b538SAndroid Build Coastguard Worker      * Go in reverse to give precedence to user defined handlers.
1710*6777b538SAndroid Build Coastguard Worker      */
1711*6777b538SAndroid Build Coastguard Worker     for (i = xmlOutputCallbackNr - 1; i >= 0; i--) {
1712*6777b538SAndroid Build Coastguard Worker         xmlOutputCallback *cb = &xmlOutputCallbackTable[i];
1713*6777b538SAndroid Build Coastguard Worker         int code;
1714*6777b538SAndroid Build Coastguard Worker 
1715*6777b538SAndroid Build Coastguard Worker         if (cb->matchcallback == xmlIODefaultMatch) {
1716*6777b538SAndroid Build Coastguard Worker             code = xmlOutputDefaultOpen(ret, URI, compression);
1717*6777b538SAndroid Build Coastguard Worker             /* TODO: Handle other errors */
1718*6777b538SAndroid Build Coastguard Worker             if (code == XML_ERR_OK)
1719*6777b538SAndroid Build Coastguard Worker                 break;
1720*6777b538SAndroid Build Coastguard Worker         } else if ((cb->matchcallback != NULL) &&
1721*6777b538SAndroid Build Coastguard Worker                    (cb->matchcallback(URI) != 0)) {
1722*6777b538SAndroid Build Coastguard Worker             ret->context = cb->opencallback(URI);
1723*6777b538SAndroid Build Coastguard Worker             if (ret->context != NULL) {
1724*6777b538SAndroid Build Coastguard Worker                 ret->writecallback = cb->writecallback;
1725*6777b538SAndroid Build Coastguard Worker                 ret->closecallback = cb->closecallback;
1726*6777b538SAndroid Build Coastguard Worker                 break;
1727*6777b538SAndroid Build Coastguard Worker             }
1728*6777b538SAndroid Build Coastguard Worker         }
1729*6777b538SAndroid Build Coastguard Worker     }
1730*6777b538SAndroid Build Coastguard Worker 
1731*6777b538SAndroid Build Coastguard Worker     if (ret->context == NULL) {
1732*6777b538SAndroid Build Coastguard Worker         xmlOutputBufferClose(ret);
1733*6777b538SAndroid Build Coastguard Worker 	ret = NULL;
1734*6777b538SAndroid Build Coastguard Worker     }
1735*6777b538SAndroid Build Coastguard Worker 
1736*6777b538SAndroid Build Coastguard Worker     xmlFree(unescaped);
1737*6777b538SAndroid Build Coastguard Worker     return(ret);
1738*6777b538SAndroid Build Coastguard Worker }
1739*6777b538SAndroid Build Coastguard Worker 
1740*6777b538SAndroid Build Coastguard Worker /**
1741*6777b538SAndroid Build Coastguard Worker  * xmlOutputBufferCreateFilename:
1742*6777b538SAndroid Build Coastguard Worker  * @URI:  a C string containing the URI or filename
1743*6777b538SAndroid Build Coastguard Worker  * @encoder:  the encoding converter or NULL
1744*6777b538SAndroid Build Coastguard Worker  * @compression:  the compression ration (0 none, 9 max).
1745*6777b538SAndroid Build Coastguard Worker  *
1746*6777b538SAndroid Build Coastguard Worker  * Create a buffered  output for the progressive saving of a file
1747*6777b538SAndroid Build Coastguard Worker  * If filename is "-' then we use stdout as the output.
1748*6777b538SAndroid Build Coastguard Worker  * Automatic support for ZLIB/Compress compressed document is provided
1749*6777b538SAndroid Build Coastguard Worker  * by default if found at compile-time.
1750*6777b538SAndroid Build Coastguard Worker  * TODO: currently if compression is set, the library only support
1751*6777b538SAndroid Build Coastguard Worker  *       writing to a local file.
1752*6777b538SAndroid Build Coastguard Worker  *
1753*6777b538SAndroid Build Coastguard Worker  * Returns the new output or NULL
1754*6777b538SAndroid Build Coastguard Worker  */
1755*6777b538SAndroid Build Coastguard Worker xmlOutputBufferPtr
xmlOutputBufferCreateFilename(const char * URI,xmlCharEncodingHandlerPtr encoder,int compression ATTRIBUTE_UNUSED)1756*6777b538SAndroid Build Coastguard Worker xmlOutputBufferCreateFilename(const char *URI,
1757*6777b538SAndroid Build Coastguard Worker                               xmlCharEncodingHandlerPtr encoder,
1758*6777b538SAndroid Build Coastguard Worker                               int compression ATTRIBUTE_UNUSED) {
1759*6777b538SAndroid Build Coastguard Worker     if ((xmlOutputBufferCreateFilenameValue)) {
1760*6777b538SAndroid Build Coastguard Worker 		return xmlOutputBufferCreateFilenameValue(URI, encoder, compression);
1761*6777b538SAndroid Build Coastguard Worker 	}
1762*6777b538SAndroid Build Coastguard Worker 	return __xmlOutputBufferCreateFilename(URI, encoder, compression);
1763*6777b538SAndroid Build Coastguard Worker }
1764*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_OUTPUT_ENABLED */
1765*6777b538SAndroid Build Coastguard Worker 
1766*6777b538SAndroid Build Coastguard Worker /**
1767*6777b538SAndroid Build Coastguard Worker  * xmlParserInputBufferCreateFile:
1768*6777b538SAndroid Build Coastguard Worker  * @file:  a FILE*
1769*6777b538SAndroid Build Coastguard Worker  * @enc:  the charset encoding if known (deprecated)
1770*6777b538SAndroid Build Coastguard Worker  *
1771*6777b538SAndroid Build Coastguard Worker  * Create a buffered parser input for the progressive parsing of a FILE *
1772*6777b538SAndroid Build Coastguard Worker  * buffered C I/O
1773*6777b538SAndroid Build Coastguard Worker  *
1774*6777b538SAndroid Build Coastguard Worker  * The encoding argument is deprecated and should be set to
1775*6777b538SAndroid Build Coastguard Worker  * XML_CHAR_ENCODING_NONE. The encoding can be changed with
1776*6777b538SAndroid Build Coastguard Worker  * xmlSwitchEncoding or xmlSwitchEncodingName later on.
1777*6777b538SAndroid Build Coastguard Worker  *
1778*6777b538SAndroid Build Coastguard Worker  * Returns the new parser input or NULL
1779*6777b538SAndroid Build Coastguard Worker  */
1780*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferPtr
xmlParserInputBufferCreateFile(FILE * file,xmlCharEncoding enc)1781*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferCreateFile(FILE *file, xmlCharEncoding enc) {
1782*6777b538SAndroid Build Coastguard Worker     xmlParserInputBufferPtr ret;
1783*6777b538SAndroid Build Coastguard Worker 
1784*6777b538SAndroid Build Coastguard Worker     if (file == NULL) return(NULL);
1785*6777b538SAndroid Build Coastguard Worker 
1786*6777b538SAndroid Build Coastguard Worker     ret = xmlAllocParserInputBuffer(enc);
1787*6777b538SAndroid Build Coastguard Worker     if (ret != NULL) {
1788*6777b538SAndroid Build Coastguard Worker         ret->context = file;
1789*6777b538SAndroid Build Coastguard Worker 	ret->readcallback = xmlFileRead;
1790*6777b538SAndroid Build Coastguard Worker 	ret->closecallback = NULL;
1791*6777b538SAndroid Build Coastguard Worker     }
1792*6777b538SAndroid Build Coastguard Worker 
1793*6777b538SAndroid Build Coastguard Worker     return(ret);
1794*6777b538SAndroid Build Coastguard Worker }
1795*6777b538SAndroid Build Coastguard Worker 
1796*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
1797*6777b538SAndroid Build Coastguard Worker /**
1798*6777b538SAndroid Build Coastguard Worker  * xmlOutputBufferCreateFile:
1799*6777b538SAndroid Build Coastguard Worker  * @file:  a FILE*
1800*6777b538SAndroid Build Coastguard Worker  * @encoder:  the encoding converter or NULL
1801*6777b538SAndroid Build Coastguard Worker  *
1802*6777b538SAndroid Build Coastguard Worker  * Create a buffered output for the progressive saving to a FILE *
1803*6777b538SAndroid Build Coastguard Worker  * buffered C I/O
1804*6777b538SAndroid Build Coastguard Worker  *
1805*6777b538SAndroid Build Coastguard Worker  * Returns the new parser output or NULL
1806*6777b538SAndroid Build Coastguard Worker  */
1807*6777b538SAndroid Build Coastguard Worker xmlOutputBufferPtr
xmlOutputBufferCreateFile(FILE * file,xmlCharEncodingHandlerPtr encoder)1808*6777b538SAndroid Build Coastguard Worker xmlOutputBufferCreateFile(FILE *file, xmlCharEncodingHandlerPtr encoder) {
1809*6777b538SAndroid Build Coastguard Worker     xmlOutputBufferPtr ret;
1810*6777b538SAndroid Build Coastguard Worker 
1811*6777b538SAndroid Build Coastguard Worker     if (file == NULL) return(NULL);
1812*6777b538SAndroid Build Coastguard Worker 
1813*6777b538SAndroid Build Coastguard Worker     ret = xmlAllocOutputBufferInternal(encoder);
1814*6777b538SAndroid Build Coastguard Worker     if (ret != NULL) {
1815*6777b538SAndroid Build Coastguard Worker         ret->context = file;
1816*6777b538SAndroid Build Coastguard Worker 	ret->writecallback = xmlFileWrite;
1817*6777b538SAndroid Build Coastguard Worker 	ret->closecallback = xmlFileFlush;
1818*6777b538SAndroid Build Coastguard Worker     }
1819*6777b538SAndroid Build Coastguard Worker 
1820*6777b538SAndroid Build Coastguard Worker     return(ret);
1821*6777b538SAndroid Build Coastguard Worker }
1822*6777b538SAndroid Build Coastguard Worker 
1823*6777b538SAndroid Build Coastguard Worker /**
1824*6777b538SAndroid Build Coastguard Worker  * xmlOutputBufferCreateBuffer:
1825*6777b538SAndroid Build Coastguard Worker  * @buffer:  a xmlBufferPtr
1826*6777b538SAndroid Build Coastguard Worker  * @encoder:  the encoding converter or NULL
1827*6777b538SAndroid Build Coastguard Worker  *
1828*6777b538SAndroid Build Coastguard Worker  * Create a buffered output for the progressive saving to a xmlBuffer
1829*6777b538SAndroid Build Coastguard Worker  *
1830*6777b538SAndroid Build Coastguard Worker  * Returns the new parser output or NULL
1831*6777b538SAndroid Build Coastguard Worker  */
1832*6777b538SAndroid Build Coastguard Worker xmlOutputBufferPtr
xmlOutputBufferCreateBuffer(xmlBufferPtr buffer,xmlCharEncodingHandlerPtr encoder)1833*6777b538SAndroid Build Coastguard Worker xmlOutputBufferCreateBuffer(xmlBufferPtr buffer,
1834*6777b538SAndroid Build Coastguard Worker                             xmlCharEncodingHandlerPtr encoder) {
1835*6777b538SAndroid Build Coastguard Worker     xmlOutputBufferPtr ret;
1836*6777b538SAndroid Build Coastguard Worker 
1837*6777b538SAndroid Build Coastguard Worker     if (buffer == NULL) return(NULL);
1838*6777b538SAndroid Build Coastguard Worker 
1839*6777b538SAndroid Build Coastguard Worker     ret = xmlOutputBufferCreateIO(xmlBufferWrite, NULL, (void *) buffer,
1840*6777b538SAndroid Build Coastguard Worker                                   encoder);
1841*6777b538SAndroid Build Coastguard Worker 
1842*6777b538SAndroid Build Coastguard Worker     return(ret);
1843*6777b538SAndroid Build Coastguard Worker }
1844*6777b538SAndroid Build Coastguard Worker 
1845*6777b538SAndroid Build Coastguard Worker /**
1846*6777b538SAndroid Build Coastguard Worker  * xmlOutputBufferGetContent:
1847*6777b538SAndroid Build Coastguard Worker  * @out:  an xmlOutputBufferPtr
1848*6777b538SAndroid Build Coastguard Worker  *
1849*6777b538SAndroid Build Coastguard Worker  * Gives a pointer to the data currently held in the output buffer
1850*6777b538SAndroid Build Coastguard Worker  *
1851*6777b538SAndroid Build Coastguard Worker  * Returns a pointer to the data or NULL in case of error
1852*6777b538SAndroid Build Coastguard Worker  */
1853*6777b538SAndroid Build Coastguard Worker const xmlChar *
xmlOutputBufferGetContent(xmlOutputBufferPtr out)1854*6777b538SAndroid Build Coastguard Worker xmlOutputBufferGetContent(xmlOutputBufferPtr out) {
1855*6777b538SAndroid Build Coastguard Worker     if ((out == NULL) || (out->buffer == NULL) || (out->error != 0))
1856*6777b538SAndroid Build Coastguard Worker         return(NULL);
1857*6777b538SAndroid Build Coastguard Worker 
1858*6777b538SAndroid Build Coastguard Worker     return(xmlBufContent(out->buffer));
1859*6777b538SAndroid Build Coastguard Worker }
1860*6777b538SAndroid Build Coastguard Worker 
1861*6777b538SAndroid Build Coastguard Worker /**
1862*6777b538SAndroid Build Coastguard Worker  * xmlOutputBufferGetSize:
1863*6777b538SAndroid Build Coastguard Worker  * @out:  an xmlOutputBufferPtr
1864*6777b538SAndroid Build Coastguard Worker  *
1865*6777b538SAndroid Build Coastguard Worker  * Gives the length of the data currently held in the output buffer
1866*6777b538SAndroid Build Coastguard Worker  *
1867*6777b538SAndroid Build Coastguard Worker  * Returns 0 in case or error or no data is held, the size otherwise
1868*6777b538SAndroid Build Coastguard Worker  */
1869*6777b538SAndroid Build Coastguard Worker size_t
xmlOutputBufferGetSize(xmlOutputBufferPtr out)1870*6777b538SAndroid Build Coastguard Worker xmlOutputBufferGetSize(xmlOutputBufferPtr out) {
1871*6777b538SAndroid Build Coastguard Worker     if ((out == NULL) || (out->buffer == NULL) || (out->error != 0))
1872*6777b538SAndroid Build Coastguard Worker         return(0);
1873*6777b538SAndroid Build Coastguard Worker 
1874*6777b538SAndroid Build Coastguard Worker     return(xmlBufUse(out->buffer));
1875*6777b538SAndroid Build Coastguard Worker }
1876*6777b538SAndroid Build Coastguard Worker 
1877*6777b538SAndroid Build Coastguard Worker 
1878*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_OUTPUT_ENABLED */
1879*6777b538SAndroid Build Coastguard Worker 
1880*6777b538SAndroid Build Coastguard Worker /**
1881*6777b538SAndroid Build Coastguard Worker  * xmlParserInputBufferCreateFd:
1882*6777b538SAndroid Build Coastguard Worker  * @fd:  a file descriptor number
1883*6777b538SAndroid Build Coastguard Worker  * @enc:  the charset encoding if known (deprecated)
1884*6777b538SAndroid Build Coastguard Worker  *
1885*6777b538SAndroid Build Coastguard Worker  * Create a buffered parser input for the progressive parsing for the input
1886*6777b538SAndroid Build Coastguard Worker  * from a file descriptor
1887*6777b538SAndroid Build Coastguard Worker  *
1888*6777b538SAndroid Build Coastguard Worker  * The encoding argument is deprecated and should be set to
1889*6777b538SAndroid Build Coastguard Worker  * XML_CHAR_ENCODING_NONE. The encoding can be changed with
1890*6777b538SAndroid Build Coastguard Worker  * xmlSwitchEncoding or xmlSwitchEncodingName later on.
1891*6777b538SAndroid Build Coastguard Worker  *
1892*6777b538SAndroid Build Coastguard Worker  * Returns the new parser input or NULL
1893*6777b538SAndroid Build Coastguard Worker  */
1894*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferPtr
xmlParserInputBufferCreateFd(int fd,xmlCharEncoding enc)1895*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferCreateFd(int fd, xmlCharEncoding enc) {
1896*6777b538SAndroid Build Coastguard Worker     xmlParserInputBufferPtr ret;
1897*6777b538SAndroid Build Coastguard Worker 
1898*6777b538SAndroid Build Coastguard Worker     if (fd < 0) return(NULL);
1899*6777b538SAndroid Build Coastguard Worker 
1900*6777b538SAndroid Build Coastguard Worker     ret = xmlAllocParserInputBuffer(enc);
1901*6777b538SAndroid Build Coastguard Worker     if (ret != NULL) {
1902*6777b538SAndroid Build Coastguard Worker         ret->context = (void *) (ptrdiff_t) fd;
1903*6777b538SAndroid Build Coastguard Worker 	ret->readcallback = xmlFdRead;
1904*6777b538SAndroid Build Coastguard Worker 	ret->closecallback = xmlFdClose;
1905*6777b538SAndroid Build Coastguard Worker     }
1906*6777b538SAndroid Build Coastguard Worker 
1907*6777b538SAndroid Build Coastguard Worker     return(ret);
1908*6777b538SAndroid Build Coastguard Worker }
1909*6777b538SAndroid Build Coastguard Worker 
1910*6777b538SAndroid Build Coastguard Worker typedef struct {
1911*6777b538SAndroid Build Coastguard Worker     char *mem;
1912*6777b538SAndroid Build Coastguard Worker     const char *cur;
1913*6777b538SAndroid Build Coastguard Worker     size_t size;
1914*6777b538SAndroid Build Coastguard Worker } xmlMemIOCtxt;
1915*6777b538SAndroid Build Coastguard Worker 
1916*6777b538SAndroid Build Coastguard Worker static int
xmlMemRead(void * vctxt,char * buf,int size)1917*6777b538SAndroid Build Coastguard Worker xmlMemRead(void *vctxt, char *buf, int size) {
1918*6777b538SAndroid Build Coastguard Worker     xmlMemIOCtxt *ctxt = vctxt;
1919*6777b538SAndroid Build Coastguard Worker 
1920*6777b538SAndroid Build Coastguard Worker     if ((size_t) size > ctxt->size)
1921*6777b538SAndroid Build Coastguard Worker         size = ctxt->size;
1922*6777b538SAndroid Build Coastguard Worker 
1923*6777b538SAndroid Build Coastguard Worker     memcpy(buf, ctxt->cur, size);
1924*6777b538SAndroid Build Coastguard Worker     ctxt->cur += size;
1925*6777b538SAndroid Build Coastguard Worker     ctxt->size -= size;
1926*6777b538SAndroid Build Coastguard Worker 
1927*6777b538SAndroid Build Coastguard Worker     return size;
1928*6777b538SAndroid Build Coastguard Worker }
1929*6777b538SAndroid Build Coastguard Worker 
1930*6777b538SAndroid Build Coastguard Worker static int
xmlMemClose(void * vctxt)1931*6777b538SAndroid Build Coastguard Worker xmlMemClose(void *vctxt) {
1932*6777b538SAndroid Build Coastguard Worker     xmlMemIOCtxt *ctxt = vctxt;
1933*6777b538SAndroid Build Coastguard Worker 
1934*6777b538SAndroid Build Coastguard Worker     if (ctxt->mem != NULL)
1935*6777b538SAndroid Build Coastguard Worker         xmlFree(ctxt->mem);
1936*6777b538SAndroid Build Coastguard Worker     xmlFree(ctxt);
1937*6777b538SAndroid Build Coastguard Worker     return(0);
1938*6777b538SAndroid Build Coastguard Worker }
1939*6777b538SAndroid Build Coastguard Worker 
1940*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferPtr
xmlNewInputBufferMemory(const void * mem,size_t size,int flags,xmlCharEncoding enc)1941*6777b538SAndroid Build Coastguard Worker xmlNewInputBufferMemory(const void *mem, size_t size, int flags,
1942*6777b538SAndroid Build Coastguard Worker                         xmlCharEncoding enc) {
1943*6777b538SAndroid Build Coastguard Worker     xmlParserInputBufferPtr ret;
1944*6777b538SAndroid Build Coastguard Worker     xmlMemIOCtxt *ctxt;
1945*6777b538SAndroid Build Coastguard Worker     char *copy = NULL;
1946*6777b538SAndroid Build Coastguard Worker 
1947*6777b538SAndroid Build Coastguard Worker     if ((flags & XML_INPUT_BUF_STATIC) == 0) {
1948*6777b538SAndroid Build Coastguard Worker         if (size + 1 == 0)
1949*6777b538SAndroid Build Coastguard Worker             return(NULL);
1950*6777b538SAndroid Build Coastguard Worker         copy = xmlMalloc(size + 1);
1951*6777b538SAndroid Build Coastguard Worker         if (copy == NULL)
1952*6777b538SAndroid Build Coastguard Worker             return(NULL);
1953*6777b538SAndroid Build Coastguard Worker         memcpy(copy, mem, size);
1954*6777b538SAndroid Build Coastguard Worker         copy[size] = 0;
1955*6777b538SAndroid Build Coastguard Worker 
1956*6777b538SAndroid Build Coastguard Worker         mem = copy;
1957*6777b538SAndroid Build Coastguard Worker     }
1958*6777b538SAndroid Build Coastguard Worker 
1959*6777b538SAndroid Build Coastguard Worker     ret = xmlAllocParserInputBuffer(enc);
1960*6777b538SAndroid Build Coastguard Worker     if (ret == NULL) {
1961*6777b538SAndroid Build Coastguard Worker         xmlFree(copy);
1962*6777b538SAndroid Build Coastguard Worker         return(NULL);
1963*6777b538SAndroid Build Coastguard Worker     }
1964*6777b538SAndroid Build Coastguard Worker 
1965*6777b538SAndroid Build Coastguard Worker     ctxt = xmlMalloc(sizeof(*ctxt));
1966*6777b538SAndroid Build Coastguard Worker     if (ctxt == NULL) {
1967*6777b538SAndroid Build Coastguard Worker         xmlFreeParserInputBuffer(ret);
1968*6777b538SAndroid Build Coastguard Worker         xmlFree(copy);
1969*6777b538SAndroid Build Coastguard Worker         return(NULL);
1970*6777b538SAndroid Build Coastguard Worker     }
1971*6777b538SAndroid Build Coastguard Worker 
1972*6777b538SAndroid Build Coastguard Worker     ctxt->mem = copy;
1973*6777b538SAndroid Build Coastguard Worker     ctxt->cur = mem;
1974*6777b538SAndroid Build Coastguard Worker     ctxt->size = size;
1975*6777b538SAndroid Build Coastguard Worker 
1976*6777b538SAndroid Build Coastguard Worker     ret->context = ctxt;
1977*6777b538SAndroid Build Coastguard Worker     ret->readcallback = xmlMemRead;
1978*6777b538SAndroid Build Coastguard Worker     ret->closecallback = xmlMemClose;
1979*6777b538SAndroid Build Coastguard Worker 
1980*6777b538SAndroid Build Coastguard Worker     return(ret);
1981*6777b538SAndroid Build Coastguard Worker }
1982*6777b538SAndroid Build Coastguard Worker 
1983*6777b538SAndroid Build Coastguard Worker /**
1984*6777b538SAndroid Build Coastguard Worker  * xmlParserInputBufferCreateMem:
1985*6777b538SAndroid Build Coastguard Worker  * @mem:  the memory input
1986*6777b538SAndroid Build Coastguard Worker  * @size:  the length of the memory block
1987*6777b538SAndroid Build Coastguard Worker  * @enc:  the charset encoding if known (deprecated)
1988*6777b538SAndroid Build Coastguard Worker  *
1989*6777b538SAndroid Build Coastguard Worker  * Create a parser input buffer for parsing from a memory area.
1990*6777b538SAndroid Build Coastguard Worker  *
1991*6777b538SAndroid Build Coastguard Worker  * This function makes a copy of the whole input buffer. If you are sure
1992*6777b538SAndroid Build Coastguard Worker  * that the contents of the buffer will remain valid until the document
1993*6777b538SAndroid Build Coastguard Worker  * was parsed, you can avoid the copy by using
1994*6777b538SAndroid Build Coastguard Worker  * xmlParserInputBufferCreateStatic.
1995*6777b538SAndroid Build Coastguard Worker  *
1996*6777b538SAndroid Build Coastguard Worker  * The encoding argument is deprecated and should be set to
1997*6777b538SAndroid Build Coastguard Worker  * XML_CHAR_ENCODING_NONE. The encoding can be changed with
1998*6777b538SAndroid Build Coastguard Worker  * xmlSwitchEncoding or xmlSwitchEncodingName later on.
1999*6777b538SAndroid Build Coastguard Worker  *
2000*6777b538SAndroid Build Coastguard Worker  * Returns the new parser input or NULL in case of error.
2001*6777b538SAndroid Build Coastguard Worker  */
2002*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferPtr
xmlParserInputBufferCreateMem(const char * mem,int size,xmlCharEncoding enc)2003*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferCreateMem(const char *mem, int size, xmlCharEncoding enc) {
2004*6777b538SAndroid Build Coastguard Worker     if ((mem == NULL) || (size < 0))
2005*6777b538SAndroid Build Coastguard Worker         return(NULL);
2006*6777b538SAndroid Build Coastguard Worker 
2007*6777b538SAndroid Build Coastguard Worker     return(xmlNewInputBufferMemory(mem, size, 0, enc));
2008*6777b538SAndroid Build Coastguard Worker }
2009*6777b538SAndroid Build Coastguard Worker 
2010*6777b538SAndroid Build Coastguard Worker /**
2011*6777b538SAndroid Build Coastguard Worker  * xmlParserInputBufferCreateStatic:
2012*6777b538SAndroid Build Coastguard Worker  * @mem:  the memory input
2013*6777b538SAndroid Build Coastguard Worker  * @size:  the length of the memory block
2014*6777b538SAndroid Build Coastguard Worker  * @enc:  the charset encoding if known
2015*6777b538SAndroid Build Coastguard Worker  *
2016*6777b538SAndroid Build Coastguard Worker  * Create a parser input buffer for parsing from a memory area.
2017*6777b538SAndroid Build Coastguard Worker  *
2018*6777b538SAndroid Build Coastguard Worker  * This functions assumes that the contents of the input buffer remain
2019*6777b538SAndroid Build Coastguard Worker  * valid until the document was parsed. Use xmlParserInputBufferCreateMem
2020*6777b538SAndroid Build Coastguard Worker  * otherwise.
2021*6777b538SAndroid Build Coastguard Worker  *
2022*6777b538SAndroid Build Coastguard Worker  * The encoding argument is deprecated and should be set to
2023*6777b538SAndroid Build Coastguard Worker  * XML_CHAR_ENCODING_NONE. The encoding can be changed with
2024*6777b538SAndroid Build Coastguard Worker  * xmlSwitchEncoding or xmlSwitchEncodingName later on.
2025*6777b538SAndroid Build Coastguard Worker  *
2026*6777b538SAndroid Build Coastguard Worker  * Returns the new parser input or NULL in case of error.
2027*6777b538SAndroid Build Coastguard Worker  */
2028*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferPtr
xmlParserInputBufferCreateStatic(const char * mem,int size,xmlCharEncoding enc)2029*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferCreateStatic(const char *mem, int size,
2030*6777b538SAndroid Build Coastguard Worker                                  xmlCharEncoding enc) {
2031*6777b538SAndroid Build Coastguard Worker     if ((mem == NULL) || (size < 0))
2032*6777b538SAndroid Build Coastguard Worker         return(NULL);
2033*6777b538SAndroid Build Coastguard Worker 
2034*6777b538SAndroid Build Coastguard Worker     return(xmlNewInputBufferMemory(mem, size, XML_INPUT_BUF_STATIC, enc));
2035*6777b538SAndroid Build Coastguard Worker }
2036*6777b538SAndroid Build Coastguard Worker 
2037*6777b538SAndroid Build Coastguard Worker typedef struct {
2038*6777b538SAndroid Build Coastguard Worker     const char *str;
2039*6777b538SAndroid Build Coastguard Worker } xmlStringIOCtxt;
2040*6777b538SAndroid Build Coastguard Worker 
2041*6777b538SAndroid Build Coastguard Worker static int
xmlStringRead(void * vctxt,char * buf,int size)2042*6777b538SAndroid Build Coastguard Worker xmlStringRead(void *vctxt, char *buf, int size) {
2043*6777b538SAndroid Build Coastguard Worker     xmlStringIOCtxt *ctxt = vctxt;
2044*6777b538SAndroid Build Coastguard Worker     const char *zero;
2045*6777b538SAndroid Build Coastguard Worker     size_t len;
2046*6777b538SAndroid Build Coastguard Worker 
2047*6777b538SAndroid Build Coastguard Worker     zero = memchr(ctxt->str, 0, size);
2048*6777b538SAndroid Build Coastguard Worker     len = zero ? zero - ctxt->str : size;
2049*6777b538SAndroid Build Coastguard Worker 
2050*6777b538SAndroid Build Coastguard Worker     memcpy(buf, ctxt->str, len);
2051*6777b538SAndroid Build Coastguard Worker     ctxt->str += len;
2052*6777b538SAndroid Build Coastguard Worker 
2053*6777b538SAndroid Build Coastguard Worker     return(len);
2054*6777b538SAndroid Build Coastguard Worker }
2055*6777b538SAndroid Build Coastguard Worker 
2056*6777b538SAndroid Build Coastguard Worker static int
xmlStringClose(void * vctxt)2057*6777b538SAndroid Build Coastguard Worker xmlStringClose(void *vctxt) {
2058*6777b538SAndroid Build Coastguard Worker     xmlFree(vctxt);
2059*6777b538SAndroid Build Coastguard Worker     return(0);
2060*6777b538SAndroid Build Coastguard Worker }
2061*6777b538SAndroid Build Coastguard Worker 
2062*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferPtr
xmlNewInputBufferString(const char * str,int flags)2063*6777b538SAndroid Build Coastguard Worker xmlNewInputBufferString(const char *str, int flags) {
2064*6777b538SAndroid Build Coastguard Worker     xmlParserInputBufferPtr ret;
2065*6777b538SAndroid Build Coastguard Worker     xmlStringIOCtxt *ctxt;
2066*6777b538SAndroid Build Coastguard Worker 
2067*6777b538SAndroid Build Coastguard Worker     if ((flags & XML_INPUT_BUF_STATIC) == 0)
2068*6777b538SAndroid Build Coastguard Worker         return(xmlNewInputBufferMemory(str, strlen(str), flags,
2069*6777b538SAndroid Build Coastguard Worker                                        XML_CHAR_ENCODING_NONE));
2070*6777b538SAndroid Build Coastguard Worker 
2071*6777b538SAndroid Build Coastguard Worker     ret = xmlAllocParserInputBuffer(XML_CHAR_ENCODING_NONE);
2072*6777b538SAndroid Build Coastguard Worker     if (ret == NULL)
2073*6777b538SAndroid Build Coastguard Worker         return(NULL);
2074*6777b538SAndroid Build Coastguard Worker 
2075*6777b538SAndroid Build Coastguard Worker     ctxt = xmlMalloc(sizeof(*ctxt));
2076*6777b538SAndroid Build Coastguard Worker     if (ctxt == NULL) {
2077*6777b538SAndroid Build Coastguard Worker         xmlFreeParserInputBuffer(ret);
2078*6777b538SAndroid Build Coastguard Worker         return(NULL);
2079*6777b538SAndroid Build Coastguard Worker     }
2080*6777b538SAndroid Build Coastguard Worker 
2081*6777b538SAndroid Build Coastguard Worker     ctxt->str = str;
2082*6777b538SAndroid Build Coastguard Worker 
2083*6777b538SAndroid Build Coastguard Worker     ret->context = ctxt;
2084*6777b538SAndroid Build Coastguard Worker     ret->readcallback = xmlStringRead;
2085*6777b538SAndroid Build Coastguard Worker     ret->closecallback = xmlStringClose;
2086*6777b538SAndroid Build Coastguard Worker 
2087*6777b538SAndroid Build Coastguard Worker     return(ret);
2088*6777b538SAndroid Build Coastguard Worker }
2089*6777b538SAndroid Build Coastguard Worker 
2090*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
2091*6777b538SAndroid Build Coastguard Worker /**
2092*6777b538SAndroid Build Coastguard Worker  * xmlOutputBufferCreateFd:
2093*6777b538SAndroid Build Coastguard Worker  * @fd:  a file descriptor number
2094*6777b538SAndroid Build Coastguard Worker  * @encoder:  the encoding converter or NULL
2095*6777b538SAndroid Build Coastguard Worker  *
2096*6777b538SAndroid Build Coastguard Worker  * Create a buffered output for the progressive saving
2097*6777b538SAndroid Build Coastguard Worker  * to a file descriptor
2098*6777b538SAndroid Build Coastguard Worker  *
2099*6777b538SAndroid Build Coastguard Worker  * Returns the new parser output or NULL
2100*6777b538SAndroid Build Coastguard Worker  */
2101*6777b538SAndroid Build Coastguard Worker xmlOutputBufferPtr
xmlOutputBufferCreateFd(int fd,xmlCharEncodingHandlerPtr encoder)2102*6777b538SAndroid Build Coastguard Worker xmlOutputBufferCreateFd(int fd, xmlCharEncodingHandlerPtr encoder) {
2103*6777b538SAndroid Build Coastguard Worker     xmlOutputBufferPtr ret;
2104*6777b538SAndroid Build Coastguard Worker 
2105*6777b538SAndroid Build Coastguard Worker     if (fd < 0) return(NULL);
2106*6777b538SAndroid Build Coastguard Worker 
2107*6777b538SAndroid Build Coastguard Worker     ret = xmlAllocOutputBufferInternal(encoder);
2108*6777b538SAndroid Build Coastguard Worker     if (ret != NULL) {
2109*6777b538SAndroid Build Coastguard Worker         ret->context = (void *) (ptrdiff_t) fd;
2110*6777b538SAndroid Build Coastguard Worker 	ret->writecallback = xmlFdWrite;
2111*6777b538SAndroid Build Coastguard Worker 	ret->closecallback = NULL;
2112*6777b538SAndroid Build Coastguard Worker     }
2113*6777b538SAndroid Build Coastguard Worker 
2114*6777b538SAndroid Build Coastguard Worker     return(ret);
2115*6777b538SAndroid Build Coastguard Worker }
2116*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_OUTPUT_ENABLED */
2117*6777b538SAndroid Build Coastguard Worker 
2118*6777b538SAndroid Build Coastguard Worker /**
2119*6777b538SAndroid Build Coastguard Worker  * xmlParserInputBufferCreateIO:
2120*6777b538SAndroid Build Coastguard Worker  * @ioread:  an I/O read function
2121*6777b538SAndroid Build Coastguard Worker  * @ioclose:  an I/O close function
2122*6777b538SAndroid Build Coastguard Worker  * @ioctx:  an I/O handler
2123*6777b538SAndroid Build Coastguard Worker  * @enc:  the charset encoding if known (deprecated)
2124*6777b538SAndroid Build Coastguard Worker  *
2125*6777b538SAndroid Build Coastguard Worker  * Create a buffered parser input for the progressive parsing for the input
2126*6777b538SAndroid Build Coastguard Worker  * from an I/O handler
2127*6777b538SAndroid Build Coastguard Worker  *
2128*6777b538SAndroid Build Coastguard Worker  * The encoding argument is deprecated and should be set to
2129*6777b538SAndroid Build Coastguard Worker  * XML_CHAR_ENCODING_NONE. The encoding can be changed with
2130*6777b538SAndroid Build Coastguard Worker  * xmlSwitchEncoding or xmlSwitchEncodingName later on.
2131*6777b538SAndroid Build Coastguard Worker  *
2132*6777b538SAndroid Build Coastguard Worker  * Returns the new parser input or NULL
2133*6777b538SAndroid Build Coastguard Worker  */
2134*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferPtr
xmlParserInputBufferCreateIO(xmlInputReadCallback ioread,xmlInputCloseCallback ioclose,void * ioctx,xmlCharEncoding enc)2135*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferCreateIO(xmlInputReadCallback   ioread,
2136*6777b538SAndroid Build Coastguard Worker 	 xmlInputCloseCallback  ioclose, void *ioctx, xmlCharEncoding enc) {
2137*6777b538SAndroid Build Coastguard Worker     xmlParserInputBufferPtr ret;
2138*6777b538SAndroid Build Coastguard Worker 
2139*6777b538SAndroid Build Coastguard Worker     if (ioread == NULL) return(NULL);
2140*6777b538SAndroid Build Coastguard Worker 
2141*6777b538SAndroid Build Coastguard Worker     ret = xmlAllocParserInputBuffer(enc);
2142*6777b538SAndroid Build Coastguard Worker     if (ret != NULL) {
2143*6777b538SAndroid Build Coastguard Worker         ret->context = (void *) ioctx;
2144*6777b538SAndroid Build Coastguard Worker 	ret->readcallback = ioread;
2145*6777b538SAndroid Build Coastguard Worker 	ret->closecallback = ioclose;
2146*6777b538SAndroid Build Coastguard Worker     }
2147*6777b538SAndroid Build Coastguard Worker 
2148*6777b538SAndroid Build Coastguard Worker     return(ret);
2149*6777b538SAndroid Build Coastguard Worker }
2150*6777b538SAndroid Build Coastguard Worker 
2151*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
2152*6777b538SAndroid Build Coastguard Worker /**
2153*6777b538SAndroid Build Coastguard Worker  * xmlOutputBufferCreateIO:
2154*6777b538SAndroid Build Coastguard Worker  * @iowrite:  an I/O write function
2155*6777b538SAndroid Build Coastguard Worker  * @ioclose:  an I/O close function
2156*6777b538SAndroid Build Coastguard Worker  * @ioctx:  an I/O handler
2157*6777b538SAndroid Build Coastguard Worker  * @encoder:  the charset encoding if known
2158*6777b538SAndroid Build Coastguard Worker  *
2159*6777b538SAndroid Build Coastguard Worker  * Create a buffered output for the progressive saving
2160*6777b538SAndroid Build Coastguard Worker  * to an I/O handler
2161*6777b538SAndroid Build Coastguard Worker  *
2162*6777b538SAndroid Build Coastguard Worker  * Returns the new parser output or NULL
2163*6777b538SAndroid Build Coastguard Worker  */
2164*6777b538SAndroid Build Coastguard Worker xmlOutputBufferPtr
xmlOutputBufferCreateIO(xmlOutputWriteCallback iowrite,xmlOutputCloseCallback ioclose,void * ioctx,xmlCharEncodingHandlerPtr encoder)2165*6777b538SAndroid Build Coastguard Worker xmlOutputBufferCreateIO(xmlOutputWriteCallback   iowrite,
2166*6777b538SAndroid Build Coastguard Worker 	 xmlOutputCloseCallback  ioclose, void *ioctx,
2167*6777b538SAndroid Build Coastguard Worker 	 xmlCharEncodingHandlerPtr encoder) {
2168*6777b538SAndroid Build Coastguard Worker     xmlOutputBufferPtr ret;
2169*6777b538SAndroid Build Coastguard Worker 
2170*6777b538SAndroid Build Coastguard Worker     if (iowrite == NULL) return(NULL);
2171*6777b538SAndroid Build Coastguard Worker 
2172*6777b538SAndroid Build Coastguard Worker     ret = xmlAllocOutputBufferInternal(encoder);
2173*6777b538SAndroid Build Coastguard Worker     if (ret != NULL) {
2174*6777b538SAndroid Build Coastguard Worker         ret->context = (void *) ioctx;
2175*6777b538SAndroid Build Coastguard Worker 	ret->writecallback = iowrite;
2176*6777b538SAndroid Build Coastguard Worker 	ret->closecallback = ioclose;
2177*6777b538SAndroid Build Coastguard Worker     }
2178*6777b538SAndroid Build Coastguard Worker 
2179*6777b538SAndroid Build Coastguard Worker     return(ret);
2180*6777b538SAndroid Build Coastguard Worker }
2181*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_OUTPUT_ENABLED */
2182*6777b538SAndroid Build Coastguard Worker 
2183*6777b538SAndroid Build Coastguard Worker /**
2184*6777b538SAndroid Build Coastguard Worker  * xmlParserInputBufferCreateFilenameDefault:
2185*6777b538SAndroid Build Coastguard Worker  * @func: function pointer to the new ParserInputBufferCreateFilenameFunc
2186*6777b538SAndroid Build Coastguard Worker  *
2187*6777b538SAndroid Build Coastguard Worker  * Registers a callback for URI input file handling
2188*6777b538SAndroid Build Coastguard Worker  *
2189*6777b538SAndroid Build Coastguard Worker  * Returns the old value of the registration function
2190*6777b538SAndroid Build Coastguard Worker  */
2191*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferCreateFilenameFunc
xmlParserInputBufferCreateFilenameDefault(xmlParserInputBufferCreateFilenameFunc func)2192*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferCreateFilenameDefault(xmlParserInputBufferCreateFilenameFunc func)
2193*6777b538SAndroid Build Coastguard Worker {
2194*6777b538SAndroid Build Coastguard Worker     xmlParserInputBufferCreateFilenameFunc old = xmlParserInputBufferCreateFilenameValue;
2195*6777b538SAndroid Build Coastguard Worker     if (old == NULL) {
2196*6777b538SAndroid Build Coastguard Worker 		old = __xmlParserInputBufferCreateFilename;
2197*6777b538SAndroid Build Coastguard Worker 	}
2198*6777b538SAndroid Build Coastguard Worker 
2199*6777b538SAndroid Build Coastguard Worker     xmlParserInputBufferCreateFilenameValue = func;
2200*6777b538SAndroid Build Coastguard Worker     return(old);
2201*6777b538SAndroid Build Coastguard Worker }
2202*6777b538SAndroid Build Coastguard Worker 
2203*6777b538SAndroid Build Coastguard Worker /**
2204*6777b538SAndroid Build Coastguard Worker  * xmlOutputBufferCreateFilenameDefault:
2205*6777b538SAndroid Build Coastguard Worker  * @func: function pointer to the new OutputBufferCreateFilenameFunc
2206*6777b538SAndroid Build Coastguard Worker  *
2207*6777b538SAndroid Build Coastguard Worker  * Registers a callback for URI output file handling
2208*6777b538SAndroid Build Coastguard Worker  *
2209*6777b538SAndroid Build Coastguard Worker  * Returns the old value of the registration function
2210*6777b538SAndroid Build Coastguard Worker  */
2211*6777b538SAndroid Build Coastguard Worker xmlOutputBufferCreateFilenameFunc
xmlOutputBufferCreateFilenameDefault(xmlOutputBufferCreateFilenameFunc func)2212*6777b538SAndroid Build Coastguard Worker xmlOutputBufferCreateFilenameDefault(xmlOutputBufferCreateFilenameFunc func)
2213*6777b538SAndroid Build Coastguard Worker {
2214*6777b538SAndroid Build Coastguard Worker     xmlOutputBufferCreateFilenameFunc old = xmlOutputBufferCreateFilenameValue;
2215*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
2216*6777b538SAndroid Build Coastguard Worker     if (old == NULL) {
2217*6777b538SAndroid Build Coastguard Worker 		old = __xmlOutputBufferCreateFilename;
2218*6777b538SAndroid Build Coastguard Worker 	}
2219*6777b538SAndroid Build Coastguard Worker #endif
2220*6777b538SAndroid Build Coastguard Worker     xmlOutputBufferCreateFilenameValue = func;
2221*6777b538SAndroid Build Coastguard Worker     return(old);
2222*6777b538SAndroid Build Coastguard Worker }
2223*6777b538SAndroid Build Coastguard Worker 
2224*6777b538SAndroid Build Coastguard Worker /**
2225*6777b538SAndroid Build Coastguard Worker  * xmlParserInputBufferPush:
2226*6777b538SAndroid Build Coastguard Worker  * @in:  a buffered parser input
2227*6777b538SAndroid Build Coastguard Worker  * @len:  the size in bytes of the array.
2228*6777b538SAndroid Build Coastguard Worker  * @buf:  an char array
2229*6777b538SAndroid Build Coastguard Worker  *
2230*6777b538SAndroid Build Coastguard Worker  * Push the content of the arry in the input buffer
2231*6777b538SAndroid Build Coastguard Worker  * This routine handle the I18N transcoding to internal UTF-8
2232*6777b538SAndroid Build Coastguard Worker  * This is used when operating the parser in progressive (push) mode.
2233*6777b538SAndroid Build Coastguard Worker  *
2234*6777b538SAndroid Build Coastguard Worker  * Returns the number of chars read and stored in the buffer, or -1
2235*6777b538SAndroid Build Coastguard Worker  *         in case of error.
2236*6777b538SAndroid Build Coastguard Worker  */
2237*6777b538SAndroid Build Coastguard Worker int
xmlParserInputBufferPush(xmlParserInputBufferPtr in,int len,const char * buf)2238*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferPush(xmlParserInputBufferPtr in,
2239*6777b538SAndroid Build Coastguard Worker 	                 int len, const char *buf) {
2240*6777b538SAndroid Build Coastguard Worker     int nbchars = 0;
2241*6777b538SAndroid Build Coastguard Worker     int ret;
2242*6777b538SAndroid Build Coastguard Worker 
2243*6777b538SAndroid Build Coastguard Worker     if (len < 0) return(0);
2244*6777b538SAndroid Build Coastguard Worker     if ((in == NULL) || (in->error)) return(-1);
2245*6777b538SAndroid Build Coastguard Worker     if (in->encoder != NULL) {
2246*6777b538SAndroid Build Coastguard Worker         /*
2247*6777b538SAndroid Build Coastguard Worker 	 * Store the data in the incoming raw buffer
2248*6777b538SAndroid Build Coastguard Worker 	 */
2249*6777b538SAndroid Build Coastguard Worker         if (in->raw == NULL) {
2250*6777b538SAndroid Build Coastguard Worker 	    in->raw = xmlBufCreate();
2251*6777b538SAndroid Build Coastguard Worker             if (in->raw == NULL) {
2252*6777b538SAndroid Build Coastguard Worker                 in->error = XML_ERR_NO_MEMORY;
2253*6777b538SAndroid Build Coastguard Worker                 return(-1);
2254*6777b538SAndroid Build Coastguard Worker             }
2255*6777b538SAndroid Build Coastguard Worker 	}
2256*6777b538SAndroid Build Coastguard Worker 	ret = xmlBufAdd(in->raw, (const xmlChar *) buf, len);
2257*6777b538SAndroid Build Coastguard Worker 	if (ret != 0) {
2258*6777b538SAndroid Build Coastguard Worker             in->error = XML_ERR_NO_MEMORY;
2259*6777b538SAndroid Build Coastguard Worker 	    return(-1);
2260*6777b538SAndroid Build Coastguard Worker         }
2261*6777b538SAndroid Build Coastguard Worker 
2262*6777b538SAndroid Build Coastguard Worker 	/*
2263*6777b538SAndroid Build Coastguard Worker 	 * convert as much as possible to the parser reading buffer.
2264*6777b538SAndroid Build Coastguard Worker 	 */
2265*6777b538SAndroid Build Coastguard Worker 	nbchars = xmlCharEncInput(in);
2266*6777b538SAndroid Build Coastguard Worker 	if (nbchars < 0)
2267*6777b538SAndroid Build Coastguard Worker 	    return(-1);
2268*6777b538SAndroid Build Coastguard Worker     } else {
2269*6777b538SAndroid Build Coastguard Worker 	nbchars = len;
2270*6777b538SAndroid Build Coastguard Worker         ret = xmlBufAdd(in->buffer, (xmlChar *) buf, nbchars);
2271*6777b538SAndroid Build Coastguard Worker 	if (ret != 0) {
2272*6777b538SAndroid Build Coastguard Worker             in->error = XML_ERR_NO_MEMORY;
2273*6777b538SAndroid Build Coastguard Worker 	    return(-1);
2274*6777b538SAndroid Build Coastguard Worker         }
2275*6777b538SAndroid Build Coastguard Worker     }
2276*6777b538SAndroid Build Coastguard Worker     return(nbchars);
2277*6777b538SAndroid Build Coastguard Worker }
2278*6777b538SAndroid Build Coastguard Worker 
2279*6777b538SAndroid Build Coastguard Worker /**
2280*6777b538SAndroid Build Coastguard Worker  * endOfInput:
2281*6777b538SAndroid Build Coastguard Worker  *
2282*6777b538SAndroid Build Coastguard Worker  * When reading from an Input channel indicated end of file or error
2283*6777b538SAndroid Build Coastguard Worker  * don't reread from it again.
2284*6777b538SAndroid Build Coastguard Worker  */
2285*6777b538SAndroid Build Coastguard Worker static int
endOfInput(void * context ATTRIBUTE_UNUSED,char * buffer ATTRIBUTE_UNUSED,int len ATTRIBUTE_UNUSED)2286*6777b538SAndroid Build Coastguard Worker endOfInput (void * context ATTRIBUTE_UNUSED,
2287*6777b538SAndroid Build Coastguard Worker 	    char * buffer ATTRIBUTE_UNUSED,
2288*6777b538SAndroid Build Coastguard Worker 	    int len ATTRIBUTE_UNUSED) {
2289*6777b538SAndroid Build Coastguard Worker     return(0);
2290*6777b538SAndroid Build Coastguard Worker }
2291*6777b538SAndroid Build Coastguard Worker 
2292*6777b538SAndroid Build Coastguard Worker /**
2293*6777b538SAndroid Build Coastguard Worker  * xmlParserInputBufferGrow:
2294*6777b538SAndroid Build Coastguard Worker  * @in:  a buffered parser input
2295*6777b538SAndroid Build Coastguard Worker  * @len:  indicative value of the amount of chars to read
2296*6777b538SAndroid Build Coastguard Worker  *
2297*6777b538SAndroid Build Coastguard Worker  * Grow up the content of the input buffer, the old data are preserved
2298*6777b538SAndroid Build Coastguard Worker  * This routine handle the I18N transcoding to internal UTF-8
2299*6777b538SAndroid Build Coastguard Worker  * This routine is used when operating the parser in normal (pull) mode
2300*6777b538SAndroid Build Coastguard Worker  *
2301*6777b538SAndroid Build Coastguard Worker  * TODO: one should be able to remove one extra copy by copying directly
2302*6777b538SAndroid Build Coastguard Worker  *       onto in->buffer or in->raw
2303*6777b538SAndroid Build Coastguard Worker  *
2304*6777b538SAndroid Build Coastguard Worker  * Returns the number of chars read and stored in the buffer, or -1
2305*6777b538SAndroid Build Coastguard Worker  *         in case of error.
2306*6777b538SAndroid Build Coastguard Worker  */
2307*6777b538SAndroid Build Coastguard Worker int
xmlParserInputBufferGrow(xmlParserInputBufferPtr in,int len)2308*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferGrow(xmlParserInputBufferPtr in, int len) {
2309*6777b538SAndroid Build Coastguard Worker     xmlBufPtr buf;
2310*6777b538SAndroid Build Coastguard Worker     int res = 0;
2311*6777b538SAndroid Build Coastguard Worker 
2312*6777b538SAndroid Build Coastguard Worker     if ((in == NULL) || (in->error)) return(-1);
2313*6777b538SAndroid Build Coastguard Worker     if ((len <= MINLEN) && (len != 4))
2314*6777b538SAndroid Build Coastguard Worker         len = MINLEN;
2315*6777b538SAndroid Build Coastguard Worker 
2316*6777b538SAndroid Build Coastguard Worker     if (in->encoder == NULL) {
2317*6777b538SAndroid Build Coastguard Worker         if (in->readcallback == NULL)
2318*6777b538SAndroid Build Coastguard Worker             return(0);
2319*6777b538SAndroid Build Coastguard Worker         buf = in->buffer;
2320*6777b538SAndroid Build Coastguard Worker     } else {
2321*6777b538SAndroid Build Coastguard Worker         if (in->raw == NULL) {
2322*6777b538SAndroid Build Coastguard Worker 	    in->raw = xmlBufCreate();
2323*6777b538SAndroid Build Coastguard Worker 	}
2324*6777b538SAndroid Build Coastguard Worker         buf = in->raw;
2325*6777b538SAndroid Build Coastguard Worker     }
2326*6777b538SAndroid Build Coastguard Worker 
2327*6777b538SAndroid Build Coastguard Worker     /*
2328*6777b538SAndroid Build Coastguard Worker      * Call the read method for this I/O type.
2329*6777b538SAndroid Build Coastguard Worker      */
2330*6777b538SAndroid Build Coastguard Worker     if (in->readcallback != NULL) {
2331*6777b538SAndroid Build Coastguard Worker         if (xmlBufGrow(buf, len + 1) < 0) {
2332*6777b538SAndroid Build Coastguard Worker             in->error = XML_ERR_NO_MEMORY;
2333*6777b538SAndroid Build Coastguard Worker             return(-1);
2334*6777b538SAndroid Build Coastguard Worker         }
2335*6777b538SAndroid Build Coastguard Worker 
2336*6777b538SAndroid Build Coastguard Worker 	res = in->readcallback(in->context, (char *)xmlBufEnd(buf), len);
2337*6777b538SAndroid Build Coastguard Worker 	if (res <= 0)
2338*6777b538SAndroid Build Coastguard Worker 	    in->readcallback = endOfInput;
2339*6777b538SAndroid Build Coastguard Worker         if (res < 0) {
2340*6777b538SAndroid Build Coastguard Worker             if (res == -1)
2341*6777b538SAndroid Build Coastguard Worker                 in->error = XML_IO_UNKNOWN;
2342*6777b538SAndroid Build Coastguard Worker             else
2343*6777b538SAndroid Build Coastguard Worker                 in->error = -res;
2344*6777b538SAndroid Build Coastguard Worker             return(-1);
2345*6777b538SAndroid Build Coastguard Worker         }
2346*6777b538SAndroid Build Coastguard Worker 
2347*6777b538SAndroid Build Coastguard Worker         if (xmlBufAddLen(buf, res) < 0) {
2348*6777b538SAndroid Build Coastguard Worker             in->error = XML_ERR_NO_MEMORY;
2349*6777b538SAndroid Build Coastguard Worker             return(-1);
2350*6777b538SAndroid Build Coastguard Worker         }
2351*6777b538SAndroid Build Coastguard Worker     }
2352*6777b538SAndroid Build Coastguard Worker 
2353*6777b538SAndroid Build Coastguard Worker     /*
2354*6777b538SAndroid Build Coastguard Worker      * try to establish compressed status of input if not done already
2355*6777b538SAndroid Build Coastguard Worker      */
2356*6777b538SAndroid Build Coastguard Worker     if (in->compressed == -1) {
2357*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_LZMA_ENABLED
2358*6777b538SAndroid Build Coastguard Worker 	if (in->readcallback == xmlXzfileRead)
2359*6777b538SAndroid Build Coastguard Worker             in->compressed = __libxml2_xzcompressed(in->context);
2360*6777b538SAndroid Build Coastguard Worker #endif
2361*6777b538SAndroid Build Coastguard Worker     }
2362*6777b538SAndroid Build Coastguard Worker 
2363*6777b538SAndroid Build Coastguard Worker     if (in->encoder != NULL) {
2364*6777b538SAndroid Build Coastguard Worker 	res = xmlCharEncInput(in);
2365*6777b538SAndroid Build Coastguard Worker 	if (res < 0)
2366*6777b538SAndroid Build Coastguard Worker 	    return(-1);
2367*6777b538SAndroid Build Coastguard Worker     }
2368*6777b538SAndroid Build Coastguard Worker     return(res);
2369*6777b538SAndroid Build Coastguard Worker }
2370*6777b538SAndroid Build Coastguard Worker 
2371*6777b538SAndroid Build Coastguard Worker /**
2372*6777b538SAndroid Build Coastguard Worker  * xmlParserInputBufferRead:
2373*6777b538SAndroid Build Coastguard Worker  * @in:  a buffered parser input
2374*6777b538SAndroid Build Coastguard Worker  * @len:  indicative value of the amount of chars to read
2375*6777b538SAndroid Build Coastguard Worker  *
2376*6777b538SAndroid Build Coastguard Worker  * Refresh the content of the input buffer, the old data are considered
2377*6777b538SAndroid Build Coastguard Worker  * consumed
2378*6777b538SAndroid Build Coastguard Worker  * This routine handle the I18N transcoding to internal UTF-8
2379*6777b538SAndroid Build Coastguard Worker  *
2380*6777b538SAndroid Build Coastguard Worker  * Returns the number of chars read and stored in the buffer, or -1
2381*6777b538SAndroid Build Coastguard Worker  *         in case of error.
2382*6777b538SAndroid Build Coastguard Worker  */
2383*6777b538SAndroid Build Coastguard Worker int
xmlParserInputBufferRead(xmlParserInputBufferPtr in,int len)2384*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferRead(xmlParserInputBufferPtr in, int len) {
2385*6777b538SAndroid Build Coastguard Worker     return(xmlParserInputBufferGrow(in, len));
2386*6777b538SAndroid Build Coastguard Worker }
2387*6777b538SAndroid Build Coastguard Worker 
2388*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
2389*6777b538SAndroid Build Coastguard Worker /**
2390*6777b538SAndroid Build Coastguard Worker  * xmlOutputBufferWrite:
2391*6777b538SAndroid Build Coastguard Worker  * @out:  a buffered parser output
2392*6777b538SAndroid Build Coastguard Worker  * @len:  the size in bytes of the array.
2393*6777b538SAndroid Build Coastguard Worker  * @buf:  an char array
2394*6777b538SAndroid Build Coastguard Worker  *
2395*6777b538SAndroid Build Coastguard Worker  * Write the content of the array in the output I/O buffer
2396*6777b538SAndroid Build Coastguard Worker  * This routine handle the I18N transcoding from internal UTF-8
2397*6777b538SAndroid Build Coastguard Worker  * The buffer is lossless, i.e. will store in case of partial
2398*6777b538SAndroid Build Coastguard Worker  * or delayed writes.
2399*6777b538SAndroid Build Coastguard Worker  *
2400*6777b538SAndroid Build Coastguard Worker  * Returns the number of chars immediately written, or -1
2401*6777b538SAndroid Build Coastguard Worker  *         in case of error.
2402*6777b538SAndroid Build Coastguard Worker  */
2403*6777b538SAndroid Build Coastguard Worker int
xmlOutputBufferWrite(xmlOutputBufferPtr out,int len,const char * buf)2404*6777b538SAndroid Build Coastguard Worker xmlOutputBufferWrite(xmlOutputBufferPtr out, int len, const char *buf) {
2405*6777b538SAndroid Build Coastguard Worker     int nbchars = 0; /* number of chars to output to I/O */
2406*6777b538SAndroid Build Coastguard Worker     int ret;         /* return from function call */
2407*6777b538SAndroid Build Coastguard Worker     int written = 0; /* number of char written to I/O so far */
2408*6777b538SAndroid Build Coastguard Worker     int chunk;       /* number of byte current processed from buf */
2409*6777b538SAndroid Build Coastguard Worker 
2410*6777b538SAndroid Build Coastguard Worker     if ((out == NULL) || (out->error)) return(-1);
2411*6777b538SAndroid Build Coastguard Worker     if (len < 0) return(0);
2412*6777b538SAndroid Build Coastguard Worker     if (out->error) return(-1);
2413*6777b538SAndroid Build Coastguard Worker 
2414*6777b538SAndroid Build Coastguard Worker     do {
2415*6777b538SAndroid Build Coastguard Worker 	chunk = len;
2416*6777b538SAndroid Build Coastguard Worker 	if (chunk > 4 * MINLEN)
2417*6777b538SAndroid Build Coastguard Worker 	    chunk = 4 * MINLEN;
2418*6777b538SAndroid Build Coastguard Worker 
2419*6777b538SAndroid Build Coastguard Worker 	/*
2420*6777b538SAndroid Build Coastguard Worker 	 * first handle encoding stuff.
2421*6777b538SAndroid Build Coastguard Worker 	 */
2422*6777b538SAndroid Build Coastguard Worker 	if (out->encoder != NULL) {
2423*6777b538SAndroid Build Coastguard Worker 	    /*
2424*6777b538SAndroid Build Coastguard Worker 	     * Store the data in the incoming raw buffer
2425*6777b538SAndroid Build Coastguard Worker 	     */
2426*6777b538SAndroid Build Coastguard Worker 	    if (out->conv == NULL) {
2427*6777b538SAndroid Build Coastguard Worker 		out->conv = xmlBufCreate();
2428*6777b538SAndroid Build Coastguard Worker                 if (out->conv == NULL) {
2429*6777b538SAndroid Build Coastguard Worker                     out->error = XML_ERR_NO_MEMORY;
2430*6777b538SAndroid Build Coastguard Worker                     return(-1);
2431*6777b538SAndroid Build Coastguard Worker                 }
2432*6777b538SAndroid Build Coastguard Worker 	    }
2433*6777b538SAndroid Build Coastguard Worker 	    ret = xmlBufAdd(out->buffer, (const xmlChar *) buf, chunk);
2434*6777b538SAndroid Build Coastguard Worker 	    if (ret != 0) {
2435*6777b538SAndroid Build Coastguard Worker                 out->error = XML_ERR_NO_MEMORY;
2436*6777b538SAndroid Build Coastguard Worker 	        return(-1);
2437*6777b538SAndroid Build Coastguard Worker             }
2438*6777b538SAndroid Build Coastguard Worker 
2439*6777b538SAndroid Build Coastguard Worker 	    if ((xmlBufUse(out->buffer) < MINLEN) && (chunk == len))
2440*6777b538SAndroid Build Coastguard Worker 		goto done;
2441*6777b538SAndroid Build Coastguard Worker 
2442*6777b538SAndroid Build Coastguard Worker 	    /*
2443*6777b538SAndroid Build Coastguard Worker 	     * convert as much as possible to the parser reading buffer.
2444*6777b538SAndroid Build Coastguard Worker 	     */
2445*6777b538SAndroid Build Coastguard Worker 	    ret = xmlCharEncOutput(out, 0);
2446*6777b538SAndroid Build Coastguard Worker 	    if (ret < 0)
2447*6777b538SAndroid Build Coastguard Worker 		return(-1);
2448*6777b538SAndroid Build Coastguard Worker             if (out->writecallback)
2449*6777b538SAndroid Build Coastguard Worker 	        nbchars = xmlBufUse(out->conv);
2450*6777b538SAndroid Build Coastguard Worker             else
2451*6777b538SAndroid Build Coastguard Worker                 nbchars = ret >= 0 ? ret : 0;
2452*6777b538SAndroid Build Coastguard Worker 	} else {
2453*6777b538SAndroid Build Coastguard Worker 	    ret = xmlBufAdd(out->buffer, (const xmlChar *) buf, chunk);
2454*6777b538SAndroid Build Coastguard Worker 	    if (ret != 0)
2455*6777b538SAndroid Build Coastguard Worker 	        return(-1);
2456*6777b538SAndroid Build Coastguard Worker             if (out->writecallback)
2457*6777b538SAndroid Build Coastguard Worker 	        nbchars = xmlBufUse(out->buffer);
2458*6777b538SAndroid Build Coastguard Worker             else
2459*6777b538SAndroid Build Coastguard Worker                 nbchars = chunk;
2460*6777b538SAndroid Build Coastguard Worker 	}
2461*6777b538SAndroid Build Coastguard Worker 	buf += chunk;
2462*6777b538SAndroid Build Coastguard Worker 	len -= chunk;
2463*6777b538SAndroid Build Coastguard Worker 
2464*6777b538SAndroid Build Coastguard Worker 	if (out->writecallback) {
2465*6777b538SAndroid Build Coastguard Worker             if ((nbchars < MINLEN) && (len <= 0))
2466*6777b538SAndroid Build Coastguard Worker                 goto done;
2467*6777b538SAndroid Build Coastguard Worker 
2468*6777b538SAndroid Build Coastguard Worker 	    /*
2469*6777b538SAndroid Build Coastguard Worker 	     * second write the stuff to the I/O channel
2470*6777b538SAndroid Build Coastguard Worker 	     */
2471*6777b538SAndroid Build Coastguard Worker 	    if (out->encoder != NULL) {
2472*6777b538SAndroid Build Coastguard Worker 		ret = out->writecallback(out->context,
2473*6777b538SAndroid Build Coastguard Worker                            (const char *)xmlBufContent(out->conv), nbchars);
2474*6777b538SAndroid Build Coastguard Worker 		if (ret >= 0)
2475*6777b538SAndroid Build Coastguard Worker 		    xmlBufShrink(out->conv, ret);
2476*6777b538SAndroid Build Coastguard Worker 	    } else {
2477*6777b538SAndroid Build Coastguard Worker 		ret = out->writecallback(out->context,
2478*6777b538SAndroid Build Coastguard Worker                            (const char *)xmlBufContent(out->buffer), nbchars);
2479*6777b538SAndroid Build Coastguard Worker 		if (ret >= 0)
2480*6777b538SAndroid Build Coastguard Worker 		    xmlBufShrink(out->buffer, ret);
2481*6777b538SAndroid Build Coastguard Worker 	    }
2482*6777b538SAndroid Build Coastguard Worker 	    if (ret < 0) {
2483*6777b538SAndroid Build Coastguard Worker                 int errNo = (ret == -1) ? XML_IO_WRITE : -ret;
2484*6777b538SAndroid Build Coastguard Worker 
2485*6777b538SAndroid Build Coastguard Worker 		xmlIOErr(errNo, NULL);
2486*6777b538SAndroid Build Coastguard Worker 		out->error = errNo;
2487*6777b538SAndroid Build Coastguard Worker 		return(ret);
2488*6777b538SAndroid Build Coastguard Worker 	    }
2489*6777b538SAndroid Build Coastguard Worker             if (out->written > INT_MAX - ret)
2490*6777b538SAndroid Build Coastguard Worker                 out->written = INT_MAX;
2491*6777b538SAndroid Build Coastguard Worker             else
2492*6777b538SAndroid Build Coastguard Worker                 out->written += ret;
2493*6777b538SAndroid Build Coastguard Worker 	}
2494*6777b538SAndroid Build Coastguard Worker 	written += nbchars;
2495*6777b538SAndroid Build Coastguard Worker     } while (len > 0);
2496*6777b538SAndroid Build Coastguard Worker 
2497*6777b538SAndroid Build Coastguard Worker done:
2498*6777b538SAndroid Build Coastguard Worker     return(written);
2499*6777b538SAndroid Build Coastguard Worker }
2500*6777b538SAndroid Build Coastguard Worker 
2501*6777b538SAndroid Build Coastguard Worker /**
2502*6777b538SAndroid Build Coastguard Worker  * xmlEscapeContent:
2503*6777b538SAndroid Build Coastguard Worker  * @out:  a pointer to an array of bytes to store the result
2504*6777b538SAndroid Build Coastguard Worker  * @outlen:  the length of @out
2505*6777b538SAndroid Build Coastguard Worker  * @in:  a pointer to an array of unescaped UTF-8 bytes
2506*6777b538SAndroid Build Coastguard Worker  * @inlen:  the length of @in
2507*6777b538SAndroid Build Coastguard Worker  *
2508*6777b538SAndroid Build Coastguard Worker  * Take a block of UTF-8 chars in and escape them.
2509*6777b538SAndroid Build Coastguard Worker  * Returns 0 if success, or -1 otherwise
2510*6777b538SAndroid Build Coastguard Worker  * The value of @inlen after return is the number of octets consumed
2511*6777b538SAndroid Build Coastguard Worker  *     if the return value is positive, else unpredictable.
2512*6777b538SAndroid Build Coastguard Worker  * The value of @outlen after return is the number of octets consumed.
2513*6777b538SAndroid Build Coastguard Worker  */
2514*6777b538SAndroid Build Coastguard Worker static int
xmlEscapeContent(unsigned char * out,int * outlen,const xmlChar * in,int * inlen)2515*6777b538SAndroid Build Coastguard Worker xmlEscapeContent(unsigned char* out, int *outlen,
2516*6777b538SAndroid Build Coastguard Worker                  const xmlChar* in, int *inlen) {
2517*6777b538SAndroid Build Coastguard Worker     unsigned char* outstart = out;
2518*6777b538SAndroid Build Coastguard Worker     const unsigned char* base = in;
2519*6777b538SAndroid Build Coastguard Worker     unsigned char* outend = out + *outlen;
2520*6777b538SAndroid Build Coastguard Worker     const unsigned char* inend;
2521*6777b538SAndroid Build Coastguard Worker 
2522*6777b538SAndroid Build Coastguard Worker     inend = in + (*inlen);
2523*6777b538SAndroid Build Coastguard Worker 
2524*6777b538SAndroid Build Coastguard Worker     while ((in < inend) && (out < outend)) {
2525*6777b538SAndroid Build Coastguard Worker 	if (*in == '<') {
2526*6777b538SAndroid Build Coastguard Worker 	    if (outend - out < 4) break;
2527*6777b538SAndroid Build Coastguard Worker 	    *out++ = '&';
2528*6777b538SAndroid Build Coastguard Worker 	    *out++ = 'l';
2529*6777b538SAndroid Build Coastguard Worker 	    *out++ = 't';
2530*6777b538SAndroid Build Coastguard Worker 	    *out++ = ';';
2531*6777b538SAndroid Build Coastguard Worker 	} else if (*in == '>') {
2532*6777b538SAndroid Build Coastguard Worker 	    if (outend - out < 4) break;
2533*6777b538SAndroid Build Coastguard Worker 	    *out++ = '&';
2534*6777b538SAndroid Build Coastguard Worker 	    *out++ = 'g';
2535*6777b538SAndroid Build Coastguard Worker 	    *out++ = 't';
2536*6777b538SAndroid Build Coastguard Worker 	    *out++ = ';';
2537*6777b538SAndroid Build Coastguard Worker 	} else if (*in == '&') {
2538*6777b538SAndroid Build Coastguard Worker 	    if (outend - out < 5) break;
2539*6777b538SAndroid Build Coastguard Worker 	    *out++ = '&';
2540*6777b538SAndroid Build Coastguard Worker 	    *out++ = 'a';
2541*6777b538SAndroid Build Coastguard Worker 	    *out++ = 'm';
2542*6777b538SAndroid Build Coastguard Worker 	    *out++ = 'p';
2543*6777b538SAndroid Build Coastguard Worker 	    *out++ = ';';
2544*6777b538SAndroid Build Coastguard Worker 	} else if (*in == '\r') {
2545*6777b538SAndroid Build Coastguard Worker 	    if (outend - out < 5) break;
2546*6777b538SAndroid Build Coastguard Worker 	    *out++ = '&';
2547*6777b538SAndroid Build Coastguard Worker 	    *out++ = '#';
2548*6777b538SAndroid Build Coastguard Worker 	    *out++ = '1';
2549*6777b538SAndroid Build Coastguard Worker 	    *out++ = '3';
2550*6777b538SAndroid Build Coastguard Worker 	    *out++ = ';';
2551*6777b538SAndroid Build Coastguard Worker 	} else {
2552*6777b538SAndroid Build Coastguard Worker 	    *out++ = *in;
2553*6777b538SAndroid Build Coastguard Worker 	}
2554*6777b538SAndroid Build Coastguard Worker 	++in;
2555*6777b538SAndroid Build Coastguard Worker     }
2556*6777b538SAndroid Build Coastguard Worker     *outlen = out - outstart;
2557*6777b538SAndroid Build Coastguard Worker     *inlen = in - base;
2558*6777b538SAndroid Build Coastguard Worker     return(0);
2559*6777b538SAndroid Build Coastguard Worker }
2560*6777b538SAndroid Build Coastguard Worker 
2561*6777b538SAndroid Build Coastguard Worker /**
2562*6777b538SAndroid Build Coastguard Worker  * xmlOutputBufferWriteEscape:
2563*6777b538SAndroid Build Coastguard Worker  * @out:  a buffered parser output
2564*6777b538SAndroid Build Coastguard Worker  * @str:  a zero terminated UTF-8 string
2565*6777b538SAndroid Build Coastguard Worker  * @escaping:  an optional escaping function (or NULL)
2566*6777b538SAndroid Build Coastguard Worker  *
2567*6777b538SAndroid Build Coastguard Worker  * Write the content of the string in the output I/O buffer
2568*6777b538SAndroid Build Coastguard Worker  * This routine escapes the characters and then handle the I18N
2569*6777b538SAndroid Build Coastguard Worker  * transcoding from internal UTF-8
2570*6777b538SAndroid Build Coastguard Worker  * The buffer is lossless, i.e. will store in case of partial
2571*6777b538SAndroid Build Coastguard Worker  * or delayed writes.
2572*6777b538SAndroid Build Coastguard Worker  *
2573*6777b538SAndroid Build Coastguard Worker  * Returns the number of chars immediately written, or -1
2574*6777b538SAndroid Build Coastguard Worker  *         in case of error.
2575*6777b538SAndroid Build Coastguard Worker  */
2576*6777b538SAndroid Build Coastguard Worker int
xmlOutputBufferWriteEscape(xmlOutputBufferPtr out,const xmlChar * str,xmlCharEncodingOutputFunc escaping)2577*6777b538SAndroid Build Coastguard Worker xmlOutputBufferWriteEscape(xmlOutputBufferPtr out, const xmlChar *str,
2578*6777b538SAndroid Build Coastguard Worker                            xmlCharEncodingOutputFunc escaping) {
2579*6777b538SAndroid Build Coastguard Worker     int nbchars = 0; /* number of chars to output to I/O */
2580*6777b538SAndroid Build Coastguard Worker     int ret;         /* return from function call */
2581*6777b538SAndroid Build Coastguard Worker     int written = 0; /* number of char written to I/O so far */
2582*6777b538SAndroid Build Coastguard Worker     int oldwritten=0;/* loop guard */
2583*6777b538SAndroid Build Coastguard Worker     int chunk;       /* number of byte currently processed from str */
2584*6777b538SAndroid Build Coastguard Worker     int len;         /* number of bytes in str */
2585*6777b538SAndroid Build Coastguard Worker     int cons;        /* byte from str consumed */
2586*6777b538SAndroid Build Coastguard Worker 
2587*6777b538SAndroid Build Coastguard Worker     if ((out == NULL) || (out->error) || (str == NULL) ||
2588*6777b538SAndroid Build Coastguard Worker         (out->buffer == NULL))
2589*6777b538SAndroid Build Coastguard Worker         return(-1);
2590*6777b538SAndroid Build Coastguard Worker     len = strlen((const char *)str);
2591*6777b538SAndroid Build Coastguard Worker     if (len < 0) return(0);
2592*6777b538SAndroid Build Coastguard Worker     if (out->error) return(-1);
2593*6777b538SAndroid Build Coastguard Worker     if (escaping == NULL) escaping = xmlEscapeContent;
2594*6777b538SAndroid Build Coastguard Worker 
2595*6777b538SAndroid Build Coastguard Worker     do {
2596*6777b538SAndroid Build Coastguard Worker         oldwritten = written;
2597*6777b538SAndroid Build Coastguard Worker 
2598*6777b538SAndroid Build Coastguard Worker         /*
2599*6777b538SAndroid Build Coastguard Worker 	 * how many bytes to consume and how many bytes to store.
2600*6777b538SAndroid Build Coastguard Worker 	 */
2601*6777b538SAndroid Build Coastguard Worker 	cons = len;
2602*6777b538SAndroid Build Coastguard Worker 	chunk = xmlBufAvail(out->buffer);
2603*6777b538SAndroid Build Coastguard Worker 
2604*6777b538SAndroid Build Coastguard Worker         /*
2605*6777b538SAndroid Build Coastguard Worker 	 * make sure we have enough room to save first, if this is
2606*6777b538SAndroid Build Coastguard Worker 	 * not the case force a flush, but make sure we stay in the loop
2607*6777b538SAndroid Build Coastguard Worker 	 */
2608*6777b538SAndroid Build Coastguard Worker 	if (chunk < 40) {
2609*6777b538SAndroid Build Coastguard Worker 	    if (xmlBufGrow(out->buffer, 100) < 0)
2610*6777b538SAndroid Build Coastguard Worker 	        return(-1);
2611*6777b538SAndroid Build Coastguard Worker             oldwritten = -1;
2612*6777b538SAndroid Build Coastguard Worker 	    continue;
2613*6777b538SAndroid Build Coastguard Worker 	}
2614*6777b538SAndroid Build Coastguard Worker 
2615*6777b538SAndroid Build Coastguard Worker 	/*
2616*6777b538SAndroid Build Coastguard Worker 	 * first handle encoding stuff.
2617*6777b538SAndroid Build Coastguard Worker 	 */
2618*6777b538SAndroid Build Coastguard Worker 	if (out->encoder != NULL) {
2619*6777b538SAndroid Build Coastguard Worker 	    /*
2620*6777b538SAndroid Build Coastguard Worker 	     * Store the data in the incoming raw buffer
2621*6777b538SAndroid Build Coastguard Worker 	     */
2622*6777b538SAndroid Build Coastguard Worker 	    if (out->conv == NULL) {
2623*6777b538SAndroid Build Coastguard Worker 		out->conv = xmlBufCreate();
2624*6777b538SAndroid Build Coastguard Worker 	    }
2625*6777b538SAndroid Build Coastguard Worker 	    ret = escaping(xmlBufEnd(out->buffer) ,
2626*6777b538SAndroid Build Coastguard Worker 	                   &chunk, str, &cons);
2627*6777b538SAndroid Build Coastguard Worker 	    if ((ret < 0) || (chunk == 0)) /* chunk==0 => nothing done */
2628*6777b538SAndroid Build Coastguard Worker 	        return(-1);
2629*6777b538SAndroid Build Coastguard Worker             xmlBufAddLen(out->buffer, chunk);
2630*6777b538SAndroid Build Coastguard Worker 
2631*6777b538SAndroid Build Coastguard Worker 	    if ((xmlBufUse(out->buffer) < MINLEN) && (cons == len))
2632*6777b538SAndroid Build Coastguard Worker 		goto done;
2633*6777b538SAndroid Build Coastguard Worker 
2634*6777b538SAndroid Build Coastguard Worker 	    /*
2635*6777b538SAndroid Build Coastguard Worker 	     * convert as much as possible to the output buffer.
2636*6777b538SAndroid Build Coastguard Worker 	     */
2637*6777b538SAndroid Build Coastguard Worker 	    ret = xmlCharEncOutput(out, 0);
2638*6777b538SAndroid Build Coastguard Worker 	    if (ret < 0)
2639*6777b538SAndroid Build Coastguard Worker 		return(-1);
2640*6777b538SAndroid Build Coastguard Worker             if (out->writecallback)
2641*6777b538SAndroid Build Coastguard Worker 	        nbchars = xmlBufUse(out->conv);
2642*6777b538SAndroid Build Coastguard Worker             else
2643*6777b538SAndroid Build Coastguard Worker                 nbchars = ret >= 0 ? ret : 0;
2644*6777b538SAndroid Build Coastguard Worker 	} else {
2645*6777b538SAndroid Build Coastguard Worker 	    ret = escaping(xmlBufEnd(out->buffer), &chunk, str, &cons);
2646*6777b538SAndroid Build Coastguard Worker 	    if ((ret < 0) || (chunk == 0)) /* chunk==0 => nothing done */
2647*6777b538SAndroid Build Coastguard Worker 	        return(-1);
2648*6777b538SAndroid Build Coastguard Worker             xmlBufAddLen(out->buffer, chunk);
2649*6777b538SAndroid Build Coastguard Worker             if (out->writecallback)
2650*6777b538SAndroid Build Coastguard Worker 	        nbchars = xmlBufUse(out->buffer);
2651*6777b538SAndroid Build Coastguard Worker             else
2652*6777b538SAndroid Build Coastguard Worker                 nbchars = chunk;
2653*6777b538SAndroid Build Coastguard Worker 	}
2654*6777b538SAndroid Build Coastguard Worker 	str += cons;
2655*6777b538SAndroid Build Coastguard Worker 	len -= cons;
2656*6777b538SAndroid Build Coastguard Worker 
2657*6777b538SAndroid Build Coastguard Worker 	if (out->writecallback) {
2658*6777b538SAndroid Build Coastguard Worker             if ((nbchars < MINLEN) && (len <= 0))
2659*6777b538SAndroid Build Coastguard Worker                 goto done;
2660*6777b538SAndroid Build Coastguard Worker 
2661*6777b538SAndroid Build Coastguard Worker 	    /*
2662*6777b538SAndroid Build Coastguard Worker 	     * second write the stuff to the I/O channel
2663*6777b538SAndroid Build Coastguard Worker 	     */
2664*6777b538SAndroid Build Coastguard Worker 	    if (out->encoder != NULL) {
2665*6777b538SAndroid Build Coastguard Worker 		ret = out->writecallback(out->context,
2666*6777b538SAndroid Build Coastguard Worker                            (const char *)xmlBufContent(out->conv), nbchars);
2667*6777b538SAndroid Build Coastguard Worker 		if (ret >= 0)
2668*6777b538SAndroid Build Coastguard Worker 		    xmlBufShrink(out->conv, ret);
2669*6777b538SAndroid Build Coastguard Worker 	    } else {
2670*6777b538SAndroid Build Coastguard Worker 		ret = out->writecallback(out->context,
2671*6777b538SAndroid Build Coastguard Worker                            (const char *)xmlBufContent(out->buffer), nbchars);
2672*6777b538SAndroid Build Coastguard Worker 		if (ret >= 0)
2673*6777b538SAndroid Build Coastguard Worker 		    xmlBufShrink(out->buffer, ret);
2674*6777b538SAndroid Build Coastguard Worker 	    }
2675*6777b538SAndroid Build Coastguard Worker 	    if (ret < 0) {
2676*6777b538SAndroid Build Coastguard Worker                 int errNo = (ret == -1) ? XML_IO_WRITE : -ret;
2677*6777b538SAndroid Build Coastguard Worker 		xmlIOErr(errNo, NULL);
2678*6777b538SAndroid Build Coastguard Worker 		out->error = errNo;
2679*6777b538SAndroid Build Coastguard Worker 		return(ret);
2680*6777b538SAndroid Build Coastguard Worker 	    }
2681*6777b538SAndroid Build Coastguard Worker             if (out->written > INT_MAX - ret)
2682*6777b538SAndroid Build Coastguard Worker                 out->written = INT_MAX;
2683*6777b538SAndroid Build Coastguard Worker             else
2684*6777b538SAndroid Build Coastguard Worker                 out->written += ret;
2685*6777b538SAndroid Build Coastguard Worker 	} else if (xmlBufAvail(out->buffer) < MINLEN) {
2686*6777b538SAndroid Build Coastguard Worker 	    xmlBufGrow(out->buffer, MINLEN);
2687*6777b538SAndroid Build Coastguard Worker 	}
2688*6777b538SAndroid Build Coastguard Worker 	written += nbchars;
2689*6777b538SAndroid Build Coastguard Worker     } while ((len > 0) && (oldwritten != written));
2690*6777b538SAndroid Build Coastguard Worker 
2691*6777b538SAndroid Build Coastguard Worker done:
2692*6777b538SAndroid Build Coastguard Worker     return(written);
2693*6777b538SAndroid Build Coastguard Worker }
2694*6777b538SAndroid Build Coastguard Worker 
2695*6777b538SAndroid Build Coastguard Worker /**
2696*6777b538SAndroid Build Coastguard Worker  * xmlOutputBufferWriteString:
2697*6777b538SAndroid Build Coastguard Worker  * @out:  a buffered parser output
2698*6777b538SAndroid Build Coastguard Worker  * @str:  a zero terminated C string
2699*6777b538SAndroid Build Coastguard Worker  *
2700*6777b538SAndroid Build Coastguard Worker  * Write the content of the string in the output I/O buffer
2701*6777b538SAndroid Build Coastguard Worker  * This routine handle the I18N transcoding from internal UTF-8
2702*6777b538SAndroid Build Coastguard Worker  * The buffer is lossless, i.e. will store in case of partial
2703*6777b538SAndroid Build Coastguard Worker  * or delayed writes.
2704*6777b538SAndroid Build Coastguard Worker  *
2705*6777b538SAndroid Build Coastguard Worker  * Returns the number of chars immediately written, or -1
2706*6777b538SAndroid Build Coastguard Worker  *         in case of error.
2707*6777b538SAndroid Build Coastguard Worker  */
2708*6777b538SAndroid Build Coastguard Worker int
xmlOutputBufferWriteString(xmlOutputBufferPtr out,const char * str)2709*6777b538SAndroid Build Coastguard Worker xmlOutputBufferWriteString(xmlOutputBufferPtr out, const char *str) {
2710*6777b538SAndroid Build Coastguard Worker     int len;
2711*6777b538SAndroid Build Coastguard Worker 
2712*6777b538SAndroid Build Coastguard Worker     if ((out == NULL) || (out->error)) return(-1);
2713*6777b538SAndroid Build Coastguard Worker     if (str == NULL)
2714*6777b538SAndroid Build Coastguard Worker         return(-1);
2715*6777b538SAndroid Build Coastguard Worker     len = strlen(str);
2716*6777b538SAndroid Build Coastguard Worker 
2717*6777b538SAndroid Build Coastguard Worker     if (len > 0)
2718*6777b538SAndroid Build Coastguard Worker 	return(xmlOutputBufferWrite(out, len, str));
2719*6777b538SAndroid Build Coastguard Worker     return(len);
2720*6777b538SAndroid Build Coastguard Worker }
2721*6777b538SAndroid Build Coastguard Worker 
2722*6777b538SAndroid Build Coastguard Worker /**
2723*6777b538SAndroid Build Coastguard Worker  * xmlOutputBufferFlush:
2724*6777b538SAndroid Build Coastguard Worker  * @out:  a buffered output
2725*6777b538SAndroid Build Coastguard Worker  *
2726*6777b538SAndroid Build Coastguard Worker  * flushes the output I/O channel
2727*6777b538SAndroid Build Coastguard Worker  *
2728*6777b538SAndroid Build Coastguard Worker  * Returns the number of byte written or -1 in case of error.
2729*6777b538SAndroid Build Coastguard Worker  */
2730*6777b538SAndroid Build Coastguard Worker int
xmlOutputBufferFlush(xmlOutputBufferPtr out)2731*6777b538SAndroid Build Coastguard Worker xmlOutputBufferFlush(xmlOutputBufferPtr out) {
2732*6777b538SAndroid Build Coastguard Worker     int nbchars = 0, ret = 0;
2733*6777b538SAndroid Build Coastguard Worker 
2734*6777b538SAndroid Build Coastguard Worker     if ((out == NULL) || (out->error)) return(-1);
2735*6777b538SAndroid Build Coastguard Worker     /*
2736*6777b538SAndroid Build Coastguard Worker      * first handle encoding stuff.
2737*6777b538SAndroid Build Coastguard Worker      */
2738*6777b538SAndroid Build Coastguard Worker     if ((out->conv != NULL) && (out->encoder != NULL)) {
2739*6777b538SAndroid Build Coastguard Worker 	/*
2740*6777b538SAndroid Build Coastguard Worker 	 * convert as much as possible to the parser output buffer.
2741*6777b538SAndroid Build Coastguard Worker 	 */
2742*6777b538SAndroid Build Coastguard Worker 	do {
2743*6777b538SAndroid Build Coastguard Worker 	    nbchars = xmlCharEncOutput(out, 0);
2744*6777b538SAndroid Build Coastguard Worker 	    if (nbchars < 0)
2745*6777b538SAndroid Build Coastguard Worker 		return(-1);
2746*6777b538SAndroid Build Coastguard Worker 	} while (nbchars);
2747*6777b538SAndroid Build Coastguard Worker     }
2748*6777b538SAndroid Build Coastguard Worker 
2749*6777b538SAndroid Build Coastguard Worker     /*
2750*6777b538SAndroid Build Coastguard Worker      * second flush the stuff to the I/O channel
2751*6777b538SAndroid Build Coastguard Worker      */
2752*6777b538SAndroid Build Coastguard Worker     if ((out->conv != NULL) && (out->encoder != NULL) &&
2753*6777b538SAndroid Build Coastguard Worker 	(out->writecallback != NULL)) {
2754*6777b538SAndroid Build Coastguard Worker 	ret = out->writecallback(out->context,
2755*6777b538SAndroid Build Coastguard Worker                                  (const char *)xmlBufContent(out->conv),
2756*6777b538SAndroid Build Coastguard Worker                                  xmlBufUse(out->conv));
2757*6777b538SAndroid Build Coastguard Worker 	if (ret >= 0)
2758*6777b538SAndroid Build Coastguard Worker 	    xmlBufShrink(out->conv, ret);
2759*6777b538SAndroid Build Coastguard Worker     } else if (out->writecallback != NULL) {
2760*6777b538SAndroid Build Coastguard Worker 	ret = out->writecallback(out->context,
2761*6777b538SAndroid Build Coastguard Worker                                  (const char *)xmlBufContent(out->buffer),
2762*6777b538SAndroid Build Coastguard Worker                                  xmlBufUse(out->buffer));
2763*6777b538SAndroid Build Coastguard Worker 	if (ret >= 0)
2764*6777b538SAndroid Build Coastguard Worker 	    xmlBufShrink(out->buffer, ret);
2765*6777b538SAndroid Build Coastguard Worker     }
2766*6777b538SAndroid Build Coastguard Worker     if (ret < 0) {
2767*6777b538SAndroid Build Coastguard Worker         int errNo = (ret == -1) ? XML_IO_WRITE : -ret;
2768*6777b538SAndroid Build Coastguard Worker 
2769*6777b538SAndroid Build Coastguard Worker         xmlIOErr(errNo, NULL);
2770*6777b538SAndroid Build Coastguard Worker         out->error = errNo;
2771*6777b538SAndroid Build Coastguard Worker 	return(ret);
2772*6777b538SAndroid Build Coastguard Worker     }
2773*6777b538SAndroid Build Coastguard Worker     if (out->written > INT_MAX - ret)
2774*6777b538SAndroid Build Coastguard Worker         out->written = INT_MAX;
2775*6777b538SAndroid Build Coastguard Worker     else
2776*6777b538SAndroid Build Coastguard Worker         out->written += ret;
2777*6777b538SAndroid Build Coastguard Worker 
2778*6777b538SAndroid Build Coastguard Worker     return(ret);
2779*6777b538SAndroid Build Coastguard Worker }
2780*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_OUTPUT_ENABLED */
2781*6777b538SAndroid Build Coastguard Worker 
2782*6777b538SAndroid Build Coastguard Worker /**
2783*6777b538SAndroid Build Coastguard Worker  * xmlParserGetDirectory:
2784*6777b538SAndroid Build Coastguard Worker  * @filename:  the path to a file
2785*6777b538SAndroid Build Coastguard Worker  *
2786*6777b538SAndroid Build Coastguard Worker  * lookup the directory for that file
2787*6777b538SAndroid Build Coastguard Worker  *
2788*6777b538SAndroid Build Coastguard Worker  * Returns a new allocated string containing the directory, or NULL.
2789*6777b538SAndroid Build Coastguard Worker  */
2790*6777b538SAndroid Build Coastguard Worker char *
xmlParserGetDirectory(const char * filename)2791*6777b538SAndroid Build Coastguard Worker xmlParserGetDirectory(const char *filename) {
2792*6777b538SAndroid Build Coastguard Worker     char *ret = NULL;
2793*6777b538SAndroid Build Coastguard Worker     char dir[1024];
2794*6777b538SAndroid Build Coastguard Worker     char *cur;
2795*6777b538SAndroid Build Coastguard Worker 
2796*6777b538SAndroid Build Coastguard Worker     if (filename == NULL) return(NULL);
2797*6777b538SAndroid Build Coastguard Worker 
2798*6777b538SAndroid Build Coastguard Worker #if defined(_WIN32)
2799*6777b538SAndroid Build Coastguard Worker #   define IS_XMLPGD_SEP(ch) ((ch=='/')||(ch=='\\'))
2800*6777b538SAndroid Build Coastguard Worker #else
2801*6777b538SAndroid Build Coastguard Worker #   define IS_XMLPGD_SEP(ch) (ch=='/')
2802*6777b538SAndroid Build Coastguard Worker #endif
2803*6777b538SAndroid Build Coastguard Worker 
2804*6777b538SAndroid Build Coastguard Worker     strncpy(dir, filename, 1023);
2805*6777b538SAndroid Build Coastguard Worker     dir[1023] = 0;
2806*6777b538SAndroid Build Coastguard Worker     cur = &dir[strlen(dir)];
2807*6777b538SAndroid Build Coastguard Worker     while (cur > dir) {
2808*6777b538SAndroid Build Coastguard Worker          if (IS_XMLPGD_SEP(*cur)) break;
2809*6777b538SAndroid Build Coastguard Worker 	 cur --;
2810*6777b538SAndroid Build Coastguard Worker     }
2811*6777b538SAndroid Build Coastguard Worker     if (IS_XMLPGD_SEP(*cur)) {
2812*6777b538SAndroid Build Coastguard Worker         if (cur == dir) dir[1] = 0;
2813*6777b538SAndroid Build Coastguard Worker 	else *cur = 0;
2814*6777b538SAndroid Build Coastguard Worker 	ret = xmlMemStrdup(dir);
2815*6777b538SAndroid Build Coastguard Worker     } else {
2816*6777b538SAndroid Build Coastguard Worker         if (getcwd(dir, 1024) != NULL) {
2817*6777b538SAndroid Build Coastguard Worker 	    dir[1023] = 0;
2818*6777b538SAndroid Build Coastguard Worker 	    ret = xmlMemStrdup(dir);
2819*6777b538SAndroid Build Coastguard Worker 	}
2820*6777b538SAndroid Build Coastguard Worker     }
2821*6777b538SAndroid Build Coastguard Worker     return(ret);
2822*6777b538SAndroid Build Coastguard Worker #undef IS_XMLPGD_SEP
2823*6777b538SAndroid Build Coastguard Worker }
2824*6777b538SAndroid Build Coastguard Worker 
2825*6777b538SAndroid Build Coastguard Worker /**
2826*6777b538SAndroid Build Coastguard Worker  * xmlNoNetExists:
2827*6777b538SAndroid Build Coastguard Worker  * @filename:  the path to check
2828*6777b538SAndroid Build Coastguard Worker  *
2829*6777b538SAndroid Build Coastguard Worker  * DEPRECATED: Internal function, don't use.
2830*6777b538SAndroid Build Coastguard Worker  *
2831*6777b538SAndroid Build Coastguard Worker  * Like xmlCheckFilename but handles file URIs.
2832*6777b538SAndroid Build Coastguard Worker  */
2833*6777b538SAndroid Build Coastguard Worker int
xmlNoNetExists(const char * filename)2834*6777b538SAndroid Build Coastguard Worker xmlNoNetExists(const char *filename) {
2835*6777b538SAndroid Build Coastguard Worker     char *fromUri;
2836*6777b538SAndroid Build Coastguard Worker     int ret;
2837*6777b538SAndroid Build Coastguard Worker 
2838*6777b538SAndroid Build Coastguard Worker     if (filename == NULL)
2839*6777b538SAndroid Build Coastguard Worker 	return(0);
2840*6777b538SAndroid Build Coastguard Worker 
2841*6777b538SAndroid Build Coastguard Worker     if (xmlConvertUriToPath(filename, &fromUri) < 0)
2842*6777b538SAndroid Build Coastguard Worker         return(0);
2843*6777b538SAndroid Build Coastguard Worker 
2844*6777b538SAndroid Build Coastguard Worker     if (fromUri != NULL)
2845*6777b538SAndroid Build Coastguard Worker         filename = fromUri;
2846*6777b538SAndroid Build Coastguard Worker 
2847*6777b538SAndroid Build Coastguard Worker     ret =  xmlCheckFilename(filename);
2848*6777b538SAndroid Build Coastguard Worker 
2849*6777b538SAndroid Build Coastguard Worker     xmlFree(fromUri);
2850*6777b538SAndroid Build Coastguard Worker     return(ret);
2851*6777b538SAndroid Build Coastguard Worker }
2852*6777b538SAndroid Build Coastguard Worker 
2853*6777b538SAndroid Build Coastguard Worker /************************************************************************
2854*6777b538SAndroid Build Coastguard Worker  *									*
2855*6777b538SAndroid Build Coastguard Worker  *			Input/output callbacks				*
2856*6777b538SAndroid Build Coastguard Worker  *									*
2857*6777b538SAndroid Build Coastguard Worker  ************************************************************************/
2858*6777b538SAndroid Build Coastguard Worker 
2859*6777b538SAndroid Build Coastguard Worker /**
2860*6777b538SAndroid Build Coastguard Worker  * xmlInitIOCallbacks:
2861*6777b538SAndroid Build Coastguard Worker  *
2862*6777b538SAndroid Build Coastguard Worker  * Initialize callback tables.
2863*6777b538SAndroid Build Coastguard Worker  */
2864*6777b538SAndroid Build Coastguard Worker void
xmlInitIOCallbacks(void)2865*6777b538SAndroid Build Coastguard Worker xmlInitIOCallbacks(void)
2866*6777b538SAndroid Build Coastguard Worker {
2867*6777b538SAndroid Build Coastguard Worker     xmlInputCallbackNr = 1;
2868*6777b538SAndroid Build Coastguard Worker     xmlInputCallbackTable[0].matchcallback = xmlIODefaultMatch;
2869*6777b538SAndroid Build Coastguard Worker 
2870*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
2871*6777b538SAndroid Build Coastguard Worker     xmlOutputCallbackNr = 1;
2872*6777b538SAndroid Build Coastguard Worker     xmlOutputCallbackTable[0].matchcallback = xmlIODefaultMatch;
2873*6777b538SAndroid Build Coastguard Worker #endif
2874*6777b538SAndroid Build Coastguard Worker }
2875*6777b538SAndroid Build Coastguard Worker 
2876*6777b538SAndroid Build Coastguard Worker /**
2877*6777b538SAndroid Build Coastguard Worker  * xmlRegisterInputCallbacks:
2878*6777b538SAndroid Build Coastguard Worker  * @matchFunc:  the xmlInputMatchCallback
2879*6777b538SAndroid Build Coastguard Worker  * @openFunc:  the xmlInputOpenCallback
2880*6777b538SAndroid Build Coastguard Worker  * @readFunc:  the xmlInputReadCallback
2881*6777b538SAndroid Build Coastguard Worker  * @closeFunc:  the xmlInputCloseCallback
2882*6777b538SAndroid Build Coastguard Worker  *
2883*6777b538SAndroid Build Coastguard Worker  * Register a new set of I/O callback for handling parser input.
2884*6777b538SAndroid Build Coastguard Worker  *
2885*6777b538SAndroid Build Coastguard Worker  * Returns the registered handler number or -1 in case of error
2886*6777b538SAndroid Build Coastguard Worker  */
2887*6777b538SAndroid Build Coastguard Worker int
xmlRegisterInputCallbacks(xmlInputMatchCallback matchFunc,xmlInputOpenCallback openFunc,xmlInputReadCallback readFunc,xmlInputCloseCallback closeFunc)2888*6777b538SAndroid Build Coastguard Worker xmlRegisterInputCallbacks(xmlInputMatchCallback matchFunc,
2889*6777b538SAndroid Build Coastguard Worker 	xmlInputOpenCallback openFunc, xmlInputReadCallback readFunc,
2890*6777b538SAndroid Build Coastguard Worker 	xmlInputCloseCallback closeFunc) {
2891*6777b538SAndroid Build Coastguard Worker     if (xmlInputCallbackNr >= MAX_INPUT_CALLBACK) {
2892*6777b538SAndroid Build Coastguard Worker 	return(-1);
2893*6777b538SAndroid Build Coastguard Worker     }
2894*6777b538SAndroid Build Coastguard Worker     xmlInputCallbackTable[xmlInputCallbackNr].matchcallback = matchFunc;
2895*6777b538SAndroid Build Coastguard Worker     xmlInputCallbackTable[xmlInputCallbackNr].opencallback = openFunc;
2896*6777b538SAndroid Build Coastguard Worker     xmlInputCallbackTable[xmlInputCallbackNr].readcallback = readFunc;
2897*6777b538SAndroid Build Coastguard Worker     xmlInputCallbackTable[xmlInputCallbackNr].closecallback = closeFunc;
2898*6777b538SAndroid Build Coastguard Worker     return(xmlInputCallbackNr++);
2899*6777b538SAndroid Build Coastguard Worker }
2900*6777b538SAndroid Build Coastguard Worker 
2901*6777b538SAndroid Build Coastguard Worker /**
2902*6777b538SAndroid Build Coastguard Worker  * xmlRegisterDefaultInputCallbacks:
2903*6777b538SAndroid Build Coastguard Worker  *
2904*6777b538SAndroid Build Coastguard Worker  * Registers the default compiled-in I/O handlers.
2905*6777b538SAndroid Build Coastguard Worker  */
2906*6777b538SAndroid Build Coastguard Worker void
xmlRegisterDefaultInputCallbacks(void)2907*6777b538SAndroid Build Coastguard Worker xmlRegisterDefaultInputCallbacks(void) {
2908*6777b538SAndroid Build Coastguard Worker     xmlRegisterInputCallbacks(xmlIODefaultMatch, NULL, NULL, NULL);
2909*6777b538SAndroid Build Coastguard Worker }
2910*6777b538SAndroid Build Coastguard Worker 
2911*6777b538SAndroid Build Coastguard Worker /**
2912*6777b538SAndroid Build Coastguard Worker  * xmlPopInputCallbacks:
2913*6777b538SAndroid Build Coastguard Worker  *
2914*6777b538SAndroid Build Coastguard Worker  * Clear the top input callback from the input stack. this includes the
2915*6777b538SAndroid Build Coastguard Worker  * compiled-in I/O.
2916*6777b538SAndroid Build Coastguard Worker  *
2917*6777b538SAndroid Build Coastguard Worker  * Returns the number of input callback registered or -1 in case of error.
2918*6777b538SAndroid Build Coastguard Worker  */
2919*6777b538SAndroid Build Coastguard Worker int
xmlPopInputCallbacks(void)2920*6777b538SAndroid Build Coastguard Worker xmlPopInputCallbacks(void)
2921*6777b538SAndroid Build Coastguard Worker {
2922*6777b538SAndroid Build Coastguard Worker     if (xmlInputCallbackNr <= 0)
2923*6777b538SAndroid Build Coastguard Worker         return(-1);
2924*6777b538SAndroid Build Coastguard Worker 
2925*6777b538SAndroid Build Coastguard Worker     xmlInputCallbackNr--;
2926*6777b538SAndroid Build Coastguard Worker 
2927*6777b538SAndroid Build Coastguard Worker     return(xmlInputCallbackNr);
2928*6777b538SAndroid Build Coastguard Worker }
2929*6777b538SAndroid Build Coastguard Worker 
2930*6777b538SAndroid Build Coastguard Worker /**
2931*6777b538SAndroid Build Coastguard Worker  * xmlCleanupInputCallbacks:
2932*6777b538SAndroid Build Coastguard Worker  *
2933*6777b538SAndroid Build Coastguard Worker  * clears the entire input callback table. this includes the
2934*6777b538SAndroid Build Coastguard Worker  * compiled-in I/O.
2935*6777b538SAndroid Build Coastguard Worker  */
2936*6777b538SAndroid Build Coastguard Worker void
xmlCleanupInputCallbacks(void)2937*6777b538SAndroid Build Coastguard Worker xmlCleanupInputCallbacks(void)
2938*6777b538SAndroid Build Coastguard Worker {
2939*6777b538SAndroid Build Coastguard Worker     xmlInputCallbackNr = 0;
2940*6777b538SAndroid Build Coastguard Worker }
2941*6777b538SAndroid Build Coastguard Worker 
2942*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
2943*6777b538SAndroid Build Coastguard Worker /**
2944*6777b538SAndroid Build Coastguard Worker  * xmlRegisterOutputCallbacks:
2945*6777b538SAndroid Build Coastguard Worker  * @matchFunc:  the xmlOutputMatchCallback
2946*6777b538SAndroid Build Coastguard Worker  * @openFunc:  the xmlOutputOpenCallback
2947*6777b538SAndroid Build Coastguard Worker  * @writeFunc:  the xmlOutputWriteCallback
2948*6777b538SAndroid Build Coastguard Worker  * @closeFunc:  the xmlOutputCloseCallback
2949*6777b538SAndroid Build Coastguard Worker  *
2950*6777b538SAndroid Build Coastguard Worker  * Register a new set of I/O callback for handling output.
2951*6777b538SAndroid Build Coastguard Worker  *
2952*6777b538SAndroid Build Coastguard Worker  * Returns the registered handler number or -1 in case of error
2953*6777b538SAndroid Build Coastguard Worker  */
2954*6777b538SAndroid Build Coastguard Worker int
xmlRegisterOutputCallbacks(xmlOutputMatchCallback matchFunc,xmlOutputOpenCallback openFunc,xmlOutputWriteCallback writeFunc,xmlOutputCloseCallback closeFunc)2955*6777b538SAndroid Build Coastguard Worker xmlRegisterOutputCallbacks(xmlOutputMatchCallback matchFunc,
2956*6777b538SAndroid Build Coastguard Worker 	xmlOutputOpenCallback openFunc, xmlOutputWriteCallback writeFunc,
2957*6777b538SAndroid Build Coastguard Worker 	xmlOutputCloseCallback closeFunc) {
2958*6777b538SAndroid Build Coastguard Worker     if (xmlOutputCallbackNr >= MAX_OUTPUT_CALLBACK) {
2959*6777b538SAndroid Build Coastguard Worker 	return(-1);
2960*6777b538SAndroid Build Coastguard Worker     }
2961*6777b538SAndroid Build Coastguard Worker     xmlOutputCallbackTable[xmlOutputCallbackNr].matchcallback = matchFunc;
2962*6777b538SAndroid Build Coastguard Worker     xmlOutputCallbackTable[xmlOutputCallbackNr].opencallback = openFunc;
2963*6777b538SAndroid Build Coastguard Worker     xmlOutputCallbackTable[xmlOutputCallbackNr].writecallback = writeFunc;
2964*6777b538SAndroid Build Coastguard Worker     xmlOutputCallbackTable[xmlOutputCallbackNr].closecallback = closeFunc;
2965*6777b538SAndroid Build Coastguard Worker     return(xmlOutputCallbackNr++);
2966*6777b538SAndroid Build Coastguard Worker }
2967*6777b538SAndroid Build Coastguard Worker 
2968*6777b538SAndroid Build Coastguard Worker /**
2969*6777b538SAndroid Build Coastguard Worker  * xmlRegisterDefaultOutputCallbacks:
2970*6777b538SAndroid Build Coastguard Worker  *
2971*6777b538SAndroid Build Coastguard Worker  * Registers the default compiled-in I/O handlers.
2972*6777b538SAndroid Build Coastguard Worker  */
2973*6777b538SAndroid Build Coastguard Worker void
xmlRegisterDefaultOutputCallbacks(void)2974*6777b538SAndroid Build Coastguard Worker xmlRegisterDefaultOutputCallbacks (void) {
2975*6777b538SAndroid Build Coastguard Worker     xmlRegisterOutputCallbacks(xmlIODefaultMatch, NULL, NULL, NULL);
2976*6777b538SAndroid Build Coastguard Worker }
2977*6777b538SAndroid Build Coastguard Worker 
2978*6777b538SAndroid Build Coastguard Worker /**
2979*6777b538SAndroid Build Coastguard Worker  * xmlPopOutputCallbacks:
2980*6777b538SAndroid Build Coastguard Worker  *
2981*6777b538SAndroid Build Coastguard Worker  * Remove the top output callbacks from the output stack. This includes the
2982*6777b538SAndroid Build Coastguard Worker  * compiled-in I/O.
2983*6777b538SAndroid Build Coastguard Worker  *
2984*6777b538SAndroid Build Coastguard Worker  * Returns the number of output callback registered or -1 in case of error.
2985*6777b538SAndroid Build Coastguard Worker  */
2986*6777b538SAndroid Build Coastguard Worker int
xmlPopOutputCallbacks(void)2987*6777b538SAndroid Build Coastguard Worker xmlPopOutputCallbacks(void)
2988*6777b538SAndroid Build Coastguard Worker {
2989*6777b538SAndroid Build Coastguard Worker     if (xmlOutputCallbackNr <= 0)
2990*6777b538SAndroid Build Coastguard Worker         return(-1);
2991*6777b538SAndroid Build Coastguard Worker 
2992*6777b538SAndroid Build Coastguard Worker     xmlOutputCallbackNr--;
2993*6777b538SAndroid Build Coastguard Worker 
2994*6777b538SAndroid Build Coastguard Worker     return(xmlOutputCallbackNr);
2995*6777b538SAndroid Build Coastguard Worker }
2996*6777b538SAndroid Build Coastguard Worker 
2997*6777b538SAndroid Build Coastguard Worker /**
2998*6777b538SAndroid Build Coastguard Worker  * xmlCleanupOutputCallbacks:
2999*6777b538SAndroid Build Coastguard Worker  *
3000*6777b538SAndroid Build Coastguard Worker  * clears the entire output callback table. this includes the
3001*6777b538SAndroid Build Coastguard Worker  * compiled-in I/O callbacks.
3002*6777b538SAndroid Build Coastguard Worker  */
3003*6777b538SAndroid Build Coastguard Worker void
xmlCleanupOutputCallbacks(void)3004*6777b538SAndroid Build Coastguard Worker xmlCleanupOutputCallbacks(void)
3005*6777b538SAndroid Build Coastguard Worker {
3006*6777b538SAndroid Build Coastguard Worker     xmlOutputCallbackNr = 0;
3007*6777b538SAndroid Build Coastguard Worker }
3008*6777b538SAndroid Build Coastguard Worker 
3009*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_HTTP_ENABLED
3010*6777b538SAndroid Build Coastguard Worker /**
3011*6777b538SAndroid Build Coastguard Worker  * xmlRegisterHTTPPostCallbacks:
3012*6777b538SAndroid Build Coastguard Worker  *
3013*6777b538SAndroid Build Coastguard Worker  * DEPRECATED: Support for HTTP POST has been removed.
3014*6777b538SAndroid Build Coastguard Worker  */
3015*6777b538SAndroid Build Coastguard Worker void
xmlRegisterHTTPPostCallbacks(void)3016*6777b538SAndroid Build Coastguard Worker xmlRegisterHTTPPostCallbacks(void) {
3017*6777b538SAndroid Build Coastguard Worker     xmlRegisterDefaultOutputCallbacks();
3018*6777b538SAndroid Build Coastguard Worker }
3019*6777b538SAndroid Build Coastguard Worker #endif
3020*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_OUTPUT_ENABLED */
3021*6777b538SAndroid Build Coastguard Worker 
3022