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