summaryrefslogtreecommitdiff
path: root/expat/xmlwf/xmlfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'expat/xmlwf/xmlfile.c')
-rw-r--r--expat/xmlwf/xmlfile.c202
1 files changed, 87 insertions, 115 deletions
diff --git a/expat/xmlwf/xmlfile.c b/expat/xmlwf/xmlfile.c
index 922e18b0b..2f769aa89 100644
--- a/expat/xmlwf/xmlfile.c
+++ b/expat/xmlwf/xmlfile.c
@@ -1,33 +1,5 @@
-/*
- __ __ _
- ___\ \/ /_ __ __ _| |_
- / _ \\ /| '_ \ / _` | __|
- | __// \| |_) | (_| | |_
- \___/_/\_\ .__/ \__,_|\__|
- |_| XML parser
-
- Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
- Copyright (c) 2000-2017 Expat development team
- Licensed under the MIT license:
-
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- "Software"), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to permit
- persons to whom the Software is furnished to do so, subject to the
- following conditions:
-
- The above copyright notice and this permission notice shall be included
- in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
- NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- USE OR OTHER DEALINGS IN THE SOFTWARE.
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+ See the file COPYING for copying permission.
*/
#include <stdio.h>
@@ -36,104 +8,119 @@
#include <string.h>
#include <fcntl.h>
-#ifdef _WIN32
-# include "winconfig.h"
+#ifdef WIN32
+#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)
-# include <expat_config.h>
-#endif /* ndef _WIN32 */
+#include <expat_config.h>
+#endif /* ndef WIN32 */
#include "expat.h"
-#include "internal.h" /* for UNUSED_P only */
+#include "internal.h" /* for UNUSED_P only */
#include "xmlfile.h"
#include "xmltchar.h"
#include "filemap.h"
-#if defined(_MSC_VER)
-# include <io.h>
+#if (defined(_MSC_VER) || (defined(__WATCOMC__) && !defined(__LINUX__)))
+#include <io.h>
+#endif
+
+#if defined(__amigaos__) && defined(__USE_INLINE__)
+#include <proto/expat.h>
#endif
#ifdef HAVE_UNISTD_H
-# include <unistd.h>
+#include <unistd.h>
#endif
#ifndef O_BINARY
-# ifdef _O_BINARY
-# define O_BINARY _O_BINARY
-# else
-# define O_BINARY 0
-# endif
+#ifdef _O_BINARY
+#define O_BINARY _O_BINARY
+#else
+#define O_BINARY 0
+#endif
#endif
#ifdef _DEBUG
-# define READ_SIZE 16
+#define READ_SIZE 16
#else
-# define READ_SIZE (1024 * 8)
+#define READ_SIZE (1024*8)
#endif
+
typedef struct {
XML_Parser parser;
int *retPtr;
} PROCESS_ARGS;
-static int processStream(const XML_Char *filename, XML_Parser parser);
-
static void
-reportError(XML_Parser parser, const XML_Char *filename) {
+reportError(XML_Parser parser, const XML_Char *filename)
+{
enum XML_Error code = XML_GetErrorCode(parser);
const XML_Char *message = XML_ErrorString(code);
if (message)
- ftprintf(stdout,
- T("%s") T(":%") T(XML_FMT_INT_MOD) T("u") T(":%")
- T(XML_FMT_INT_MOD) T("u") T(": %s\n"),
- filename, XML_GetErrorLineNumber(parser),
- XML_GetErrorColumnNumber(parser), message);
+ ftprintf(stdout, T("%s:%" XML_FMT_INT_MOD "u:%" XML_FMT_INT_MOD "u: %s\n"),
+ filename,
+ XML_GetErrorLineNumber(parser),
+ XML_GetErrorColumnNumber(parser),
+ message);
else
ftprintf(stderr, T("%s: (unknown message %d)\n"), filename, code);
}
-
+
/* This implementation will give problems on files larger than INT_MAX. */
static void
-processFile(const void *data, size_t size, const XML_Char *filename,
- void *args) {
+processFile(const void *data, size_t size,
+ const XML_Char *filename, void *args)
+{
XML_Parser parser = ((PROCESS_ARGS *)args)->parser;
int *retPtr = ((PROCESS_ARGS *)args)->retPtr;
if (XML_Parse(parser, (const char *)data, (int)size, 1) == XML_STATUS_ERROR) {
reportError(parser, filename);
*retPtr = 0;
- } else
+ }
+ else
*retPtr = 1;
}
-#if defined(_WIN32)
+#if (defined(WIN32) || defined(__WATCOMC__))
static int
-isAsciiLetter(XML_Char c) {
+isAsciiLetter(XML_Char c)
+{
return (T('a') <= c && c <= T('z')) || (T('A') <= c && c <= T('Z'));
}
-#endif /* _WIN32 */
+#endif /* WIN32 */
static const XML_Char *
resolveSystemId(const XML_Char *base, const XML_Char *systemId,
- XML_Char **toFree) {
+ XML_Char **toFree)
+{
XML_Char *s;
*toFree = 0;
- if (! base || *systemId == T('/')
-#if defined(_WIN32)
+ if (!base
+ || *systemId == T('/')
+#if (defined(WIN32) || defined(__WATCOMC__))
|| *systemId == T('\\')
|| (isAsciiLetter(systemId[0]) && systemId[1] == T(':'))
#endif
- )
+ )
return systemId;
*toFree = (XML_Char *)malloc((tcslen(base) + tcslen(systemId) + 2)
* sizeof(XML_Char));
- if (! *toFree)
+ if (!*toFree)
return systemId;
tcscpy(*toFree, base);
s = *toFree;
if (tcsrchr(s, T('/')))
s = tcsrchr(s, T('/')) + 1;
-#if defined(_WIN32)
+#if (defined(WIN32) || defined(__WATCOMC__))
if (tcsrchr(s, T('\\')))
s = tcsrchr(s, T('\\')) + 1;
#endif
@@ -142,45 +129,36 @@ resolveSystemId(const XML_Char *base, const XML_Char *systemId,
}
static int
-externalEntityRefFilemap(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
+externalEntityRefFilemap(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *UNUSED_P(publicId))
+{
int result;
XML_Char *s;
const XML_Char *filename;
XML_Parser entParser = XML_ExternalEntityParserCreate(parser, context, 0);
- int filemapRes;
PROCESS_ARGS args;
- UNUSED_P(publicId);
args.retPtr = &result;
args.parser = entParser;
filename = resolveSystemId(base, systemId, &s);
XML_SetBase(entParser, filename);
- filemapRes = filemap(filename, processFile, &args);
- switch (filemapRes) {
- case 0:
+ if (!filemap(filename, processFile, &args))
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);
XML_ParserFree(entParser);
return result;
}
static int
-processStream(const XML_Char *filename, XML_Parser parser) {
+processStream(const XML_Char *filename, XML_Parser parser)
+{
/* passing NULL for filename means read intput from stdin */
- int fd = 0; /* 0 is the fileno for stdin */
+ int fd = 0; /* 0 is the fileno for stdin */
if (filename != NULL) {
- fd = topen(filename, O_BINARY | O_RDONLY);
+ fd = topen(filename, O_BINARY|O_RDONLY);
if (fd < 0) {
tperror(filename);
return 0;
@@ -189,22 +167,22 @@ processStream(const XML_Char *filename, XML_Parser parser) {
for (;;) {
int nread;
char *buf = (char *)XML_GetBuffer(parser, READ_SIZE);
- if (! buf) {
+ if (!buf) {
if (filename != NULL)
close(fd);
ftprintf(stderr, T("%s: out of memory\n"),
- filename != NULL ? filename : T("xmlwf"));
+ filename != NULL ? filename : "xmlwf");
return 0;
}
nread = read(fd, buf, READ_SIZE);
if (nread < 0) {
- tperror(filename != NULL ? filename : T("STDIN"));
+ tperror(filename != NULL ? filename : "STDIN");
if (filename != NULL)
close(fd);
return 0;
}
if (XML_ParseBuffer(parser, nread, nread == 0) == XML_STATUS_ERROR) {
- reportError(parser, filename != NULL ? filename : T("STDIN"));
+ reportError(parser, filename != NULL ? filename : "STDIN");
if (filename != NULL)
close(fd);
return 0;
@@ -212,22 +190,23 @@ processStream(const XML_Char *filename, XML_Parser parser) {
if (nread == 0) {
if (filename != NULL)
close(fd);
- break;
- ;
+ break;;
}
}
return 1;
}
static int
-externalEntityRefStream(XML_Parser parser, const XML_Char *context,
- const XML_Char *base, const XML_Char *systemId,
- const XML_Char *publicId) {
+externalEntityRefStream(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *UNUSED_P(publicId))
+{
XML_Char *s;
const XML_Char *filename;
int ret;
XML_Parser entParser = XML_ExternalEntityParserCreate(parser, context, 0);
- UNUSED_P(publicId);
filename = resolveSystemId(base, systemId, &s);
XML_SetBase(entParser, filename);
ret = processStream(filename, entParser);
@@ -237,37 +216,30 @@ externalEntityRefStream(XML_Parser parser, const XML_Char *context,
}
int
-XML_ProcessFile(XML_Parser parser, const XML_Char *filename, unsigned flags) {
+XML_ProcessFile(XML_Parser parser,
+ const XML_Char *filename,
+ unsigned flags)
+{
int result;
- if (! XML_SetBase(parser, filename)) {
+ if (!XML_SetBase(parser, filename)) {
ftprintf(stderr, T("%s: out of memory"), filename);
exit(1);
}
if (flags & XML_EXTERNAL_ENTITIES)
- XML_SetExternalEntityRefHandler(parser, (flags & XML_MAP_FILE)
- ? externalEntityRefFilemap
- : externalEntityRefStream);
+ XML_SetExternalEntityRefHandler(parser,
+ (flags & XML_MAP_FILE)
+ ? externalEntityRefFilemap
+ : externalEntityRefStream);
if (flags & XML_MAP_FILE) {
- int filemapRes;
PROCESS_ARGS args;
args.retPtr = &result;
args.parser = parser;
- filemapRes = filemap(filename, processFile, &args);
- switch (filemapRes) {
- case 0:
+ if (!filemap(filename, processFile, &args))
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);
return result;
}