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