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, """);
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