Annotation of embedaddon/expat/xmlwf/xmlfile.c, revision 1.1
1.1 ! misho 1: /* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
! 2: See the file COPYING for copying permission.
! 3: */
! 4:
! 5: #include <stdio.h>
! 6: #include <stdlib.h>
! 7: #include <stddef.h>
! 8: #include <string.h>
! 9: #include <fcntl.h>
! 10:
! 11: #ifdef COMPILED_FROM_DSP
! 12: #include "winconfig.h"
! 13: #elif defined(MACOS_CLASSIC)
! 14: #include "macconfig.h"
! 15: #elif defined(__amigaos__)
! 16: #include "amigaconfig.h"
! 17: #elif defined(__WATCOMC__)
! 18: #include "watcomconfig.h"
! 19: #elif defined(HAVE_EXPAT_CONFIG_H)
! 20: #include <expat_config.h>
! 21: #endif /* ndef COMPILED_FROM_DSP */
! 22:
! 23: #include "expat.h"
! 24: #include "xmlfile.h"
! 25: #include "xmltchar.h"
! 26: #include "filemap.h"
! 27:
! 28: #if (defined(_MSC_VER) || (defined(__WATCOMC__) && !defined(__LINUX__)))
! 29: #include <io.h>
! 30: #endif
! 31:
! 32: #if defined(__amigaos__) && defined(__USE_INLINE__)
! 33: #include <proto/expat.h>
! 34: #endif
! 35:
! 36: #ifdef HAVE_UNISTD_H
! 37: #include <unistd.h>
! 38: #endif
! 39:
! 40: #ifndef O_BINARY
! 41: #ifdef _O_BINARY
! 42: #define O_BINARY _O_BINARY
! 43: #else
! 44: #define O_BINARY 0
! 45: #endif
! 46: #endif
! 47:
! 48: #ifdef _DEBUG
! 49: #define READ_SIZE 16
! 50: #else
! 51: #define READ_SIZE (1024*8)
! 52: #endif
! 53:
! 54:
! 55: typedef struct {
! 56: XML_Parser parser;
! 57: int *retPtr;
! 58: } PROCESS_ARGS;
! 59:
! 60: static void
! 61: reportError(XML_Parser parser, const XML_Char *filename)
! 62: {
! 63: enum XML_Error code = XML_GetErrorCode(parser);
! 64: const XML_Char *message = XML_ErrorString(code);
! 65: if (message)
! 66: ftprintf(stdout, T("%s:%" XML_FMT_INT_MOD "u:%" XML_FMT_INT_MOD "u: %s\n"),
! 67: filename,
! 68: XML_GetErrorLineNumber(parser),
! 69: XML_GetErrorColumnNumber(parser),
! 70: message);
! 71: else
! 72: ftprintf(stderr, T("%s: (unknown message %d)\n"), filename, code);
! 73: }
! 74:
! 75: /* This implementation will give problems on files larger than INT_MAX. */
! 76: static void
! 77: processFile(const void *data, size_t size,
! 78: const XML_Char *filename, void *args)
! 79: {
! 80: XML_Parser parser = ((PROCESS_ARGS *)args)->parser;
! 81: int *retPtr = ((PROCESS_ARGS *)args)->retPtr;
! 82: if (XML_Parse(parser, (const char *)data, (int)size, 1) == XML_STATUS_ERROR) {
! 83: reportError(parser, filename);
! 84: *retPtr = 0;
! 85: }
! 86: else
! 87: *retPtr = 1;
! 88: }
! 89:
! 90: #if (defined(WIN32) || defined(__WATCOMC__))
! 91:
! 92: static int
! 93: isAsciiLetter(XML_Char c)
! 94: {
! 95: return (T('a') <= c && c <= T('z')) || (T('A') <= c && c <= T('Z'));
! 96: }
! 97:
! 98: #endif /* WIN32 */
! 99:
! 100: static const XML_Char *
! 101: resolveSystemId(const XML_Char *base, const XML_Char *systemId,
! 102: XML_Char **toFree)
! 103: {
! 104: XML_Char *s;
! 105: *toFree = 0;
! 106: if (!base
! 107: || *systemId == T('/')
! 108: #if (defined(WIN32) || defined(__WATCOMC__))
! 109: || *systemId == T('\\')
! 110: || (isAsciiLetter(systemId[0]) && systemId[1] == T(':'))
! 111: #endif
! 112: )
! 113: return systemId;
! 114: *toFree = (XML_Char *)malloc((tcslen(base) + tcslen(systemId) + 2)
! 115: * sizeof(XML_Char));
! 116: if (!*toFree)
! 117: return systemId;
! 118: tcscpy(*toFree, base);
! 119: s = *toFree;
! 120: if (tcsrchr(s, T('/')))
! 121: s = tcsrchr(s, T('/')) + 1;
! 122: #if (defined(WIN32) || defined(__WATCOMC__))
! 123: if (tcsrchr(s, T('\\')))
! 124: s = tcsrchr(s, T('\\')) + 1;
! 125: #endif
! 126: tcscpy(s, systemId);
! 127: return *toFree;
! 128: }
! 129:
! 130: static int
! 131: externalEntityRefFilemap(XML_Parser parser,
! 132: const XML_Char *context,
! 133: const XML_Char *base,
! 134: const XML_Char *systemId,
! 135: const XML_Char *publicId)
! 136: {
! 137: int result;
! 138: XML_Char *s;
! 139: const XML_Char *filename;
! 140: XML_Parser entParser = XML_ExternalEntityParserCreate(parser, context, 0);
! 141: PROCESS_ARGS args;
! 142: args.retPtr = &result;
! 143: args.parser = entParser;
! 144: filename = resolveSystemId(base, systemId, &s);
! 145: XML_SetBase(entParser, filename);
! 146: if (!filemap(filename, processFile, &args))
! 147: result = 0;
! 148: free(s);
! 149: XML_ParserFree(entParser);
! 150: return result;
! 151: }
! 152:
! 153: static int
! 154: processStream(const XML_Char *filename, XML_Parser parser)
! 155: {
! 156: /* passing NULL for filename means read intput from stdin */
! 157: int fd = 0; /* 0 is the fileno for stdin */
! 158:
! 159: if (filename != NULL) {
! 160: fd = topen(filename, O_BINARY|O_RDONLY);
! 161: if (fd < 0) {
! 162: tperror(filename);
! 163: return 0;
! 164: }
! 165: }
! 166: for (;;) {
! 167: int nread;
! 168: char *buf = (char *)XML_GetBuffer(parser, READ_SIZE);
! 169: if (!buf) {
! 170: if (filename != NULL)
! 171: close(fd);
! 172: ftprintf(stderr, T("%s: out of memory\n"),
! 173: filename != NULL ? filename : "xmlwf");
! 174: return 0;
! 175: }
! 176: nread = read(fd, buf, READ_SIZE);
! 177: if (nread < 0) {
! 178: tperror(filename != NULL ? filename : "STDIN");
! 179: if (filename != NULL)
! 180: close(fd);
! 181: return 0;
! 182: }
! 183: if (XML_ParseBuffer(parser, nread, nread == 0) == XML_STATUS_ERROR) {
! 184: reportError(parser, filename != NULL ? filename : "STDIN");
! 185: if (filename != NULL)
! 186: close(fd);
! 187: return 0;
! 188: }
! 189: if (nread == 0) {
! 190: if (filename != NULL)
! 191: close(fd);
! 192: break;;
! 193: }
! 194: }
! 195: return 1;
! 196: }
! 197:
! 198: static int
! 199: externalEntityRefStream(XML_Parser parser,
! 200: const XML_Char *context,
! 201: const XML_Char *base,
! 202: const XML_Char *systemId,
! 203: const XML_Char *publicId)
! 204: {
! 205: XML_Char *s;
! 206: const XML_Char *filename;
! 207: int ret;
! 208: XML_Parser entParser = XML_ExternalEntityParserCreate(parser, context, 0);
! 209: filename = resolveSystemId(base, systemId, &s);
! 210: XML_SetBase(entParser, filename);
! 211: ret = processStream(filename, entParser);
! 212: free(s);
! 213: XML_ParserFree(entParser);
! 214: return ret;
! 215: }
! 216:
! 217: int
! 218: XML_ProcessFile(XML_Parser parser,
! 219: const XML_Char *filename,
! 220: unsigned flags)
! 221: {
! 222: int result;
! 223:
! 224: if (!XML_SetBase(parser, filename)) {
! 225: ftprintf(stderr, T("%s: out of memory"), filename);
! 226: exit(1);
! 227: }
! 228:
! 229: if (flags & XML_EXTERNAL_ENTITIES)
! 230: XML_SetExternalEntityRefHandler(parser,
! 231: (flags & XML_MAP_FILE)
! 232: ? externalEntityRefFilemap
! 233: : externalEntityRefStream);
! 234: if (flags & XML_MAP_FILE) {
! 235: PROCESS_ARGS args;
! 236: args.retPtr = &result;
! 237: args.parser = parser;
! 238: if (!filemap(filename, processFile, &args))
! 239: result = 0;
! 240: }
! 241: else
! 242: result = processStream(filename, parser);
! 243: return result;
! 244: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>