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