15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlIO.c : implementation of the I/O interfaces used by the parser
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See Copyright for the status of this software.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * daniel@veillard.com
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 14 Nov 2000 ht - for VMS, truncated name of long functions to under 32 char
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IN_LIBXML
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ERRNO_H
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <errno.h>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_TYPES_H
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/types.h>
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_STAT_H
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/stat.h>
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_FCNTL_H
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <fcntl.h>
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_UNISTD_H
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <unistd.h>
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STDLIB_H
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h>
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ZLIB_H
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <zlib.h>
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(WIN32) || defined(_WIN32)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h>
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_WIN32_WCE)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <winnls.h> /* for CP_UTF8 */
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Figure a portable way to know if a file is a directory. */
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef HAVE_STAT
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  ifdef HAVE__STAT
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     /* MS C library seems to define stat and _stat. The definition
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        is identical. Still, mapping them to each other causes a warning. */
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    ifndef _MSC_VER
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#      define stat(x,y) _stat(x,y)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    endif
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    define HAVE_STAT
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  endif
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  ifdef HAVE__STAT
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#      define stat _stat
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    endif
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  endif
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STAT
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  ifndef S_ISDIR
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    ifdef _S_ISDIR
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#      define S_ISDIR(x) _S_ISDIR(x)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    else
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#      ifdef S_IFDIR
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#        ifndef S_IFMT
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#          ifdef _S_IFMT
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#            define S_IFMT _S_IFMT
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#          endif
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#        endif
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#        ifdef S_IFMT
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#          define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#        endif
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#      endif
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    endif
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  endif
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlmemory.h>
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/parser.h>
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/parserInternals.h>
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlIO.h>
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/uri.h>
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/nanohttp.h>
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/nanoftp.h>
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlerror.h>
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_CATALOG_ENABLED
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/catalog.h>
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/globals.h>
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #define VERBOSE_FAILURE */
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #define DEBUG_EXTERNAL_ENTITIES */
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #define DEBUG_INPUT */
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_INPUT
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MINLEN 40
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MINLEN 4000
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Input I/O callback sets
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlInputCallback {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlInputMatchCallback matchcallback;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlInputOpenCallback opencallback;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlInputReadCallback readcallback;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlInputCloseCallback closecallback;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} xmlInputCallback;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAX_INPUT_CALLBACK 15
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlInputCallback xmlInputCallbackTable[MAX_INPUT_CALLBACK];
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlInputCallbackNr = 0;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlInputCallbackInitialized = 0;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Output I/O callback sets
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlOutputCallback {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlOutputMatchCallback matchcallback;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlOutputOpenCallback opencallback;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlOutputWriteCallback writecallback;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlOutputCloseCallback closecallback;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} xmlOutputCallback;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAX_OUTPUT_CALLBACK 15
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlOutputCallback xmlOutputCallbackTable[MAX_OUTPUT_CALLBACK];
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlOutputCallbackNr = 0;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlOutputCallbackInitialized = 0;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlOutputBufferPtr
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAllocOutputBufferInternal(xmlCharEncodingHandlerPtr encoder);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		Tree memory error handler				*
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char *IOerr[] = {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Unknown IO error",         /* UNKNOWN */
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Permission denied",	/* EACCES */
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Resource temporarily unavailable",/* EAGAIN */
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Bad file descriptor",	/* EBADF */
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Bad message",		/* EBADMSG */
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Resource busy",		/* EBUSY */
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Operation canceled",	/* ECANCELED */
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "No child processes",	/* ECHILD */
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Resource deadlock avoided",/* EDEADLK */
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Domain error",		/* EDOM */
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "File exists",		/* EEXIST */
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Bad address",		/* EFAULT */
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "File too large",		/* EFBIG */
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Operation in progress",	/* EINPROGRESS */
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Interrupted function call",/* EINTR */
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Invalid argument",		/* EINVAL */
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Input/output error",	/* EIO */
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Is a directory",		/* EISDIR */
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Too many open files",	/* EMFILE */
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Too many links",		/* EMLINK */
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Inappropriate message buffer length",/* EMSGSIZE */
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Filename too long",	/* ENAMETOOLONG */
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Too many open files in system",/* ENFILE */
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "No such device",		/* ENODEV */
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "No such file or directory",/* ENOENT */
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Exec format error",	/* ENOEXEC */
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "No locks available",	/* ENOLCK */
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Not enough space",		/* ENOMEM */
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "No space left on device",	/* ENOSPC */
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Function not implemented",	/* ENOSYS */
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Not a directory",		/* ENOTDIR */
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Directory not empty",	/* ENOTEMPTY */
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Not supported",		/* ENOTSUP */
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Inappropriate I/O control operation",/* ENOTTY */
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "No such device or address",/* ENXIO */
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Operation not permitted",	/* EPERM */
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Broken pipe",		/* EPIPE */
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Result too large",		/* ERANGE */
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Read-only file system",	/* EROFS */
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Invalid seek",		/* ESPIPE */
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "No such process",		/* ESRCH */
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Operation timed out",	/* ETIMEDOUT */
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Improper link",		/* EXDEV */
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Attempt to load network entity %s", /* XML_IO_NETWORK_ATTEMPT */
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "encoder error",		/* XML_IO_ENCODER */
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "flush error",
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "write error",
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "no input",
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "buffer full",
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "loading error",
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "not a socket",		/* ENOTSOCK */
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "already connected",	/* EISCONN */
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "connection refused",	/* ECONNREFUSED */
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "unreachable network",	/* ENETUNREACH */
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "adddress in use",		/* EADDRINUSE */
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "already in use",		/* EALREADY */
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "unknown address familly",	/* EAFNOSUPPORT */
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * __xmlIOWin32UTF8ToWChar:
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @u8String:  uft-8 string
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Convert a string from utf-8 to wchar (WINDOWS ONLY!)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static wchar_t *
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__xmlIOWin32UTF8ToWChar(const char *u8String)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wchar_t *wString = NULL;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (u8String) {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int wLen =
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, u8String,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                -1, NULL, 0);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (wLen) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            wString = xmlMalloc(wLen * sizeof(wchar_t));
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (wString) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (MultiByteToWideChar
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    (CP_UTF8, 0, u8String, -1, wString, wLen) == 0) {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlFree(wString);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    wString = NULL;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return wString;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlIOErrMemory:
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @extra:  extra informations
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle an out of memory condition
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlIOErrMemory(const char *extra)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __xmlSimpleError(XML_FROM_IO, XML_ERR_NO_MEMORY, NULL, NULL, extra);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * __xmlIOErr:
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @code:  the error number
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @extra:  extra informations
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle an I/O error
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__xmlIOErr(int domain, int code, const char *extra)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int idx;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (code == 0) {
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ERRNO_H
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (errno == 0) code = 0;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EACCES
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EACCES) code = XML_IO_EACCES;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EAGAIN
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EAGAIN) code = XML_IO_EAGAIN;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EBADF
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EBADF) code = XML_IO_EBADF;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EBADMSG
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EBADMSG) code = XML_IO_EBADMSG;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EBUSY
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EBUSY) code = XML_IO_EBUSY;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ECANCELED
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == ECANCELED) code = XML_IO_ECANCELED;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ECHILD
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == ECHILD) code = XML_IO_ECHILD;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EDEADLK
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EDEADLK) code = XML_IO_EDEADLK;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EDOM
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EDOM) code = XML_IO_EDOM;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EEXIST
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EEXIST) code = XML_IO_EEXIST;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EFAULT
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EFAULT) code = XML_IO_EFAULT;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EFBIG
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EFBIG) code = XML_IO_EFBIG;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EINPROGRESS
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EINPROGRESS) code = XML_IO_EINPROGRESS;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EINTR
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EINTR) code = XML_IO_EINTR;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EINVAL
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EINVAL) code = XML_IO_EINVAL;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EIO
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EIO) code = XML_IO_EIO;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EISDIR
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EISDIR) code = XML_IO_EISDIR;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EMFILE
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EMFILE) code = XML_IO_EMFILE;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EMLINK
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EMLINK) code = XML_IO_EMLINK;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EMSGSIZE
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EMSGSIZE) code = XML_IO_EMSGSIZE;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ENAMETOOLONG
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == ENAMETOOLONG) code = XML_IO_ENAMETOOLONG;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ENFILE
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == ENFILE) code = XML_IO_ENFILE;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ENODEV
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == ENODEV) code = XML_IO_ENODEV;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ENOENT
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == ENOENT) code = XML_IO_ENOENT;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ENOEXEC
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == ENOEXEC) code = XML_IO_ENOEXEC;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ENOLCK
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == ENOLCK) code = XML_IO_ENOLCK;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ENOMEM
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == ENOMEM) code = XML_IO_ENOMEM;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ENOSPC
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == ENOSPC) code = XML_IO_ENOSPC;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ENOSYS
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == ENOSYS) code = XML_IO_ENOSYS;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ENOTDIR
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == ENOTDIR) code = XML_IO_ENOTDIR;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ENOTEMPTY
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == ENOTEMPTY) code = XML_IO_ENOTEMPTY;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ENOTSUP
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == ENOTSUP) code = XML_IO_ENOTSUP;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ENOTTY
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == ENOTTY) code = XML_IO_ENOTTY;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ENXIO
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == ENXIO) code = XML_IO_ENXIO;
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EPERM
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EPERM) code = XML_IO_EPERM;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EPIPE
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EPIPE) code = XML_IO_EPIPE;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ERANGE
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == ERANGE) code = XML_IO_ERANGE;
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EROFS
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EROFS) code = XML_IO_EROFS;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ESPIPE
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == ESPIPE) code = XML_IO_ESPIPE;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ESRCH
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == ESRCH) code = XML_IO_ESRCH;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ETIMEDOUT
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == ETIMEDOUT) code = XML_IO_ETIMEDOUT;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EXDEV
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EXDEV) code = XML_IO_EXDEV;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ENOTSOCK
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == ENOTSOCK) code = XML_IO_ENOTSOCK;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EISCONN
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EISCONN) code = XML_IO_EISCONN;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ECONNREFUSED
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == ECONNREFUSED) code = XML_IO_ECONNREFUSED;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ETIMEDOUT
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == ETIMEDOUT) code = XML_IO_ETIMEDOUT;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ENETUNREACH
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == ENETUNREACH) code = XML_IO_ENETUNREACH;
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EADDRINUSE
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EADDRINUSE) code = XML_IO_EADDRINUSE;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EINPROGRESS
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EINPROGRESS) code = XML_IO_EINPROGRESS;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EALREADY
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EALREADY) code = XML_IO_EALREADY;
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef EAFNOSUPPORT
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (errno == EAFNOSUPPORT) code = XML_IO_EAFNOSUPPORT;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else code = XML_IO_UNKNOWN;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* HAVE_ERRNO_H */
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    idx = 0;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (code >= XML_IO_UNKNOWN) idx = code - XML_IO_UNKNOWN;
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (idx >= (sizeof(IOerr) / sizeof(IOerr[0]))) idx = 0;
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __xmlSimpleError(domain, code, NULL, IOerr[idx], extra);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlIOErr:
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @code:  the error number
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @extra:  extra informations
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle an I/O error
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlIOErr(int code, const char *extra)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __xmlIOErr(XML_FROM_IO, code, extra);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * __xmlLoaderErr:
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx: the parser context
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @extra:  extra informations
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle a resource access error
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__xmlLoaderErr(void *ctx, const char *msg, const char *filename)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlStructuredErrorFunc schannel = NULL;
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericErrorFunc channel = NULL;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void *data = NULL;
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlErrorLevel level = XML_ERR_ERROR;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->disableSAX != 0) &&
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ctxt->instate == XML_PARSER_EOF))
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->sax != NULL)) {
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ctxt->validate) {
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    channel = ctxt->sax->error;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    level = XML_ERR_ERROR;
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    channel = ctxt->sax->warning;
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    level = XML_ERR_WARNING;
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ctxt->sax->initialized == XML_SAX2_MAGIC)
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    schannel = ctxt->sax->serror;
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	data = ctxt->userData;
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __xmlRaiseError(schannel, channel, data, ctxt, NULL, XML_FROM_IO,
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    XML_IO_LOAD_ERROR, level, NULL, 0,
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    filename, NULL, NULL, 0, 0,
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    msg, filename);
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		Tree memory error handler				*
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNormalizeWindowsPath:
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @path: the input file path
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This function is obsolete. Please see xmlURIFromPath in uri.c for
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a better solution.
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a canonicalized version of the path
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar *
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNormalizeWindowsPath(const xmlChar *path)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return xmlCanonicPath(path);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCleanupInputCallbacks:
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * clears the entire input callback table. this includes the
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * compiled-in I/O.
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCleanupInputCallbacks(void)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlInputCallbackInitialized)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = xmlInputCallbackNr - 1; i >= 0; i--) {
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlInputCallbackTable[i].matchcallback = NULL;
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlInputCallbackTable[i].opencallback = NULL;
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlInputCallbackTable[i].readcallback = NULL;
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlInputCallbackTable[i].closecallback = NULL;
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlInputCallbackNr = 0;
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlInputCallbackInitialized = 0;
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlPopInputCallbacks:
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Clear the top input callback from the input stack. this includes the
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * compiled-in I/O.
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of input callback registered or -1 in case of error.
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlPopInputCallbacks(void)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlInputCallbackInitialized)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlInputCallbackNr <= 0)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlInputCallbackNr--;
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlInputCallbackTable[xmlInputCallbackNr].matchcallback = NULL;
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlInputCallbackTable[xmlInputCallbackNr].opencallback = NULL;
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlInputCallbackTable[xmlInputCallbackNr].readcallback = NULL;
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlInputCallbackTable[xmlInputCallbackNr].closecallback = NULL;
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlInputCallbackNr);
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCleanupOutputCallbacks:
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * clears the entire output callback table. this includes the
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * compiled-in I/O callbacks.
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCleanupOutputCallbacks(void)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlOutputCallbackInitialized)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = xmlOutputCallbackNr - 1; i >= 0; i--) {
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlOutputCallbackTable[i].matchcallback = NULL;
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlOutputCallbackTable[i].opencallback = NULL;
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlOutputCallbackTable[i].writecallback = NULL;
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlOutputCallbackTable[i].closecallback = NULL;
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlOutputCallbackNr = 0;
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlOutputCallbackInitialized = 0;
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		Standard I/O for file accesses				*
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  xmlWrapOpenUtf8:
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @path:  the path in utf-8 encoding
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @mode:  type of access (0 - read, 1 - write)
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * function opens the file specified by @path
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static FILE*
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlWrapOpenUtf8(const char *path,int mode)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FILE *fd = NULL;
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wchar_t *wPath;
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wPath = __xmlIOWin32UTF8ToWChar(path);
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if(wPath)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       fd = _wfopen(wPath, mode ? L"wb" : L"rb");
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       xmlFree(wPath);
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* maybe path in native encoding */
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if(fd == NULL)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       fd = fopen(path, mode ? "wb" : "rb");
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return fd;
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ZLIB_H
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static gzFile
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlWrapGzOpenUtf8(const char *path, const char *mode)
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gzFile fd;
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wchar_t *wPath;
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fd = gzopen (path, mode);
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (fd)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return fd;
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wPath = __xmlIOWin32UTF8ToWChar(path);
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if(wPath)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int d, m = (strstr(mode, "r") ? O_RDONLY : O_RDWR);
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef _O_BINARY
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        m |= (strstr(mode, "b") ? _O_BINARY : 0);
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	d = _wopen(wPath, m);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (d >= 0)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fd = gzdopen(d, mode);
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(wPath);
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return fd;
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  xmlWrapStatUtf8:
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @path:  the path in utf-8 encoding
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @info:  structure that stores results
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * function obtains information about the file or directory
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlWrapStatUtf8(const char *path,struct stat *info)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STAT
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int retval = -1;
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wchar_t *wPath;
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wPath = __xmlIOWin32UTF8ToWChar(path);
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (wPath)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       retval = _wstat(wPath,info);
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       xmlFree(wPath);
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* maybe path in native encoding */
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if(retval < 0)
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       retval = stat(path,info);
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return retval;
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return -1;
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  xmlWrapOpenNative:
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @path:  the path
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @mode:  type of access (0 - read, 1 - write)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * function opens the file specified by @path
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static FILE*
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlWrapOpenNative(const char *path,int mode)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return fopen(path,mode ? "wb" : "rb");
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  xmlWrapStatNative:
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @path:  the path
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @info:  structure that stores results
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * function obtains information about the file or directory
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlWrapStatNative(const char *path,struct stat *info)
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STAT
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return stat(path,info);
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return -1;
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int (* xmlWrapStatFunc) (const char *f, struct stat *s);
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlWrapStatFunc xmlWrapStat = xmlWrapStatNative;
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef FILE* (* xmlWrapOpenFunc)(const char *f,int mode);
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlWrapOpenFunc xmlWrapOpen = xmlWrapOpenNative;
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ZLIB_H
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef gzFile (* xmlWrapGzOpenFunc) (const char *f, const char *mode);
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlWrapGzOpenFunc xmlWrapGzOpen = gzopen;
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlInitPlatformSpecificIo:
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Initialize platform specific features.
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlInitPlatformSpecificIo(void)
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static int xmlPlatformIoInitialized = 0;
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OSVERSIONINFO osvi;
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if(xmlPlatformIoInitialized)
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    osvi.dwOSVersionInfoSize = sizeof(osvi);
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if(GetVersionEx(&osvi) && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)) {
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      xmlWrapStat = xmlWrapStatUtf8;
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      xmlWrapOpen = xmlWrapOpenUtf8;
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ZLIB_H
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      xmlWrapGzOpen = xmlWrapGzOpenUtf8;
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      xmlWrapStat = xmlWrapStatNative;
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      xmlWrapOpen = xmlWrapOpenNative;
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ZLIB_H
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      xmlWrapGzOpen = gzopen;
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlPlatformIoInitialized = 1;
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCheckFilename:
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @path:  the path to check
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * function checks to see if @path is a valid source
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (file, socket...) for XML.
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if stat is not available on the target machine,
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * returns 1.  if stat fails, returns 0 (if calling
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * stat on the filename fails, it can't be right).
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if stat succeeds and the file is a directory,
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * returns 2.  otherwise returns 1.
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCheckFilename (const char *path)
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STAT
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct stat stat_buffer;
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (path == NULL)
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(0);
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STAT
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlWrapStat(path, &stat_buffer) == -1)
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (stat(path, &stat_buffer) == -1)
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef S_ISDIR
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (S_ISDIR(stat_buffer.st_mode))
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 2;
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* HAVE_STAT */
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1;
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNop(void) {
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFdRead:
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @context:  the I/O context
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buffer:  where to drop data
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  number of bytes to read
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Read @len bytes to @buffer from the I/O channel.
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of bytes written
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFdRead (void * context, char * buffer, int len) {
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = read((int) (long) context, &buffer[0], len);
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret < 0) xmlIOErr(0, "read()");
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFdWrite:
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @context:  the I/O context
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buffer:  where to get data
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  number of bytes to write
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Write @len bytes from @buffer to the I/O channel.
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of bytes written
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFdWrite (void * context, const char * buffer, int len) {
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len > 0) {
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = write((int) (long) context, &buffer[0], len);
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret < 0) xmlIOErr(0, "write()");
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFdClose:
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @context:  the I/O context
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Close an I/O channel
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success and error code otherwise
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFdClose (void * context) {
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = close((int) (long) context);
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret < 0) xmlIOErr(0, "close()");
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFileMatch:
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename:  the URI for matching
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * input from FILE *
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if matches, 0 otherwise
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFileMatch (const char *filename ATTRIBUTE_UNUSED) {
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(1);
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFileOpen_real:
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename:  the URI for matching
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * input from FILE *, supports compressed input
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if @filename is " " then the standard input is used
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns an I/O context or NULL in case of error
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void *
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFileOpen_real (const char *filename) {
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *path = NULL;
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FILE *fd;
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (filename == NULL)
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(filename, "-")) {
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fd = stdin;
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return((void *) fd);
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) {
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = &filename[17];
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = &filename[16];
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) {
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = &filename[8];
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = &filename[7];
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:/", 6)) {
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* lots of generators seems to lazy to read RFC 1738 */
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = &filename[6];
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = &filename[5];
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = filename;
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (path == NULL)
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlCheckFilename(path))
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fd = xmlWrapOpen(path, 0);
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fd = fopen(path, "r");
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* WIN32 */
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (fd == NULL) xmlIOErr(0, path);
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return((void *) fd);
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFileOpen:
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename:  the URI for matching
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Wrapper around xmlFileOpen_real that try it with an unescaped
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * version of @filename, if this fails fallback to @filename
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a handler or NULL in case or failure
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void *
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFileOpen (const char *filename) {
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *unescaped;
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void *retval;
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    retval = xmlFileOpen_real(filename);
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (retval == NULL) {
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	unescaped = xmlURIUnescapeString(filename, 0, NULL);
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (unescaped != NULL) {
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    retval = xmlFileOpen_real(unescaped);
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(unescaped);
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return retval;
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFileOpenW:
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename:  the URI for matching
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * output to from FILE *,
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if @filename is "-" then the standard output is used
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns an I/O context or NULL in case of error
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void *
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFileOpenW (const char *filename) {
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *path = NULL;
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FILE *fd;
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(filename, "-")) {
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fd = stdout;
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return((void *) fd);
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17))
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = &filename[17];
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = &filename[16];
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) {
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = &filename[8];
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = &filename[7];
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = filename;
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (path == NULL)
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fd = xmlWrapOpen(path, 1);
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 	   fd = fopen(path, "wb");
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* WIN32 */
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 if (fd == NULL) xmlIOErr(0, path);
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return((void *) fd);
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFileRead:
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @context:  the I/O context
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buffer:  where to drop data
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  number of bytes to write
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Read @len bytes to @buffer from the I/O channel.
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of bytes written or < 0 in case of failure
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFileRead (void * context, char * buffer, int len) {
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((context == NULL) || (buffer == NULL))
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = fread(&buffer[0], 1,  len, (FILE *) context);
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret < 0) xmlIOErr(0, "fread()");
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFileWrite:
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @context:  the I/O context
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buffer:  where to drop data
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  number of bytes to write
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Write @len bytes from @buffer to the I/O channel.
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of bytes written
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFileWrite (void * context, const char * buffer, int len) {
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int items;
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((context == NULL) || (buffer == NULL))
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    items = fwrite(&buffer[0], len, 1, (FILE *) context);
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((items == 0) && (ferror((FILE *) context))) {
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlIOErr(0, "fwrite()");
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(items * len);
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFileClose:
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @context:  the I/O context
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Close an I/O channel
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 or -1 in case of error
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFileClose (void * context) {
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FILE *fil;
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (context == NULL)
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fil = (FILE *) context;
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((fil == stdout) || (fil == stderr)) {
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = fflush(fil);
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret < 0)
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlIOErr(0, "fflush()");
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (fil == stdin)
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = ( fclose((FILE *) context) == EOF ) ? -1 : 0;
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret < 0)
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlIOErr(0, "fclose()");
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFileFlush:
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @context:  the I/O context
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Flush an I/O channel
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFileFlush (void * context) {
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (context == NULL)
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = ( fflush((FILE *) context) == EOF ) ? -1 : 0;
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret < 0)
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlIOErr(0, "fflush()");
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlBufferWrite:
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @context:  the xmlBuffer
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buffer:  the data to write
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  number of bytes to write
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Write @len bytes from @buffer to the xml buffer
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of bytes written
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBufferWrite (void * context, const char * buffer, int len) {
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlBufferAdd((xmlBufferPtr) context, (const xmlChar *) buffer, len);
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != 0)
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(len);
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ZLIB_H
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		I/O for compressed file accesses			*
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGzfileMatch:
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename:  the URI for matching
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * input from compressed file test
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if matches, 0 otherwise
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGzfileMatch (const char *filename ATTRIBUTE_UNUSED) {
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(1);
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGzfileOpen_real:
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename:  the URI for matching
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * input from compressed file open
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if @filename is " " then the standard input is used
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns an I/O context or NULL in case of error
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void *
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGzfileOpen_real (const char *filename) {
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *path = NULL;
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gzFile fd;
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(filename, "-")) {
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fd = gzdopen(dup(0), "rb");
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return((void *) fd);
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17))
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = &filename[17];
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = &filename[16];
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) {
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = &filename[8];
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = &filename[7];
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = filename;
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (path == NULL)
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlCheckFilename(path))
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fd = xmlWrapGzOpen(path, "rb");
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fd = gzopen(path, "rb");
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return((void *) fd);
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGzfileOpen:
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename:  the URI for matching
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Wrapper around xmlGzfileOpen if the open fais, it will
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * try to unescape @filename
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void *
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGzfileOpen (const char *filename) {
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *unescaped;
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void *retval;
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    retval = xmlGzfileOpen_real(filename);
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (retval == NULL) {
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	unescaped = xmlURIUnescapeString(filename, 0, NULL);
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (unescaped != NULL) {
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    retval = xmlGzfileOpen_real(unescaped);
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(unescaped);
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return retval;
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGzfileOpenW:
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename:  the URI for matching
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @compression:  the compression factor (0 - 9 included)
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * input from compressed file open
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if @filename is " " then the standard input is used
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns an I/O context or NULL in case of error
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void *
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGzfileOpenW (const char *filename, int compression) {
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *path = NULL;
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char mode[15];
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gzFile fd;
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    snprintf(mode, sizeof(mode), "wb%d", compression);
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!strcmp(filename, "-")) {
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fd = gzdopen(dup(1), mode);
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return((void *) fd);
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17))
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = &filename[17];
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = &filename[16];
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) {
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = &filename[8];
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = &filename[7];
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = filename;
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (path == NULL)
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fd = xmlWrapGzOpen(path, mode);
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fd = gzopen(path, mode);
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return((void *) fd);
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGzfileRead:
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @context:  the I/O context
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buffer:  where to drop data
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  number of bytes to write
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Read @len bytes to @buffer from the compressed I/O channel.
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of bytes written
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGzfileRead (void * context, char * buffer, int len) {
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = gzread((gzFile) context, &buffer[0], len);
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret < 0) xmlIOErr(0, "gzread()");
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGzfileWrite:
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @context:  the I/O context
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buffer:  where to drop data
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  number of bytes to write
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Write @len bytes from @buffer to the compressed I/O channel.
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of bytes written
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGzfileWrite (void * context, const char * buffer, int len) {
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = gzwrite((gzFile) context, (char *) &buffer[0], len);
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret < 0) xmlIOErr(0, "gzwrite()");
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGzfileClose:
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @context:  the I/O context
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Close a compressed I/O channel
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGzfileClose (void * context) {
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret =  (gzclose((gzFile) context) == Z_OK ) ? 0 : -1;
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret < 0) xmlIOErr(0, "gzclose()");
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* HAVE_ZLIB_H */
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_HTTP_ENABLED
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			I/O for HTTP file accesses			*
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct xmlIOHTTPWriteCtxt_
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int			compression;
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *		uri;
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void *		doc_buff;
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} xmlIOHTTPWriteCtxt, *xmlIOHTTPWriteCtxtPtr;
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ZLIB_H
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DFLT_WBITS		( -15 )
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DFLT_MEM_LVL		( 8 )
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GZ_MAGIC1		( 0x1f )
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GZ_MAGIC2		( 0x8b )
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LXML_ZLIB_OS_CODE	( 0x03 )
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define INIT_HTTP_BUFF_SIZE	( 32768 )
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DFLT_ZLIB_RATIO		( 5 )
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**  Data structure and functions to work with sending compressed data
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**  via HTTP.
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct xmlZMemBuff_
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   unsigned long	size;
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   unsigned long	crc;
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   unsigned char *	zbuff;
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   z_stream		zctrl;
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} xmlZMemBuff, *xmlZMemBuffPtr;
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * append_reverse_ulong
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buff:  Compressed memory buffer
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @data:  Unsigned long to append
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Append a unsigned long in reverse byte order to the end of the
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * memory buffer.
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)append_reverse_ulong( xmlZMemBuff * buff, unsigned long data ) {
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int		idx;
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ( buff == NULL )
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **  This is plagiarized from putLong in gzio.c (zlib source) where
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **  the number "4" is hardcoded.  If zlib is ever patched to
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **  support 64 bit file sizes, this code would need to be patched
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **  as well.
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for ( idx = 0; idx < 4; idx++ ) {
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*buff->zctrl.next_out = ( data & 0xff );
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	data >>= 8;
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	buff->zctrl.next_out++;
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFreeZMemBuff
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buff:  The memory buffer context to clear
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Release all the resources associated with the compressed memory buffer.
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFreeZMemBuff( xmlZMemBuffPtr buff ) {
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_HTTP
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int z_err;
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ( buff == NULL )
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree( buff->zbuff );
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_HTTP
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    z_err = deflateEnd( &buff->zctrl );
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ( z_err != Z_OK )
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError( xmlGenericErrorContext,
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"xmlFreeZMemBuff:  Error releasing zlib context:  %d\n",
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			z_err );
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    deflateEnd( &buff->zctrl );
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree( buff );
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCreateZMemBuff
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *@compression:	Compression value to use
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a memory buffer to hold the compressed XML document.  The
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * compressed document in memory will end up being identical to what
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * would be created if gzopen/gzwrite/gzclose were being used to
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * write the document to disk.  The code for the header/trailer data to
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the compression is plagiarized from the zlib source files.
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void *
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCreateZMemBuff( int compression ) {
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int			z_err;
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int			hdr_lgth;
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlZMemBuffPtr	buff = NULL;
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ( ( compression < 1 ) || ( compression > 9 ) )
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return ( NULL );
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*  Create the control and data areas  */
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buff = xmlMalloc( sizeof( xmlZMemBuff ) );
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ( buff == NULL ) {
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlIOErrMemory("creating buffer context");
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return ( NULL );
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (void)memset( buff, 0, sizeof( xmlZMemBuff ) );
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buff->size = INIT_HTTP_BUFF_SIZE;
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buff->zbuff = xmlMalloc( buff->size );
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ( buff->zbuff == NULL ) {
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeZMemBuff( buff );
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlIOErrMemory("creating buffer");
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return ( NULL );
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    z_err = deflateInit2( &buff->zctrl, compression, Z_DEFLATED,
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    DFLT_WBITS, DFLT_MEM_LVL, Z_DEFAULT_STRATEGY );
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ( z_err != Z_OK ) {
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar msg[500];
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeZMemBuff( buff );
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	buff = NULL;
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlStrPrintf(msg, 500,
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (const xmlChar *) "xmlCreateZMemBuff:  %s %d\n",
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Error initializing compression context.  ZLIB error:",
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    z_err );
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlIOErr(XML_IO_WRITE, (const char *) msg);
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return ( NULL );
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*  Set the header data.  The CRC will be needed for the trailer  */
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buff->crc = crc32( 0L, NULL, 0 );
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hdr_lgth = snprintf( (char *)buff->zbuff, buff->size,
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"%c%c%c%c%c%c%c%c%c%c",
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			GZ_MAGIC1, GZ_MAGIC2, Z_DEFLATED,
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			0, 0, 0, 0, 0, 0, LXML_ZLIB_OS_CODE );
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buff->zctrl.next_out  = buff->zbuff + hdr_lgth;
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buff->zctrl.avail_out = buff->size - hdr_lgth;
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ( buff );
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlZMemBuffExtend
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buff:  Buffer used to compress and consolidate data.
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ext_amt:   Number of bytes to extend the buffer.
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Extend the internal buffer used to store the compressed data by the
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * specified amount.
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 on success or -1 on failure to extend the buffer.  On failure
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the original buffer still exists at the original size.
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlZMemBuffExtend( xmlZMemBuffPtr buff, size_t ext_amt ) {
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int			rc = -1;
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t		new_size;
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t		cur_used;
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char *	tmp_ptr = NULL;
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ( buff == NULL )
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return ( -1 );
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if ( ext_amt == 0 )
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return ( 0 );
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur_used = buff->zctrl.next_out - buff->zbuff;
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_size = buff->size + ext_amt;
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_HTTP
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ( cur_used > new_size )
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError( xmlGenericErrorContext,
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"xmlZMemBuffExtend:  %s\n%s %d bytes.\n",
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Buffer overwrite detected during compressed memory",
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"buffer extension.  Overflowed by",
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(cur_used - new_size ) );
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tmp_ptr = xmlRealloc( buff->zbuff, new_size );
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ( tmp_ptr != NULL ) {
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	rc = 0;
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	buff->size  = new_size;
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	buff->zbuff = tmp_ptr;
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	buff->zctrl.next_out  = tmp_ptr + cur_used;
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	buff->zctrl.avail_out = new_size - cur_used;
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else {
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar msg[500];
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlStrPrintf(msg, 500,
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (const xmlChar *) "xmlZMemBuffExtend:  %s %lu bytes.\n",
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Allocation failure extending output buffer to",
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    new_size );
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlIOErr(XML_IO_WRITE, (const char *) msg);
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ( rc );
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlZMemBuffAppend
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buff:  Buffer used to compress and consolidate data
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @src:   Uncompressed source content to append to buffer
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:   Length of source data to append to buffer
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Compress and append data to the internal buffer.  The data buffer
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * will be expanded if needed to store the additional data.
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of bytes appended to the buffer or -1 on error.
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlZMemBuffAppend( xmlZMemBuffPtr buff, const char * src, int len ) {
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int		z_err;
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t	min_accept;
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ( ( buff == NULL ) || ( src == NULL ) )
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return ( -1 );
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buff->zctrl.avail_in = len;
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buff->zctrl.next_in  = (unsigned char *)src;
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ( buff->zctrl.avail_in > 0 ) {
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	**  Extend the buffer prior to deflate call if a reasonable amount
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	**  of output buffer space is not available.
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	min_accept = buff->zctrl.avail_in / DFLT_ZLIB_RATIO;
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ( buff->zctrl.avail_out <= min_accept ) {
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ( xmlZMemBuffExtend( buff, buff->size ) == -1 )
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return ( -1 );
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	z_err = deflate( &buff->zctrl, Z_NO_FLUSH );
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ( z_err != Z_OK ) {
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar msg[500];
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlStrPrintf(msg, 500,
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(const xmlChar *) "xmlZMemBuffAppend:  %s %d %s - %d",
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Compression error while appending",
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			len, "bytes to buffer.  ZLIB error", z_err );
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlIOErr(XML_IO_WRITE, (const char *) msg);
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return ( -1 );
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buff->crc = crc32( buff->crc, (unsigned char *)src, len );
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ( len );
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlZMemBuffGetContent
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buff:  Compressed memory content buffer
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @data_ref:  Pointer reference to point to compressed content
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Flushes the compression buffers, appends gzip file trailers and
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * returns the compressed content and length of the compressed data.
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE:  The gzip trailer code here is plagiarized from zlib source.
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the length of the compressed data or -1 on error.
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlZMemBuffGetContent( xmlZMemBuffPtr buff, char ** data_ref ) {
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int		zlgth = -1;
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int		z_err;
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ( ( buff == NULL ) || ( data_ref == NULL ) )
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return ( -1 );
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*  Need to loop until compression output buffers are flushed  */
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	z_err = deflate( &buff->zctrl, Z_FINISH );
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ( z_err == Z_OK ) {
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*  In this case Z_OK means more buffer space needed  */
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ( xmlZMemBuffExtend( buff, buff->size ) == -1 )
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return ( -1 );
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ( z_err == Z_OK );
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*  If the compression state is not Z_STREAM_END, some error occurred  */
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ( z_err == Z_STREAM_END ) {
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*  Need to append the gzip data trailer  */
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ( buff->zctrl.avail_out < ( 2 * sizeof( unsigned long ) ) ) {
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ( xmlZMemBuffExtend(buff, (2 * sizeof(unsigned long))) == -1 )
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return ( -1 );
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	**  For whatever reason, the CRC and length data are pushed out
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	**  in reverse byte order.  So a memcpy can't be used here.
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	append_reverse_ulong( buff, buff->crc );
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	append_reverse_ulong( buff, buff->zctrl.total_in );
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	zlgth = buff->zctrl.next_out - buff->zbuff;
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*data_ref = (char *)buff->zbuff;
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else {
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar msg[500];
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlStrPrintf(msg, 500,
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (const xmlChar *) "xmlZMemBuffGetContent:  %s - %d\n",
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Error flushing zlib buffers.  Error code", z_err );
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlIOErr(XML_IO_WRITE, (const char *) msg);
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ( zlgth );
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  /*  HAVE_ZLIB_H  */
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFreeHTTPWriteCtxt
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  Context to cleanup
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free allocated memory and reclaim system resources.
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * No return value.
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFreeHTTPWriteCtxt( xmlIOHTTPWriteCtxtPtr ctxt )
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ( ctxt->uri != NULL )
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree( ctxt->uri );
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ( ctxt->doc_buff != NULL ) {
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ZLIB_H
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ( ctxt->compression > 0 ) {
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFreeZMemBuff( ctxt->doc_buff );
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlOutputBufferClose( ctxt->doc_buff );
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree( ctxt );
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlIOHTTPMatch:
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename:  the URI for matching
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * check if the URI matches an HTTP one
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if matches, 0 otherwise
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlIOHTTPMatch (const char *filename) {
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "http://", 7))
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(1);
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlIOHTTPOpen:
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename:  the URI for matching
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * open an HTTP I/O channel
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns an I/O context or NULL in case of error
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void *
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlIOHTTPOpen (const char *filename) {
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlNanoHTTPOpen(filename, NULL));
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlIOHTTPOpenW:
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @post_uri:  The destination URI for the document
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @compression:  The compression desired for the document.
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Open a temporary buffer to collect the document for a subsequent HTTP POST
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * request.  Non-static as is called from the output buffer creation routine.
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns an I/O context or NULL in case of error.
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void *
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlIOHTTPOpenW(const char *post_uri, int compression)
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlIOHTTPWriteCtxtPtr ctxt = NULL;
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (post_uri == NULL)
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt = xmlMalloc(sizeof(xmlIOHTTPWriteCtxt));
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL) {
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlIOErrMemory("creating HTTP output context");
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (void) memset(ctxt, 0, sizeof(xmlIOHTTPWriteCtxt));
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->uri = (char *) xmlStrdup((const xmlChar *)post_uri);
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->uri == NULL) {
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlIOErrMemory("copying URI");
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFreeHTTPWriteCtxt(ctxt);
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * **  Since the document length is required for an HTTP post,
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * **  need to put the document into a buffer.  A memory buffer
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * **  is being used to avoid pushing the data to disk and back.
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ZLIB_H
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((compression > 0) && (compression <= 9)) {
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt->compression = compression;
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt->doc_buff = xmlCreateZMemBuff(compression);
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*  Any character conversions should have been done before this  */
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt->doc_buff = xmlAllocOutputBufferInternal(NULL);
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->doc_buff == NULL) {
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFreeHTTPWriteCtxt(ctxt);
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt = NULL;
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ctxt);
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlIOHTTPDfltOpenW
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @post_uri:  The destination URI for this document.
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Calls xmlIOHTTPOpenW with no compression to set up for a subsequent
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * HTTP post command.  This function should generally not be used as
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the open callback is short circuited in xmlOutputBufferCreateFile.
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new IO context.
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void *
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlIOHTTPDfltOpenW( const char * post_uri ) {
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ( xmlIOHTTPOpenW( post_uri, 0 ) );
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlIOHTTPRead:
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @context:  the I/O context
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buffer:  where to drop data
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  number of bytes to write
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Read @len bytes to @buffer from the I/O channel.
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of bytes written
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlIOHTTPRead(void * context, char * buffer, int len) {
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((buffer == NULL) || (len < 0)) return(-1);
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlNanoHTTPRead(context, &buffer[0], len));
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlIOHTTPWrite
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @context:  previously opened writing context
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buffer:   data to output to temporary buffer
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:      bytes to output
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Collect data from memory buffer into a temporary file for later
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * processing.
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns number of bytes written.
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlIOHTTPWrite( void * context, const char * buffer, int len ) {
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlIOHTTPWriteCtxtPtr	ctxt = context;
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ( ( ctxt == NULL ) || ( ctxt->doc_buff == NULL ) || ( buffer == NULL ) )
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return ( -1 );
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ( len > 0 ) {
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*  Use gzwrite or fwrite as previously setup in the open call  */
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ZLIB_H
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ( ctxt->compression > 0 )
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    len = xmlZMemBuffAppend( ctxt->doc_buff, buffer, len );
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    len = xmlOutputBufferWrite( ctxt->doc_buff, len, buffer );
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ( len < 0 ) {
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar msg[500];
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlStrPrintf(msg, 500,
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(const xmlChar *) "xmlIOHTTPWrite:  %s\n%s '%s'.\n",
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Error appending to internal buffer.",
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Error sending document to URI",
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ctxt->uri );
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlIOErr(XML_IO_WRITE, (const char *) msg);
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ( len );
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlIOHTTPClose:
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @context:  the I/O context
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Close an HTTP I/O channel
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlIOHTTPClose (void * context) {
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNanoHTTPClose(context);
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlIOHTTCloseWrite
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @context:  The I/O context
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @http_mthd: The HTTP method to be used when sending the data
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Close the transmit HTTP I/O channel and actually send the data.
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlIOHTTPCloseWrite( void * context, const char * http_mthd ) {
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int				close_rc = -1;
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int				http_rtn = 0;
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int				content_lgth = 0;
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlIOHTTPWriteCtxtPtr	ctxt = context;
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *			http_content = NULL;
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *			content_encoding = NULL;
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *			content_type = (char *) "text/xml";
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void *			http_ctxt = NULL;
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ( ( ctxt == NULL ) || ( http_mthd == NULL ) )
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return ( -1 );
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*  Retrieve the content from the appropriate buffer  */
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ZLIB_H
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ( ctxt->compression > 0 ) {
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	content_lgth = xmlZMemBuffGetContent( ctxt->doc_buff, &http_content );
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	content_encoding = (char *) "Content-Encoding: gzip";
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*  Pull the data out of the memory output buffer  */
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlOutputBufferPtr	dctxt = ctxt->doc_buff;
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	http_content = (char *)dctxt->buffer->content;
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	content_lgth = dctxt->buffer->use;
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ( http_content == NULL ) {
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar msg[500];
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlStrPrintf(msg, 500,
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     (const xmlChar *) "xmlIOHTTPCloseWrite:  %s '%s' %s '%s'.\n",
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     "Error retrieving content.\nUnable to",
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     http_mthd, "data to URI", ctxt->uri );
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlIOErr(XML_IO_WRITE, (const char *) msg);
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else {
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	http_ctxt = xmlNanoHTTPMethod( ctxt->uri, http_mthd, http_content,
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					&content_type, content_encoding,
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					content_lgth );
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ( http_ctxt != NULL ) {
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_HTTP
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*  If testing/debugging - dump reply with request content  */
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FILE *	tst_file = NULL;
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    char	buffer[ 4096 ];
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    char *	dump_name = NULL;
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int		avail;
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError( xmlGenericErrorContext,
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"xmlNanoHTTPCloseWrite:  HTTP %s to\n%s returned %d.\n",
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			http_mthd, ctxt->uri,
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlNanoHTTPReturnCode( http_ctxt ) );
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    **  Since either content or reply may be gzipped,
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    **  dump them to separate files instead of the
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    **  standard error context.
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    dump_name = tempnam( NULL, "lxml" );
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ( dump_name != NULL ) {
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(void)snprintf( buffer, sizeof(buffer), "%s.content", dump_name );
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tst_file = fopen( buffer, "wb" );
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ( tst_file != NULL ) {
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlGenericError( xmlGenericErrorContext,
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Transmitted content saved in file:  %s\n", buffer );
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    fwrite( http_content, sizeof( char ),
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					content_lgth, tst_file );
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    fclose( tst_file );
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(void)snprintf( buffer, sizeof(buffer), "%s.reply", dump_name );
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tst_file = fopen( buffer, "wb" );
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ( tst_file != NULL ) {
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlGenericError( xmlGenericErrorContext,
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Reply content saved in file:  %s\n", buffer );
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    while ( (avail = xmlNanoHTTPRead( http_ctxt,
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					buffer, sizeof( buffer ) )) > 0 ) {
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			fwrite( buffer, sizeof( char ), avail, tst_file );
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    fclose( tst_file );
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		free( dump_name );
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  /*  DEBUG_HTTP  */
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    http_rtn = xmlNanoHTTPReturnCode( http_ctxt );
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ( ( http_rtn >= 200 ) && ( http_rtn < 300 ) )
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		close_rc = 0;
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else {
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlChar msg[500];
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlStrPrintf(msg, 500,
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (const xmlChar *) "xmlIOHTTPCloseWrite: HTTP '%s' of %d %s\n'%s' %s %d\n",
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    http_mthd, content_lgth,
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "bytes to URI", ctxt->uri,
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "failed.  HTTP return code:", http_rtn );
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlIOErr(XML_IO_WRITE, (const char *) msg);
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNanoHTTPClose( http_ctxt );
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree( content_type );
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*  Final cleanups  */
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFreeHTTPWriteCtxt( ctxt );
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ( close_rc );
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlIOHTTPClosePut
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @context:  The I/O context
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Close the transmit HTTP I/O channel and actually send data using a PUT
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * HTTP method.
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlIOHTTPClosePut( void * ctxt ) {
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ( xmlIOHTTPCloseWrite( ctxt, "PUT" ) );
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlIOHTTPClosePost
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @context:  The I/O context
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Close the transmit HTTP I/O channel and actually send data using a POST
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * HTTP method.
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlIOHTTPClosePost( void * ctxt ) {
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ( xmlIOHTTPCloseWrite( ctxt, "POST" ) );
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_HTTP_ENABLED */
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_FTP_ENABLED
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			I/O for FTP file accesses			*
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlIOFTPMatch:
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename:  the URI for matching
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * check if the URI matches an FTP one
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if matches, 0 otherwise
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlIOFTPMatch (const char *filename) {
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "ftp://", 6))
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(1);
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlIOFTPOpen:
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename:  the URI for matching
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * open an FTP I/O channel
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns an I/O context or NULL in case of error
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void *
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlIOFTPOpen (const char *filename) {
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlNanoFTPOpen(filename));
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlIOFTPRead:
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @context:  the I/O context
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buffer:  where to drop data
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  number of bytes to write
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Read @len bytes to @buffer from the I/O channel.
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of bytes written
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlIOFTPRead(void * context, char * buffer, int len) {
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((buffer == NULL) || (len < 0)) return(-1);
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlNanoFTPRead(context, &buffer[0], len));
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlIOFTPClose:
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @context:  the I/O context
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Close an FTP I/O channel
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlIOFTPClose (void * context) {
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ( xmlNanoFTPClose(context) );
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_FTP_ENABLED */
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRegisterInputCallbacks:
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @matchFunc:  the xmlInputMatchCallback
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @openFunc:  the xmlInputOpenCallback
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @readFunc:  the xmlInputReadCallback
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @closeFunc:  the xmlInputCloseCallback
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Register a new set of I/O callback for handling parser input.
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the registered handler number or -1 in case of error
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRegisterInputCallbacks(xmlInputMatchCallback matchFunc,
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlInputOpenCallback openFunc, xmlInputReadCallback readFunc,
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlInputCloseCallback closeFunc) {
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlInputCallbackNr >= MAX_INPUT_CALLBACK) {
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlInputCallbackTable[xmlInputCallbackNr].matchcallback = matchFunc;
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlInputCallbackTable[xmlInputCallbackNr].opencallback = openFunc;
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlInputCallbackTable[xmlInputCallbackNr].readcallback = readFunc;
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlInputCallbackTable[xmlInputCallbackNr].closecallback = closeFunc;
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlInputCallbackInitialized = 1;
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlInputCallbackNr++);
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRegisterOutputCallbacks:
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @matchFunc:  the xmlOutputMatchCallback
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @openFunc:  the xmlOutputOpenCallback
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @writeFunc:  the xmlOutputWriteCallback
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @closeFunc:  the xmlOutputCloseCallback
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Register a new set of I/O callback for handling output.
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the registered handler number or -1 in case of error
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRegisterOutputCallbacks(xmlOutputMatchCallback matchFunc,
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlOutputOpenCallback openFunc, xmlOutputWriteCallback writeFunc,
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlOutputCloseCallback closeFunc) {
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlOutputCallbackNr >= MAX_OUTPUT_CALLBACK) {
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlOutputCallbackTable[xmlOutputCallbackNr].matchcallback = matchFunc;
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlOutputCallbackTable[xmlOutputCallbackNr].opencallback = openFunc;
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlOutputCallbackTable[xmlOutputCallbackNr].writecallback = writeFunc;
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlOutputCallbackTable[xmlOutputCallbackNr].closecallback = closeFunc;
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlOutputCallbackInitialized = 1;
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlOutputCallbackNr++);
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRegisterDefaultInputCallbacks:
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Registers the default compiled-in I/O handlers.
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRegisterDefaultInputCallbacks(void) {
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlInputCallbackInitialized)
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlInitPlatformSpecificIo();
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRegisterInputCallbacks(xmlFileMatch, xmlFileOpen,
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                      xmlFileRead, xmlFileClose);
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ZLIB_H
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRegisterInputCallbacks(xmlGzfileMatch, xmlGzfileOpen,
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                      xmlGzfileRead, xmlGzfileClose);
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* HAVE_ZLIB_H */
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_HTTP_ENABLED
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRegisterInputCallbacks(xmlIOHTTPMatch, xmlIOHTTPOpen,
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                      xmlIOHTTPRead, xmlIOHTTPClose);
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_HTTP_ENABLED */
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_FTP_ENABLED
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRegisterInputCallbacks(xmlIOFTPMatch, xmlIOFTPOpen,
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                      xmlIOFTPRead, xmlIOFTPClose);
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_FTP_ENABLED */
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlInputCallbackInitialized = 1;
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRegisterDefaultOutputCallbacks:
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Registers the default compiled-in I/O handlers.
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRegisterDefaultOutputCallbacks (void) {
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlOutputCallbackInitialized)
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlInitPlatformSpecificIo();
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRegisterOutputCallbacks(xmlFileMatch, xmlFileOpenW,
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                      xmlFileWrite, xmlFileClose);
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_HTTP_ENABLED
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRegisterOutputCallbacks(xmlIOHTTPMatch, xmlIOHTTPDfltOpenW,
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                       xmlIOHTTPWrite, xmlIOHTTPClosePut);
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*********************************
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) No way a-priori to distinguish between gzipped files from
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uncompressed ones except opening if existing then closing
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) and saving with same compression ratio ... a pain.
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ZLIB_H
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRegisterOutputCallbacks(xmlGzfileMatch, xmlGzfileOpen,
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                       xmlGzfileWrite, xmlGzfileClose);
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Nor FTP PUT ....
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_FTP_ENABLED
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRegisterOutputCallbacks(xmlIOFTPMatch, xmlIOFTPOpen,
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                       xmlIOFTPWrite, xmlIOFTPClose);
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) **********************************/
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlOutputCallbackInitialized = 1;
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_HTTP_ENABLED
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRegisterHTTPPostCallbacks:
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * By default, libxml submits HTTP output requests using the "PUT" method.
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Calling this method changes the HTTP output method to use the "POST"
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * method instead.
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRegisterHTTPPostCallbacks( void ) {
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*  Register defaults if not done previously  */
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ( xmlOutputCallbackInitialized == 0 )
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRegisterDefaultOutputCallbacks( );
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRegisterOutputCallbacks(xmlIOHTTPMatch, xmlIOHTTPDfltOpenW,
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                       xmlIOHTTPWrite, xmlIOHTTPClosePost);
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlAllocParserInputBuffer:
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @enc:  the charset encoding if known
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a buffered parser input for progressive parsing
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new parser input or NULL
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserInputBufferPtr
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAllocParserInputBuffer(xmlCharEncoding enc) {
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputBufferPtr ret;
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlParserInputBufferPtr) xmlMalloc(sizeof(xmlParserInputBuffer));
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlIOErrMemory("creating input buffer");
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, (size_t) sizeof(xmlParserInputBuffer));
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->buffer = xmlBufferCreateSize(2 * xmlDefaultBufferSize);
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret->buffer == NULL) {
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(ret);
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->buffer->alloc = XML_BUFFER_ALLOC_DOUBLEIT;
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->encoder = xmlGetCharEncodingHandler(enc);
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret->encoder != NULL)
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->raw = xmlBufferCreateSize(2 * xmlDefaultBufferSize);
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->raw = NULL;
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->readcallback = NULL;
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->closecallback = NULL;
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->context = NULL;
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->compressed = -1;
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->rawconsumed = 0;
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlAllocOutputBuffer:
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @encoder:  the encoding converter or NULL
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a buffered parser output
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new parser output or NULL
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlOutputBufferPtr
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAllocOutputBuffer(xmlCharEncodingHandlerPtr encoder) {
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlOutputBufferPtr ret;
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer));
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlIOErrMemory("creating output buffer");
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, (size_t) sizeof(xmlOutputBuffer));
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->buffer = xmlBufferCreate();
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret->buffer == NULL) {
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(ret);
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* try to avoid a performance problem with Windows realloc() */
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret->buffer->alloc == XML_BUFFER_ALLOC_EXACT)
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->buffer->alloc = XML_BUFFER_ALLOC_DOUBLEIT;
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->encoder = encoder;
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (encoder != NULL) {
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->conv = xmlBufferCreateSize(4000);
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret->conv == NULL) {
23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(ret);
23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * This call is designed to initiate the encoder state
23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlCharEncOutFunc(encoder, ret->conv, NULL);
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->conv = NULL;
23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->writecallback = NULL;
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->closecallback = NULL;
23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->context = NULL;
23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->written = 0;
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlAllocOutputBufferInternal:
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @encoder:  the encoding converter or NULL
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a buffered parser output
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new parser output or NULL
23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlOutputBufferPtr
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAllocOutputBufferInternal(xmlCharEncodingHandlerPtr encoder) {
23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlOutputBufferPtr ret;
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer));
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlIOErrMemory("creating output buffer");
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, (size_t) sizeof(xmlOutputBuffer));
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->buffer = xmlBufferCreate();
23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret->buffer == NULL) {
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(ret);
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * For conversion buffers we use the special IO handling
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * We don't do that from the exported API to avoid confusing
23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * user's code.
23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->buffer->alloc = XML_BUFFER_ALLOC_IO;
23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->buffer->contentIO = ret->buffer->content;
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->encoder = encoder;
23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (encoder != NULL) {
23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->conv = xmlBufferCreateSize(4000);
23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret->conv == NULL) {
23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(ret);
23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * This call is designed to initiate the encoder state
23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlCharEncOutFunc(encoder, ret->conv, NULL);
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->conv = NULL;
23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->writecallback = NULL;
24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->closecallback = NULL;
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->context = NULL;
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->written = 0;
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFreeParserInputBuffer:
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @in:  a buffered parser input
24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free up the memory used by a buffered parser input
24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFreeParserInputBuffer(xmlParserInputBufferPtr in) {
24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in == NULL) return;
24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in->raw) {
24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlBufferFree(in->raw);
24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	in->raw = NULL;
24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in->encoder != NULL) {
24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlCharEncCloseFunc(in->encoder);
24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in->closecallback != NULL) {
24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	in->closecallback(in->context);
24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in->buffer != NULL) {
24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlBufferFree(in->buffer);
24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	in->buffer = NULL;
24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(in);
24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlOutputBufferClose:
24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @out:  a buffered output
24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * flushes and close the output I/O channel
24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and free up all the associated resources
24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of byte written or -1 in case of error.
24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlOutputBufferClose(xmlOutputBufferPtr out)
24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int written;
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int err_rc = 0;
24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (out == NULL)
24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (out->writecallback != NULL)
24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlOutputBufferFlush(out);
24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (out->closecallback != NULL) {
24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err_rc = out->closecallback(out->context);
24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    written = out->written;
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (out->conv) {
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlBufferFree(out->conv);
24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        out->conv = NULL;
24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (out->encoder != NULL) {
24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlCharEncCloseFunc(out->encoder);
24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (out->buffer != NULL) {
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlBufferFree(out->buffer);
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        out->buffer = NULL;
24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (out->error)
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        err_rc = -1;
24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(out);
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ((err_rc == 0) ? written : err_rc);
24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserInputBufferPtr
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__xmlParserInputBufferCreateFilename(const char *URI, xmlCharEncoding enc) {
24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputBufferPtr ret;
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i = 0;
24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void *context = NULL;
24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlInputCallbackInitialized == 0)
24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRegisterDefaultInputCallbacks();
24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (URI == NULL) return(NULL);
24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Try to find one of the input accept method accepting that scheme
24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Go in reverse to give precedence to user defined handlers.
24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (context == NULL) {
24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = xmlInputCallbackNr - 1;i >= 0;i--) {
24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((xmlInputCallbackTable[i].matchcallback != NULL) &&
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlInputCallbackTable[i].matchcallback(URI) != 0)) {
24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		context = xmlInputCallbackTable[i].opencallback(URI);
25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (context != NULL) {
25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (context == NULL) {
25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Allocate the Input buffer front-end.
25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlAllocParserInputBuffer(enc);
25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != NULL) {
25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->context = context;
25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->readcallback = xmlInputCallbackTable[i].readcallback;
25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->closecallback = xmlInputCallbackTable[i].closecallback;
25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ZLIB_H
25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((xmlInputCallbackTable[i].opencallback == xmlGzfileOpen) &&
25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(strcmp(URI, "-") != 0)) {
25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ZLIB_VERNUM) && ZLIB_VERNUM >= 0x1230
25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret->compressed = !gzdirect(context);
25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (((z_stream *)context)->avail_in > 4) {
25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        char *cptr, buff4[4];
25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cptr = (char *) ((z_stream *)context)->next_in;
25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (gzread(context, buff4, 4) == 4) {
25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (strncmp(buff4, cptr, 4) == 0)
25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        ret->compressed = 0;
25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else
25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        ret->compressed = 1;
25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    gzrewind(context);
25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      xmlInputCallbackTable[i].closecallback (context);
25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParserInputBufferCreateFilename:
25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URI:  a C string containing the URI or filename
25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @enc:  the charset encoding if known
25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a buffered parser input for the progressive parsing of a file
25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If filename is "-' then we use stdin as the input.
25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Automatic support for ZLIB/Compress compressed document is provided
25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * by default if found at compile-time.
25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do an encoding check if enc == XML_CHAR_ENCODING_NONE
25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new parser input or NULL
25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserInputBufferPtr
25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserInputBufferCreateFilename(const char *URI, xmlCharEncoding enc) {
25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((xmlParserInputBufferCreateFilenameValue)) {
25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return xmlParserInputBufferCreateFilenameValue(URI, enc);
25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return __xmlParserInputBufferCreateFilename(URI, enc);
25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlOutputBufferPtr
25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__xmlOutputBufferCreateFilename(const char *URI,
25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              xmlCharEncodingHandlerPtr encoder,
25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int compression ATTRIBUTE_UNUSED) {
25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlOutputBufferPtr ret;
25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlURIPtr puri;
25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i = 0;
25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void *context = NULL;
25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *unescaped = NULL;
25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ZLIB_H
25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int is_file_uri = 1;
25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlOutputCallbackInitialized == 0)
25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRegisterDefaultOutputCallbacks();
25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (URI == NULL) return(NULL);
25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    puri = xmlParseURI(URI);
25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (puri != NULL) {
25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ZLIB_H
25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((puri->scheme != NULL) &&
25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (!xmlStrEqual(BAD_CAST puri->scheme, BAD_CAST "file")))
25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    is_file_uri = 0;
25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * try to limit the damages of the URI unescaping code.
25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((puri->scheme == NULL) ||
25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (xmlStrEqual(BAD_CAST puri->scheme, BAD_CAST "file")))
25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    unescaped = xmlURIUnescapeString(URI, 0, NULL);
25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeURI(puri);
25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Try to find one of the output accept method accepting that scheme
26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Go in reverse to give precedence to user defined handlers.
26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * try with an unescaped version of the URI
26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (unescaped != NULL) {
26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ZLIB_H
26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((compression > 0) && (compression <= 9) && (is_file_uri == 1)) {
26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    context = xmlGzfileOpenW(unescaped, compression);
26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (context != NULL) {
26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlAllocOutputBufferInternal(encoder);
26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret != NULL) {
26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret->context = context;
26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret->writecallback = xmlGzfileWrite;
26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret->closecallback = xmlGzfileClose;
26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(unescaped);
26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(ret);
26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = xmlOutputCallbackNr - 1;i >= 0;i--) {
26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((xmlOutputCallbackTable[i].matchcallback != NULL) &&
26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlOutputCallbackTable[i].matchcallback(unescaped) != 0)) {
26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_HTTP_ENABLED) && defined(HAVE_ZLIB_H)
26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*  Need to pass compression parameter into HTTP open calls  */
26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlOutputCallbackTable[i].matchcallback == xmlIOHTTPMatch)
26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    context = xmlIOHTTPOpenW(unescaped, compression);
26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    context = xmlOutputCallbackTable[i].opencallback(unescaped);
26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (context != NULL)
26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(unescaped);
26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * If this failed try with a non-escaped URI this may be a strange
26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * filename
26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (context == NULL) {
26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ZLIB_H
26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((compression > 0) && (compression <= 9) && (is_file_uri == 1)) {
26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    context = xmlGzfileOpenW(URI, compression);
26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (context != NULL) {
26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlAllocOutputBufferInternal(encoder);
26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret != NULL) {
26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret->context = context;
26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret->writecallback = xmlGzfileWrite;
26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret->closecallback = xmlGzfileClose;
26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(ret);
26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = xmlOutputCallbackNr - 1;i >= 0;i--) {
26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((xmlOutputCallbackTable[i].matchcallback != NULL) &&
26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlOutputCallbackTable[i].matchcallback(URI) != 0)) {
26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_HTTP_ENABLED) && defined(HAVE_ZLIB_H)
26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*  Need to pass compression parameter into HTTP open calls  */
26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlOutputCallbackTable[i].matchcallback == xmlIOHTTPMatch)
26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    context = xmlIOHTTPOpenW(URI, compression);
26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    context = xmlOutputCallbackTable[i].opencallback(URI);
26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (context != NULL)
26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (context == NULL) {
26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Allocate the Output buffer front-end.
26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlAllocOutputBufferInternal(encoder);
26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != NULL) {
26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->context = context;
26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->writecallback = xmlOutputCallbackTable[i].writecallback;
26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->closecallback = xmlOutputCallbackTable[i].closecallback;
26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlOutputBufferCreateFilename:
26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URI:  a C string containing the URI or filename
26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @encoder:  the encoding converter or NULL
26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @compression:  the compression ration (0 none, 9 max).
26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a buffered  output for the progressive saving of a file
26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If filename is "-' then we use stdout as the output.
26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Automatic support for ZLIB/Compress compressed document is provided
26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * by default if found at compile-time.
27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: currently if compression is set, the library only support
27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       writing to a local file.
27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new output or NULL
27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlOutputBufferPtr
27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlOutputBufferCreateFilename(const char *URI,
27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              xmlCharEncodingHandlerPtr encoder,
27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int compression ATTRIBUTE_UNUSED) {
27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((xmlOutputBufferCreateFilenameValue)) {
27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return xmlOutputBufferCreateFilenameValue(URI, encoder, compression);
27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return __xmlOutputBufferCreateFilename(URI, encoder, compression);
27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParserInputBufferCreateFile:
27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @file:  a FILE*
27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @enc:  the charset encoding if known
27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a buffered parser input for the progressive parsing of a FILE *
27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * buffered C I/O
27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new parser input or NULL
27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserInputBufferPtr
27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserInputBufferCreateFile(FILE *file, xmlCharEncoding enc) {
27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputBufferPtr ret;
27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlInputCallbackInitialized == 0)
27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRegisterDefaultInputCallbacks();
27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file == NULL) return(NULL);
27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlAllocParserInputBuffer(enc);
27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != NULL) {
27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->context = file;
27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->readcallback = xmlFileRead;
27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->closecallback = xmlFileFlush;
27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlOutputBufferCreateFile:
27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @file:  a FILE*
27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @encoder:  the encoding converter or NULL
27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a buffered output for the progressive saving to a FILE *
27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * buffered C I/O
27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new parser output or NULL
27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlOutputBufferPtr
27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlOutputBufferCreateFile(FILE *file, xmlCharEncodingHandlerPtr encoder) {
27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlOutputBufferPtr ret;
27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlOutputCallbackInitialized == 0)
27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRegisterDefaultOutputCallbacks();
27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file == NULL) return(NULL);
27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlAllocOutputBufferInternal(encoder);
27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != NULL) {
27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->context = file;
27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->writecallback = xmlFileWrite;
27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->closecallback = xmlFileFlush;
27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlOutputBufferCreateBuffer:
27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buffer:  a xmlBufferPtr
27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @encoder:  the encoding converter or NULL
27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a buffered output for the progressive saving to a xmlBuffer
27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new parser output or NULL
27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlOutputBufferPtr
27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlOutputBufferCreateBuffer(xmlBufferPtr buffer,
27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlCharEncodingHandlerPtr encoder) {
27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlOutputBufferPtr ret;
27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buffer == NULL) return(NULL);
27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlOutputBufferCreateIO((xmlOutputWriteCallback)
27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  xmlBufferWrite,
27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  (xmlOutputCloseCallback)
27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  NULL, (void *) buffer, encoder);
27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParserInputBufferCreateFd:
28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @fd:  a file descriptor number
28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @enc:  the charset encoding if known
28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a buffered parser input for the progressive parsing for the input
28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * from a file descriptor
28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new parser input or NULL
28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserInputBufferPtr
28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserInputBufferCreateFd(int fd, xmlCharEncoding enc) {
28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputBufferPtr ret;
28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (fd < 0) return(NULL);
28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlAllocParserInputBuffer(enc);
28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != NULL) {
28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->context = (void *) (long) fd;
28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->readcallback = xmlFdRead;
28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->closecallback = xmlFdClose;
28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParserInputBufferCreateMem:
28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @mem:  the memory input
28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @size:  the length of the memory block
28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @enc:  the charset encoding if known
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a buffered parser input for the progressive parsing for the input
28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * from a memory area.
28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new parser input or NULL
28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserInputBufferPtr
28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserInputBufferCreateMem(const char *mem, int size, xmlCharEncoding enc) {
28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputBufferPtr ret;
28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int errcode;
28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (size <= 0) return(NULL);
28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (mem == NULL) return(NULL);
28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlAllocParserInputBuffer(enc);
28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != NULL) {
28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->context = (void *) mem;
28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->readcallback = (xmlInputReadCallback) xmlNop;
28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->closecallback = NULL;
28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	errcode = xmlBufferAdd(ret->buffer, (const xmlChar *) mem, size);
28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (errcode != 0) {
28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(ret);
28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParserInputBufferCreateStatic:
28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @mem:  the memory input
28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @size:  the length of the memory block
28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @enc:  the charset encoding if known
28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a buffered parser input for the progressive parsing for the input
28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * from an immutable memory area. This will not copy the memory area to
28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the buffer, but the memory is expected to be available until the end of
28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the parsing, this is useful for example when using mmap'ed file.
28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new parser input or NULL
28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserInputBufferPtr
28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserInputBufferCreateStatic(const char *mem, int size,
28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 xmlCharEncoding enc) {
28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputBufferPtr ret;
28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (size <= 0) return(NULL);
28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (mem == NULL) return(NULL);
28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlParserInputBufferPtr) xmlMalloc(sizeof(xmlParserInputBuffer));
28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlIOErrMemory("creating input buffer");
28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, (size_t) sizeof(xmlParserInputBuffer));
28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->buffer = xmlBufferCreateStatic((void *)mem, (size_t) size);
28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret->buffer == NULL) {
28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(ret);
28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->encoder = xmlGetCharEncodingHandler(enc);
28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret->encoder != NULL)
28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->raw = xmlBufferCreateSize(2 * xmlDefaultBufferSize);
28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->raw = NULL;
28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->compressed = -1;
28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->context = (void *) mem;
29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->readcallback = NULL;
29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->closecallback = NULL;
29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlOutputBufferCreateFd:
29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @fd:  a file descriptor number
29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @encoder:  the encoding converter or NULL
29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a buffered output for the progressive saving
29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to a file descriptor
29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new parser output or NULL
29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlOutputBufferPtr
29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlOutputBufferCreateFd(int fd, xmlCharEncodingHandlerPtr encoder) {
29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlOutputBufferPtr ret;
29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (fd < 0) return(NULL);
29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlAllocOutputBufferInternal(encoder);
29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != NULL) {
29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->context = (void *) (long) fd;
29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->writecallback = xmlFdWrite;
29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->closecallback = NULL;
29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParserInputBufferCreateIO:
29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ioread:  an I/O read function
29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ioclose:  an I/O close function
29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ioctx:  an I/O handler
29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @enc:  the charset encoding if known
29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a buffered parser input for the progressive parsing for the input
29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * from an I/O handler
29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new parser input or NULL
29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserInputBufferPtr
29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserInputBufferCreateIO(xmlInputReadCallback   ioread,
29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 xmlInputCloseCallback  ioclose, void *ioctx, xmlCharEncoding enc) {
29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputBufferPtr ret;
29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ioread == NULL) return(NULL);
29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlAllocParserInputBuffer(enc);
29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != NULL) {
29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->context = (void *) ioctx;
29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->readcallback = ioread;
29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->closecallback = ioclose;
29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlOutputBufferCreateIO:
29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @iowrite:  an I/O write function
29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ioclose:  an I/O close function
29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ioctx:  an I/O handler
29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @encoder:  the charset encoding if known
29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a buffered output for the progressive saving
29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to an I/O handler
29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new parser output or NULL
29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlOutputBufferPtr
29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlOutputBufferCreateIO(xmlOutputWriteCallback   iowrite,
29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 xmlOutputCloseCallback  ioclose, void *ioctx,
29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 xmlCharEncodingHandlerPtr encoder) {
29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlOutputBufferPtr ret;
29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (iowrite == NULL) return(NULL);
29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlAllocOutputBufferInternal(encoder);
29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != NULL) {
29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->context = (void *) ioctx;
29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->writecallback = iowrite;
29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->closecallback = ioclose;
29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParserInputBufferCreateFilenameDefault:
29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @func: function pointer to the new ParserInputBufferCreateFilenameFunc
29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Registers a callback for URI input file handling
30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the old value of the registration function
30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserInputBufferCreateFilenameFunc
30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserInputBufferCreateFilenameDefault(xmlParserInputBufferCreateFilenameFunc func)
30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputBufferCreateFilenameFunc old = xmlParserInputBufferCreateFilenameValue;
30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (old == NULL) {
30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		old = __xmlParserInputBufferCreateFilename;
30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputBufferCreateFilenameValue = func;
30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(old);
30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlOutputBufferCreateFilenameDefault:
30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @func: function pointer to the new OutputBufferCreateFilenameFunc
30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Registers a callback for URI output file handling
30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the old value of the registration function
30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlOutputBufferCreateFilenameFunc
30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlOutputBufferCreateFilenameDefault(xmlOutputBufferCreateFilenameFunc func)
30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlOutputBufferCreateFilenameFunc old = xmlOutputBufferCreateFilenameValue;
30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (old == NULL) {
30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		old = __xmlOutputBufferCreateFilename;
30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlOutputBufferCreateFilenameValue = func;
30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(old);
30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParserInputBufferPush:
30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @in:  a buffered parser input
30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  the size in bytes of the array.
30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf:  an char array
30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Push the content of the arry in the input buffer
30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This routine handle the I18N transcoding to internal UTF-8
30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This is used when operating the parser in progressive (push) mode.
30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of chars read and stored in the buffer, or -1
30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         in case of error.
30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserInputBufferPush(xmlParserInputBufferPtr in,
30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                 int len, const char *buf) {
30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nbchars = 0;
30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len < 0) return(0);
30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((in == NULL) || (in->error)) return(-1);
30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in->encoder != NULL) {
30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unsigned int use;
30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * Store the data in the incoming raw buffer
30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (in->raw == NULL) {
30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    in->raw = xmlBufferCreate();
30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlBufferAdd(in->raw, (const xmlChar *) buf, len);
30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret != 0)
30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * convert as much as possible to the parser reading buffer.
30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	use = in->raw->use;
30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nbchars = xmlCharEncInFunc(in->encoder, in->buffer, in->raw);
30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (nbchars < 0) {
30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlIOErr(XML_IO_ENCODER, NULL);
30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    in->error = XML_IO_ENCODER;
30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	in->rawconsumed += (use - in->raw->use);
30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nbchars = len;
30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = xmlBufferAdd(in->buffer, (xmlChar *) buf, nbchars);
30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret != 0)
30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_INPUT
30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext,
30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "I/O: pushed %d chars, buffer %d/%d\n",
30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            nbchars, in->buffer->use, in->buffer->size);
30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(nbchars);
30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * endOfInput:
30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * When reading from an Input channel indicated end of file or error
30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * don't reread from it again.
31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)endOfInput (void * context ATTRIBUTE_UNUSED,
31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    char * buffer ATTRIBUTE_UNUSED,
31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int len ATTRIBUTE_UNUSED) {
31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParserInputBufferGrow:
31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @in:  a buffered parser input
31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  indicative value of the amount of chars to read
31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Grow up the content of the input buffer, the old data are preserved
31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This routine handle the I18N transcoding to internal UTF-8
31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This routine is used when operating the parser in normal (pull) mode
31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: one should be able to remove one extra copy by copying directly
31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       onto in->buffer or in->raw
31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of chars read and stored in the buffer, or -1
31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         in case of error.
31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserInputBufferGrow(xmlParserInputBufferPtr in, int len) {
31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *buffer = NULL;
31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res = 0;
31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nbchars = 0;
31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int buffree;
31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int needSize;
31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((in == NULL) || (in->error)) return(-1);
31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((len <= MINLEN) && (len != 4))
31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        len = MINLEN;
31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buffree = in->buffer->size - in->buffer->use;
31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buffree <= 0) {
31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlIOErr(XML_IO_BUFFER_FULL, NULL);
31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	in->error = XML_IO_BUFFER_FULL;
31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    needSize = in->buffer->use + len + 1;
31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (needSize > in->buffer->size){
31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!xmlBufferResize(in->buffer, needSize)){
31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlIOErrMemory("growing input buffer");
31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    in->error = XML_ERR_NO_MEMORY;
31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return(-1);
31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buffer = (char *)&in->buffer->content[in->buffer->use];
31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Call the read method for this I/O type.
31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in->readcallback != NULL) {
31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = in->readcallback(in->context, &buffer[0], len);
31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res <= 0)
31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    in->readcallback = endOfInput;
31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlIOErr(XML_IO_NO_INPUT, NULL);
31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	in->error = XML_IO_NO_INPUT;
31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (res < 0) {
31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    len = res;
31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in->encoder != NULL) {
31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unsigned int use;
31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * Store the data in the incoming raw buffer
31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (in->raw == NULL) {
31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    in->raw = xmlBufferCreate();
31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = xmlBufferAdd(in->raw, (const xmlChar *) buffer, len);
31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res != 0)
31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * convert as much as possible to the parser reading buffer.
31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	use = in->raw->use;
31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nbchars = xmlCharEncInFunc(in->encoder, in->buffer, in->raw);
31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (nbchars < 0) {
31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlIOErr(XML_IO_ENCODER, NULL);
31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    in->error = XML_IO_ENCODER;
31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	in->rawconsumed += (use - in->raw->use);
31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nbchars = len;
31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   	in->buffer->use += nbchars;
31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	buffer[nbchars] = 0;
31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_INPUT
31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext,
31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "I/O: read %d chars, buffer %d/%d\n",
32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            nbchars, in->buffer->use, in->buffer->size);
32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(nbchars);
32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParserInputBufferRead:
32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @in:  a buffered parser input
32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  indicative value of the amount of chars to read
32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Refresh the content of the input buffer, the old data are considered
32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * consumed
32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This routine handle the I18N transcoding to internal UTF-8
32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of chars read and stored in the buffer, or -1
32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         in case of error.
32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserInputBufferRead(xmlParserInputBufferPtr in, int len) {
32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((in == NULL) || (in->error)) return(-1);
32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in->readcallback != NULL)
32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(xmlParserInputBufferGrow(in, len));
32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if ((in->buffer != NULL) &&
32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             (in->buffer->alloc == XML_BUFFER_ALLOC_IMMUTABLE))
32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlOutputBufferWrite:
32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @out:  a buffered parser output
32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  the size in bytes of the array.
32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf:  an char array
32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Write the content of the array in the output I/O buffer
32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This routine handle the I18N transcoding from internal UTF-8
32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The buffer is lossless, i.e. will store in case of partial
32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or delayed writes.
32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of chars immediately written, or -1
32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         in case of error.
32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlOutputBufferWrite(xmlOutputBufferPtr out, int len, const char *buf) {
32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nbchars = 0; /* number of chars to output to I/O */
32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;         /* return from function call */
32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int written = 0; /* number of char written to I/O so far */
32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int chunk;       /* number of byte curreent processed from buf */
32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((out == NULL) || (out->error)) return(-1);
32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len < 0) return(0);
32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (out->error) return(-1);
32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do {
32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	chunk = len;
32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (chunk > 4 * MINLEN)
32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    chunk = 4 * MINLEN;
32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * first handle encoding stuff.
32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (out->encoder != NULL) {
32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * Store the data in the incoming raw buffer
32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (out->conv == NULL) {
32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		out->conv = xmlBufferCreate();
32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlBufferAdd(out->buffer, (const xmlChar *) buf, chunk);
32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret != 0)
32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        return(-1);
32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((out->buffer->use < MINLEN) && (chunk == len))
32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto done;
32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * convert as much as possible to the parser reading buffer.
32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlCharEncOutFunc(out->encoder, out->conv, out->buffer);
32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((ret < 0) && (ret != -3)) {
32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlIOErr(XML_IO_ENCODER, NULL);
32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		out->error = XML_IO_ENCODER;
32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(-1);
32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nbchars = out->conv->use;
32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlBufferAdd(out->buffer, (const xmlChar *) buf, chunk);
32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret != 0)
32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        return(-1);
32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nbchars = out->buffer->use;
32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	buf += chunk;
32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	len -= chunk;
32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((nbchars < MINLEN) && (len <= 0))
32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto done;
32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (out->writecallback) {
33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * second write the stuff to the I/O channel
33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (out->encoder != NULL) {
33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = out->writecallback(out->context,
33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 (const char *)out->conv->content, nbchars);
33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret >= 0)
33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlBufferShrink(out->conv, ret);
33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = out->writecallback(out->context,
33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 (const char *)out->buffer->content, nbchars);
33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret >= 0)
33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlBufferShrink(out->buffer, ret);
33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret < 0) {
33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlIOErr(XML_IO_WRITE, NULL);
33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		out->error = XML_IO_WRITE;
33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(ret);
33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    out->written += ret;
33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	written += nbchars;
33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } while (len > 0);
33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)done:
33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_INPUT
33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext,
33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "I/O: wrote %d chars\n", written);
33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(written);
33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlEscapeContent:
33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @out:  a pointer to an array of bytes to store the result
33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @outlen:  the length of @out
33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @in:  a pointer to an array of unescaped UTF-8 bytes
33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inlen:  the length of @in
33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Take a block of UTF-8 chars in and escape them.
33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if success, or -1 otherwise
33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The value of @inlen after return is the number of octets consumed
33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     if the return value is positive, else unpredictable.
33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The value of @outlen after return is the number of octets consumed.
33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlEscapeContent(unsigned char* out, int *outlen,
33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const xmlChar* in, int *inlen) {
33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char* outstart = out;
33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* base = in;
33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned char* outend = out + *outlen;
33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char* inend;
33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inend = in + (*inlen);
33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((in < inend) && (out < outend)) {
33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   	if (*in == '<') {
33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (outend - out < 4) break;
33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *out++ = '&';
33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *out++ = 'l';
33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *out++ = 't';
33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *out++ = ';';
33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (*in == '>') {
33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (outend - out < 4) break;
33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *out++ = '&';
33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *out++ = 'g';
33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *out++ = 't';
33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *out++ = ';';
33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (*in == '&') {
33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (outend - out < 5) break;
33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *out++ = '&';
33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *out++ = 'a';
33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *out++ = 'm';
33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *out++ = 'p';
33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *out++ = ';';
33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (*in == '\r') {
33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (outend - out < 5) break;
33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *out++ = '&';
33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *out++ = '#';
33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *out++ = '1';
33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *out++ = '3';
33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *out++ = ';';
33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *out++ = (unsigned char) *in;
33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	++in;
33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *outlen = out - outstart;
33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *inlen = in - base;
33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlOutputBufferWriteEscape:
33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @out:  a buffered parser output
33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str:  a zero terminated UTF-8 string
33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @escaping:  an optional escaping function (or NULL)
33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Write the content of the string in the output I/O buffer
33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This routine escapes the caracters and then handle the I18N
34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * transcoding from internal UTF-8
34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The buffer is lossless, i.e. will store in case of partial
34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or delayed writes.
34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of chars immediately written, or -1
34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         in case of error.
34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlOutputBufferWriteEscape(xmlOutputBufferPtr out, const xmlChar *str,
34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           xmlCharEncodingOutputFunc escaping) {
34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nbchars = 0; /* number of chars to output to I/O */
34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;         /* return from function call */
34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int written = 0; /* number of char written to I/O so far */
34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int oldwritten=0;/* loop guard */
34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int chunk;       /* number of byte currently processed from str */
34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int len;         /* number of bytes in str */
34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int cons;        /* byte from str consumed */
34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((out == NULL) || (out->error) || (str == NULL) ||
34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (out->buffer == NULL) ||
34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(out->buffer->alloc == XML_BUFFER_ALLOC_IMMUTABLE)) return(-1);
34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    len = strlen((const char *)str);
34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len < 0) return(0);
34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (out->error) return(-1);
34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (escaping == NULL) escaping = xmlEscapeContent;
34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do {
34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        oldwritten = written;
34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * how many bytes to consume and how many bytes to store.
34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cons = len;
34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	chunk = (out->buffer->size - out->buffer->use) - 1;
34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * make sure we have enough room to save first, if this is
34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * not the case force a flush, but make sure we stay in the loop
34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (chunk < 40) {
34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlBufferGrow(out->buffer, out->buffer->size + 100) < 0)
34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        return(-1);
34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            oldwritten = -1;
34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * first handle encoding stuff.
34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (out->encoder != NULL) {
34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * Store the data in the incoming raw buffer
34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (out->conv == NULL) {
34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		out->conv = xmlBufferCreate();
34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = escaping(out->buffer->content + out->buffer->use ,
34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                   &chunk, str, &cons);
34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((ret < 0) || (chunk == 0)) /* chunk==0 => nothing done */
34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        return(-1);
34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    out->buffer->use += chunk;
34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    out->buffer->content[out->buffer->use] = 0;
34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((out->buffer->use < MINLEN) && (cons == len))
34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto done;
34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * convert as much as possible to the output buffer.
34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlCharEncOutFunc(out->encoder, out->conv, out->buffer);
34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((ret < 0) && (ret != -3)) {
34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlIOErr(XML_IO_ENCODER, NULL);
34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		out->error = XML_IO_ENCODER;
34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(-1);
34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nbchars = out->conv->use;
34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = escaping(out->buffer->content + out->buffer->use ,
34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                   &chunk, str, &cons);
34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((ret < 0) || (chunk == 0)) /* chunk==0 => nothing done */
34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        return(-1);
34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    out->buffer->use += chunk;
34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    out->buffer->content[out->buffer->use] = 0;
34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nbchars = out->buffer->use;
34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	str += cons;
34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	len -= cons;
34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((nbchars < MINLEN) && (len <= 0))
34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto done;
34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (out->writecallback) {
34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * second write the stuff to the I/O channel
34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (out->encoder != NULL) {
34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = out->writecallback(out->context,
34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 (const char *)out->conv->content, nbchars);
34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret >= 0)
34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlBufferShrink(out->conv, ret);
35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = out->writecallback(out->context,
35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 (const char *)out->buffer->content, nbchars);
35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret >= 0)
35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlBufferShrink(out->buffer, ret);
35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret < 0) {
35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlIOErr(XML_IO_WRITE, NULL);
35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		out->error = XML_IO_WRITE;
35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(ret);
35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    out->written += ret;
35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (out->buffer->size - out->buffer->use < MINLEN) {
35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlBufferResize(out->buffer, out->buffer->size + MINLEN);
35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	written += nbchars;
35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } while ((len > 0) && (oldwritten != written));
35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)done:
35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_INPUT
35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext,
35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "I/O: wrote %d chars\n", written);
35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(written);
35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlOutputBufferWriteString:
35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @out:  a buffered parser output
35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str:  a zero terminated C string
35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Write the content of the string in the output I/O buffer
35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This routine handle the I18N transcoding from internal UTF-8
35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The buffer is lossless, i.e. will store in case of partial
35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or delayed writes.
35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of chars immediately written, or -1
35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         in case of error.
35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlOutputBufferWriteString(xmlOutputBufferPtr out, const char *str) {
35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int len;
35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((out == NULL) || (out->error)) return(-1);
35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (str == NULL)
35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    len = strlen(str);
35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len > 0)
35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(xmlOutputBufferWrite(out, len, str));
35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(len);
35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlOutputBufferFlush:
35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @out:  a buffered output
35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * flushes the output I/O channel
35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of byte written or -1 in case of error.
35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlOutputBufferFlush(xmlOutputBufferPtr out) {
35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nbchars = 0, ret = 0;
35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((out == NULL) || (out->error)) return(-1);
35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * first handle encoding stuff.
35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((out->conv != NULL) && (out->encoder != NULL)) {
35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * convert as much as possible to the parser reading buffer.
35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nbchars = xmlCharEncOutFunc(out->encoder, out->conv, out->buffer);
35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (nbchars < 0) {
35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlIOErr(XML_IO_ENCODER, NULL);
35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    out->error = XML_IO_ENCODER;
35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * second flush the stuff to the I/O channel
35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((out->conv != NULL) && (out->encoder != NULL) &&
35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(out->writecallback != NULL)) {
35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = out->writecallback(out->context,
35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	           (const char *)out->conv->content, out->conv->use);
35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret >= 0)
35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlBufferShrink(out->conv, ret);
35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (out->writecallback != NULL) {
35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = out->writecallback(out->context,
35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	           (const char *)out->buffer->content, out->buffer->use);
35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret >= 0)
35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlBufferShrink(out->buffer, ret);
35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret < 0) {
35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlIOErr(XML_IO_FLUSH, NULL);
35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	out->error = XML_IO_FLUSH;
35995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ret);
36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    out->written += ret;
36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_INPUT
36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext,
36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "I/O: flushed %d chars\n", ret);
36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParserGetDirectory:
36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename:  the path to a file
36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * lookup the directory for that file
36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a new allocated string containing the directory, or NULL.
36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char *
36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserGetDirectory(const char *filename) {
36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *ret = NULL;
36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char dir[1024];
36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *cur;
36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef _WIN32_WCE  /* easy way by now ... wince does not have dirs! */
36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlInputCallbackInitialized == 0)
36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRegisterDefaultInputCallbacks();
36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (filename == NULL) return(NULL);
36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(WIN32) && !defined(__CYGWIN__)
36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   define IS_XMLPGD_SEP(ch) ((ch=='/')||(ch=='\\'))
36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   define IS_XMLPGD_SEP(ch) (ch=='/')
36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    strncpy(dir, filename, 1023);
36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dir[1023] = 0;
36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = &dir[strlen(dir)];
36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur > dir) {
36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (IS_XMLPGD_SEP(*cur)) break;
36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 cur --;
36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_XMLPGD_SEP(*cur)) {
36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (cur == dir) dir[1] = 0;
36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else *cur = 0;
36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlMemStrdup(dir);
36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (getcwd(dir, 1024) != NULL) {
36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    dir[1023] = 0;
36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlMemStrdup(dir);
36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef IS_XMLPGD_SEP
36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/****************************************************************
36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *								*
36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		External entities loading			*
36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *								*
36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ****************************************************************/
36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCheckHTTPInput:
36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: an XML parser context
36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ret: an XML parser input
36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check an input in case it was created from an HTTP stream, in that
36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * case it will handle encoding and update of the base URL in case of
36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * redirection. It also checks for HTTP errors in which case the input
36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is cleanly freed up and an appropriate error is raised in context
36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the input or NULL in case of HTTP error.
36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserInputPtr
36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCheckHTTPInput(xmlParserCtxtPtr ctxt, xmlParserInputPtr ret) {
36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_HTTP_ENABLED
36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ret != NULL) && (ret->buf != NULL) &&
36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ret->buf->readcallback == xmlIOHTTPRead) &&
36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ret->buf->context != NULL)) {
36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const char *encoding;
36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const char *redir;
36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const char *mime;
36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int code;
36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        code = xmlNanoHTTPReturnCode(ret->buf->context);
36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (code >= 400) {
36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* fatal error */
36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret->filename != NULL)
36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		__xmlLoaderErr(ctxt, "failed to load HTTP resource \"%s\"\n",
36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         (const char *) ret->filename);
36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		__xmlLoaderErr(ctxt, "failed to load HTTP resource\n", NULL);
36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlFreeInputStream(ret);
36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret = NULL;
37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mime = xmlNanoHTTPMimeType(ret->buf->context);
37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if ((xmlStrstr(BAD_CAST mime, BAD_CAST "/xml")) ||
37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                (xmlStrstr(BAD_CAST mime, BAD_CAST "+xml"))) {
37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                encoding = xmlNanoHTTPEncoding(ret->buf->context);
37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (encoding != NULL) {
37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlCharEncodingHandlerPtr handler;
37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    handler = xmlFindCharEncodingHandler(encoding);
37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if (handler != NULL) {
37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        xmlSwitchInputEncoding(ctxt, ret, handler);
37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    } else {
37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        __xmlErrEncoding(ctxt, XML_ERR_UNKNOWN_ENCODING,
37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         "Unknown encoding %s",
37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         BAD_CAST encoding, NULL);
37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    }
37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if (ret->encoding == NULL)
37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        ret->encoding = xmlStrdup(BAD_CAST encoding);
37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else if (xmlStrstr(BAD_CAST mime, BAD_CAST "html")) {
37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            redir = xmlNanoHTTPRedir(ret->buf->context);
37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (redir != NULL) {
37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (ret->filename != NULL)
37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlFree((xmlChar *) ret->filename);
37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (ret->directory != NULL) {
37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlFree((xmlChar *) ret->directory);
37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ret->directory = NULL;
37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ret->filename =
37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    (char *) xmlStrdup((const xmlChar *) redir);
37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlNoNetExists(const char *URL) {
37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *path;
37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (URL == NULL)
37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlStrncasecmp(BAD_CAST URL, BAD_CAST "file://localhost/", 17))
37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = &URL[17];
37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = &URL[16];
37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (!xmlStrncasecmp(BAD_CAST URL, BAD_CAST "file:///", 8)) {
37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = &URL[8];
37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
37575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = &URL[7];
37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
37595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
37605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = URL;
37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return xmlCheckFilename(path);
37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_CATALOG_ENABLED
37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlResolveResourceFromCatalog:
37695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URL:  the URL for the entity to load
37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ID:  the System ID for the entity to load
37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the context in which the entity is called or NULL
37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Resolves the URL and ID against the appropriate catalog.
37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This function is used by xmlDefaultExternalEntityLoader and
37755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNoNetExternalEntityLoader.
37765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a new allocated URL, or NULL.
37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar *
37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlResolveResourceFromCatalog(const char *URL, const char *ID,
37815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              xmlParserCtxtPtr ctxt) {
37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *resource = NULL;
37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogAllow pref;
37845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * If the resource doesn't exists as a file,
37875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * try to load it from the resource pointed in the catalogs
37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pref = xmlCatalogGetDefaults();
37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((pref != XML_CATA_ALLOW_NONE) && (!xmlNoNetExists(URL))) {
37925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * Do a local lookup
37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
37955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((ctxt != NULL) && (ctxt->catalogs != NULL) &&
37965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ((pref == XML_CATA_ALLOW_ALL) ||
37975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     (pref == XML_CATA_ALLOW_DOCUMENT))) {
37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    resource = xmlCatalogLocalResolve(ctxt->catalogs,
37995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					      (const xmlChar *)ID,
38005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					      (const xmlChar *)URL);
38015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
38025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
38035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * Try a global lookup
38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
38055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((resource == NULL) &&
38065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ((pref == XML_CATA_ALLOW_ALL) ||
38075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     (pref == XML_CATA_ALLOW_GLOBAL))) {
38085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    resource = xmlCatalogResolve((const xmlChar *)ID,
38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 (const xmlChar *)URL);
38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
38115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((resource == NULL) && (URL != NULL))
38125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    resource = xmlStrdup((const xmlChar *) URL);
38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * TODO: do an URI lookup on the reference
38165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
38175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((resource != NULL) && (!xmlNoNetExists((const char *)resource))) {
38185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *tmp = NULL;
38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((ctxt != NULL) && (ctxt->catalogs != NULL) &&
38215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		((pref == XML_CATA_ALLOW_ALL) ||
38225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 (pref == XML_CATA_ALLOW_DOCUMENT))) {
38235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp = xmlCatalogLocalResolveURI(ctxt->catalogs, resource);
38245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
38255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((tmp == NULL) &&
38265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		((pref == XML_CATA_ALLOW_ALL) ||
38275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (pref == XML_CATA_ALLOW_GLOBAL))) {
38285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp = xmlCatalogResolveURI(resource);
38295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
38305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (tmp != NULL) {
38325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(resource);
38335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		resource = tmp;
38345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
38355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
38365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return resource;
38395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
38425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
38445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDefaultExternalEntityLoader:
38455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URL:  the URL for the entity to load
38465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ID:  the System ID for the entity to load
38475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the context in which the entity is called or NULL
38485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
38495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * By default we don't load external entitites, yet.
38505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
38515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a new allocated xmlParserInputPtr, or NULL.
38525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
38535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlParserInputPtr
38545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDefaultExternalEntityLoader(const char *URL, const char *ID,
38555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               xmlParserCtxtPtr ctxt)
38565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
38575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputPtr ret = NULL;
38585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *resource = NULL;
38595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_EXTERNAL_ENTITIES
38615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext,
38625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "xmlDefaultExternalEntityLoader(%s, xxx)\n", URL);
38635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
38645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->options & XML_PARSE_NONET)) {
38655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int options = ctxt->options;
38665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->options -= XML_PARSE_NONET;
38685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt);
38695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->options = options;
38705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ret);
38715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
38725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_CATALOG_ENABLED
38735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resource = xmlResolveResourceFromCatalog(URL, ID, ctxt);
38745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
38755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (resource == NULL)
38775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        resource = (xmlChar *) URL;
38785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (resource == NULL) {
38805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ID == NULL)
38815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ID = "NULL";
38825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        __xmlLoaderErr(ctxt, "failed to load external entity \"%s\"\n", ID);
38835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
38845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
38855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlNewInputFromFile(ctxt, (const char *) resource);
38865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((resource != NULL) && (resource != (xmlChar *) URL))
38875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(resource);
38885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
38895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlExternalEntityLoader xmlCurrentExternalEntityLoader =
38925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       xmlDefaultExternalEntityLoader;
38935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
38955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSetExternalEntityLoader:
38965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @f:  the new entity resolver function
38975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
38985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Changes the defaultexternal entity resolver function for the application
38995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
39005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
39015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSetExternalEntityLoader(xmlExternalEntityLoader f) {
39025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCurrentExternalEntityLoader = f;
39035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
39065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetExternalEntityLoader:
39075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
39085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get the default external entity resolver function for the application
39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
39105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the xmlExternalEntityLoader function pointer
39115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
39125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlExternalEntityLoader
39135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetExternalEntityLoader(void) {
39145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlCurrentExternalEntityLoader);
39155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
39185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlLoadExternalEntity:
39195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URL:  the URL for the entity to load
39205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ID:  the Public ID for the entity to load
39215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the context in which the entity is called or NULL
39225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
39235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Load an external entity, note that the use of this function for
39245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * unparsed entities may generate problems
39255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
39265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the xmlParserInputPtr or NULL
39275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
39285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserInputPtr
39295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlLoadExternalEntity(const char *URL, const char *ID,
39305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      xmlParserCtxtPtr ctxt) {
39315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((URL != NULL) && (xmlNoNetExists(URL) == 0)) {
39325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	char *canonicFilename;
39335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlParserInputPtr ret;
39345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	canonicFilename = (char *) xmlCanonicPath((const xmlChar *) URL);
39365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (canonicFilename == NULL) {
39375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlIOErrMemory("building canonical path\n");
39385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
39395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
39405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlCurrentExternalEntityLoader(canonicFilename, ID, ctxt);
39425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(canonicFilename);
39435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ret);
39445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
39455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlCurrentExternalEntityLoader(URL, ID, ctxt));
39465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
39495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
39505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		Disabling Network access				*
39515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
39525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
39535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
39555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNoNetExternalEntityLoader:
39565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URL:  the URL for the entity to load
39575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ID:  the System ID for the entity to load
39585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the context in which the entity is called or NULL
39595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
39605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A specific entity loader disabling network accesses, though still
39615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * allowing local catalog accesses for resolution.
39625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
39635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a new allocated xmlParserInputPtr, or NULL.
39645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
39655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserInputPtr
39665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNoNetExternalEntityLoader(const char *URL, const char *ID,
39675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             xmlParserCtxtPtr ctxt) {
39685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputPtr input = NULL;
39695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *resource = NULL;
39705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_CATALOG_ENABLED
39725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resource = xmlResolveResourceFromCatalog(URL, ID, ctxt);
39735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
39745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (resource == NULL)
39765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	resource = (xmlChar *) URL;
39775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (resource != NULL) {
39795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((!xmlStrncasecmp(BAD_CAST resource, BAD_CAST "ftp://", 6)) ||
39805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (!xmlStrncasecmp(BAD_CAST resource, BAD_CAST "http://", 7))) {
39815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlIOErr(XML_IO_NETWORK_ATTEMPT, (const char *) resource);
39825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (resource != (xmlChar *) URL)
39835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(resource);
39845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
39855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
39865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
39875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input = xmlDefaultExternalEntityLoader((const char *) resource, ID, ctxt);
39885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (resource != (xmlChar *) URL)
39895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(resource);
39905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(input);
39915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define bottom_xmlIO
39945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "elfgcchack.h"
3995