diff options
Diffstat (limited to 'xmlIO.c')
-rw-r--r-- | xmlIO.c | 247 |
1 files changed, 73 insertions, 174 deletions
@@ -12,6 +12,7 @@ #include "libxml.h" #include <string.h> +#include <stddef.h> #ifdef HAVE_ERRNO_H #include <errno.h> #endif @@ -32,14 +33,15 @@ #ifdef HAVE_STDLIB_H #include <stdlib.h> #endif -#ifdef HAVE_ZLIB_H +#ifdef LIBXML_ZLIB_ENABLED #include <zlib.h> #endif -#ifdef HAVE_LZMA_H +#ifdef LIBXML_LZMA_ENABLED #include <lzma.h> #endif -#if defined(WIN32) || defined(_WIN32) +#if defined(_WIN32) && !defined(__CYGWIN__) +#define WIN32_LEAN_AND_MEAN #include <windows.h> #endif @@ -47,38 +49,14 @@ #include <winnls.h> /* for CP_UTF8 */ #endif -/* Figure a portable way to know if a file is a directory. */ -#ifndef HAVE_STAT -# ifdef HAVE__STAT - /* MS C library seems to define stat and _stat. The definition - is identical. Still, mapping them to each other causes a warning. */ -# ifndef _MSC_VER -# define stat(x,y) _stat(x,y) -# endif -# define HAVE_STAT -# endif -#else -# ifdef HAVE__STAT -# if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) -# define stat _stat -# endif -# endif -#endif -#ifdef HAVE_STAT -# ifndef S_ISDIR -# ifdef _S_ISDIR -# define S_ISDIR(x) _S_ISDIR(x) -# else -# ifdef S_IFDIR -# ifndef S_IFMT -# ifdef _S_IFMT -# define S_IFMT _S_IFMT -# endif -# endif -# ifdef S_IFMT -# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) -# endif -# endif +#ifndef S_ISDIR +# ifdef _S_ISDIR +# define S_ISDIR(x) _S_ISDIR(x) +# elif defined(S_IFDIR) +# ifdef S_IFMT +# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) +# elif defined(_S_IFMT) +# define S_ISDIR(m) (((m) & _S_IFMT) == S_IFDIR) # endif # endif #endif @@ -619,7 +597,7 @@ xmlWrapOpenUtf8(const char *path,int mode) return fd; } -#ifdef HAVE_ZLIB_H +#ifdef LIBXML_ZLIB_ENABLED static gzFile xmlWrapGzOpenUtf8(const char *path, const char *mode) { @@ -656,99 +634,19 @@ xmlWrapGzOpenUtf8(const char *path, const char *mode) * */ static int -xmlWrapStatUtf8(const char *path,struct stat *info) -{ -#ifdef HAVE_STAT +xmlWrapStatUtf8(const char *path, struct _stat *info) { int retval = -1; wchar_t *wPath; wPath = __xmlIOWin32UTF8ToWChar(path); - if (wPath) - { - retval = _wstat(wPath,info); + if (wPath) { + retval = _wstat(wPath, info); xmlFree(wPath); } /* maybe path in native encoding */ if(retval < 0) - retval = stat(path,info); + retval = _stat(path, info); return retval; -#else - return -1; -#endif -} - -/** - * xmlWrapOpenNative: - * @path: the path - * @mode: type of access (0 - read, 1 - write) - * - * function opens the file specified by @path - * - */ -static FILE* -xmlWrapOpenNative(const char *path,int mode) -{ - return fopen(path,mode ? "wb" : "rb"); -} - -/** - * xmlWrapStatNative: - * @path: the path - * @info: structure that stores results - * - * function obtains information about the file or directory - * - */ -static int -xmlWrapStatNative(const char *path,struct stat *info) -{ -#ifdef HAVE_STAT - return stat(path,info); -#else - return -1; -#endif -} - -typedef int (* xmlWrapStatFunc) (const char *f, struct stat *s); -static xmlWrapStatFunc xmlWrapStat = xmlWrapStatNative; -typedef FILE* (* xmlWrapOpenFunc)(const char *f,int mode); -static xmlWrapOpenFunc xmlWrapOpen = xmlWrapOpenNative; -#ifdef HAVE_ZLIB_H -typedef gzFile (* xmlWrapGzOpenFunc) (const char *f, const char *mode); -static xmlWrapGzOpenFunc xmlWrapGzOpen = gzopen; -#endif -/** - * xmlInitPlatformSpecificIo: - * - * Initialize platform specific features. - */ -static void -xmlInitPlatformSpecificIo(void) -{ - static int xmlPlatformIoInitialized = 0; - OSVERSIONINFO osvi; - - if(xmlPlatformIoInitialized) - return; - - osvi.dwOSVersionInfoSize = sizeof(osvi); - - if(GetVersionEx(&osvi) && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)) { - xmlWrapStat = xmlWrapStatUtf8; - xmlWrapOpen = xmlWrapOpenUtf8; -#ifdef HAVE_ZLIB_H - xmlWrapGzOpen = xmlWrapGzOpenUtf8; -#endif - } else { - xmlWrapStat = xmlWrapStatNative; - xmlWrapOpen = xmlWrapOpenNative; -#ifdef HAVE_ZLIB_H - xmlWrapGzOpen = gzopen; -#endif - } - - xmlPlatformIoInitialized = 1; - return; } #endif @@ -771,8 +669,12 @@ int xmlCheckFilename (const char *path) { #ifdef HAVE_STAT +#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) + struct _stat stat_buffer; +#else struct stat stat_buffer; #endif +#endif if (path == NULL) return(0); @@ -786,7 +688,7 @@ xmlCheckFilename (const char *path) (path[3] == '\\') ) return 1; - if (xmlWrapStat(path, &stat_buffer) == -1) + if (xmlWrapStatUtf8(path, &stat_buffer) == -1) return 0; #else if (stat(path, &stat_buffer) == -1) @@ -801,14 +703,16 @@ xmlCheckFilename (const char *path) } /** - * xmlNop: + * xmlInputReadCallbackNop: * - * No Operation function, does nothing, no input + * No Operation xmlInputReadCallback function, does nothing. * * Returns zero */ int -xmlNop(void) { +xmlInputReadCallbackNop(void *context ATTRIBUTE_UNUSED, + char *buffer ATTRIBUTE_UNUSED, + int len ATTRIBUTE_UNUSED) { return(0); } @@ -826,7 +730,7 @@ static int xmlFdRead (void * context, char * buffer, int len) { int ret; - ret = read((int) (long) context, &buffer[0], len); + ret = read((int) (ptrdiff_t) context, &buffer[0], len); if (ret < 0) xmlIOErr(0, "read()"); return(ret); } @@ -847,7 +751,7 @@ xmlFdWrite (void * context, const char * buffer, int len) { int ret = 0; if (len > 0) { - ret = write((int) (long) context, &buffer[0], len); + ret = write((int) (ptrdiff_t) context, &buffer[0], len); if (ret < 0) xmlIOErr(0, "write()"); } return(ret); @@ -865,7 +769,7 @@ xmlFdWrite (void * context, const char * buffer, int len) { static int xmlFdClose (void * context) { int ret; - ret = close((int) (long) context); + ret = close((int) (ptrdiff_t) context); if (ret < 0) xmlIOErr(0, "close()"); return(ret); } @@ -926,11 +830,14 @@ xmlFileOpen_real (const char *filename) { #endif } + /* Do not check DDNAME on zOS ! */ +#if !defined(__MVS__) if (!xmlCheckFilename(path)) return(NULL); +#endif #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) - fd = xmlWrapOpen(path, 0); + fd = xmlWrapOpenUtf8(path, 0); #else fd = fopen(path, "r"); #endif /* WIN32 */ @@ -1003,12 +910,14 @@ xmlFileOpenW (const char *filename) { return(NULL); #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) - fd = xmlWrapOpen(path, 1); + fd = xmlWrapOpenUtf8(path, 1); +#elif(__MVS__) + fd = fopen(path, "w"); #else - fd = fopen(path, "wb"); + fd = fopen(path, "wb"); #endif /* WIN32 */ - if (fd == NULL) xmlIOErr(0, path); + if (fd == NULL) xmlIOErr(0, path); return((void *) fd); } #endif /* LIBXML_OUTPUT_ENABLED */ @@ -1129,7 +1038,7 @@ xmlBufferWrite (void * context, const char * buffer, int len) { } #endif -#ifdef HAVE_ZLIB_H +#ifdef LIBXML_ZLIB_ENABLED /************************************************************************ * * * I/O for compressed file accesses * @@ -1193,7 +1102,7 @@ xmlGzfileOpen_real (const char *filename) { return(NULL); #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) - fd = xmlWrapGzOpen(path, "rb"); + fd = xmlWrapGzOpenUtf8(path, "rb"); #else fd = gzopen(path, "rb"); #endif @@ -1270,7 +1179,7 @@ xmlGzfileOpenW (const char *filename, int compression) { return(NULL); #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) - fd = xmlWrapGzOpen(path, mode); + fd = xmlWrapGzOpenUtf8(path, mode); #else fd = gzopen(path, mode); #endif @@ -1286,7 +1195,7 @@ xmlGzfileOpenW (const char *filename, int compression) { * * Read @len bytes to @buffer from the compressed I/O channel. * - * Returns the number of bytes written + * Returns the number of bytes read. */ static int xmlGzfileRead (void * context, char * buffer, int len) { @@ -1332,7 +1241,7 @@ xmlGzfileClose (void * context) { if (ret < 0) xmlIOErr(0, "gzclose()"); return(ret); } -#endif /* HAVE_ZLIB_H */ +#endif /* LIBXML_ZLIB_ENABLED */ #ifdef LIBXML_LZMA_ENABLED /************************************************************************ @@ -1471,7 +1380,7 @@ typedef struct xmlIOHTTPWriteCtxt_ } xmlIOHTTPWriteCtxt, *xmlIOHTTPWriteCtxtPtr; -#ifdef HAVE_ZLIB_H +#ifdef LIBXML_ZLIB_ENABLED #define DFLT_WBITS ( -15 ) #define DFLT_MEM_LVL ( 8 ) @@ -1674,7 +1583,7 @@ xmlZMemBuffExtend( xmlZMemBuffPtr buff, size_t ext_amt ) { xmlStrPrintf(msg, 500, "xmlZMemBuffExtend: %s %lu bytes.\n", "Allocation failure extending output buffer to", - new_size ); + (unsigned long) new_size ); xmlIOErr(XML_IO_WRITE, (const char *) msg); } @@ -1799,7 +1708,7 @@ xmlZMemBuffGetContent( xmlZMemBuffPtr buff, char ** data_ref ) { return ( zlgth ); } #endif /* LIBXML_OUTPUT_ENABLED */ -#endif /* HAVE_ZLIB_H */ +#endif /* LIBXML_ZLIB_ENABLED */ #ifdef LIBXML_OUTPUT_ENABLED /** @@ -1818,7 +1727,7 @@ xmlFreeHTTPWriteCtxt( xmlIOHTTPWriteCtxtPtr ctxt ) if ( ctxt->doc_buff != NULL ) { -#ifdef HAVE_ZLIB_H +#ifdef LIBXML_ZLIB_ENABLED if ( ctxt->compression > 0 ) { xmlFreeZMemBuff( ctxt->doc_buff ); } @@ -1876,7 +1785,7 @@ xmlIOHTTPOpen (const char *filename) { */ void * -xmlIOHTTPOpenW(const char *post_uri, int compression) +xmlIOHTTPOpenW(const char *post_uri, int compression ATTRIBUTE_UNUSED) { xmlIOHTTPWriteCtxtPtr ctxt = NULL; @@ -1905,7 +1814,7 @@ xmlIOHTTPOpenW(const char *post_uri, int compression) * ** is being used to avoid pushing the data to disk and back. */ -#ifdef HAVE_ZLIB_H +#ifdef LIBXML_ZLIB_ENABLED if ((compression > 0) && (compression <= 9)) { ctxt->compression = compression; @@ -1985,7 +1894,7 @@ xmlIOHTTPWrite( void * context, const char * buffer, int len ) { /* Use gzwrite or fwrite as previously setup in the open call */ -#ifdef HAVE_ZLIB_H +#ifdef LIBXML_ZLIB_ENABLED if ( ctxt->compression > 0 ) len = xmlZMemBuffAppend( ctxt->doc_buff, buffer, len ); @@ -2049,7 +1958,7 @@ xmlIOHTTPCloseWrite( void * context, const char * http_mthd ) { /* Retrieve the content from the appropriate buffer */ -#ifdef HAVE_ZLIB_H +#ifdef LIBXML_ZLIB_ENABLED if ( ctxt->compression > 0 ) { content_lgth = xmlZMemBuffGetContent( ctxt->doc_buff, &http_content ); @@ -2318,16 +2227,12 @@ xmlRegisterDefaultInputCallbacks(void) { if (xmlInputCallbackInitialized) return; -#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) - xmlInitPlatformSpecificIo(); -#endif - xmlRegisterInputCallbacks(xmlFileMatch, xmlFileOpen, xmlFileRead, xmlFileClose); -#ifdef HAVE_ZLIB_H +#ifdef LIBXML_ZLIB_ENABLED xmlRegisterInputCallbacks(xmlGzfileMatch, xmlGzfileOpen, xmlGzfileRead, xmlGzfileClose); -#endif /* HAVE_ZLIB_H */ +#endif /* LIBXML_ZLIB_ENABLED */ #ifdef LIBXML_LZMA_ENABLED xmlRegisterInputCallbacks(xmlXzfileMatch, xmlXzfileOpen, xmlXzfileRead, xmlXzfileClose); @@ -2356,10 +2261,6 @@ xmlRegisterDefaultOutputCallbacks (void) { if (xmlOutputCallbackInitialized) return; -#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) - xmlInitPlatformSpecificIo(); -#endif - xmlRegisterOutputCallbacks(xmlFileMatch, xmlFileOpenW, xmlFileWrite, xmlFileClose); @@ -2373,7 +2274,7 @@ xmlRegisterDefaultOutputCallbacks (void) { uncompressed ones except opening if existing then closing and saving with same compression ratio ... a pain. -#ifdef HAVE_ZLIB_H +#ifdef LIBXML_ZLIB_ENABLED xmlRegisterOutputCallbacks(xmlGzfileMatch, xmlGzfileOpen, xmlGzfileWrite, xmlGzfileClose); #endif @@ -2663,7 +2564,7 @@ __xmlParserInputBufferCreateFilename(const char *URI, xmlCharEncoding enc) { ret->context = context; ret->readcallback = xmlInputCallbackTable[i].readcallback; ret->closecallback = xmlInputCallbackTable[i].closecallback; -#ifdef HAVE_ZLIB_H +#ifdef LIBXML_ZLIB_ENABLED if ((xmlInputCallbackTable[i].opencallback == xmlGzfileOpen) && (strcmp(URI, "-") != 0)) { #if defined(ZLIB_VERNUM) && ZLIB_VERNUM >= 0x1230 @@ -2727,7 +2628,7 @@ __xmlOutputBufferCreateFilename(const char *URI, int i = 0; void *context = NULL; char *unescaped = NULL; -#ifdef HAVE_ZLIB_H +#ifdef LIBXML_ZLIB_ENABLED int is_file_uri = 1; #endif @@ -2738,7 +2639,7 @@ __xmlOutputBufferCreateFilename(const char *URI, puri = xmlParseURI(URI); if (puri != NULL) { -#ifdef HAVE_ZLIB_H +#ifdef LIBXML_ZLIB_ENABLED if ((puri->scheme != NULL) && (!xmlStrEqual(BAD_CAST puri->scheme, BAD_CAST "file"))) is_file_uri = 0; @@ -2758,7 +2659,7 @@ __xmlOutputBufferCreateFilename(const char *URI, * try with an unescaped version of the URI */ if (unescaped != NULL) { -#ifdef HAVE_ZLIB_H +#ifdef LIBXML_ZLIB_ENABLED if ((compression > 0) && (compression <= 9) && (is_file_uri == 1)) { context = xmlGzfileOpenW(unescaped, compression); if (context != NULL) { @@ -2776,7 +2677,7 @@ __xmlOutputBufferCreateFilename(const char *URI, for (i = xmlOutputCallbackNr - 1;i >= 0;i--) { if ((xmlOutputCallbackTable[i].matchcallback != NULL) && (xmlOutputCallbackTable[i].matchcallback(unescaped) != 0)) { -#if defined(LIBXML_HTTP_ENABLED) && defined(HAVE_ZLIB_H) +#if defined(LIBXML_HTTP_ENABLED) && defined(LIBXML_ZLIB_ENABLED) /* Need to pass compression parameter into HTTP open calls */ if (xmlOutputCallbackTable[i].matchcallback == xmlIOHTTPMatch) context = xmlIOHTTPOpenW(unescaped, compression); @@ -2795,7 +2696,7 @@ __xmlOutputBufferCreateFilename(const char *URI, * filename */ if (context == NULL) { -#ifdef HAVE_ZLIB_H +#ifdef LIBXML_ZLIB_ENABLED if ((compression > 0) && (compression <= 9) && (is_file_uri == 1)) { context = xmlGzfileOpenW(URI, compression); if (context != NULL) { @@ -2812,7 +2713,7 @@ __xmlOutputBufferCreateFilename(const char *URI, for (i = xmlOutputCallbackNr - 1;i >= 0;i--) { if ((xmlOutputCallbackTable[i].matchcallback != NULL) && (xmlOutputCallbackTable[i].matchcallback(URI) != 0)) { -#if defined(LIBXML_HTTP_ENABLED) && defined(HAVE_ZLIB_H) +#if defined(LIBXML_HTTP_ENABLED) && defined(LIBXML_ZLIB_ENABLED) /* Need to pass compression parameter into HTTP open calls */ if (xmlOutputCallbackTable[i].matchcallback == xmlIOHTTPMatch) context = xmlIOHTTPOpenW(URI, compression); @@ -2942,10 +2843,8 @@ xmlOutputBufferCreateBuffer(xmlBufferPtr buffer, if (buffer == NULL) return(NULL); - ret = xmlOutputBufferCreateIO((xmlOutputWriteCallback) - xmlBufferWrite, - (xmlOutputCloseCallback) - NULL, (void *) buffer, encoder); + ret = xmlOutputBufferCreateIO(xmlBufferWrite, NULL, (void *) buffer, + encoder); return(ret); } @@ -3003,7 +2902,7 @@ xmlParserInputBufferCreateFd(int fd, xmlCharEncoding enc) { ret = xmlAllocParserInputBuffer(enc); if (ret != NULL) { - ret->context = (void *) (long) fd; + ret->context = (void *) (ptrdiff_t) fd; ret->readcallback = xmlFdRead; ret->closecallback = xmlFdClose; } @@ -3027,13 +2926,13 @@ xmlParserInputBufferCreateMem(const char *mem, int size, xmlCharEncoding enc) { xmlParserInputBufferPtr ret; int errcode; - if (size <= 0) return(NULL); + if (size < 0) return(NULL); if (mem == NULL) return(NULL); ret = xmlAllocParserInputBuffer(enc); if (ret != NULL) { ret->context = (void *) mem; - ret->readcallback = (xmlInputReadCallback) xmlNop; + ret->readcallback = xmlInputReadCallbackNop; ret->closecallback = NULL; errcode = xmlBufAdd(ret->buffer, (const xmlChar *) mem, size); if (errcode != 0) { @@ -3063,7 +2962,7 @@ xmlParserInputBufferCreateStatic(const char *mem, int size, xmlCharEncoding enc) { xmlParserInputBufferPtr ret; - if (size <= 0) return(NULL); + if (size < 0) return(NULL); if (mem == NULL) return(NULL); ret = (xmlParserInputBufferPtr) xmlMalloc(sizeof(xmlParserInputBuffer)); @@ -3109,7 +3008,7 @@ xmlOutputBufferCreateFd(int fd, xmlCharEncodingHandlerPtr encoder) { ret = xmlAllocOutputBufferInternal(encoder); if (ret != NULL) { - ret->context = (void *) (long) fd; + ret->context = (void *) (ptrdiff_t) fd; ret->writecallback = xmlFdWrite; ret->closecallback = NULL; } @@ -3258,7 +3157,7 @@ xmlParserInputBufferPush(xmlParserInputBufferPtr in, * convert as much as possible to the parser reading buffer. */ use = xmlBufUse(in->raw); - nbchars = xmlCharEncInput(in, 1); + nbchars = xmlCharEncInput(in, 0); if (nbchars < 0) { xmlIOErr(XML_IO_ENCODER, NULL); in->error = XML_IO_ENCODER; @@ -3374,7 +3273,7 @@ xmlParserInputBufferGrow(xmlParserInputBufferPtr in, int len) { * convert as much as possible to the parser reading buffer. */ use = xmlBufUse(in->raw); - nbchars = xmlCharEncInput(in, 1); + nbchars = xmlCharEncInput(in, 0); if (nbchars < 0) { xmlIOErr(XML_IO_ENCODER, NULL); in->error = XML_IO_ENCODER; @@ -3823,7 +3722,7 @@ xmlParserGetDirectory(const char *filename) { if (filename == NULL) return(NULL); -#if defined(WIN32) && !defined(__CYGWIN__) +#if defined(_WIN32) && !defined(__CYGWIN__) # define IS_XMLPGD_SEP(ch) ((ch=='/')||(ch=='\\')) #else # define IS_XMLPGD_SEP(ch) (ch=='/') |