version 1.1.1.1.2.2, 2017/06/21 16:56:33 |
version 1.1.1.2, 2017/02/04 10:15:57 |
|
|
#include <string.h> |
#include <string.h> |
#include <fcntl.h> |
#include <fcntl.h> |
|
|
#ifdef _WIN32 |
#ifdef WIN32 |
#include "winconfig.h" |
#include "winconfig.h" |
|
#elif defined(MACOS_CLASSIC) |
|
#include "macconfig.h" |
|
#elif defined(__amigaos__) |
|
#include "amigaconfig.h" |
|
#elif defined(__WATCOMC__) |
|
#include "watcomconfig.h" |
#elif defined(HAVE_EXPAT_CONFIG_H) |
#elif defined(HAVE_EXPAT_CONFIG_H) |
#include <expat_config.h> |
#include <expat_config.h> |
#endif /* ndef _WIN32 */ |
#endif /* ndef WIN32 */ |
|
|
#include "expat.h" |
#include "expat.h" |
#include "internal.h" /* for UNUSED_P only */ |
#include "internal.h" /* for UNUSED_P only */ |
|
|
#include "xmltchar.h" |
#include "xmltchar.h" |
#include "filemap.h" |
#include "filemap.h" |
|
|
#if defined(_MSC_VER) |
#if (defined(_MSC_VER) || (defined(__WATCOMC__) && !defined(__LINUX__))) |
#include <io.h> |
#include <io.h> |
#endif |
#endif |
|
|
|
#if defined(__amigaos__) && defined(__USE_INLINE__) |
|
#include <proto/expat.h> |
|
#endif |
|
|
#ifdef HAVE_UNISTD_H |
#ifdef HAVE_UNISTD_H |
#include <unistd.h> |
#include <unistd.h> |
#endif |
#endif |
|
|
int *retPtr; |
int *retPtr; |
} PROCESS_ARGS; |
} PROCESS_ARGS; |
|
|
static int |
|
processStream(const XML_Char *filename, XML_Parser parser); |
|
|
|
static void |
static void |
reportError(XML_Parser parser, const XML_Char *filename) |
reportError(XML_Parser parser, const XML_Char *filename) |
{ |
{ |
Line 81 processFile(const void *data, size_t siz |
|
Line 88 processFile(const void *data, size_t siz |
|
*retPtr = 1; |
*retPtr = 1; |
} |
} |
|
|
#if defined(_WIN32) |
#if (defined(WIN32) || defined(__WATCOMC__)) |
|
|
static int |
static int |
isAsciiLetter(XML_Char c) |
isAsciiLetter(XML_Char c) |
Line 89 isAsciiLetter(XML_Char c) |
|
Line 96 isAsciiLetter(XML_Char c) |
|
return (T('a') <= c && c <= T('z')) || (T('A') <= c && c <= T('Z')); |
return (T('a') <= c && c <= T('z')) || (T('A') <= c && c <= T('Z')); |
} |
} |
|
|
#endif /* _WIN32 */ |
#endif /* WIN32 */ |
|
|
static const XML_Char * |
static const XML_Char * |
resolveSystemId(const XML_Char *base, const XML_Char *systemId, |
resolveSystemId(const XML_Char *base, const XML_Char *systemId, |
Line 99 resolveSystemId(const XML_Char *base, co |
|
Line 106 resolveSystemId(const XML_Char *base, co |
|
*toFree = 0; |
*toFree = 0; |
if (!base |
if (!base |
|| *systemId == T('/') |
|| *systemId == T('/') |
#if defined(_WIN32) |
#if (defined(WIN32) || defined(__WATCOMC__)) |
|| *systemId == T('\\') |
|| *systemId == T('\\') |
|| (isAsciiLetter(systemId[0]) && systemId[1] == T(':')) |
|| (isAsciiLetter(systemId[0]) && systemId[1] == T(':')) |
#endif |
#endif |
Line 113 resolveSystemId(const XML_Char *base, co |
|
Line 120 resolveSystemId(const XML_Char *base, co |
|
s = *toFree; |
s = *toFree; |
if (tcsrchr(s, T('/'))) |
if (tcsrchr(s, T('/'))) |
s = tcsrchr(s, T('/')) + 1; |
s = tcsrchr(s, T('/')) + 1; |
#if defined(_WIN32) |
#if (defined(WIN32) || defined(__WATCOMC__)) |
if (tcsrchr(s, T('\\'))) |
if (tcsrchr(s, T('\\'))) |
s = tcsrchr(s, T('\\')) + 1; |
s = tcsrchr(s, T('\\')) + 1; |
#endif |
#endif |
Line 132 externalEntityRefFilemap(XML_Parser pars |
|
Line 139 externalEntityRefFilemap(XML_Parser pars |
|
XML_Char *s; |
XML_Char *s; |
const XML_Char *filename; |
const XML_Char *filename; |
XML_Parser entParser = XML_ExternalEntityParserCreate(parser, context, 0); |
XML_Parser entParser = XML_ExternalEntityParserCreate(parser, context, 0); |
int filemapRes; |
|
PROCESS_ARGS args; |
PROCESS_ARGS args; |
args.retPtr = &result; |
args.retPtr = &result; |
args.parser = entParser; |
args.parser = entParser; |
filename = resolveSystemId(base, systemId, &s); |
filename = resolveSystemId(base, systemId, &s); |
XML_SetBase(entParser, filename); |
XML_SetBase(entParser, filename); |
filemapRes = filemap(filename, processFile, &args); |
if (!filemap(filename, processFile, &args)) |
switch (filemapRes) { |
|
case 0: |
|
result = 0; |
result = 0; |
break; |
|
case 2: |
|
ftprintf(stderr, T("%s: file too large for memory-mapping") |
|
T(", switching to streaming\n"), filename); |
|
result = processStream(filename, entParser); |
|
break; |
|
} |
|
free(s); |
free(s); |
XML_ParserFree(entParser); |
XML_ParserFree(entParser); |
return result; |
return result; |
Line 236 XML_ProcessFile(XML_Parser parser, |
|
Line 233 XML_ProcessFile(XML_Parser parser, |
|
? externalEntityRefFilemap |
? externalEntityRefFilemap |
: externalEntityRefStream); |
: externalEntityRefStream); |
if (flags & XML_MAP_FILE) { |
if (flags & XML_MAP_FILE) { |
int filemapRes; |
|
PROCESS_ARGS args; |
PROCESS_ARGS args; |
args.retPtr = &result; |
args.retPtr = &result; |
args.parser = parser; |
args.parser = parser; |
filemapRes = filemap(filename, processFile, &args); |
if (!filemap(filename, processFile, &args)) |
switch (filemapRes) { |
|
case 0: |
|
result = 0; |
result = 0; |
break; |
|
case 2: |
|
ftprintf(stderr, T("%s: file too large for memory-mapping") |
|
T(", switching to streaming\n"), filename); |
|
result = processStream(filename, parser); |
|
break; |
|
} |
|
} |
} |
else |
else |
result = processStream(filename, parser); |
result = processStream(filename, parser); |