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