1*7c568831SAndroid Build Coastguard Worker /**
2*7c568831SAndroid Build Coastguard Worker * catalog.c: set of generic Catalog related routines
3*7c568831SAndroid Build Coastguard Worker *
4*7c568831SAndroid Build Coastguard Worker * Reference: SGML Open Technical Resolution TR9401:1997.
5*7c568831SAndroid Build Coastguard Worker * http://www.jclark.com/sp/catalog.htm
6*7c568831SAndroid Build Coastguard Worker *
7*7c568831SAndroid Build Coastguard Worker * XML Catalogs Working Draft 06 August 2001
8*7c568831SAndroid Build Coastguard Worker * http://www.oasis-open.org/committees/entity/spec-2001-08-06.html
9*7c568831SAndroid Build Coastguard Worker *
10*7c568831SAndroid Build Coastguard Worker * See Copyright for the status of this software.
11*7c568831SAndroid Build Coastguard Worker *
12*7c568831SAndroid Build Coastguard Worker * [email protected]
13*7c568831SAndroid Build Coastguard Worker */
14*7c568831SAndroid Build Coastguard Worker
15*7c568831SAndroid Build Coastguard Worker #define IN_LIBXML
16*7c568831SAndroid Build Coastguard Worker #include "libxml.h"
17*7c568831SAndroid Build Coastguard Worker
18*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_CATALOG_ENABLED
19*7c568831SAndroid Build Coastguard Worker #include <stdio.h>
20*7c568831SAndroid Build Coastguard Worker #include <stdlib.h>
21*7c568831SAndroid Build Coastguard Worker #include <string.h>
22*7c568831SAndroid Build Coastguard Worker
23*7c568831SAndroid Build Coastguard Worker #include <fcntl.h>
24*7c568831SAndroid Build Coastguard Worker #include <sys/stat.h>
25*7c568831SAndroid Build Coastguard Worker
26*7c568831SAndroid Build Coastguard Worker #ifdef _WIN32
27*7c568831SAndroid Build Coastguard Worker #include <io.h>
28*7c568831SAndroid Build Coastguard Worker #else
29*7c568831SAndroid Build Coastguard Worker #include <unistd.h>
30*7c568831SAndroid Build Coastguard Worker #endif
31*7c568831SAndroid Build Coastguard Worker
32*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlmemory.h>
33*7c568831SAndroid Build Coastguard Worker #include <libxml/hash.h>
34*7c568831SAndroid Build Coastguard Worker #include <libxml/uri.h>
35*7c568831SAndroid Build Coastguard Worker #include <libxml/parserInternals.h>
36*7c568831SAndroid Build Coastguard Worker #include <libxml/catalog.h>
37*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlerror.h>
38*7c568831SAndroid Build Coastguard Worker #include <libxml/threads.h>
39*7c568831SAndroid Build Coastguard Worker
40*7c568831SAndroid Build Coastguard Worker #include "private/cata.h"
41*7c568831SAndroid Build Coastguard Worker #include "private/buf.h"
42*7c568831SAndroid Build Coastguard Worker #include "private/error.h"
43*7c568831SAndroid Build Coastguard Worker #include "private/threads.h"
44*7c568831SAndroid Build Coastguard Worker
45*7c568831SAndroid Build Coastguard Worker #define MAX_DELEGATE 50
46*7c568831SAndroid Build Coastguard Worker #define MAX_CATAL_DEPTH 50
47*7c568831SAndroid Build Coastguard Worker
48*7c568831SAndroid Build Coastguard Worker #ifdef _WIN32
49*7c568831SAndroid Build Coastguard Worker # define PATH_SEPARATOR ';'
50*7c568831SAndroid Build Coastguard Worker #else
51*7c568831SAndroid Build Coastguard Worker # define PATH_SEPARATOR ':'
52*7c568831SAndroid Build Coastguard Worker #endif
53*7c568831SAndroid Build Coastguard Worker
54*7c568831SAndroid Build Coastguard Worker #define XML_URN_PUBID "urn:publicid:"
55*7c568831SAndroid Build Coastguard Worker #define XML_CATAL_BREAK ((xmlChar *) -1)
56*7c568831SAndroid Build Coastguard Worker #ifndef XML_XML_DEFAULT_CATALOG
57*7c568831SAndroid Build Coastguard Worker #define XML_XML_DEFAULT_CATALOG "file://" SYSCONFDIR "/xml/catalog"
58*7c568831SAndroid Build Coastguard Worker #endif
59*7c568831SAndroid Build Coastguard Worker #ifndef XML_SGML_DEFAULT_CATALOG
60*7c568831SAndroid Build Coastguard Worker #define XML_SGML_DEFAULT_CATALOG "file://" SYSCONFDIR "/sgml/catalog"
61*7c568831SAndroid Build Coastguard Worker #endif
62*7c568831SAndroid Build Coastguard Worker
63*7c568831SAndroid Build Coastguard Worker static xmlChar *xmlCatalogNormalizePublic(const xmlChar *pubID);
64*7c568831SAndroid Build Coastguard Worker static int xmlExpandCatalog(xmlCatalogPtr catal, const char *filename);
65*7c568831SAndroid Build Coastguard Worker
66*7c568831SAndroid Build Coastguard Worker /************************************************************************
67*7c568831SAndroid Build Coastguard Worker * *
68*7c568831SAndroid Build Coastguard Worker * Types, all private *
69*7c568831SAndroid Build Coastguard Worker * *
70*7c568831SAndroid Build Coastguard Worker ************************************************************************/
71*7c568831SAndroid Build Coastguard Worker
72*7c568831SAndroid Build Coastguard Worker typedef enum {
73*7c568831SAndroid Build Coastguard Worker XML_CATA_REMOVED = -1,
74*7c568831SAndroid Build Coastguard Worker XML_CATA_NONE = 0,
75*7c568831SAndroid Build Coastguard Worker XML_CATA_CATALOG,
76*7c568831SAndroid Build Coastguard Worker XML_CATA_BROKEN_CATALOG,
77*7c568831SAndroid Build Coastguard Worker XML_CATA_NEXT_CATALOG,
78*7c568831SAndroid Build Coastguard Worker XML_CATA_GROUP,
79*7c568831SAndroid Build Coastguard Worker XML_CATA_PUBLIC,
80*7c568831SAndroid Build Coastguard Worker XML_CATA_SYSTEM,
81*7c568831SAndroid Build Coastguard Worker XML_CATA_REWRITE_SYSTEM,
82*7c568831SAndroid Build Coastguard Worker XML_CATA_DELEGATE_PUBLIC,
83*7c568831SAndroid Build Coastguard Worker XML_CATA_DELEGATE_SYSTEM,
84*7c568831SAndroid Build Coastguard Worker XML_CATA_URI,
85*7c568831SAndroid Build Coastguard Worker XML_CATA_REWRITE_URI,
86*7c568831SAndroid Build Coastguard Worker XML_CATA_DELEGATE_URI,
87*7c568831SAndroid Build Coastguard Worker SGML_CATA_SYSTEM,
88*7c568831SAndroid Build Coastguard Worker SGML_CATA_PUBLIC,
89*7c568831SAndroid Build Coastguard Worker SGML_CATA_ENTITY,
90*7c568831SAndroid Build Coastguard Worker SGML_CATA_PENTITY,
91*7c568831SAndroid Build Coastguard Worker SGML_CATA_DOCTYPE,
92*7c568831SAndroid Build Coastguard Worker SGML_CATA_LINKTYPE,
93*7c568831SAndroid Build Coastguard Worker SGML_CATA_NOTATION,
94*7c568831SAndroid Build Coastguard Worker SGML_CATA_DELEGATE,
95*7c568831SAndroid Build Coastguard Worker SGML_CATA_BASE,
96*7c568831SAndroid Build Coastguard Worker SGML_CATA_CATALOG,
97*7c568831SAndroid Build Coastguard Worker SGML_CATA_DOCUMENT,
98*7c568831SAndroid Build Coastguard Worker SGML_CATA_SGMLDECL
99*7c568831SAndroid Build Coastguard Worker } xmlCatalogEntryType;
100*7c568831SAndroid Build Coastguard Worker
101*7c568831SAndroid Build Coastguard Worker typedef struct _xmlCatalogEntry xmlCatalogEntry;
102*7c568831SAndroid Build Coastguard Worker typedef xmlCatalogEntry *xmlCatalogEntryPtr;
103*7c568831SAndroid Build Coastguard Worker struct _xmlCatalogEntry {
104*7c568831SAndroid Build Coastguard Worker struct _xmlCatalogEntry *next;
105*7c568831SAndroid Build Coastguard Worker struct _xmlCatalogEntry *parent;
106*7c568831SAndroid Build Coastguard Worker struct _xmlCatalogEntry *children;
107*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryType type;
108*7c568831SAndroid Build Coastguard Worker xmlChar *name;
109*7c568831SAndroid Build Coastguard Worker xmlChar *value;
110*7c568831SAndroid Build Coastguard Worker xmlChar *URL; /* The expanded URL using the base */
111*7c568831SAndroid Build Coastguard Worker xmlCatalogPrefer prefer;
112*7c568831SAndroid Build Coastguard Worker int dealloc;
113*7c568831SAndroid Build Coastguard Worker int depth;
114*7c568831SAndroid Build Coastguard Worker struct _xmlCatalogEntry *group;
115*7c568831SAndroid Build Coastguard Worker };
116*7c568831SAndroid Build Coastguard Worker
117*7c568831SAndroid Build Coastguard Worker typedef enum {
118*7c568831SAndroid Build Coastguard Worker XML_XML_CATALOG_TYPE = 1,
119*7c568831SAndroid Build Coastguard Worker XML_SGML_CATALOG_TYPE
120*7c568831SAndroid Build Coastguard Worker } xmlCatalogType;
121*7c568831SAndroid Build Coastguard Worker
122*7c568831SAndroid Build Coastguard Worker #define XML_MAX_SGML_CATA_DEPTH 10
123*7c568831SAndroid Build Coastguard Worker struct _xmlCatalog {
124*7c568831SAndroid Build Coastguard Worker xmlCatalogType type; /* either XML or SGML */
125*7c568831SAndroid Build Coastguard Worker
126*7c568831SAndroid Build Coastguard Worker /*
127*7c568831SAndroid Build Coastguard Worker * SGML Catalogs are stored as a simple hash table of catalog entries
128*7c568831SAndroid Build Coastguard Worker * Catalog stack to check against overflows when building the
129*7c568831SAndroid Build Coastguard Worker * SGML catalog
130*7c568831SAndroid Build Coastguard Worker */
131*7c568831SAndroid Build Coastguard Worker char *catalTab[XML_MAX_SGML_CATA_DEPTH]; /* stack of catals */
132*7c568831SAndroid Build Coastguard Worker int catalNr; /* Number of current catal streams */
133*7c568831SAndroid Build Coastguard Worker int catalMax; /* Max number of catal streams */
134*7c568831SAndroid Build Coastguard Worker xmlHashTablePtr sgml;
135*7c568831SAndroid Build Coastguard Worker
136*7c568831SAndroid Build Coastguard Worker /*
137*7c568831SAndroid Build Coastguard Worker * XML Catalogs are stored as a tree of Catalog entries
138*7c568831SAndroid Build Coastguard Worker */
139*7c568831SAndroid Build Coastguard Worker xmlCatalogPrefer prefer;
140*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr xml;
141*7c568831SAndroid Build Coastguard Worker };
142*7c568831SAndroid Build Coastguard Worker
143*7c568831SAndroid Build Coastguard Worker /************************************************************************
144*7c568831SAndroid Build Coastguard Worker * *
145*7c568831SAndroid Build Coastguard Worker * Global variables *
146*7c568831SAndroid Build Coastguard Worker * *
147*7c568831SAndroid Build Coastguard Worker ************************************************************************/
148*7c568831SAndroid Build Coastguard Worker
149*7c568831SAndroid Build Coastguard Worker /*
150*7c568831SAndroid Build Coastguard Worker * Those are preferences
151*7c568831SAndroid Build Coastguard Worker */
152*7c568831SAndroid Build Coastguard Worker static int xmlDebugCatalogs = 0; /* used for debugging */
153*7c568831SAndroid Build Coastguard Worker static xmlCatalogAllow xmlCatalogDefaultAllow = XML_CATA_ALLOW_ALL;
154*7c568831SAndroid Build Coastguard Worker static xmlCatalogPrefer xmlCatalogDefaultPrefer = XML_CATA_PREFER_PUBLIC;
155*7c568831SAndroid Build Coastguard Worker
156*7c568831SAndroid Build Coastguard Worker /*
157*7c568831SAndroid Build Coastguard Worker * Hash table containing all the trees of XML catalogs parsed by
158*7c568831SAndroid Build Coastguard Worker * the application.
159*7c568831SAndroid Build Coastguard Worker */
160*7c568831SAndroid Build Coastguard Worker static xmlHashTablePtr xmlCatalogXMLFiles = NULL;
161*7c568831SAndroid Build Coastguard Worker
162*7c568831SAndroid Build Coastguard Worker /*
163*7c568831SAndroid Build Coastguard Worker * The default catalog in use by the application
164*7c568831SAndroid Build Coastguard Worker */
165*7c568831SAndroid Build Coastguard Worker static xmlCatalogPtr xmlDefaultCatalog = NULL;
166*7c568831SAndroid Build Coastguard Worker
167*7c568831SAndroid Build Coastguard Worker /*
168*7c568831SAndroid Build Coastguard Worker * A mutex for modifying the shared global catalog(s)
169*7c568831SAndroid Build Coastguard Worker * xmlDefaultCatalog tree.
170*7c568831SAndroid Build Coastguard Worker * It also protects xmlCatalogXMLFiles
171*7c568831SAndroid Build Coastguard Worker * The core of this readers/writer scheme is in xmlFetchXMLCatalogFile()
172*7c568831SAndroid Build Coastguard Worker */
173*7c568831SAndroid Build Coastguard Worker static xmlRMutex xmlCatalogMutex;
174*7c568831SAndroid Build Coastguard Worker
175*7c568831SAndroid Build Coastguard Worker /*
176*7c568831SAndroid Build Coastguard Worker * Whether the default system catalog was initialized.
177*7c568831SAndroid Build Coastguard Worker */
178*7c568831SAndroid Build Coastguard Worker static int xmlCatalogInitialized = 0;
179*7c568831SAndroid Build Coastguard Worker
180*7c568831SAndroid Build Coastguard Worker /************************************************************************
181*7c568831SAndroid Build Coastguard Worker * *
182*7c568831SAndroid Build Coastguard Worker * Catalog error handlers *
183*7c568831SAndroid Build Coastguard Worker * *
184*7c568831SAndroid Build Coastguard Worker ************************************************************************/
185*7c568831SAndroid Build Coastguard Worker
186*7c568831SAndroid Build Coastguard Worker /**
187*7c568831SAndroid Build Coastguard Worker * xmlCatalogErrMemory:
188*7c568831SAndroid Build Coastguard Worker * @extra: extra information
189*7c568831SAndroid Build Coastguard Worker *
190*7c568831SAndroid Build Coastguard Worker * Handle an out of memory condition
191*7c568831SAndroid Build Coastguard Worker */
192*7c568831SAndroid Build Coastguard Worker static void
xmlCatalogErrMemory(void)193*7c568831SAndroid Build Coastguard Worker xmlCatalogErrMemory(void)
194*7c568831SAndroid Build Coastguard Worker {
195*7c568831SAndroid Build Coastguard Worker xmlRaiseMemoryError(NULL, NULL, NULL, XML_FROM_CATALOG, NULL);
196*7c568831SAndroid Build Coastguard Worker }
197*7c568831SAndroid Build Coastguard Worker
198*7c568831SAndroid Build Coastguard Worker /**
199*7c568831SAndroid Build Coastguard Worker * xmlCatalogErr:
200*7c568831SAndroid Build Coastguard Worker * @catal: the Catalog entry
201*7c568831SAndroid Build Coastguard Worker * @node: the context node
202*7c568831SAndroid Build Coastguard Worker * @msg: the error message
203*7c568831SAndroid Build Coastguard Worker * @extra: extra information
204*7c568831SAndroid Build Coastguard Worker *
205*7c568831SAndroid Build Coastguard Worker * Handle a catalog error
206*7c568831SAndroid Build Coastguard Worker */
207*7c568831SAndroid Build Coastguard Worker static void LIBXML_ATTR_FORMAT(4,0)
xmlCatalogErr(xmlCatalogEntryPtr catal,xmlNodePtr node,int error,const char * msg,const xmlChar * str1,const xmlChar * str2,const xmlChar * str3)208*7c568831SAndroid Build Coastguard Worker xmlCatalogErr(xmlCatalogEntryPtr catal, xmlNodePtr node, int error,
209*7c568831SAndroid Build Coastguard Worker const char *msg, const xmlChar *str1, const xmlChar *str2,
210*7c568831SAndroid Build Coastguard Worker const xmlChar *str3)
211*7c568831SAndroid Build Coastguard Worker {
212*7c568831SAndroid Build Coastguard Worker int res;
213*7c568831SAndroid Build Coastguard Worker
214*7c568831SAndroid Build Coastguard Worker res = xmlRaiseError(NULL, NULL, NULL, catal, node,
215*7c568831SAndroid Build Coastguard Worker XML_FROM_CATALOG, error, XML_ERR_ERROR, NULL, 0,
216*7c568831SAndroid Build Coastguard Worker (const char *) str1, (const char *) str2,
217*7c568831SAndroid Build Coastguard Worker (const char *) str3, 0, 0,
218*7c568831SAndroid Build Coastguard Worker msg, str1, str2, str3);
219*7c568831SAndroid Build Coastguard Worker if (res < 0)
220*7c568831SAndroid Build Coastguard Worker xmlCatalogErrMemory();
221*7c568831SAndroid Build Coastguard Worker }
222*7c568831SAndroid Build Coastguard Worker
223*7c568831SAndroid Build Coastguard Worker static void
xmlCatalogPrintDebug(const char * fmt,...)224*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(const char *fmt, ...) {
225*7c568831SAndroid Build Coastguard Worker va_list ap;
226*7c568831SAndroid Build Coastguard Worker
227*7c568831SAndroid Build Coastguard Worker va_start(ap, fmt);
228*7c568831SAndroid Build Coastguard Worker xmlVPrintErrorMessage(fmt, ap);
229*7c568831SAndroid Build Coastguard Worker va_end(ap);
230*7c568831SAndroid Build Coastguard Worker }
231*7c568831SAndroid Build Coastguard Worker
232*7c568831SAndroid Build Coastguard Worker /************************************************************************
233*7c568831SAndroid Build Coastguard Worker * *
234*7c568831SAndroid Build Coastguard Worker * Allocation and Freeing *
235*7c568831SAndroid Build Coastguard Worker * *
236*7c568831SAndroid Build Coastguard Worker ************************************************************************/
237*7c568831SAndroid Build Coastguard Worker
238*7c568831SAndroid Build Coastguard Worker /**
239*7c568831SAndroid Build Coastguard Worker * xmlNewCatalogEntry:
240*7c568831SAndroid Build Coastguard Worker * @type: type of entry
241*7c568831SAndroid Build Coastguard Worker * @name: name of the entry
242*7c568831SAndroid Build Coastguard Worker * @value: value of the entry
243*7c568831SAndroid Build Coastguard Worker * @prefer: the PUBLIC vs. SYSTEM current preference value
244*7c568831SAndroid Build Coastguard Worker * @group: for members of a group, the group entry
245*7c568831SAndroid Build Coastguard Worker *
246*7c568831SAndroid Build Coastguard Worker * create a new Catalog entry, this type is shared both by XML and
247*7c568831SAndroid Build Coastguard Worker * SGML catalogs, but the acceptable types values differs.
248*7c568831SAndroid Build Coastguard Worker *
249*7c568831SAndroid Build Coastguard Worker * Returns the xmlCatalogEntryPtr or NULL in case of error
250*7c568831SAndroid Build Coastguard Worker */
251*7c568831SAndroid Build Coastguard Worker static xmlCatalogEntryPtr
xmlNewCatalogEntry(xmlCatalogEntryType type,const xmlChar * name,const xmlChar * value,const xmlChar * URL,xmlCatalogPrefer prefer,xmlCatalogEntryPtr group)252*7c568831SAndroid Build Coastguard Worker xmlNewCatalogEntry(xmlCatalogEntryType type, const xmlChar *name,
253*7c568831SAndroid Build Coastguard Worker const xmlChar *value, const xmlChar *URL, xmlCatalogPrefer prefer,
254*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr group) {
255*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr ret;
256*7c568831SAndroid Build Coastguard Worker xmlChar *normid = NULL;
257*7c568831SAndroid Build Coastguard Worker
258*7c568831SAndroid Build Coastguard Worker ret = (xmlCatalogEntryPtr) xmlMalloc(sizeof(xmlCatalogEntry));
259*7c568831SAndroid Build Coastguard Worker if (ret == NULL) {
260*7c568831SAndroid Build Coastguard Worker xmlCatalogErrMemory();
261*7c568831SAndroid Build Coastguard Worker return(NULL);
262*7c568831SAndroid Build Coastguard Worker }
263*7c568831SAndroid Build Coastguard Worker ret->next = NULL;
264*7c568831SAndroid Build Coastguard Worker ret->parent = NULL;
265*7c568831SAndroid Build Coastguard Worker ret->children = NULL;
266*7c568831SAndroid Build Coastguard Worker ret->type = type;
267*7c568831SAndroid Build Coastguard Worker if (type == XML_CATA_PUBLIC || type == XML_CATA_DELEGATE_PUBLIC) {
268*7c568831SAndroid Build Coastguard Worker normid = xmlCatalogNormalizePublic(name);
269*7c568831SAndroid Build Coastguard Worker if (normid != NULL)
270*7c568831SAndroid Build Coastguard Worker name = (*normid != 0 ? normid : NULL);
271*7c568831SAndroid Build Coastguard Worker }
272*7c568831SAndroid Build Coastguard Worker if (name != NULL)
273*7c568831SAndroid Build Coastguard Worker ret->name = xmlStrdup(name);
274*7c568831SAndroid Build Coastguard Worker else
275*7c568831SAndroid Build Coastguard Worker ret->name = NULL;
276*7c568831SAndroid Build Coastguard Worker if (normid != NULL)
277*7c568831SAndroid Build Coastguard Worker xmlFree(normid);
278*7c568831SAndroid Build Coastguard Worker if (value != NULL)
279*7c568831SAndroid Build Coastguard Worker ret->value = xmlStrdup(value);
280*7c568831SAndroid Build Coastguard Worker else
281*7c568831SAndroid Build Coastguard Worker ret->value = NULL;
282*7c568831SAndroid Build Coastguard Worker if (URL == NULL)
283*7c568831SAndroid Build Coastguard Worker URL = value;
284*7c568831SAndroid Build Coastguard Worker if (URL != NULL)
285*7c568831SAndroid Build Coastguard Worker ret->URL = xmlStrdup(URL);
286*7c568831SAndroid Build Coastguard Worker else
287*7c568831SAndroid Build Coastguard Worker ret->URL = NULL;
288*7c568831SAndroid Build Coastguard Worker ret->prefer = prefer;
289*7c568831SAndroid Build Coastguard Worker ret->dealloc = 0;
290*7c568831SAndroid Build Coastguard Worker ret->depth = 0;
291*7c568831SAndroid Build Coastguard Worker ret->group = group;
292*7c568831SAndroid Build Coastguard Worker return(ret);
293*7c568831SAndroid Build Coastguard Worker }
294*7c568831SAndroid Build Coastguard Worker
295*7c568831SAndroid Build Coastguard Worker static void
296*7c568831SAndroid Build Coastguard Worker xmlFreeCatalogEntryList(xmlCatalogEntryPtr ret);
297*7c568831SAndroid Build Coastguard Worker
298*7c568831SAndroid Build Coastguard Worker /**
299*7c568831SAndroid Build Coastguard Worker * xmlFreeCatalogEntry:
300*7c568831SAndroid Build Coastguard Worker * @payload: a Catalog entry
301*7c568831SAndroid Build Coastguard Worker *
302*7c568831SAndroid Build Coastguard Worker * Free the memory allocated to a Catalog entry
303*7c568831SAndroid Build Coastguard Worker */
304*7c568831SAndroid Build Coastguard Worker static void
xmlFreeCatalogEntry(void * payload,const xmlChar * name ATTRIBUTE_UNUSED)305*7c568831SAndroid Build Coastguard Worker xmlFreeCatalogEntry(void *payload, const xmlChar *name ATTRIBUTE_UNUSED) {
306*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr ret = (xmlCatalogEntryPtr) payload;
307*7c568831SAndroid Build Coastguard Worker if (ret == NULL)
308*7c568831SAndroid Build Coastguard Worker return;
309*7c568831SAndroid Build Coastguard Worker /*
310*7c568831SAndroid Build Coastguard Worker * Entries stored in the file hash must be deallocated
311*7c568831SAndroid Build Coastguard Worker * only by the file hash cleaner !
312*7c568831SAndroid Build Coastguard Worker */
313*7c568831SAndroid Build Coastguard Worker if (ret->dealloc == 1)
314*7c568831SAndroid Build Coastguard Worker return;
315*7c568831SAndroid Build Coastguard Worker
316*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs) {
317*7c568831SAndroid Build Coastguard Worker if (ret->name != NULL)
318*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
319*7c568831SAndroid Build Coastguard Worker "Free catalog entry %s\n", ret->name);
320*7c568831SAndroid Build Coastguard Worker else if (ret->value != NULL)
321*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
322*7c568831SAndroid Build Coastguard Worker "Free catalog entry %s\n", ret->value);
323*7c568831SAndroid Build Coastguard Worker else
324*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
325*7c568831SAndroid Build Coastguard Worker "Free catalog entry\n");
326*7c568831SAndroid Build Coastguard Worker }
327*7c568831SAndroid Build Coastguard Worker
328*7c568831SAndroid Build Coastguard Worker if (ret->name != NULL)
329*7c568831SAndroid Build Coastguard Worker xmlFree(ret->name);
330*7c568831SAndroid Build Coastguard Worker if (ret->value != NULL)
331*7c568831SAndroid Build Coastguard Worker xmlFree(ret->value);
332*7c568831SAndroid Build Coastguard Worker if (ret->URL != NULL)
333*7c568831SAndroid Build Coastguard Worker xmlFree(ret->URL);
334*7c568831SAndroid Build Coastguard Worker xmlFree(ret);
335*7c568831SAndroid Build Coastguard Worker }
336*7c568831SAndroid Build Coastguard Worker
337*7c568831SAndroid Build Coastguard Worker /**
338*7c568831SAndroid Build Coastguard Worker * xmlFreeCatalogEntryList:
339*7c568831SAndroid Build Coastguard Worker * @ret: a Catalog entry list
340*7c568831SAndroid Build Coastguard Worker *
341*7c568831SAndroid Build Coastguard Worker * Free the memory allocated to a full chained list of Catalog entries
342*7c568831SAndroid Build Coastguard Worker */
343*7c568831SAndroid Build Coastguard Worker static void
xmlFreeCatalogEntryList(xmlCatalogEntryPtr ret)344*7c568831SAndroid Build Coastguard Worker xmlFreeCatalogEntryList(xmlCatalogEntryPtr ret) {
345*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr next;
346*7c568831SAndroid Build Coastguard Worker
347*7c568831SAndroid Build Coastguard Worker while (ret != NULL) {
348*7c568831SAndroid Build Coastguard Worker next = ret->next;
349*7c568831SAndroid Build Coastguard Worker xmlFreeCatalogEntry(ret, NULL);
350*7c568831SAndroid Build Coastguard Worker ret = next;
351*7c568831SAndroid Build Coastguard Worker }
352*7c568831SAndroid Build Coastguard Worker }
353*7c568831SAndroid Build Coastguard Worker
354*7c568831SAndroid Build Coastguard Worker /**
355*7c568831SAndroid Build Coastguard Worker * xmlFreeCatalogHashEntryList:
356*7c568831SAndroid Build Coastguard Worker * @payload: a Catalog entry list
357*7c568831SAndroid Build Coastguard Worker *
358*7c568831SAndroid Build Coastguard Worker * Free the memory allocated to list of Catalog entries from the
359*7c568831SAndroid Build Coastguard Worker * catalog file hash.
360*7c568831SAndroid Build Coastguard Worker */
361*7c568831SAndroid Build Coastguard Worker static void
xmlFreeCatalogHashEntryList(void * payload,const xmlChar * name ATTRIBUTE_UNUSED)362*7c568831SAndroid Build Coastguard Worker xmlFreeCatalogHashEntryList(void *payload,
363*7c568831SAndroid Build Coastguard Worker const xmlChar *name ATTRIBUTE_UNUSED) {
364*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr catal = (xmlCatalogEntryPtr) payload;
365*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr children, next;
366*7c568831SAndroid Build Coastguard Worker
367*7c568831SAndroid Build Coastguard Worker if (catal == NULL)
368*7c568831SAndroid Build Coastguard Worker return;
369*7c568831SAndroid Build Coastguard Worker
370*7c568831SAndroid Build Coastguard Worker children = catal->children;
371*7c568831SAndroid Build Coastguard Worker while (children != NULL) {
372*7c568831SAndroid Build Coastguard Worker next = children->next;
373*7c568831SAndroid Build Coastguard Worker children->dealloc = 0;
374*7c568831SAndroid Build Coastguard Worker children->children = NULL;
375*7c568831SAndroid Build Coastguard Worker xmlFreeCatalogEntry(children, NULL);
376*7c568831SAndroid Build Coastguard Worker children = next;
377*7c568831SAndroid Build Coastguard Worker }
378*7c568831SAndroid Build Coastguard Worker catal->dealloc = 0;
379*7c568831SAndroid Build Coastguard Worker xmlFreeCatalogEntry(catal, NULL);
380*7c568831SAndroid Build Coastguard Worker }
381*7c568831SAndroid Build Coastguard Worker
382*7c568831SAndroid Build Coastguard Worker /**
383*7c568831SAndroid Build Coastguard Worker * xmlCreateNewCatalog:
384*7c568831SAndroid Build Coastguard Worker * @type: type of catalog
385*7c568831SAndroid Build Coastguard Worker * @prefer: the PUBLIC vs. SYSTEM current preference value
386*7c568831SAndroid Build Coastguard Worker *
387*7c568831SAndroid Build Coastguard Worker * create a new Catalog, this type is shared both by XML and
388*7c568831SAndroid Build Coastguard Worker * SGML catalogs, but the acceptable types values differs.
389*7c568831SAndroid Build Coastguard Worker *
390*7c568831SAndroid Build Coastguard Worker * Returns the xmlCatalogPtr or NULL in case of error
391*7c568831SAndroid Build Coastguard Worker */
392*7c568831SAndroid Build Coastguard Worker static xmlCatalogPtr
xmlCreateNewCatalog(xmlCatalogType type,xmlCatalogPrefer prefer)393*7c568831SAndroid Build Coastguard Worker xmlCreateNewCatalog(xmlCatalogType type, xmlCatalogPrefer prefer) {
394*7c568831SAndroid Build Coastguard Worker xmlCatalogPtr ret;
395*7c568831SAndroid Build Coastguard Worker
396*7c568831SAndroid Build Coastguard Worker ret = (xmlCatalogPtr) xmlMalloc(sizeof(xmlCatalog));
397*7c568831SAndroid Build Coastguard Worker if (ret == NULL) {
398*7c568831SAndroid Build Coastguard Worker xmlCatalogErrMemory();
399*7c568831SAndroid Build Coastguard Worker return(NULL);
400*7c568831SAndroid Build Coastguard Worker }
401*7c568831SAndroid Build Coastguard Worker memset(ret, 0, sizeof(xmlCatalog));
402*7c568831SAndroid Build Coastguard Worker ret->type = type;
403*7c568831SAndroid Build Coastguard Worker ret->catalNr = 0;
404*7c568831SAndroid Build Coastguard Worker ret->catalMax = XML_MAX_SGML_CATA_DEPTH;
405*7c568831SAndroid Build Coastguard Worker ret->prefer = prefer;
406*7c568831SAndroid Build Coastguard Worker if (ret->type == XML_SGML_CATALOG_TYPE)
407*7c568831SAndroid Build Coastguard Worker ret->sgml = xmlHashCreate(10);
408*7c568831SAndroid Build Coastguard Worker return(ret);
409*7c568831SAndroid Build Coastguard Worker }
410*7c568831SAndroid Build Coastguard Worker
411*7c568831SAndroid Build Coastguard Worker /**
412*7c568831SAndroid Build Coastguard Worker * xmlFreeCatalog:
413*7c568831SAndroid Build Coastguard Worker * @catal: a Catalog
414*7c568831SAndroid Build Coastguard Worker *
415*7c568831SAndroid Build Coastguard Worker * Free the memory allocated to a Catalog
416*7c568831SAndroid Build Coastguard Worker */
417*7c568831SAndroid Build Coastguard Worker void
xmlFreeCatalog(xmlCatalogPtr catal)418*7c568831SAndroid Build Coastguard Worker xmlFreeCatalog(xmlCatalogPtr catal) {
419*7c568831SAndroid Build Coastguard Worker if (catal == NULL)
420*7c568831SAndroid Build Coastguard Worker return;
421*7c568831SAndroid Build Coastguard Worker if (catal->xml != NULL)
422*7c568831SAndroid Build Coastguard Worker xmlFreeCatalogEntryList(catal->xml);
423*7c568831SAndroid Build Coastguard Worker if (catal->sgml != NULL)
424*7c568831SAndroid Build Coastguard Worker xmlHashFree(catal->sgml, xmlFreeCatalogEntry);
425*7c568831SAndroid Build Coastguard Worker xmlFree(catal);
426*7c568831SAndroid Build Coastguard Worker }
427*7c568831SAndroid Build Coastguard Worker
428*7c568831SAndroid Build Coastguard Worker /************************************************************************
429*7c568831SAndroid Build Coastguard Worker * *
430*7c568831SAndroid Build Coastguard Worker * Serializing Catalogs *
431*7c568831SAndroid Build Coastguard Worker * *
432*7c568831SAndroid Build Coastguard Worker ************************************************************************/
433*7c568831SAndroid Build Coastguard Worker
434*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
435*7c568831SAndroid Build Coastguard Worker /**
436*7c568831SAndroid Build Coastguard Worker * xmlCatalogDumpEntry:
437*7c568831SAndroid Build Coastguard Worker * @entry: the catalog entry
438*7c568831SAndroid Build Coastguard Worker * @out: the file.
439*7c568831SAndroid Build Coastguard Worker *
440*7c568831SAndroid Build Coastguard Worker * Serialize an SGML Catalog entry
441*7c568831SAndroid Build Coastguard Worker */
442*7c568831SAndroid Build Coastguard Worker static void
xmlCatalogDumpEntry(void * payload,void * data,const xmlChar * name ATTRIBUTE_UNUSED)443*7c568831SAndroid Build Coastguard Worker xmlCatalogDumpEntry(void *payload, void *data,
444*7c568831SAndroid Build Coastguard Worker const xmlChar *name ATTRIBUTE_UNUSED) {
445*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr entry = (xmlCatalogEntryPtr) payload;
446*7c568831SAndroid Build Coastguard Worker FILE *out = (FILE *) data;
447*7c568831SAndroid Build Coastguard Worker if ((entry == NULL) || (out == NULL))
448*7c568831SAndroid Build Coastguard Worker return;
449*7c568831SAndroid Build Coastguard Worker switch (entry->type) {
450*7c568831SAndroid Build Coastguard Worker case SGML_CATA_ENTITY:
451*7c568831SAndroid Build Coastguard Worker fprintf(out, "ENTITY "); break;
452*7c568831SAndroid Build Coastguard Worker case SGML_CATA_PENTITY:
453*7c568831SAndroid Build Coastguard Worker fprintf(out, "ENTITY %%"); break;
454*7c568831SAndroid Build Coastguard Worker case SGML_CATA_DOCTYPE:
455*7c568831SAndroid Build Coastguard Worker fprintf(out, "DOCTYPE "); break;
456*7c568831SAndroid Build Coastguard Worker case SGML_CATA_LINKTYPE:
457*7c568831SAndroid Build Coastguard Worker fprintf(out, "LINKTYPE "); break;
458*7c568831SAndroid Build Coastguard Worker case SGML_CATA_NOTATION:
459*7c568831SAndroid Build Coastguard Worker fprintf(out, "NOTATION "); break;
460*7c568831SAndroid Build Coastguard Worker case SGML_CATA_PUBLIC:
461*7c568831SAndroid Build Coastguard Worker fprintf(out, "PUBLIC "); break;
462*7c568831SAndroid Build Coastguard Worker case SGML_CATA_SYSTEM:
463*7c568831SAndroid Build Coastguard Worker fprintf(out, "SYSTEM "); break;
464*7c568831SAndroid Build Coastguard Worker case SGML_CATA_DELEGATE:
465*7c568831SAndroid Build Coastguard Worker fprintf(out, "DELEGATE "); break;
466*7c568831SAndroid Build Coastguard Worker case SGML_CATA_BASE:
467*7c568831SAndroid Build Coastguard Worker fprintf(out, "BASE "); break;
468*7c568831SAndroid Build Coastguard Worker case SGML_CATA_CATALOG:
469*7c568831SAndroid Build Coastguard Worker fprintf(out, "CATALOG "); break;
470*7c568831SAndroid Build Coastguard Worker case SGML_CATA_DOCUMENT:
471*7c568831SAndroid Build Coastguard Worker fprintf(out, "DOCUMENT "); break;
472*7c568831SAndroid Build Coastguard Worker case SGML_CATA_SGMLDECL:
473*7c568831SAndroid Build Coastguard Worker fprintf(out, "SGMLDECL "); break;
474*7c568831SAndroid Build Coastguard Worker default:
475*7c568831SAndroid Build Coastguard Worker return;
476*7c568831SAndroid Build Coastguard Worker }
477*7c568831SAndroid Build Coastguard Worker switch (entry->type) {
478*7c568831SAndroid Build Coastguard Worker case SGML_CATA_ENTITY:
479*7c568831SAndroid Build Coastguard Worker case SGML_CATA_PENTITY:
480*7c568831SAndroid Build Coastguard Worker case SGML_CATA_DOCTYPE:
481*7c568831SAndroid Build Coastguard Worker case SGML_CATA_LINKTYPE:
482*7c568831SAndroid Build Coastguard Worker case SGML_CATA_NOTATION:
483*7c568831SAndroid Build Coastguard Worker fprintf(out, "%s", (const char *) entry->name); break;
484*7c568831SAndroid Build Coastguard Worker case SGML_CATA_PUBLIC:
485*7c568831SAndroid Build Coastguard Worker case SGML_CATA_SYSTEM:
486*7c568831SAndroid Build Coastguard Worker case SGML_CATA_SGMLDECL:
487*7c568831SAndroid Build Coastguard Worker case SGML_CATA_DOCUMENT:
488*7c568831SAndroid Build Coastguard Worker case SGML_CATA_CATALOG:
489*7c568831SAndroid Build Coastguard Worker case SGML_CATA_BASE:
490*7c568831SAndroid Build Coastguard Worker case SGML_CATA_DELEGATE:
491*7c568831SAndroid Build Coastguard Worker fprintf(out, "\"%s\"", entry->name); break;
492*7c568831SAndroid Build Coastguard Worker default:
493*7c568831SAndroid Build Coastguard Worker break;
494*7c568831SAndroid Build Coastguard Worker }
495*7c568831SAndroid Build Coastguard Worker switch (entry->type) {
496*7c568831SAndroid Build Coastguard Worker case SGML_CATA_ENTITY:
497*7c568831SAndroid Build Coastguard Worker case SGML_CATA_PENTITY:
498*7c568831SAndroid Build Coastguard Worker case SGML_CATA_DOCTYPE:
499*7c568831SAndroid Build Coastguard Worker case SGML_CATA_LINKTYPE:
500*7c568831SAndroid Build Coastguard Worker case SGML_CATA_NOTATION:
501*7c568831SAndroid Build Coastguard Worker case SGML_CATA_PUBLIC:
502*7c568831SAndroid Build Coastguard Worker case SGML_CATA_SYSTEM:
503*7c568831SAndroid Build Coastguard Worker case SGML_CATA_DELEGATE:
504*7c568831SAndroid Build Coastguard Worker fprintf(out, " \"%s\"", entry->value); break;
505*7c568831SAndroid Build Coastguard Worker default:
506*7c568831SAndroid Build Coastguard Worker break;
507*7c568831SAndroid Build Coastguard Worker }
508*7c568831SAndroid Build Coastguard Worker fprintf(out, "\n");
509*7c568831SAndroid Build Coastguard Worker }
510*7c568831SAndroid Build Coastguard Worker
511*7c568831SAndroid Build Coastguard Worker /**
512*7c568831SAndroid Build Coastguard Worker * xmlDumpXMLCatalogNode:
513*7c568831SAndroid Build Coastguard Worker * @catal: top catalog entry
514*7c568831SAndroid Build Coastguard Worker * @catalog: pointer to the xml tree
515*7c568831SAndroid Build Coastguard Worker * @doc: the containing document
516*7c568831SAndroid Build Coastguard Worker * @ns: the current namespace
517*7c568831SAndroid Build Coastguard Worker * @cgroup: group node for group members
518*7c568831SAndroid Build Coastguard Worker *
519*7c568831SAndroid Build Coastguard Worker * Serializes a Catalog entry, called by xmlDumpXMLCatalog and recursively
520*7c568831SAndroid Build Coastguard Worker * for group entries
521*7c568831SAndroid Build Coastguard Worker */
xmlDumpXMLCatalogNode(xmlCatalogEntryPtr catal,xmlNodePtr catalog,xmlDocPtr doc,xmlNsPtr ns,xmlCatalogEntryPtr cgroup)522*7c568831SAndroid Build Coastguard Worker static void xmlDumpXMLCatalogNode(xmlCatalogEntryPtr catal, xmlNodePtr catalog,
523*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc, xmlNsPtr ns, xmlCatalogEntryPtr cgroup) {
524*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
525*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr cur;
526*7c568831SAndroid Build Coastguard Worker /*
527*7c568831SAndroid Build Coastguard Worker * add all the catalog entries
528*7c568831SAndroid Build Coastguard Worker */
529*7c568831SAndroid Build Coastguard Worker cur = catal;
530*7c568831SAndroid Build Coastguard Worker while (cur != NULL) {
531*7c568831SAndroid Build Coastguard Worker if (cur->group == cgroup) {
532*7c568831SAndroid Build Coastguard Worker switch (cur->type) {
533*7c568831SAndroid Build Coastguard Worker case XML_CATA_REMOVED:
534*7c568831SAndroid Build Coastguard Worker break;
535*7c568831SAndroid Build Coastguard Worker case XML_CATA_BROKEN_CATALOG:
536*7c568831SAndroid Build Coastguard Worker case XML_CATA_CATALOG:
537*7c568831SAndroid Build Coastguard Worker if (cur == catal) {
538*7c568831SAndroid Build Coastguard Worker cur = cur->children;
539*7c568831SAndroid Build Coastguard Worker continue;
540*7c568831SAndroid Build Coastguard Worker }
541*7c568831SAndroid Build Coastguard Worker break;
542*7c568831SAndroid Build Coastguard Worker case XML_CATA_NEXT_CATALOG:
543*7c568831SAndroid Build Coastguard Worker node = xmlNewDocNode(doc, ns, BAD_CAST "nextCatalog", NULL);
544*7c568831SAndroid Build Coastguard Worker xmlSetProp(node, BAD_CAST "catalog", cur->value);
545*7c568831SAndroid Build Coastguard Worker xmlAddChild(catalog, node);
546*7c568831SAndroid Build Coastguard Worker break;
547*7c568831SAndroid Build Coastguard Worker case XML_CATA_NONE:
548*7c568831SAndroid Build Coastguard Worker break;
549*7c568831SAndroid Build Coastguard Worker case XML_CATA_GROUP:
550*7c568831SAndroid Build Coastguard Worker node = xmlNewDocNode(doc, ns, BAD_CAST "group", NULL);
551*7c568831SAndroid Build Coastguard Worker xmlSetProp(node, BAD_CAST "id", cur->name);
552*7c568831SAndroid Build Coastguard Worker if (cur->value != NULL) {
553*7c568831SAndroid Build Coastguard Worker xmlNsPtr xns;
554*7c568831SAndroid Build Coastguard Worker xns = xmlSearchNsByHref(doc, node, XML_XML_NAMESPACE);
555*7c568831SAndroid Build Coastguard Worker if (xns != NULL)
556*7c568831SAndroid Build Coastguard Worker xmlSetNsProp(node, xns, BAD_CAST "base",
557*7c568831SAndroid Build Coastguard Worker cur->value);
558*7c568831SAndroid Build Coastguard Worker }
559*7c568831SAndroid Build Coastguard Worker switch (cur->prefer) {
560*7c568831SAndroid Build Coastguard Worker case XML_CATA_PREFER_NONE:
561*7c568831SAndroid Build Coastguard Worker break;
562*7c568831SAndroid Build Coastguard Worker case XML_CATA_PREFER_PUBLIC:
563*7c568831SAndroid Build Coastguard Worker xmlSetProp(node, BAD_CAST "prefer", BAD_CAST "public");
564*7c568831SAndroid Build Coastguard Worker break;
565*7c568831SAndroid Build Coastguard Worker case XML_CATA_PREFER_SYSTEM:
566*7c568831SAndroid Build Coastguard Worker xmlSetProp(node, BAD_CAST "prefer", BAD_CAST "system");
567*7c568831SAndroid Build Coastguard Worker break;
568*7c568831SAndroid Build Coastguard Worker }
569*7c568831SAndroid Build Coastguard Worker xmlDumpXMLCatalogNode(cur->next, node, doc, ns, cur);
570*7c568831SAndroid Build Coastguard Worker xmlAddChild(catalog, node);
571*7c568831SAndroid Build Coastguard Worker break;
572*7c568831SAndroid Build Coastguard Worker case XML_CATA_PUBLIC:
573*7c568831SAndroid Build Coastguard Worker node = xmlNewDocNode(doc, ns, BAD_CAST "public", NULL);
574*7c568831SAndroid Build Coastguard Worker xmlSetProp(node, BAD_CAST "publicId", cur->name);
575*7c568831SAndroid Build Coastguard Worker xmlSetProp(node, BAD_CAST "uri", cur->value);
576*7c568831SAndroid Build Coastguard Worker xmlAddChild(catalog, node);
577*7c568831SAndroid Build Coastguard Worker break;
578*7c568831SAndroid Build Coastguard Worker case XML_CATA_SYSTEM:
579*7c568831SAndroid Build Coastguard Worker node = xmlNewDocNode(doc, ns, BAD_CAST "system", NULL);
580*7c568831SAndroid Build Coastguard Worker xmlSetProp(node, BAD_CAST "systemId", cur->name);
581*7c568831SAndroid Build Coastguard Worker xmlSetProp(node, BAD_CAST "uri", cur->value);
582*7c568831SAndroid Build Coastguard Worker xmlAddChild(catalog, node);
583*7c568831SAndroid Build Coastguard Worker break;
584*7c568831SAndroid Build Coastguard Worker case XML_CATA_REWRITE_SYSTEM:
585*7c568831SAndroid Build Coastguard Worker node = xmlNewDocNode(doc, ns, BAD_CAST "rewriteSystem", NULL);
586*7c568831SAndroid Build Coastguard Worker xmlSetProp(node, BAD_CAST "systemIdStartString", cur->name);
587*7c568831SAndroid Build Coastguard Worker xmlSetProp(node, BAD_CAST "rewritePrefix", cur->value);
588*7c568831SAndroid Build Coastguard Worker xmlAddChild(catalog, node);
589*7c568831SAndroid Build Coastguard Worker break;
590*7c568831SAndroid Build Coastguard Worker case XML_CATA_DELEGATE_PUBLIC:
591*7c568831SAndroid Build Coastguard Worker node = xmlNewDocNode(doc, ns, BAD_CAST "delegatePublic", NULL);
592*7c568831SAndroid Build Coastguard Worker xmlSetProp(node, BAD_CAST "publicIdStartString", cur->name);
593*7c568831SAndroid Build Coastguard Worker xmlSetProp(node, BAD_CAST "catalog", cur->value);
594*7c568831SAndroid Build Coastguard Worker xmlAddChild(catalog, node);
595*7c568831SAndroid Build Coastguard Worker break;
596*7c568831SAndroid Build Coastguard Worker case XML_CATA_DELEGATE_SYSTEM:
597*7c568831SAndroid Build Coastguard Worker node = xmlNewDocNode(doc, ns, BAD_CAST "delegateSystem", NULL);
598*7c568831SAndroid Build Coastguard Worker xmlSetProp(node, BAD_CAST "systemIdStartString", cur->name);
599*7c568831SAndroid Build Coastguard Worker xmlSetProp(node, BAD_CAST "catalog", cur->value);
600*7c568831SAndroid Build Coastguard Worker xmlAddChild(catalog, node);
601*7c568831SAndroid Build Coastguard Worker break;
602*7c568831SAndroid Build Coastguard Worker case XML_CATA_URI:
603*7c568831SAndroid Build Coastguard Worker node = xmlNewDocNode(doc, ns, BAD_CAST "uri", NULL);
604*7c568831SAndroid Build Coastguard Worker xmlSetProp(node, BAD_CAST "name", cur->name);
605*7c568831SAndroid Build Coastguard Worker xmlSetProp(node, BAD_CAST "uri", cur->value);
606*7c568831SAndroid Build Coastguard Worker xmlAddChild(catalog, node);
607*7c568831SAndroid Build Coastguard Worker break;
608*7c568831SAndroid Build Coastguard Worker case XML_CATA_REWRITE_URI:
609*7c568831SAndroid Build Coastguard Worker node = xmlNewDocNode(doc, ns, BAD_CAST "rewriteURI", NULL);
610*7c568831SAndroid Build Coastguard Worker xmlSetProp(node, BAD_CAST "uriStartString", cur->name);
611*7c568831SAndroid Build Coastguard Worker xmlSetProp(node, BAD_CAST "rewritePrefix", cur->value);
612*7c568831SAndroid Build Coastguard Worker xmlAddChild(catalog, node);
613*7c568831SAndroid Build Coastguard Worker break;
614*7c568831SAndroid Build Coastguard Worker case XML_CATA_DELEGATE_URI:
615*7c568831SAndroid Build Coastguard Worker node = xmlNewDocNode(doc, ns, BAD_CAST "delegateURI", NULL);
616*7c568831SAndroid Build Coastguard Worker xmlSetProp(node, BAD_CAST "uriStartString", cur->name);
617*7c568831SAndroid Build Coastguard Worker xmlSetProp(node, BAD_CAST "catalog", cur->value);
618*7c568831SAndroid Build Coastguard Worker xmlAddChild(catalog, node);
619*7c568831SAndroid Build Coastguard Worker break;
620*7c568831SAndroid Build Coastguard Worker case SGML_CATA_SYSTEM:
621*7c568831SAndroid Build Coastguard Worker case SGML_CATA_PUBLIC:
622*7c568831SAndroid Build Coastguard Worker case SGML_CATA_ENTITY:
623*7c568831SAndroid Build Coastguard Worker case SGML_CATA_PENTITY:
624*7c568831SAndroid Build Coastguard Worker case SGML_CATA_DOCTYPE:
625*7c568831SAndroid Build Coastguard Worker case SGML_CATA_LINKTYPE:
626*7c568831SAndroid Build Coastguard Worker case SGML_CATA_NOTATION:
627*7c568831SAndroid Build Coastguard Worker case SGML_CATA_DELEGATE:
628*7c568831SAndroid Build Coastguard Worker case SGML_CATA_BASE:
629*7c568831SAndroid Build Coastguard Worker case SGML_CATA_CATALOG:
630*7c568831SAndroid Build Coastguard Worker case SGML_CATA_DOCUMENT:
631*7c568831SAndroid Build Coastguard Worker case SGML_CATA_SGMLDECL:
632*7c568831SAndroid Build Coastguard Worker break;
633*7c568831SAndroid Build Coastguard Worker }
634*7c568831SAndroid Build Coastguard Worker }
635*7c568831SAndroid Build Coastguard Worker cur = cur->next;
636*7c568831SAndroid Build Coastguard Worker }
637*7c568831SAndroid Build Coastguard Worker }
638*7c568831SAndroid Build Coastguard Worker
639*7c568831SAndroid Build Coastguard Worker static int
xmlDumpXMLCatalog(FILE * out,xmlCatalogEntryPtr catal)640*7c568831SAndroid Build Coastguard Worker xmlDumpXMLCatalog(FILE *out, xmlCatalogEntryPtr catal) {
641*7c568831SAndroid Build Coastguard Worker int ret;
642*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
643*7c568831SAndroid Build Coastguard Worker xmlNsPtr ns;
644*7c568831SAndroid Build Coastguard Worker xmlDtdPtr dtd;
645*7c568831SAndroid Build Coastguard Worker xmlNodePtr catalog;
646*7c568831SAndroid Build Coastguard Worker xmlOutputBufferPtr buf;
647*7c568831SAndroid Build Coastguard Worker
648*7c568831SAndroid Build Coastguard Worker /*
649*7c568831SAndroid Build Coastguard Worker * Rebuild a catalog
650*7c568831SAndroid Build Coastguard Worker */
651*7c568831SAndroid Build Coastguard Worker doc = xmlNewDoc(NULL);
652*7c568831SAndroid Build Coastguard Worker if (doc == NULL)
653*7c568831SAndroid Build Coastguard Worker return(-1);
654*7c568831SAndroid Build Coastguard Worker dtd = xmlNewDtd(doc, BAD_CAST "catalog",
655*7c568831SAndroid Build Coastguard Worker BAD_CAST "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN",
656*7c568831SAndroid Build Coastguard Worker BAD_CAST "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd");
657*7c568831SAndroid Build Coastguard Worker
658*7c568831SAndroid Build Coastguard Worker xmlAddChild((xmlNodePtr) doc, (xmlNodePtr) dtd);
659*7c568831SAndroid Build Coastguard Worker
660*7c568831SAndroid Build Coastguard Worker ns = xmlNewNs(NULL, XML_CATALOGS_NAMESPACE, NULL);
661*7c568831SAndroid Build Coastguard Worker if (ns == NULL) {
662*7c568831SAndroid Build Coastguard Worker xmlFreeDoc(doc);
663*7c568831SAndroid Build Coastguard Worker return(-1);
664*7c568831SAndroid Build Coastguard Worker }
665*7c568831SAndroid Build Coastguard Worker catalog = xmlNewDocNode(doc, ns, BAD_CAST "catalog", NULL);
666*7c568831SAndroid Build Coastguard Worker if (catalog == NULL) {
667*7c568831SAndroid Build Coastguard Worker xmlFreeNs(ns);
668*7c568831SAndroid Build Coastguard Worker xmlFreeDoc(doc);
669*7c568831SAndroid Build Coastguard Worker return(-1);
670*7c568831SAndroid Build Coastguard Worker }
671*7c568831SAndroid Build Coastguard Worker catalog->nsDef = ns;
672*7c568831SAndroid Build Coastguard Worker xmlAddChild((xmlNodePtr) doc, catalog);
673*7c568831SAndroid Build Coastguard Worker
674*7c568831SAndroid Build Coastguard Worker xmlDumpXMLCatalogNode(catal, catalog, doc, ns, NULL);
675*7c568831SAndroid Build Coastguard Worker
676*7c568831SAndroid Build Coastguard Worker /*
677*7c568831SAndroid Build Coastguard Worker * reserialize it
678*7c568831SAndroid Build Coastguard Worker */
679*7c568831SAndroid Build Coastguard Worker buf = xmlOutputBufferCreateFile(out, NULL);
680*7c568831SAndroid Build Coastguard Worker if (buf == NULL) {
681*7c568831SAndroid Build Coastguard Worker xmlFreeDoc(doc);
682*7c568831SAndroid Build Coastguard Worker return(-1);
683*7c568831SAndroid Build Coastguard Worker }
684*7c568831SAndroid Build Coastguard Worker ret = xmlSaveFormatFileTo(buf, doc, NULL, 1);
685*7c568831SAndroid Build Coastguard Worker
686*7c568831SAndroid Build Coastguard Worker /*
687*7c568831SAndroid Build Coastguard Worker * Free it
688*7c568831SAndroid Build Coastguard Worker */
689*7c568831SAndroid Build Coastguard Worker xmlFreeDoc(doc);
690*7c568831SAndroid Build Coastguard Worker
691*7c568831SAndroid Build Coastguard Worker return(ret);
692*7c568831SAndroid Build Coastguard Worker }
693*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_OUTPUT_ENABLED */
694*7c568831SAndroid Build Coastguard Worker
695*7c568831SAndroid Build Coastguard Worker /************************************************************************
696*7c568831SAndroid Build Coastguard Worker * *
697*7c568831SAndroid Build Coastguard Worker * Converting SGML Catalogs to XML *
698*7c568831SAndroid Build Coastguard Worker * *
699*7c568831SAndroid Build Coastguard Worker ************************************************************************/
700*7c568831SAndroid Build Coastguard Worker
701*7c568831SAndroid Build Coastguard Worker /**
702*7c568831SAndroid Build Coastguard Worker * xmlCatalogConvertEntry:
703*7c568831SAndroid Build Coastguard Worker * @entry: the entry
704*7c568831SAndroid Build Coastguard Worker * @catal: pointer to the catalog being converted
705*7c568831SAndroid Build Coastguard Worker *
706*7c568831SAndroid Build Coastguard Worker * Convert one entry from the catalog
707*7c568831SAndroid Build Coastguard Worker */
708*7c568831SAndroid Build Coastguard Worker static void
xmlCatalogConvertEntry(void * payload,void * data,const xmlChar * name ATTRIBUTE_UNUSED)709*7c568831SAndroid Build Coastguard Worker xmlCatalogConvertEntry(void *payload, void *data,
710*7c568831SAndroid Build Coastguard Worker const xmlChar *name ATTRIBUTE_UNUSED) {
711*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr entry = (xmlCatalogEntryPtr) payload;
712*7c568831SAndroid Build Coastguard Worker xmlCatalogPtr catal = (xmlCatalogPtr) data;
713*7c568831SAndroid Build Coastguard Worker if ((entry == NULL) || (catal == NULL) || (catal->sgml == NULL) ||
714*7c568831SAndroid Build Coastguard Worker (catal->xml == NULL))
715*7c568831SAndroid Build Coastguard Worker return;
716*7c568831SAndroid Build Coastguard Worker switch (entry->type) {
717*7c568831SAndroid Build Coastguard Worker case SGML_CATA_ENTITY:
718*7c568831SAndroid Build Coastguard Worker entry->type = XML_CATA_PUBLIC;
719*7c568831SAndroid Build Coastguard Worker break;
720*7c568831SAndroid Build Coastguard Worker case SGML_CATA_PENTITY:
721*7c568831SAndroid Build Coastguard Worker entry->type = XML_CATA_PUBLIC;
722*7c568831SAndroid Build Coastguard Worker break;
723*7c568831SAndroid Build Coastguard Worker case SGML_CATA_DOCTYPE:
724*7c568831SAndroid Build Coastguard Worker entry->type = XML_CATA_PUBLIC;
725*7c568831SAndroid Build Coastguard Worker break;
726*7c568831SAndroid Build Coastguard Worker case SGML_CATA_LINKTYPE:
727*7c568831SAndroid Build Coastguard Worker entry->type = XML_CATA_PUBLIC;
728*7c568831SAndroid Build Coastguard Worker break;
729*7c568831SAndroid Build Coastguard Worker case SGML_CATA_NOTATION:
730*7c568831SAndroid Build Coastguard Worker entry->type = XML_CATA_PUBLIC;
731*7c568831SAndroid Build Coastguard Worker break;
732*7c568831SAndroid Build Coastguard Worker case SGML_CATA_PUBLIC:
733*7c568831SAndroid Build Coastguard Worker entry->type = XML_CATA_PUBLIC;
734*7c568831SAndroid Build Coastguard Worker break;
735*7c568831SAndroid Build Coastguard Worker case SGML_CATA_SYSTEM:
736*7c568831SAndroid Build Coastguard Worker entry->type = XML_CATA_SYSTEM;
737*7c568831SAndroid Build Coastguard Worker break;
738*7c568831SAndroid Build Coastguard Worker case SGML_CATA_DELEGATE:
739*7c568831SAndroid Build Coastguard Worker entry->type = XML_CATA_DELEGATE_PUBLIC;
740*7c568831SAndroid Build Coastguard Worker break;
741*7c568831SAndroid Build Coastguard Worker case SGML_CATA_CATALOG:
742*7c568831SAndroid Build Coastguard Worker entry->type = XML_CATA_CATALOG;
743*7c568831SAndroid Build Coastguard Worker break;
744*7c568831SAndroid Build Coastguard Worker default:
745*7c568831SAndroid Build Coastguard Worker xmlHashRemoveEntry(catal->sgml, entry->name, xmlFreeCatalogEntry);
746*7c568831SAndroid Build Coastguard Worker return;
747*7c568831SAndroid Build Coastguard Worker }
748*7c568831SAndroid Build Coastguard Worker /*
749*7c568831SAndroid Build Coastguard Worker * Conversion successful, remove from the SGML catalog
750*7c568831SAndroid Build Coastguard Worker * and add it to the default XML one
751*7c568831SAndroid Build Coastguard Worker */
752*7c568831SAndroid Build Coastguard Worker xmlHashRemoveEntry(catal->sgml, entry->name, NULL);
753*7c568831SAndroid Build Coastguard Worker entry->parent = catal->xml;
754*7c568831SAndroid Build Coastguard Worker entry->next = NULL;
755*7c568831SAndroid Build Coastguard Worker if (catal->xml->children == NULL)
756*7c568831SAndroid Build Coastguard Worker catal->xml->children = entry;
757*7c568831SAndroid Build Coastguard Worker else {
758*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr prev;
759*7c568831SAndroid Build Coastguard Worker
760*7c568831SAndroid Build Coastguard Worker prev = catal->xml->children;
761*7c568831SAndroid Build Coastguard Worker while (prev->next != NULL)
762*7c568831SAndroid Build Coastguard Worker prev = prev->next;
763*7c568831SAndroid Build Coastguard Worker prev->next = entry;
764*7c568831SAndroid Build Coastguard Worker }
765*7c568831SAndroid Build Coastguard Worker }
766*7c568831SAndroid Build Coastguard Worker
767*7c568831SAndroid Build Coastguard Worker /**
768*7c568831SAndroid Build Coastguard Worker * xmlConvertSGMLCatalog:
769*7c568831SAndroid Build Coastguard Worker * @catal: the catalog
770*7c568831SAndroid Build Coastguard Worker *
771*7c568831SAndroid Build Coastguard Worker * Convert all the SGML catalog entries as XML ones
772*7c568831SAndroid Build Coastguard Worker *
773*7c568831SAndroid Build Coastguard Worker * Returns the number of entries converted if successful, -1 otherwise
774*7c568831SAndroid Build Coastguard Worker */
775*7c568831SAndroid Build Coastguard Worker int
xmlConvertSGMLCatalog(xmlCatalogPtr catal)776*7c568831SAndroid Build Coastguard Worker xmlConvertSGMLCatalog(xmlCatalogPtr catal) {
777*7c568831SAndroid Build Coastguard Worker
778*7c568831SAndroid Build Coastguard Worker if ((catal == NULL) || (catal->type != XML_SGML_CATALOG_TYPE))
779*7c568831SAndroid Build Coastguard Worker return(-1);
780*7c568831SAndroid Build Coastguard Worker
781*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs) {
782*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
783*7c568831SAndroid Build Coastguard Worker "Converting SGML catalog to XML\n");
784*7c568831SAndroid Build Coastguard Worker }
785*7c568831SAndroid Build Coastguard Worker xmlHashScan(catal->sgml, xmlCatalogConvertEntry, &catal);
786*7c568831SAndroid Build Coastguard Worker return(0);
787*7c568831SAndroid Build Coastguard Worker }
788*7c568831SAndroid Build Coastguard Worker
789*7c568831SAndroid Build Coastguard Worker /************************************************************************
790*7c568831SAndroid Build Coastguard Worker * *
791*7c568831SAndroid Build Coastguard Worker * Helper function *
792*7c568831SAndroid Build Coastguard Worker * *
793*7c568831SAndroid Build Coastguard Worker ************************************************************************/
794*7c568831SAndroid Build Coastguard Worker
795*7c568831SAndroid Build Coastguard Worker /**
796*7c568831SAndroid Build Coastguard Worker * xmlCatalogUnWrapURN:
797*7c568831SAndroid Build Coastguard Worker * @urn: an "urn:publicid:" to unwrap
798*7c568831SAndroid Build Coastguard Worker *
799*7c568831SAndroid Build Coastguard Worker * Expand the URN into the equivalent Public Identifier
800*7c568831SAndroid Build Coastguard Worker *
801*7c568831SAndroid Build Coastguard Worker * Returns the new identifier or NULL, the string must be deallocated
802*7c568831SAndroid Build Coastguard Worker * by the caller.
803*7c568831SAndroid Build Coastguard Worker */
804*7c568831SAndroid Build Coastguard Worker static xmlChar *
xmlCatalogUnWrapURN(const xmlChar * urn)805*7c568831SAndroid Build Coastguard Worker xmlCatalogUnWrapURN(const xmlChar *urn) {
806*7c568831SAndroid Build Coastguard Worker xmlChar result[2000];
807*7c568831SAndroid Build Coastguard Worker unsigned int i = 0;
808*7c568831SAndroid Build Coastguard Worker
809*7c568831SAndroid Build Coastguard Worker if (xmlStrncmp(urn, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1))
810*7c568831SAndroid Build Coastguard Worker return(NULL);
811*7c568831SAndroid Build Coastguard Worker urn += sizeof(XML_URN_PUBID) - 1;
812*7c568831SAndroid Build Coastguard Worker
813*7c568831SAndroid Build Coastguard Worker while (*urn != 0) {
814*7c568831SAndroid Build Coastguard Worker if (i > sizeof(result) - 4)
815*7c568831SAndroid Build Coastguard Worker break;
816*7c568831SAndroid Build Coastguard Worker if (*urn == '+') {
817*7c568831SAndroid Build Coastguard Worker result[i++] = ' ';
818*7c568831SAndroid Build Coastguard Worker urn++;
819*7c568831SAndroid Build Coastguard Worker } else if (*urn == ':') {
820*7c568831SAndroid Build Coastguard Worker result[i++] = '/';
821*7c568831SAndroid Build Coastguard Worker result[i++] = '/';
822*7c568831SAndroid Build Coastguard Worker urn++;
823*7c568831SAndroid Build Coastguard Worker } else if (*urn == ';') {
824*7c568831SAndroid Build Coastguard Worker result[i++] = ':';
825*7c568831SAndroid Build Coastguard Worker result[i++] = ':';
826*7c568831SAndroid Build Coastguard Worker urn++;
827*7c568831SAndroid Build Coastguard Worker } else if (*urn == '%') {
828*7c568831SAndroid Build Coastguard Worker if ((urn[1] == '2') && (urn[2] == 'B'))
829*7c568831SAndroid Build Coastguard Worker result[i++] = '+';
830*7c568831SAndroid Build Coastguard Worker else if ((urn[1] == '3') && (urn[2] == 'A'))
831*7c568831SAndroid Build Coastguard Worker result[i++] = ':';
832*7c568831SAndroid Build Coastguard Worker else if ((urn[1] == '2') && (urn[2] == 'F'))
833*7c568831SAndroid Build Coastguard Worker result[i++] = '/';
834*7c568831SAndroid Build Coastguard Worker else if ((urn[1] == '3') && (urn[2] == 'B'))
835*7c568831SAndroid Build Coastguard Worker result[i++] = ';';
836*7c568831SAndroid Build Coastguard Worker else if ((urn[1] == '2') && (urn[2] == '7'))
837*7c568831SAndroid Build Coastguard Worker result[i++] = '\'';
838*7c568831SAndroid Build Coastguard Worker else if ((urn[1] == '3') && (urn[2] == 'F'))
839*7c568831SAndroid Build Coastguard Worker result[i++] = '?';
840*7c568831SAndroid Build Coastguard Worker else if ((urn[1] == '2') && (urn[2] == '3'))
841*7c568831SAndroid Build Coastguard Worker result[i++] = '#';
842*7c568831SAndroid Build Coastguard Worker else if ((urn[1] == '2') && (urn[2] == '5'))
843*7c568831SAndroid Build Coastguard Worker result[i++] = '%';
844*7c568831SAndroid Build Coastguard Worker else {
845*7c568831SAndroid Build Coastguard Worker result[i++] = *urn;
846*7c568831SAndroid Build Coastguard Worker urn++;
847*7c568831SAndroid Build Coastguard Worker continue;
848*7c568831SAndroid Build Coastguard Worker }
849*7c568831SAndroid Build Coastguard Worker urn += 3;
850*7c568831SAndroid Build Coastguard Worker } else {
851*7c568831SAndroid Build Coastguard Worker result[i++] = *urn;
852*7c568831SAndroid Build Coastguard Worker urn++;
853*7c568831SAndroid Build Coastguard Worker }
854*7c568831SAndroid Build Coastguard Worker }
855*7c568831SAndroid Build Coastguard Worker result[i] = 0;
856*7c568831SAndroid Build Coastguard Worker
857*7c568831SAndroid Build Coastguard Worker return(xmlStrdup(result));
858*7c568831SAndroid Build Coastguard Worker }
859*7c568831SAndroid Build Coastguard Worker
860*7c568831SAndroid Build Coastguard Worker /**
861*7c568831SAndroid Build Coastguard Worker * xmlParseCatalogFile:
862*7c568831SAndroid Build Coastguard Worker * @filename: the filename
863*7c568831SAndroid Build Coastguard Worker *
864*7c568831SAndroid Build Coastguard Worker * parse an XML file and build a tree. It's like xmlParseFile()
865*7c568831SAndroid Build Coastguard Worker * except it bypass all catalog lookups.
866*7c568831SAndroid Build Coastguard Worker *
867*7c568831SAndroid Build Coastguard Worker * Returns the resulting document tree or NULL in case of error
868*7c568831SAndroid Build Coastguard Worker */
869*7c568831SAndroid Build Coastguard Worker
870*7c568831SAndroid Build Coastguard Worker xmlDocPtr
xmlParseCatalogFile(const char * filename)871*7c568831SAndroid Build Coastguard Worker xmlParseCatalogFile(const char *filename) {
872*7c568831SAndroid Build Coastguard Worker xmlDocPtr ret;
873*7c568831SAndroid Build Coastguard Worker xmlParserCtxtPtr ctxt;
874*7c568831SAndroid Build Coastguard Worker xmlParserInputPtr inputStream;
875*7c568831SAndroid Build Coastguard Worker xmlParserInputBufferPtr buf;
876*7c568831SAndroid Build Coastguard Worker
877*7c568831SAndroid Build Coastguard Worker ctxt = xmlNewParserCtxt();
878*7c568831SAndroid Build Coastguard Worker if (ctxt == NULL) {
879*7c568831SAndroid Build Coastguard Worker xmlCatalogErrMemory();
880*7c568831SAndroid Build Coastguard Worker return(NULL);
881*7c568831SAndroid Build Coastguard Worker }
882*7c568831SAndroid Build Coastguard Worker
883*7c568831SAndroid Build Coastguard Worker buf = xmlParserInputBufferCreateFilename(filename, XML_CHAR_ENCODING_NONE);
884*7c568831SAndroid Build Coastguard Worker if (buf == NULL) {
885*7c568831SAndroid Build Coastguard Worker xmlFreeParserCtxt(ctxt);
886*7c568831SAndroid Build Coastguard Worker return(NULL);
887*7c568831SAndroid Build Coastguard Worker }
888*7c568831SAndroid Build Coastguard Worker
889*7c568831SAndroid Build Coastguard Worker inputStream = xmlNewInputStream(ctxt);
890*7c568831SAndroid Build Coastguard Worker if (inputStream == NULL) {
891*7c568831SAndroid Build Coastguard Worker xmlFreeParserInputBuffer(buf);
892*7c568831SAndroid Build Coastguard Worker xmlFreeParserCtxt(ctxt);
893*7c568831SAndroid Build Coastguard Worker return(NULL);
894*7c568831SAndroid Build Coastguard Worker }
895*7c568831SAndroid Build Coastguard Worker
896*7c568831SAndroid Build Coastguard Worker inputStream->filename = (char *) xmlCanonicPath((const xmlChar *)filename);
897*7c568831SAndroid Build Coastguard Worker inputStream->buf = buf;
898*7c568831SAndroid Build Coastguard Worker xmlBufResetInput(buf->buffer, inputStream);
899*7c568831SAndroid Build Coastguard Worker
900*7c568831SAndroid Build Coastguard Worker if (inputPush(ctxt, inputStream) < 0) {
901*7c568831SAndroid Build Coastguard Worker xmlFreeInputStream(inputStream);
902*7c568831SAndroid Build Coastguard Worker xmlFreeParserCtxt(ctxt);
903*7c568831SAndroid Build Coastguard Worker return(NULL);
904*7c568831SAndroid Build Coastguard Worker }
905*7c568831SAndroid Build Coastguard Worker
906*7c568831SAndroid Build Coastguard Worker ctxt->valid = 0;
907*7c568831SAndroid Build Coastguard Worker ctxt->validate = 0;
908*7c568831SAndroid Build Coastguard Worker ctxt->loadsubset = 0;
909*7c568831SAndroid Build Coastguard Worker ctxt->pedantic = 0;
910*7c568831SAndroid Build Coastguard Worker ctxt->dictNames = 1;
911*7c568831SAndroid Build Coastguard Worker
912*7c568831SAndroid Build Coastguard Worker xmlParseDocument(ctxt);
913*7c568831SAndroid Build Coastguard Worker
914*7c568831SAndroid Build Coastguard Worker if (ctxt->wellFormed)
915*7c568831SAndroid Build Coastguard Worker ret = ctxt->myDoc;
916*7c568831SAndroid Build Coastguard Worker else {
917*7c568831SAndroid Build Coastguard Worker ret = NULL;
918*7c568831SAndroid Build Coastguard Worker xmlFreeDoc(ctxt->myDoc);
919*7c568831SAndroid Build Coastguard Worker ctxt->myDoc = NULL;
920*7c568831SAndroid Build Coastguard Worker }
921*7c568831SAndroid Build Coastguard Worker xmlFreeParserCtxt(ctxt);
922*7c568831SAndroid Build Coastguard Worker
923*7c568831SAndroid Build Coastguard Worker return(ret);
924*7c568831SAndroid Build Coastguard Worker }
925*7c568831SAndroid Build Coastguard Worker
926*7c568831SAndroid Build Coastguard Worker /**
927*7c568831SAndroid Build Coastguard Worker * xmlLoadFileContent:
928*7c568831SAndroid Build Coastguard Worker * @filename: a file path
929*7c568831SAndroid Build Coastguard Worker *
930*7c568831SAndroid Build Coastguard Worker * Load a file content into memory.
931*7c568831SAndroid Build Coastguard Worker *
932*7c568831SAndroid Build Coastguard Worker * Returns a pointer to the 0 terminated string or NULL in case of error
933*7c568831SAndroid Build Coastguard Worker */
934*7c568831SAndroid Build Coastguard Worker static xmlChar *
xmlLoadFileContent(const char * filename)935*7c568831SAndroid Build Coastguard Worker xmlLoadFileContent(const char *filename)
936*7c568831SAndroid Build Coastguard Worker {
937*7c568831SAndroid Build Coastguard Worker int fd;
938*7c568831SAndroid Build Coastguard Worker int len;
939*7c568831SAndroid Build Coastguard Worker long size;
940*7c568831SAndroid Build Coastguard Worker
941*7c568831SAndroid Build Coastguard Worker struct stat info;
942*7c568831SAndroid Build Coastguard Worker xmlChar *content;
943*7c568831SAndroid Build Coastguard Worker
944*7c568831SAndroid Build Coastguard Worker if (filename == NULL)
945*7c568831SAndroid Build Coastguard Worker return (NULL);
946*7c568831SAndroid Build Coastguard Worker
947*7c568831SAndroid Build Coastguard Worker if (stat(filename, &info) < 0)
948*7c568831SAndroid Build Coastguard Worker return (NULL);
949*7c568831SAndroid Build Coastguard Worker
950*7c568831SAndroid Build Coastguard Worker fd = open(filename, O_RDONLY);
951*7c568831SAndroid Build Coastguard Worker if (fd < 0)
952*7c568831SAndroid Build Coastguard Worker {
953*7c568831SAndroid Build Coastguard Worker return (NULL);
954*7c568831SAndroid Build Coastguard Worker }
955*7c568831SAndroid Build Coastguard Worker size = info.st_size;
956*7c568831SAndroid Build Coastguard Worker content = xmlMalloc(size + 10);
957*7c568831SAndroid Build Coastguard Worker if (content == NULL) {
958*7c568831SAndroid Build Coastguard Worker xmlCatalogErrMemory();
959*7c568831SAndroid Build Coastguard Worker close(fd);
960*7c568831SAndroid Build Coastguard Worker return (NULL);
961*7c568831SAndroid Build Coastguard Worker }
962*7c568831SAndroid Build Coastguard Worker len = read(fd, content, size);
963*7c568831SAndroid Build Coastguard Worker close(fd);
964*7c568831SAndroid Build Coastguard Worker if (len < 0) {
965*7c568831SAndroid Build Coastguard Worker xmlFree(content);
966*7c568831SAndroid Build Coastguard Worker return (NULL);
967*7c568831SAndroid Build Coastguard Worker }
968*7c568831SAndroid Build Coastguard Worker content[len] = 0;
969*7c568831SAndroid Build Coastguard Worker
970*7c568831SAndroid Build Coastguard Worker return(content);
971*7c568831SAndroid Build Coastguard Worker }
972*7c568831SAndroid Build Coastguard Worker
973*7c568831SAndroid Build Coastguard Worker /**
974*7c568831SAndroid Build Coastguard Worker * xmlCatalogNormalizePublic:
975*7c568831SAndroid Build Coastguard Worker * @pubID: the public ID string
976*7c568831SAndroid Build Coastguard Worker *
977*7c568831SAndroid Build Coastguard Worker * Normalizes the Public Identifier
978*7c568831SAndroid Build Coastguard Worker *
979*7c568831SAndroid Build Coastguard Worker * Implements 6.2. Public Identifier Normalization
980*7c568831SAndroid Build Coastguard Worker * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html
981*7c568831SAndroid Build Coastguard Worker *
982*7c568831SAndroid Build Coastguard Worker * Returns the new string or NULL, the string must be deallocated
983*7c568831SAndroid Build Coastguard Worker * by the caller.
984*7c568831SAndroid Build Coastguard Worker */
985*7c568831SAndroid Build Coastguard Worker static xmlChar *
xmlCatalogNormalizePublic(const xmlChar * pubID)986*7c568831SAndroid Build Coastguard Worker xmlCatalogNormalizePublic(const xmlChar *pubID)
987*7c568831SAndroid Build Coastguard Worker {
988*7c568831SAndroid Build Coastguard Worker int ok = 1;
989*7c568831SAndroid Build Coastguard Worker int white;
990*7c568831SAndroid Build Coastguard Worker const xmlChar *p;
991*7c568831SAndroid Build Coastguard Worker xmlChar *ret;
992*7c568831SAndroid Build Coastguard Worker xmlChar *q;
993*7c568831SAndroid Build Coastguard Worker
994*7c568831SAndroid Build Coastguard Worker if (pubID == NULL)
995*7c568831SAndroid Build Coastguard Worker return(NULL);
996*7c568831SAndroid Build Coastguard Worker
997*7c568831SAndroid Build Coastguard Worker white = 1;
998*7c568831SAndroid Build Coastguard Worker for (p = pubID;*p != 0 && ok;p++) {
999*7c568831SAndroid Build Coastguard Worker if (!xmlIsBlank_ch(*p))
1000*7c568831SAndroid Build Coastguard Worker white = 0;
1001*7c568831SAndroid Build Coastguard Worker else if (*p == 0x20 && !white)
1002*7c568831SAndroid Build Coastguard Worker white = 1;
1003*7c568831SAndroid Build Coastguard Worker else
1004*7c568831SAndroid Build Coastguard Worker ok = 0;
1005*7c568831SAndroid Build Coastguard Worker }
1006*7c568831SAndroid Build Coastguard Worker if (ok && !white) /* is normalized */
1007*7c568831SAndroid Build Coastguard Worker return(NULL);
1008*7c568831SAndroid Build Coastguard Worker
1009*7c568831SAndroid Build Coastguard Worker ret = xmlStrdup(pubID);
1010*7c568831SAndroid Build Coastguard Worker q = ret;
1011*7c568831SAndroid Build Coastguard Worker white = 0;
1012*7c568831SAndroid Build Coastguard Worker for (p = pubID;*p != 0;p++) {
1013*7c568831SAndroid Build Coastguard Worker if (xmlIsBlank_ch(*p)) {
1014*7c568831SAndroid Build Coastguard Worker if (q != ret)
1015*7c568831SAndroid Build Coastguard Worker white = 1;
1016*7c568831SAndroid Build Coastguard Worker } else {
1017*7c568831SAndroid Build Coastguard Worker if (white) {
1018*7c568831SAndroid Build Coastguard Worker *(q++) = 0x20;
1019*7c568831SAndroid Build Coastguard Worker white = 0;
1020*7c568831SAndroid Build Coastguard Worker }
1021*7c568831SAndroid Build Coastguard Worker *(q++) = *p;
1022*7c568831SAndroid Build Coastguard Worker }
1023*7c568831SAndroid Build Coastguard Worker }
1024*7c568831SAndroid Build Coastguard Worker *q = 0;
1025*7c568831SAndroid Build Coastguard Worker return(ret);
1026*7c568831SAndroid Build Coastguard Worker }
1027*7c568831SAndroid Build Coastguard Worker
1028*7c568831SAndroid Build Coastguard Worker /************************************************************************
1029*7c568831SAndroid Build Coastguard Worker * *
1030*7c568831SAndroid Build Coastguard Worker * The XML Catalog parser *
1031*7c568831SAndroid Build Coastguard Worker * *
1032*7c568831SAndroid Build Coastguard Worker ************************************************************************/
1033*7c568831SAndroid Build Coastguard Worker
1034*7c568831SAndroid Build Coastguard Worker static xmlCatalogEntryPtr
1035*7c568831SAndroid Build Coastguard Worker xmlParseXMLCatalogFile(xmlCatalogPrefer prefer, const xmlChar *filename);
1036*7c568831SAndroid Build Coastguard Worker static void
1037*7c568831SAndroid Build Coastguard Worker xmlParseXMLCatalogNodeList(xmlNodePtr cur, xmlCatalogPrefer prefer,
1038*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr parent, xmlCatalogEntryPtr cgroup);
1039*7c568831SAndroid Build Coastguard Worker static xmlChar *
1040*7c568831SAndroid Build Coastguard Worker xmlCatalogListXMLResolve(xmlCatalogEntryPtr catal, const xmlChar *pubID,
1041*7c568831SAndroid Build Coastguard Worker const xmlChar *sysID);
1042*7c568831SAndroid Build Coastguard Worker static xmlChar *
1043*7c568831SAndroid Build Coastguard Worker xmlCatalogListXMLResolveURI(xmlCatalogEntryPtr catal, const xmlChar *URI);
1044*7c568831SAndroid Build Coastguard Worker
1045*7c568831SAndroid Build Coastguard Worker
1046*7c568831SAndroid Build Coastguard Worker /**
1047*7c568831SAndroid Build Coastguard Worker * xmlGetXMLCatalogEntryType:
1048*7c568831SAndroid Build Coastguard Worker * @name: the name
1049*7c568831SAndroid Build Coastguard Worker *
1050*7c568831SAndroid Build Coastguard Worker * lookup the internal type associated to an XML catalog entry name
1051*7c568831SAndroid Build Coastguard Worker *
1052*7c568831SAndroid Build Coastguard Worker * Returns the type associated with that name
1053*7c568831SAndroid Build Coastguard Worker */
1054*7c568831SAndroid Build Coastguard Worker static xmlCatalogEntryType
xmlGetXMLCatalogEntryType(const xmlChar * name)1055*7c568831SAndroid Build Coastguard Worker xmlGetXMLCatalogEntryType(const xmlChar *name) {
1056*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryType type = XML_CATA_NONE;
1057*7c568831SAndroid Build Coastguard Worker if (xmlStrEqual(name, (const xmlChar *) "system"))
1058*7c568831SAndroid Build Coastguard Worker type = XML_CATA_SYSTEM;
1059*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "public"))
1060*7c568831SAndroid Build Coastguard Worker type = XML_CATA_PUBLIC;
1061*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "rewriteSystem"))
1062*7c568831SAndroid Build Coastguard Worker type = XML_CATA_REWRITE_SYSTEM;
1063*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "delegatePublic"))
1064*7c568831SAndroid Build Coastguard Worker type = XML_CATA_DELEGATE_PUBLIC;
1065*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "delegateSystem"))
1066*7c568831SAndroid Build Coastguard Worker type = XML_CATA_DELEGATE_SYSTEM;
1067*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "uri"))
1068*7c568831SAndroid Build Coastguard Worker type = XML_CATA_URI;
1069*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "rewriteURI"))
1070*7c568831SAndroid Build Coastguard Worker type = XML_CATA_REWRITE_URI;
1071*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "delegateURI"))
1072*7c568831SAndroid Build Coastguard Worker type = XML_CATA_DELEGATE_URI;
1073*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "nextCatalog"))
1074*7c568831SAndroid Build Coastguard Worker type = XML_CATA_NEXT_CATALOG;
1075*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "catalog"))
1076*7c568831SAndroid Build Coastguard Worker type = XML_CATA_CATALOG;
1077*7c568831SAndroid Build Coastguard Worker return(type);
1078*7c568831SAndroid Build Coastguard Worker }
1079*7c568831SAndroid Build Coastguard Worker
1080*7c568831SAndroid Build Coastguard Worker /**
1081*7c568831SAndroid Build Coastguard Worker * xmlParseXMLCatalogOneNode:
1082*7c568831SAndroid Build Coastguard Worker * @cur: the XML node
1083*7c568831SAndroid Build Coastguard Worker * @type: the type of Catalog entry
1084*7c568831SAndroid Build Coastguard Worker * @name: the name of the node
1085*7c568831SAndroid Build Coastguard Worker * @attrName: the attribute holding the value
1086*7c568831SAndroid Build Coastguard Worker * @uriAttrName: the attribute holding the URI-Reference
1087*7c568831SAndroid Build Coastguard Worker * @prefer: the PUBLIC vs. SYSTEM current preference value
1088*7c568831SAndroid Build Coastguard Worker * @cgroup: the group which includes this node
1089*7c568831SAndroid Build Coastguard Worker *
1090*7c568831SAndroid Build Coastguard Worker * Finishes the examination of an XML tree node of a catalog and build
1091*7c568831SAndroid Build Coastguard Worker * a Catalog entry from it.
1092*7c568831SAndroid Build Coastguard Worker *
1093*7c568831SAndroid Build Coastguard Worker * Returns the new Catalog entry node or NULL in case of error.
1094*7c568831SAndroid Build Coastguard Worker */
1095*7c568831SAndroid Build Coastguard Worker static xmlCatalogEntryPtr
xmlParseXMLCatalogOneNode(xmlNodePtr cur,xmlCatalogEntryType type,const xmlChar * name,const xmlChar * attrName,const xmlChar * uriAttrName,xmlCatalogPrefer prefer,xmlCatalogEntryPtr cgroup)1096*7c568831SAndroid Build Coastguard Worker xmlParseXMLCatalogOneNode(xmlNodePtr cur, xmlCatalogEntryType type,
1097*7c568831SAndroid Build Coastguard Worker const xmlChar *name, const xmlChar *attrName,
1098*7c568831SAndroid Build Coastguard Worker const xmlChar *uriAttrName, xmlCatalogPrefer prefer,
1099*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr cgroup) {
1100*7c568831SAndroid Build Coastguard Worker int ok = 1;
1101*7c568831SAndroid Build Coastguard Worker xmlChar *uriValue;
1102*7c568831SAndroid Build Coastguard Worker xmlChar *nameValue = NULL;
1103*7c568831SAndroid Build Coastguard Worker xmlChar *base = NULL;
1104*7c568831SAndroid Build Coastguard Worker xmlChar *URL = NULL;
1105*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr ret = NULL;
1106*7c568831SAndroid Build Coastguard Worker
1107*7c568831SAndroid Build Coastguard Worker if (attrName != NULL) {
1108*7c568831SAndroid Build Coastguard Worker nameValue = xmlGetProp(cur, attrName);
1109*7c568831SAndroid Build Coastguard Worker if (nameValue == NULL) {
1110*7c568831SAndroid Build Coastguard Worker xmlCatalogErr(ret, cur, XML_CATALOG_MISSING_ATTR,
1111*7c568831SAndroid Build Coastguard Worker "%s entry lacks '%s'\n", name, attrName, NULL);
1112*7c568831SAndroid Build Coastguard Worker ok = 0;
1113*7c568831SAndroid Build Coastguard Worker }
1114*7c568831SAndroid Build Coastguard Worker }
1115*7c568831SAndroid Build Coastguard Worker uriValue = xmlGetProp(cur, uriAttrName);
1116*7c568831SAndroid Build Coastguard Worker if (uriValue == NULL) {
1117*7c568831SAndroid Build Coastguard Worker xmlCatalogErr(ret, cur, XML_CATALOG_MISSING_ATTR,
1118*7c568831SAndroid Build Coastguard Worker "%s entry lacks '%s'\n", name, uriAttrName, NULL);
1119*7c568831SAndroid Build Coastguard Worker ok = 0;
1120*7c568831SAndroid Build Coastguard Worker }
1121*7c568831SAndroid Build Coastguard Worker if (!ok) {
1122*7c568831SAndroid Build Coastguard Worker if (nameValue != NULL)
1123*7c568831SAndroid Build Coastguard Worker xmlFree(nameValue);
1124*7c568831SAndroid Build Coastguard Worker if (uriValue != NULL)
1125*7c568831SAndroid Build Coastguard Worker xmlFree(uriValue);
1126*7c568831SAndroid Build Coastguard Worker return(NULL);
1127*7c568831SAndroid Build Coastguard Worker }
1128*7c568831SAndroid Build Coastguard Worker
1129*7c568831SAndroid Build Coastguard Worker base = xmlNodeGetBase(cur->doc, cur);
1130*7c568831SAndroid Build Coastguard Worker URL = xmlBuildURI(uriValue, base);
1131*7c568831SAndroid Build Coastguard Worker if (URL != NULL) {
1132*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs > 1) {
1133*7c568831SAndroid Build Coastguard Worker if (nameValue != NULL)
1134*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
1135*7c568831SAndroid Build Coastguard Worker "Found %s: '%s' '%s'\n", name, nameValue, URL);
1136*7c568831SAndroid Build Coastguard Worker else
1137*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
1138*7c568831SAndroid Build Coastguard Worker "Found %s: '%s'\n", name, URL);
1139*7c568831SAndroid Build Coastguard Worker }
1140*7c568831SAndroid Build Coastguard Worker ret = xmlNewCatalogEntry(type, nameValue, uriValue, URL, prefer, cgroup);
1141*7c568831SAndroid Build Coastguard Worker } else {
1142*7c568831SAndroid Build Coastguard Worker xmlCatalogErr(ret, cur, XML_CATALOG_ENTRY_BROKEN,
1143*7c568831SAndroid Build Coastguard Worker "%s entry '%s' broken ?: %s\n", name, uriAttrName, uriValue);
1144*7c568831SAndroid Build Coastguard Worker }
1145*7c568831SAndroid Build Coastguard Worker if (nameValue != NULL)
1146*7c568831SAndroid Build Coastguard Worker xmlFree(nameValue);
1147*7c568831SAndroid Build Coastguard Worker if (uriValue != NULL)
1148*7c568831SAndroid Build Coastguard Worker xmlFree(uriValue);
1149*7c568831SAndroid Build Coastguard Worker if (base != NULL)
1150*7c568831SAndroid Build Coastguard Worker xmlFree(base);
1151*7c568831SAndroid Build Coastguard Worker if (URL != NULL)
1152*7c568831SAndroid Build Coastguard Worker xmlFree(URL);
1153*7c568831SAndroid Build Coastguard Worker return(ret);
1154*7c568831SAndroid Build Coastguard Worker }
1155*7c568831SAndroid Build Coastguard Worker
1156*7c568831SAndroid Build Coastguard Worker /**
1157*7c568831SAndroid Build Coastguard Worker * xmlParseXMLCatalogNode:
1158*7c568831SAndroid Build Coastguard Worker * @cur: the XML node
1159*7c568831SAndroid Build Coastguard Worker * @prefer: the PUBLIC vs. SYSTEM current preference value
1160*7c568831SAndroid Build Coastguard Worker * @parent: the parent Catalog entry
1161*7c568831SAndroid Build Coastguard Worker * @cgroup: the group which includes this node
1162*7c568831SAndroid Build Coastguard Worker *
1163*7c568831SAndroid Build Coastguard Worker * Examines an XML tree node of a catalog and build
1164*7c568831SAndroid Build Coastguard Worker * a Catalog entry from it adding it to its parent. The examination can
1165*7c568831SAndroid Build Coastguard Worker * be recursive.
1166*7c568831SAndroid Build Coastguard Worker */
1167*7c568831SAndroid Build Coastguard Worker static void
xmlParseXMLCatalogNode(xmlNodePtr cur,xmlCatalogPrefer prefer,xmlCatalogEntryPtr parent,xmlCatalogEntryPtr cgroup)1168*7c568831SAndroid Build Coastguard Worker xmlParseXMLCatalogNode(xmlNodePtr cur, xmlCatalogPrefer prefer,
1169*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr parent, xmlCatalogEntryPtr cgroup)
1170*7c568831SAndroid Build Coastguard Worker {
1171*7c568831SAndroid Build Coastguard Worker xmlChar *base = NULL;
1172*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr entry = NULL;
1173*7c568831SAndroid Build Coastguard Worker
1174*7c568831SAndroid Build Coastguard Worker if (cur == NULL)
1175*7c568831SAndroid Build Coastguard Worker return;
1176*7c568831SAndroid Build Coastguard Worker if (xmlStrEqual(cur->name, BAD_CAST "group")) {
1177*7c568831SAndroid Build Coastguard Worker xmlChar *prop;
1178*7c568831SAndroid Build Coastguard Worker xmlCatalogPrefer pref = XML_CATA_PREFER_NONE;
1179*7c568831SAndroid Build Coastguard Worker
1180*7c568831SAndroid Build Coastguard Worker prop = xmlGetProp(cur, BAD_CAST "prefer");
1181*7c568831SAndroid Build Coastguard Worker if (prop != NULL) {
1182*7c568831SAndroid Build Coastguard Worker if (xmlStrEqual(prop, BAD_CAST "system")) {
1183*7c568831SAndroid Build Coastguard Worker prefer = XML_CATA_PREFER_SYSTEM;
1184*7c568831SAndroid Build Coastguard Worker } else if (xmlStrEqual(prop, BAD_CAST "public")) {
1185*7c568831SAndroid Build Coastguard Worker prefer = XML_CATA_PREFER_PUBLIC;
1186*7c568831SAndroid Build Coastguard Worker } else {
1187*7c568831SAndroid Build Coastguard Worker xmlCatalogErr(parent, cur, XML_CATALOG_PREFER_VALUE,
1188*7c568831SAndroid Build Coastguard Worker "Invalid value for prefer: '%s'\n",
1189*7c568831SAndroid Build Coastguard Worker prop, NULL, NULL);
1190*7c568831SAndroid Build Coastguard Worker }
1191*7c568831SAndroid Build Coastguard Worker xmlFree(prop);
1192*7c568831SAndroid Build Coastguard Worker pref = prefer;
1193*7c568831SAndroid Build Coastguard Worker }
1194*7c568831SAndroid Build Coastguard Worker prop = xmlGetProp(cur, BAD_CAST "id");
1195*7c568831SAndroid Build Coastguard Worker base = xmlGetNsProp(cur, BAD_CAST "base", XML_XML_NAMESPACE);
1196*7c568831SAndroid Build Coastguard Worker entry = xmlNewCatalogEntry(XML_CATA_GROUP, prop, base, NULL, pref, cgroup);
1197*7c568831SAndroid Build Coastguard Worker xmlFree(prop);
1198*7c568831SAndroid Build Coastguard Worker } else if (xmlStrEqual(cur->name, BAD_CAST "public")) {
1199*7c568831SAndroid Build Coastguard Worker entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_PUBLIC,
1200*7c568831SAndroid Build Coastguard Worker BAD_CAST "public", BAD_CAST "publicId", BAD_CAST "uri", prefer, cgroup);
1201*7c568831SAndroid Build Coastguard Worker } else if (xmlStrEqual(cur->name, BAD_CAST "system")) {
1202*7c568831SAndroid Build Coastguard Worker entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_SYSTEM,
1203*7c568831SAndroid Build Coastguard Worker BAD_CAST "system", BAD_CAST "systemId", BAD_CAST "uri", prefer, cgroup);
1204*7c568831SAndroid Build Coastguard Worker } else if (xmlStrEqual(cur->name, BAD_CAST "rewriteSystem")) {
1205*7c568831SAndroid Build Coastguard Worker entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_REWRITE_SYSTEM,
1206*7c568831SAndroid Build Coastguard Worker BAD_CAST "rewriteSystem", BAD_CAST "systemIdStartString",
1207*7c568831SAndroid Build Coastguard Worker BAD_CAST "rewritePrefix", prefer, cgroup);
1208*7c568831SAndroid Build Coastguard Worker } else if (xmlStrEqual(cur->name, BAD_CAST "delegatePublic")) {
1209*7c568831SAndroid Build Coastguard Worker entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_DELEGATE_PUBLIC,
1210*7c568831SAndroid Build Coastguard Worker BAD_CAST "delegatePublic", BAD_CAST "publicIdStartString",
1211*7c568831SAndroid Build Coastguard Worker BAD_CAST "catalog", prefer, cgroup);
1212*7c568831SAndroid Build Coastguard Worker } else if (xmlStrEqual(cur->name, BAD_CAST "delegateSystem")) {
1213*7c568831SAndroid Build Coastguard Worker entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_DELEGATE_SYSTEM,
1214*7c568831SAndroid Build Coastguard Worker BAD_CAST "delegateSystem", BAD_CAST "systemIdStartString",
1215*7c568831SAndroid Build Coastguard Worker BAD_CAST "catalog", prefer, cgroup);
1216*7c568831SAndroid Build Coastguard Worker } else if (xmlStrEqual(cur->name, BAD_CAST "uri")) {
1217*7c568831SAndroid Build Coastguard Worker entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_URI,
1218*7c568831SAndroid Build Coastguard Worker BAD_CAST "uri", BAD_CAST "name",
1219*7c568831SAndroid Build Coastguard Worker BAD_CAST "uri", prefer, cgroup);
1220*7c568831SAndroid Build Coastguard Worker } else if (xmlStrEqual(cur->name, BAD_CAST "rewriteURI")) {
1221*7c568831SAndroid Build Coastguard Worker entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_REWRITE_URI,
1222*7c568831SAndroid Build Coastguard Worker BAD_CAST "rewriteURI", BAD_CAST "uriStartString",
1223*7c568831SAndroid Build Coastguard Worker BAD_CAST "rewritePrefix", prefer, cgroup);
1224*7c568831SAndroid Build Coastguard Worker } else if (xmlStrEqual(cur->name, BAD_CAST "delegateURI")) {
1225*7c568831SAndroid Build Coastguard Worker entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_DELEGATE_URI,
1226*7c568831SAndroid Build Coastguard Worker BAD_CAST "delegateURI", BAD_CAST "uriStartString",
1227*7c568831SAndroid Build Coastguard Worker BAD_CAST "catalog", prefer, cgroup);
1228*7c568831SAndroid Build Coastguard Worker } else if (xmlStrEqual(cur->name, BAD_CAST "nextCatalog")) {
1229*7c568831SAndroid Build Coastguard Worker entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_NEXT_CATALOG,
1230*7c568831SAndroid Build Coastguard Worker BAD_CAST "nextCatalog", NULL,
1231*7c568831SAndroid Build Coastguard Worker BAD_CAST "catalog", prefer, cgroup);
1232*7c568831SAndroid Build Coastguard Worker }
1233*7c568831SAndroid Build Coastguard Worker if (entry != NULL) {
1234*7c568831SAndroid Build Coastguard Worker if (parent != NULL) {
1235*7c568831SAndroid Build Coastguard Worker entry->parent = parent;
1236*7c568831SAndroid Build Coastguard Worker if (parent->children == NULL)
1237*7c568831SAndroid Build Coastguard Worker parent->children = entry;
1238*7c568831SAndroid Build Coastguard Worker else {
1239*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr prev;
1240*7c568831SAndroid Build Coastguard Worker
1241*7c568831SAndroid Build Coastguard Worker prev = parent->children;
1242*7c568831SAndroid Build Coastguard Worker while (prev->next != NULL)
1243*7c568831SAndroid Build Coastguard Worker prev = prev->next;
1244*7c568831SAndroid Build Coastguard Worker prev->next = entry;
1245*7c568831SAndroid Build Coastguard Worker }
1246*7c568831SAndroid Build Coastguard Worker }
1247*7c568831SAndroid Build Coastguard Worker if (entry->type == XML_CATA_GROUP) {
1248*7c568831SAndroid Build Coastguard Worker /*
1249*7c568831SAndroid Build Coastguard Worker * Recurse to propagate prefer to the subtree
1250*7c568831SAndroid Build Coastguard Worker * (xml:base handling is automated)
1251*7c568831SAndroid Build Coastguard Worker */
1252*7c568831SAndroid Build Coastguard Worker xmlParseXMLCatalogNodeList(cur->children, prefer, parent, entry);
1253*7c568831SAndroid Build Coastguard Worker }
1254*7c568831SAndroid Build Coastguard Worker }
1255*7c568831SAndroid Build Coastguard Worker if (base != NULL)
1256*7c568831SAndroid Build Coastguard Worker xmlFree(base);
1257*7c568831SAndroid Build Coastguard Worker }
1258*7c568831SAndroid Build Coastguard Worker
1259*7c568831SAndroid Build Coastguard Worker /**
1260*7c568831SAndroid Build Coastguard Worker * xmlParseXMLCatalogNodeList:
1261*7c568831SAndroid Build Coastguard Worker * @cur: the XML node list of siblings
1262*7c568831SAndroid Build Coastguard Worker * @prefer: the PUBLIC vs. SYSTEM current preference value
1263*7c568831SAndroid Build Coastguard Worker * @parent: the parent Catalog entry
1264*7c568831SAndroid Build Coastguard Worker * @cgroup: the group which includes this list
1265*7c568831SAndroid Build Coastguard Worker *
1266*7c568831SAndroid Build Coastguard Worker * Examines a list of XML sibling nodes of a catalog and build
1267*7c568831SAndroid Build Coastguard Worker * a list of Catalog entry from it adding it to the parent.
1268*7c568831SAndroid Build Coastguard Worker * The examination will recurse to examine node subtrees.
1269*7c568831SAndroid Build Coastguard Worker */
1270*7c568831SAndroid Build Coastguard Worker static void
xmlParseXMLCatalogNodeList(xmlNodePtr cur,xmlCatalogPrefer prefer,xmlCatalogEntryPtr parent,xmlCatalogEntryPtr cgroup)1271*7c568831SAndroid Build Coastguard Worker xmlParseXMLCatalogNodeList(xmlNodePtr cur, xmlCatalogPrefer prefer,
1272*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr parent, xmlCatalogEntryPtr cgroup) {
1273*7c568831SAndroid Build Coastguard Worker while (cur != NULL) {
1274*7c568831SAndroid Build Coastguard Worker if ((cur->ns != NULL) && (cur->ns->href != NULL) &&
1275*7c568831SAndroid Build Coastguard Worker (xmlStrEqual(cur->ns->href, XML_CATALOGS_NAMESPACE))) {
1276*7c568831SAndroid Build Coastguard Worker xmlParseXMLCatalogNode(cur, prefer, parent, cgroup);
1277*7c568831SAndroid Build Coastguard Worker }
1278*7c568831SAndroid Build Coastguard Worker cur = cur->next;
1279*7c568831SAndroid Build Coastguard Worker }
1280*7c568831SAndroid Build Coastguard Worker /* TODO: sort the list according to REWRITE lengths and prefer value */
1281*7c568831SAndroid Build Coastguard Worker }
1282*7c568831SAndroid Build Coastguard Worker
1283*7c568831SAndroid Build Coastguard Worker /**
1284*7c568831SAndroid Build Coastguard Worker * xmlParseXMLCatalogFile:
1285*7c568831SAndroid Build Coastguard Worker * @prefer: the PUBLIC vs. SYSTEM current preference value
1286*7c568831SAndroid Build Coastguard Worker * @filename: the filename for the catalog
1287*7c568831SAndroid Build Coastguard Worker *
1288*7c568831SAndroid Build Coastguard Worker * Parses the catalog file to extract the XML tree and then analyze the
1289*7c568831SAndroid Build Coastguard Worker * tree to build a list of Catalog entries corresponding to this catalog
1290*7c568831SAndroid Build Coastguard Worker *
1291*7c568831SAndroid Build Coastguard Worker * Returns the resulting Catalog entries list
1292*7c568831SAndroid Build Coastguard Worker */
1293*7c568831SAndroid Build Coastguard Worker static xmlCatalogEntryPtr
xmlParseXMLCatalogFile(xmlCatalogPrefer prefer,const xmlChar * filename)1294*7c568831SAndroid Build Coastguard Worker xmlParseXMLCatalogFile(xmlCatalogPrefer prefer, const xmlChar *filename) {
1295*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
1296*7c568831SAndroid Build Coastguard Worker xmlNodePtr cur;
1297*7c568831SAndroid Build Coastguard Worker xmlChar *prop;
1298*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr parent = NULL;
1299*7c568831SAndroid Build Coastguard Worker
1300*7c568831SAndroid Build Coastguard Worker if (filename == NULL)
1301*7c568831SAndroid Build Coastguard Worker return(NULL);
1302*7c568831SAndroid Build Coastguard Worker
1303*7c568831SAndroid Build Coastguard Worker doc = xmlParseCatalogFile((const char *) filename);
1304*7c568831SAndroid Build Coastguard Worker if (doc == NULL) {
1305*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs)
1306*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
1307*7c568831SAndroid Build Coastguard Worker "Failed to parse catalog %s\n", filename);
1308*7c568831SAndroid Build Coastguard Worker return(NULL);
1309*7c568831SAndroid Build Coastguard Worker }
1310*7c568831SAndroid Build Coastguard Worker
1311*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs)
1312*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
1313*7c568831SAndroid Build Coastguard Worker "%d Parsing catalog %s\n", xmlGetThreadId(), filename);
1314*7c568831SAndroid Build Coastguard Worker
1315*7c568831SAndroid Build Coastguard Worker cur = xmlDocGetRootElement(doc);
1316*7c568831SAndroid Build Coastguard Worker if ((cur != NULL) && (xmlStrEqual(cur->name, BAD_CAST "catalog")) &&
1317*7c568831SAndroid Build Coastguard Worker (cur->ns != NULL) && (cur->ns->href != NULL) &&
1318*7c568831SAndroid Build Coastguard Worker (xmlStrEqual(cur->ns->href, XML_CATALOGS_NAMESPACE))) {
1319*7c568831SAndroid Build Coastguard Worker
1320*7c568831SAndroid Build Coastguard Worker parent = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL,
1321*7c568831SAndroid Build Coastguard Worker (const xmlChar *)filename, NULL, prefer, NULL);
1322*7c568831SAndroid Build Coastguard Worker if (parent == NULL) {
1323*7c568831SAndroid Build Coastguard Worker xmlFreeDoc(doc);
1324*7c568831SAndroid Build Coastguard Worker return(NULL);
1325*7c568831SAndroid Build Coastguard Worker }
1326*7c568831SAndroid Build Coastguard Worker
1327*7c568831SAndroid Build Coastguard Worker prop = xmlGetProp(cur, BAD_CAST "prefer");
1328*7c568831SAndroid Build Coastguard Worker if (prop != NULL) {
1329*7c568831SAndroid Build Coastguard Worker if (xmlStrEqual(prop, BAD_CAST "system")) {
1330*7c568831SAndroid Build Coastguard Worker prefer = XML_CATA_PREFER_SYSTEM;
1331*7c568831SAndroid Build Coastguard Worker } else if (xmlStrEqual(prop, BAD_CAST "public")) {
1332*7c568831SAndroid Build Coastguard Worker prefer = XML_CATA_PREFER_PUBLIC;
1333*7c568831SAndroid Build Coastguard Worker } else {
1334*7c568831SAndroid Build Coastguard Worker xmlCatalogErr(NULL, cur, XML_CATALOG_PREFER_VALUE,
1335*7c568831SAndroid Build Coastguard Worker "Invalid value for prefer: '%s'\n",
1336*7c568831SAndroid Build Coastguard Worker prop, NULL, NULL);
1337*7c568831SAndroid Build Coastguard Worker }
1338*7c568831SAndroid Build Coastguard Worker xmlFree(prop);
1339*7c568831SAndroid Build Coastguard Worker }
1340*7c568831SAndroid Build Coastguard Worker cur = cur->children;
1341*7c568831SAndroid Build Coastguard Worker xmlParseXMLCatalogNodeList(cur, prefer, parent, NULL);
1342*7c568831SAndroid Build Coastguard Worker } else {
1343*7c568831SAndroid Build Coastguard Worker xmlCatalogErr(NULL, (xmlNodePtr) doc, XML_CATALOG_NOT_CATALOG,
1344*7c568831SAndroid Build Coastguard Worker "File %s is not an XML Catalog\n",
1345*7c568831SAndroid Build Coastguard Worker filename, NULL, NULL);
1346*7c568831SAndroid Build Coastguard Worker xmlFreeDoc(doc);
1347*7c568831SAndroid Build Coastguard Worker return(NULL);
1348*7c568831SAndroid Build Coastguard Worker }
1349*7c568831SAndroid Build Coastguard Worker xmlFreeDoc(doc);
1350*7c568831SAndroid Build Coastguard Worker return(parent);
1351*7c568831SAndroid Build Coastguard Worker }
1352*7c568831SAndroid Build Coastguard Worker
1353*7c568831SAndroid Build Coastguard Worker /**
1354*7c568831SAndroid Build Coastguard Worker * xmlFetchXMLCatalogFile:
1355*7c568831SAndroid Build Coastguard Worker * @catal: an existing but incomplete catalog entry
1356*7c568831SAndroid Build Coastguard Worker *
1357*7c568831SAndroid Build Coastguard Worker * Fetch and parse the subcatalog referenced by an entry
1358*7c568831SAndroid Build Coastguard Worker *
1359*7c568831SAndroid Build Coastguard Worker * Returns 0 in case of success, -1 otherwise
1360*7c568831SAndroid Build Coastguard Worker */
1361*7c568831SAndroid Build Coastguard Worker static int
xmlFetchXMLCatalogFile(xmlCatalogEntryPtr catal)1362*7c568831SAndroid Build Coastguard Worker xmlFetchXMLCatalogFile(xmlCatalogEntryPtr catal) {
1363*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr doc;
1364*7c568831SAndroid Build Coastguard Worker
1365*7c568831SAndroid Build Coastguard Worker if (catal == NULL)
1366*7c568831SAndroid Build Coastguard Worker return(-1);
1367*7c568831SAndroid Build Coastguard Worker if (catal->URL == NULL)
1368*7c568831SAndroid Build Coastguard Worker return(-1);
1369*7c568831SAndroid Build Coastguard Worker
1370*7c568831SAndroid Build Coastguard Worker /*
1371*7c568831SAndroid Build Coastguard Worker * lock the whole catalog for modification
1372*7c568831SAndroid Build Coastguard Worker */
1373*7c568831SAndroid Build Coastguard Worker xmlRMutexLock(&xmlCatalogMutex);
1374*7c568831SAndroid Build Coastguard Worker if (catal->children != NULL) {
1375*7c568831SAndroid Build Coastguard Worker /* Okay someone else did it in the meantime */
1376*7c568831SAndroid Build Coastguard Worker xmlRMutexUnlock(&xmlCatalogMutex);
1377*7c568831SAndroid Build Coastguard Worker return(0);
1378*7c568831SAndroid Build Coastguard Worker }
1379*7c568831SAndroid Build Coastguard Worker
1380*7c568831SAndroid Build Coastguard Worker if (xmlCatalogXMLFiles != NULL) {
1381*7c568831SAndroid Build Coastguard Worker doc = (xmlCatalogEntryPtr)
1382*7c568831SAndroid Build Coastguard Worker xmlHashLookup(xmlCatalogXMLFiles, catal->URL);
1383*7c568831SAndroid Build Coastguard Worker if (doc != NULL) {
1384*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs)
1385*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
1386*7c568831SAndroid Build Coastguard Worker "Found %s in file hash\n", catal->URL);
1387*7c568831SAndroid Build Coastguard Worker
1388*7c568831SAndroid Build Coastguard Worker if (catal->type == XML_CATA_CATALOG)
1389*7c568831SAndroid Build Coastguard Worker catal->children = doc->children;
1390*7c568831SAndroid Build Coastguard Worker else
1391*7c568831SAndroid Build Coastguard Worker catal->children = doc;
1392*7c568831SAndroid Build Coastguard Worker catal->dealloc = 0;
1393*7c568831SAndroid Build Coastguard Worker xmlRMutexUnlock(&xmlCatalogMutex);
1394*7c568831SAndroid Build Coastguard Worker return(0);
1395*7c568831SAndroid Build Coastguard Worker }
1396*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs)
1397*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
1398*7c568831SAndroid Build Coastguard Worker "%s not found in file hash\n", catal->URL);
1399*7c568831SAndroid Build Coastguard Worker }
1400*7c568831SAndroid Build Coastguard Worker
1401*7c568831SAndroid Build Coastguard Worker /*
1402*7c568831SAndroid Build Coastguard Worker * Fetch and parse. Note that xmlParseXMLCatalogFile does not
1403*7c568831SAndroid Build Coastguard Worker * use the existing catalog, there is no recursion allowed at
1404*7c568831SAndroid Build Coastguard Worker * that level.
1405*7c568831SAndroid Build Coastguard Worker */
1406*7c568831SAndroid Build Coastguard Worker doc = xmlParseXMLCatalogFile(catal->prefer, catal->URL);
1407*7c568831SAndroid Build Coastguard Worker if (doc == NULL) {
1408*7c568831SAndroid Build Coastguard Worker catal->type = XML_CATA_BROKEN_CATALOG;
1409*7c568831SAndroid Build Coastguard Worker xmlRMutexUnlock(&xmlCatalogMutex);
1410*7c568831SAndroid Build Coastguard Worker return(-1);
1411*7c568831SAndroid Build Coastguard Worker }
1412*7c568831SAndroid Build Coastguard Worker
1413*7c568831SAndroid Build Coastguard Worker if (catal->type == XML_CATA_CATALOG)
1414*7c568831SAndroid Build Coastguard Worker catal->children = doc->children;
1415*7c568831SAndroid Build Coastguard Worker else
1416*7c568831SAndroid Build Coastguard Worker catal->children = doc;
1417*7c568831SAndroid Build Coastguard Worker
1418*7c568831SAndroid Build Coastguard Worker doc->dealloc = 1;
1419*7c568831SAndroid Build Coastguard Worker
1420*7c568831SAndroid Build Coastguard Worker if (xmlCatalogXMLFiles == NULL)
1421*7c568831SAndroid Build Coastguard Worker xmlCatalogXMLFiles = xmlHashCreate(10);
1422*7c568831SAndroid Build Coastguard Worker if (xmlCatalogXMLFiles != NULL) {
1423*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs)
1424*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
1425*7c568831SAndroid Build Coastguard Worker "%s added to file hash\n", catal->URL);
1426*7c568831SAndroid Build Coastguard Worker xmlHashAddEntry(xmlCatalogXMLFiles, catal->URL, doc);
1427*7c568831SAndroid Build Coastguard Worker }
1428*7c568831SAndroid Build Coastguard Worker xmlRMutexUnlock(&xmlCatalogMutex);
1429*7c568831SAndroid Build Coastguard Worker return(0);
1430*7c568831SAndroid Build Coastguard Worker }
1431*7c568831SAndroid Build Coastguard Worker
1432*7c568831SAndroid Build Coastguard Worker /************************************************************************
1433*7c568831SAndroid Build Coastguard Worker * *
1434*7c568831SAndroid Build Coastguard Worker * XML Catalog handling *
1435*7c568831SAndroid Build Coastguard Worker * *
1436*7c568831SAndroid Build Coastguard Worker ************************************************************************/
1437*7c568831SAndroid Build Coastguard Worker
1438*7c568831SAndroid Build Coastguard Worker /**
1439*7c568831SAndroid Build Coastguard Worker * xmlAddXMLCatalog:
1440*7c568831SAndroid Build Coastguard Worker * @catal: top of an XML catalog
1441*7c568831SAndroid Build Coastguard Worker * @type: the type of record to add to the catalog
1442*7c568831SAndroid Build Coastguard Worker * @orig: the system, public or prefix to match (or NULL)
1443*7c568831SAndroid Build Coastguard Worker * @replace: the replacement value for the match
1444*7c568831SAndroid Build Coastguard Worker *
1445*7c568831SAndroid Build Coastguard Worker * Add an entry in the XML catalog, it may overwrite existing but
1446*7c568831SAndroid Build Coastguard Worker * different entries.
1447*7c568831SAndroid Build Coastguard Worker *
1448*7c568831SAndroid Build Coastguard Worker * Returns 0 if successful, -1 otherwise
1449*7c568831SAndroid Build Coastguard Worker */
1450*7c568831SAndroid Build Coastguard Worker static int
xmlAddXMLCatalog(xmlCatalogEntryPtr catal,const xmlChar * type,const xmlChar * orig,const xmlChar * replace)1451*7c568831SAndroid Build Coastguard Worker xmlAddXMLCatalog(xmlCatalogEntryPtr catal, const xmlChar *type,
1452*7c568831SAndroid Build Coastguard Worker const xmlChar *orig, const xmlChar *replace) {
1453*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr cur;
1454*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryType typ;
1455*7c568831SAndroid Build Coastguard Worker int doregister = 0;
1456*7c568831SAndroid Build Coastguard Worker
1457*7c568831SAndroid Build Coastguard Worker if ((catal == NULL) ||
1458*7c568831SAndroid Build Coastguard Worker ((catal->type != XML_CATA_CATALOG) &&
1459*7c568831SAndroid Build Coastguard Worker (catal->type != XML_CATA_BROKEN_CATALOG)))
1460*7c568831SAndroid Build Coastguard Worker return(-1);
1461*7c568831SAndroid Build Coastguard Worker if (catal->children == NULL) {
1462*7c568831SAndroid Build Coastguard Worker xmlFetchXMLCatalogFile(catal);
1463*7c568831SAndroid Build Coastguard Worker }
1464*7c568831SAndroid Build Coastguard Worker if (catal->children == NULL)
1465*7c568831SAndroid Build Coastguard Worker doregister = 1;
1466*7c568831SAndroid Build Coastguard Worker
1467*7c568831SAndroid Build Coastguard Worker typ = xmlGetXMLCatalogEntryType(type);
1468*7c568831SAndroid Build Coastguard Worker if (typ == XML_CATA_NONE) {
1469*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs)
1470*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
1471*7c568831SAndroid Build Coastguard Worker "Failed to add unknown element %s to catalog\n", type);
1472*7c568831SAndroid Build Coastguard Worker return(-1);
1473*7c568831SAndroid Build Coastguard Worker }
1474*7c568831SAndroid Build Coastguard Worker
1475*7c568831SAndroid Build Coastguard Worker cur = catal->children;
1476*7c568831SAndroid Build Coastguard Worker /*
1477*7c568831SAndroid Build Coastguard Worker * Might be a simple "update in place"
1478*7c568831SAndroid Build Coastguard Worker */
1479*7c568831SAndroid Build Coastguard Worker if (cur != NULL) {
1480*7c568831SAndroid Build Coastguard Worker while (cur != NULL) {
1481*7c568831SAndroid Build Coastguard Worker if ((orig != NULL) && (cur->type == typ) &&
1482*7c568831SAndroid Build Coastguard Worker (xmlStrEqual(orig, cur->name))) {
1483*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs)
1484*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
1485*7c568831SAndroid Build Coastguard Worker "Updating element %s to catalog\n", type);
1486*7c568831SAndroid Build Coastguard Worker if (cur->value != NULL)
1487*7c568831SAndroid Build Coastguard Worker xmlFree(cur->value);
1488*7c568831SAndroid Build Coastguard Worker if (cur->URL != NULL)
1489*7c568831SAndroid Build Coastguard Worker xmlFree(cur->URL);
1490*7c568831SAndroid Build Coastguard Worker cur->value = xmlStrdup(replace);
1491*7c568831SAndroid Build Coastguard Worker cur->URL = xmlStrdup(replace);
1492*7c568831SAndroid Build Coastguard Worker return(0);
1493*7c568831SAndroid Build Coastguard Worker }
1494*7c568831SAndroid Build Coastguard Worker if (cur->next == NULL)
1495*7c568831SAndroid Build Coastguard Worker break;
1496*7c568831SAndroid Build Coastguard Worker cur = cur->next;
1497*7c568831SAndroid Build Coastguard Worker }
1498*7c568831SAndroid Build Coastguard Worker }
1499*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs)
1500*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
1501*7c568831SAndroid Build Coastguard Worker "Adding element %s to catalog\n", type);
1502*7c568831SAndroid Build Coastguard Worker if (cur == NULL)
1503*7c568831SAndroid Build Coastguard Worker catal->children = xmlNewCatalogEntry(typ, orig, replace,
1504*7c568831SAndroid Build Coastguard Worker NULL, catal->prefer, NULL);
1505*7c568831SAndroid Build Coastguard Worker else
1506*7c568831SAndroid Build Coastguard Worker cur->next = xmlNewCatalogEntry(typ, orig, replace,
1507*7c568831SAndroid Build Coastguard Worker NULL, catal->prefer, NULL);
1508*7c568831SAndroid Build Coastguard Worker if (doregister) {
1509*7c568831SAndroid Build Coastguard Worker catal->type = XML_CATA_CATALOG;
1510*7c568831SAndroid Build Coastguard Worker cur = (xmlCatalogEntryPtr)xmlHashLookup(xmlCatalogXMLFiles, catal->URL);
1511*7c568831SAndroid Build Coastguard Worker if (cur != NULL)
1512*7c568831SAndroid Build Coastguard Worker cur->children = catal->children;
1513*7c568831SAndroid Build Coastguard Worker }
1514*7c568831SAndroid Build Coastguard Worker
1515*7c568831SAndroid Build Coastguard Worker return(0);
1516*7c568831SAndroid Build Coastguard Worker }
1517*7c568831SAndroid Build Coastguard Worker
1518*7c568831SAndroid Build Coastguard Worker /**
1519*7c568831SAndroid Build Coastguard Worker * xmlDelXMLCatalog:
1520*7c568831SAndroid Build Coastguard Worker * @catal: top of an XML catalog
1521*7c568831SAndroid Build Coastguard Worker * @value: the value to remove from the catalog
1522*7c568831SAndroid Build Coastguard Worker *
1523*7c568831SAndroid Build Coastguard Worker * Remove entries in the XML catalog where the value or the URI
1524*7c568831SAndroid Build Coastguard Worker * is equal to @value
1525*7c568831SAndroid Build Coastguard Worker *
1526*7c568831SAndroid Build Coastguard Worker * Returns the number of entries removed if successful, -1 otherwise
1527*7c568831SAndroid Build Coastguard Worker */
1528*7c568831SAndroid Build Coastguard Worker static int
xmlDelXMLCatalog(xmlCatalogEntryPtr catal,const xmlChar * value)1529*7c568831SAndroid Build Coastguard Worker xmlDelXMLCatalog(xmlCatalogEntryPtr catal, const xmlChar *value) {
1530*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr cur;
1531*7c568831SAndroid Build Coastguard Worker int ret = 0;
1532*7c568831SAndroid Build Coastguard Worker
1533*7c568831SAndroid Build Coastguard Worker if ((catal == NULL) ||
1534*7c568831SAndroid Build Coastguard Worker ((catal->type != XML_CATA_CATALOG) &&
1535*7c568831SAndroid Build Coastguard Worker (catal->type != XML_CATA_BROKEN_CATALOG)))
1536*7c568831SAndroid Build Coastguard Worker return(-1);
1537*7c568831SAndroid Build Coastguard Worker if (value == NULL)
1538*7c568831SAndroid Build Coastguard Worker return(-1);
1539*7c568831SAndroid Build Coastguard Worker if (catal->children == NULL) {
1540*7c568831SAndroid Build Coastguard Worker xmlFetchXMLCatalogFile(catal);
1541*7c568831SAndroid Build Coastguard Worker }
1542*7c568831SAndroid Build Coastguard Worker
1543*7c568831SAndroid Build Coastguard Worker /*
1544*7c568831SAndroid Build Coastguard Worker * Scan the children
1545*7c568831SAndroid Build Coastguard Worker */
1546*7c568831SAndroid Build Coastguard Worker cur = catal->children;
1547*7c568831SAndroid Build Coastguard Worker while (cur != NULL) {
1548*7c568831SAndroid Build Coastguard Worker if (((cur->name != NULL) && (xmlStrEqual(value, cur->name))) ||
1549*7c568831SAndroid Build Coastguard Worker (xmlStrEqual(value, cur->value))) {
1550*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs) {
1551*7c568831SAndroid Build Coastguard Worker if (cur->name != NULL)
1552*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
1553*7c568831SAndroid Build Coastguard Worker "Removing element %s from catalog\n", cur->name);
1554*7c568831SAndroid Build Coastguard Worker else
1555*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
1556*7c568831SAndroid Build Coastguard Worker "Removing element %s from catalog\n", cur->value);
1557*7c568831SAndroid Build Coastguard Worker }
1558*7c568831SAndroid Build Coastguard Worker cur->type = XML_CATA_REMOVED;
1559*7c568831SAndroid Build Coastguard Worker }
1560*7c568831SAndroid Build Coastguard Worker cur = cur->next;
1561*7c568831SAndroid Build Coastguard Worker }
1562*7c568831SAndroid Build Coastguard Worker return(ret);
1563*7c568831SAndroid Build Coastguard Worker }
1564*7c568831SAndroid Build Coastguard Worker
1565*7c568831SAndroid Build Coastguard Worker /**
1566*7c568831SAndroid Build Coastguard Worker * xmlCatalogXMLResolve:
1567*7c568831SAndroid Build Coastguard Worker * @catal: a catalog list
1568*7c568831SAndroid Build Coastguard Worker * @pubID: the public ID string
1569*7c568831SAndroid Build Coastguard Worker * @sysID: the system ID string
1570*7c568831SAndroid Build Coastguard Worker *
1571*7c568831SAndroid Build Coastguard Worker * Do a complete resolution lookup of an External Identifier for a
1572*7c568831SAndroid Build Coastguard Worker * list of catalog entries.
1573*7c568831SAndroid Build Coastguard Worker *
1574*7c568831SAndroid Build Coastguard Worker * Implements (or tries to) 7.1. External Identifier Resolution
1575*7c568831SAndroid Build Coastguard Worker * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html
1576*7c568831SAndroid Build Coastguard Worker *
1577*7c568831SAndroid Build Coastguard Worker * Returns the URI of the resource or NULL if not found
1578*7c568831SAndroid Build Coastguard Worker */
1579*7c568831SAndroid Build Coastguard Worker static xmlChar *
xmlCatalogXMLResolve(xmlCatalogEntryPtr catal,const xmlChar * pubID,const xmlChar * sysID)1580*7c568831SAndroid Build Coastguard Worker xmlCatalogXMLResolve(xmlCatalogEntryPtr catal, const xmlChar *pubID,
1581*7c568831SAndroid Build Coastguard Worker const xmlChar *sysID) {
1582*7c568831SAndroid Build Coastguard Worker xmlChar *ret = NULL;
1583*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr cur;
1584*7c568831SAndroid Build Coastguard Worker int haveDelegate = 0;
1585*7c568831SAndroid Build Coastguard Worker int haveNext = 0;
1586*7c568831SAndroid Build Coastguard Worker
1587*7c568831SAndroid Build Coastguard Worker /*
1588*7c568831SAndroid Build Coastguard Worker * protection against loops
1589*7c568831SAndroid Build Coastguard Worker */
1590*7c568831SAndroid Build Coastguard Worker if (catal->depth > MAX_CATAL_DEPTH) {
1591*7c568831SAndroid Build Coastguard Worker xmlCatalogErr(catal, NULL, XML_CATALOG_RECURSION,
1592*7c568831SAndroid Build Coastguard Worker "Detected recursion in catalog %s\n",
1593*7c568831SAndroid Build Coastguard Worker catal->name, NULL, NULL);
1594*7c568831SAndroid Build Coastguard Worker return(NULL);
1595*7c568831SAndroid Build Coastguard Worker }
1596*7c568831SAndroid Build Coastguard Worker catal->depth++;
1597*7c568831SAndroid Build Coastguard Worker
1598*7c568831SAndroid Build Coastguard Worker /*
1599*7c568831SAndroid Build Coastguard Worker * First tries steps 2/ 3/ 4/ if a system ID is provided.
1600*7c568831SAndroid Build Coastguard Worker */
1601*7c568831SAndroid Build Coastguard Worker if (sysID != NULL) {
1602*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr rewrite = NULL;
1603*7c568831SAndroid Build Coastguard Worker int lenrewrite = 0, len;
1604*7c568831SAndroid Build Coastguard Worker cur = catal;
1605*7c568831SAndroid Build Coastguard Worker haveDelegate = 0;
1606*7c568831SAndroid Build Coastguard Worker while (cur != NULL) {
1607*7c568831SAndroid Build Coastguard Worker switch (cur->type) {
1608*7c568831SAndroid Build Coastguard Worker case XML_CATA_SYSTEM:
1609*7c568831SAndroid Build Coastguard Worker if (xmlStrEqual(sysID, cur->name)) {
1610*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs)
1611*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
1612*7c568831SAndroid Build Coastguard Worker "Found system match %s, using %s\n",
1613*7c568831SAndroid Build Coastguard Worker cur->name, cur->URL);
1614*7c568831SAndroid Build Coastguard Worker catal->depth--;
1615*7c568831SAndroid Build Coastguard Worker return(xmlStrdup(cur->URL));
1616*7c568831SAndroid Build Coastguard Worker }
1617*7c568831SAndroid Build Coastguard Worker break;
1618*7c568831SAndroid Build Coastguard Worker case XML_CATA_REWRITE_SYSTEM:
1619*7c568831SAndroid Build Coastguard Worker len = xmlStrlen(cur->name);
1620*7c568831SAndroid Build Coastguard Worker if ((len > lenrewrite) &&
1621*7c568831SAndroid Build Coastguard Worker (!xmlStrncmp(sysID, cur->name, len))) {
1622*7c568831SAndroid Build Coastguard Worker lenrewrite = len;
1623*7c568831SAndroid Build Coastguard Worker rewrite = cur;
1624*7c568831SAndroid Build Coastguard Worker }
1625*7c568831SAndroid Build Coastguard Worker break;
1626*7c568831SAndroid Build Coastguard Worker case XML_CATA_DELEGATE_SYSTEM:
1627*7c568831SAndroid Build Coastguard Worker if (!xmlStrncmp(sysID, cur->name, xmlStrlen(cur->name)))
1628*7c568831SAndroid Build Coastguard Worker haveDelegate++;
1629*7c568831SAndroid Build Coastguard Worker break;
1630*7c568831SAndroid Build Coastguard Worker case XML_CATA_NEXT_CATALOG:
1631*7c568831SAndroid Build Coastguard Worker haveNext++;
1632*7c568831SAndroid Build Coastguard Worker break;
1633*7c568831SAndroid Build Coastguard Worker default:
1634*7c568831SAndroid Build Coastguard Worker break;
1635*7c568831SAndroid Build Coastguard Worker }
1636*7c568831SAndroid Build Coastguard Worker cur = cur->next;
1637*7c568831SAndroid Build Coastguard Worker }
1638*7c568831SAndroid Build Coastguard Worker if (rewrite != NULL) {
1639*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs)
1640*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
1641*7c568831SAndroid Build Coastguard Worker "Using rewriting rule %s\n", rewrite->name);
1642*7c568831SAndroid Build Coastguard Worker ret = xmlStrdup(rewrite->URL);
1643*7c568831SAndroid Build Coastguard Worker if (ret != NULL)
1644*7c568831SAndroid Build Coastguard Worker ret = xmlStrcat(ret, &sysID[lenrewrite]);
1645*7c568831SAndroid Build Coastguard Worker catal->depth--;
1646*7c568831SAndroid Build Coastguard Worker return(ret);
1647*7c568831SAndroid Build Coastguard Worker }
1648*7c568831SAndroid Build Coastguard Worker if (haveDelegate) {
1649*7c568831SAndroid Build Coastguard Worker const xmlChar *delegates[MAX_DELEGATE];
1650*7c568831SAndroid Build Coastguard Worker int nbList = 0, i;
1651*7c568831SAndroid Build Coastguard Worker
1652*7c568831SAndroid Build Coastguard Worker /*
1653*7c568831SAndroid Build Coastguard Worker * Assume the entries have been sorted by decreasing substring
1654*7c568831SAndroid Build Coastguard Worker * matches when the list was produced.
1655*7c568831SAndroid Build Coastguard Worker */
1656*7c568831SAndroid Build Coastguard Worker cur = catal;
1657*7c568831SAndroid Build Coastguard Worker while (cur != NULL) {
1658*7c568831SAndroid Build Coastguard Worker if ((cur->type == XML_CATA_DELEGATE_SYSTEM) &&
1659*7c568831SAndroid Build Coastguard Worker (!xmlStrncmp(sysID, cur->name, xmlStrlen(cur->name)))) {
1660*7c568831SAndroid Build Coastguard Worker for (i = 0;i < nbList;i++)
1661*7c568831SAndroid Build Coastguard Worker if (xmlStrEqual(cur->URL, delegates[i]))
1662*7c568831SAndroid Build Coastguard Worker break;
1663*7c568831SAndroid Build Coastguard Worker if (i < nbList) {
1664*7c568831SAndroid Build Coastguard Worker cur = cur->next;
1665*7c568831SAndroid Build Coastguard Worker continue;
1666*7c568831SAndroid Build Coastguard Worker }
1667*7c568831SAndroid Build Coastguard Worker if (nbList < MAX_DELEGATE)
1668*7c568831SAndroid Build Coastguard Worker delegates[nbList++] = cur->URL;
1669*7c568831SAndroid Build Coastguard Worker
1670*7c568831SAndroid Build Coastguard Worker if (cur->children == NULL) {
1671*7c568831SAndroid Build Coastguard Worker xmlFetchXMLCatalogFile(cur);
1672*7c568831SAndroid Build Coastguard Worker }
1673*7c568831SAndroid Build Coastguard Worker if (cur->children != NULL) {
1674*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs)
1675*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
1676*7c568831SAndroid Build Coastguard Worker "Trying system delegate %s\n", cur->URL);
1677*7c568831SAndroid Build Coastguard Worker ret = xmlCatalogListXMLResolve(
1678*7c568831SAndroid Build Coastguard Worker cur->children, NULL, sysID);
1679*7c568831SAndroid Build Coastguard Worker if (ret != NULL) {
1680*7c568831SAndroid Build Coastguard Worker catal->depth--;
1681*7c568831SAndroid Build Coastguard Worker return(ret);
1682*7c568831SAndroid Build Coastguard Worker }
1683*7c568831SAndroid Build Coastguard Worker }
1684*7c568831SAndroid Build Coastguard Worker }
1685*7c568831SAndroid Build Coastguard Worker cur = cur->next;
1686*7c568831SAndroid Build Coastguard Worker }
1687*7c568831SAndroid Build Coastguard Worker /*
1688*7c568831SAndroid Build Coastguard Worker * Apply the cut algorithm explained in 4/
1689*7c568831SAndroid Build Coastguard Worker */
1690*7c568831SAndroid Build Coastguard Worker catal->depth--;
1691*7c568831SAndroid Build Coastguard Worker return(XML_CATAL_BREAK);
1692*7c568831SAndroid Build Coastguard Worker }
1693*7c568831SAndroid Build Coastguard Worker }
1694*7c568831SAndroid Build Coastguard Worker /*
1695*7c568831SAndroid Build Coastguard Worker * Then tries 5/ 6/ if a public ID is provided
1696*7c568831SAndroid Build Coastguard Worker */
1697*7c568831SAndroid Build Coastguard Worker if (pubID != NULL) {
1698*7c568831SAndroid Build Coastguard Worker cur = catal;
1699*7c568831SAndroid Build Coastguard Worker haveDelegate = 0;
1700*7c568831SAndroid Build Coastguard Worker while (cur != NULL) {
1701*7c568831SAndroid Build Coastguard Worker switch (cur->type) {
1702*7c568831SAndroid Build Coastguard Worker case XML_CATA_PUBLIC:
1703*7c568831SAndroid Build Coastguard Worker if (xmlStrEqual(pubID, cur->name)) {
1704*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs)
1705*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
1706*7c568831SAndroid Build Coastguard Worker "Found public match %s\n", cur->name);
1707*7c568831SAndroid Build Coastguard Worker catal->depth--;
1708*7c568831SAndroid Build Coastguard Worker return(xmlStrdup(cur->URL));
1709*7c568831SAndroid Build Coastguard Worker }
1710*7c568831SAndroid Build Coastguard Worker break;
1711*7c568831SAndroid Build Coastguard Worker case XML_CATA_DELEGATE_PUBLIC:
1712*7c568831SAndroid Build Coastguard Worker if (!xmlStrncmp(pubID, cur->name, xmlStrlen(cur->name)) &&
1713*7c568831SAndroid Build Coastguard Worker (cur->prefer == XML_CATA_PREFER_PUBLIC))
1714*7c568831SAndroid Build Coastguard Worker haveDelegate++;
1715*7c568831SAndroid Build Coastguard Worker break;
1716*7c568831SAndroid Build Coastguard Worker case XML_CATA_NEXT_CATALOG:
1717*7c568831SAndroid Build Coastguard Worker if (sysID == NULL)
1718*7c568831SAndroid Build Coastguard Worker haveNext++;
1719*7c568831SAndroid Build Coastguard Worker break;
1720*7c568831SAndroid Build Coastguard Worker default:
1721*7c568831SAndroid Build Coastguard Worker break;
1722*7c568831SAndroid Build Coastguard Worker }
1723*7c568831SAndroid Build Coastguard Worker cur = cur->next;
1724*7c568831SAndroid Build Coastguard Worker }
1725*7c568831SAndroid Build Coastguard Worker if (haveDelegate) {
1726*7c568831SAndroid Build Coastguard Worker const xmlChar *delegates[MAX_DELEGATE];
1727*7c568831SAndroid Build Coastguard Worker int nbList = 0, i;
1728*7c568831SAndroid Build Coastguard Worker
1729*7c568831SAndroid Build Coastguard Worker /*
1730*7c568831SAndroid Build Coastguard Worker * Assume the entries have been sorted by decreasing substring
1731*7c568831SAndroid Build Coastguard Worker * matches when the list was produced.
1732*7c568831SAndroid Build Coastguard Worker */
1733*7c568831SAndroid Build Coastguard Worker cur = catal;
1734*7c568831SAndroid Build Coastguard Worker while (cur != NULL) {
1735*7c568831SAndroid Build Coastguard Worker if ((cur->type == XML_CATA_DELEGATE_PUBLIC) &&
1736*7c568831SAndroid Build Coastguard Worker (cur->prefer == XML_CATA_PREFER_PUBLIC) &&
1737*7c568831SAndroid Build Coastguard Worker (!xmlStrncmp(pubID, cur->name, xmlStrlen(cur->name)))) {
1738*7c568831SAndroid Build Coastguard Worker
1739*7c568831SAndroid Build Coastguard Worker for (i = 0;i < nbList;i++)
1740*7c568831SAndroid Build Coastguard Worker if (xmlStrEqual(cur->URL, delegates[i]))
1741*7c568831SAndroid Build Coastguard Worker break;
1742*7c568831SAndroid Build Coastguard Worker if (i < nbList) {
1743*7c568831SAndroid Build Coastguard Worker cur = cur->next;
1744*7c568831SAndroid Build Coastguard Worker continue;
1745*7c568831SAndroid Build Coastguard Worker }
1746*7c568831SAndroid Build Coastguard Worker if (nbList < MAX_DELEGATE)
1747*7c568831SAndroid Build Coastguard Worker delegates[nbList++] = cur->URL;
1748*7c568831SAndroid Build Coastguard Worker
1749*7c568831SAndroid Build Coastguard Worker if (cur->children == NULL) {
1750*7c568831SAndroid Build Coastguard Worker xmlFetchXMLCatalogFile(cur);
1751*7c568831SAndroid Build Coastguard Worker }
1752*7c568831SAndroid Build Coastguard Worker if (cur->children != NULL) {
1753*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs)
1754*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
1755*7c568831SAndroid Build Coastguard Worker "Trying public delegate %s\n", cur->URL);
1756*7c568831SAndroid Build Coastguard Worker ret = xmlCatalogListXMLResolve(
1757*7c568831SAndroid Build Coastguard Worker cur->children, pubID, NULL);
1758*7c568831SAndroid Build Coastguard Worker if (ret != NULL) {
1759*7c568831SAndroid Build Coastguard Worker catal->depth--;
1760*7c568831SAndroid Build Coastguard Worker return(ret);
1761*7c568831SAndroid Build Coastguard Worker }
1762*7c568831SAndroid Build Coastguard Worker }
1763*7c568831SAndroid Build Coastguard Worker }
1764*7c568831SAndroid Build Coastguard Worker cur = cur->next;
1765*7c568831SAndroid Build Coastguard Worker }
1766*7c568831SAndroid Build Coastguard Worker /*
1767*7c568831SAndroid Build Coastguard Worker * Apply the cut algorithm explained in 4/
1768*7c568831SAndroid Build Coastguard Worker */
1769*7c568831SAndroid Build Coastguard Worker catal->depth--;
1770*7c568831SAndroid Build Coastguard Worker return(XML_CATAL_BREAK);
1771*7c568831SAndroid Build Coastguard Worker }
1772*7c568831SAndroid Build Coastguard Worker }
1773*7c568831SAndroid Build Coastguard Worker if (haveNext) {
1774*7c568831SAndroid Build Coastguard Worker cur = catal;
1775*7c568831SAndroid Build Coastguard Worker while (cur != NULL) {
1776*7c568831SAndroid Build Coastguard Worker if (cur->type == XML_CATA_NEXT_CATALOG) {
1777*7c568831SAndroid Build Coastguard Worker if (cur->children == NULL) {
1778*7c568831SAndroid Build Coastguard Worker xmlFetchXMLCatalogFile(cur);
1779*7c568831SAndroid Build Coastguard Worker }
1780*7c568831SAndroid Build Coastguard Worker if (cur->children != NULL) {
1781*7c568831SAndroid Build Coastguard Worker ret = xmlCatalogListXMLResolve(cur->children, pubID, sysID);
1782*7c568831SAndroid Build Coastguard Worker if (ret != NULL) {
1783*7c568831SAndroid Build Coastguard Worker catal->depth--;
1784*7c568831SAndroid Build Coastguard Worker return(ret);
1785*7c568831SAndroid Build Coastguard Worker } else if (catal->depth > MAX_CATAL_DEPTH) {
1786*7c568831SAndroid Build Coastguard Worker return(NULL);
1787*7c568831SAndroid Build Coastguard Worker }
1788*7c568831SAndroid Build Coastguard Worker }
1789*7c568831SAndroid Build Coastguard Worker }
1790*7c568831SAndroid Build Coastguard Worker cur = cur->next;
1791*7c568831SAndroid Build Coastguard Worker }
1792*7c568831SAndroid Build Coastguard Worker }
1793*7c568831SAndroid Build Coastguard Worker
1794*7c568831SAndroid Build Coastguard Worker catal->depth--;
1795*7c568831SAndroid Build Coastguard Worker return(NULL);
1796*7c568831SAndroid Build Coastguard Worker }
1797*7c568831SAndroid Build Coastguard Worker
1798*7c568831SAndroid Build Coastguard Worker /**
1799*7c568831SAndroid Build Coastguard Worker * xmlCatalogXMLResolveURI:
1800*7c568831SAndroid Build Coastguard Worker * @catal: a catalog list
1801*7c568831SAndroid Build Coastguard Worker * @URI: the URI
1802*7c568831SAndroid Build Coastguard Worker * @sysID: the system ID string
1803*7c568831SAndroid Build Coastguard Worker *
1804*7c568831SAndroid Build Coastguard Worker * Do a complete resolution lookup of an External Identifier for a
1805*7c568831SAndroid Build Coastguard Worker * list of catalog entries.
1806*7c568831SAndroid Build Coastguard Worker *
1807*7c568831SAndroid Build Coastguard Worker * Implements (or tries to) 7.2.2. URI Resolution
1808*7c568831SAndroid Build Coastguard Worker * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html
1809*7c568831SAndroid Build Coastguard Worker *
1810*7c568831SAndroid Build Coastguard Worker * Returns the URI of the resource or NULL if not found
1811*7c568831SAndroid Build Coastguard Worker */
1812*7c568831SAndroid Build Coastguard Worker static xmlChar *
xmlCatalogXMLResolveURI(xmlCatalogEntryPtr catal,const xmlChar * URI)1813*7c568831SAndroid Build Coastguard Worker xmlCatalogXMLResolveURI(xmlCatalogEntryPtr catal, const xmlChar *URI) {
1814*7c568831SAndroid Build Coastguard Worker xmlChar *ret = NULL;
1815*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr cur;
1816*7c568831SAndroid Build Coastguard Worker int haveDelegate = 0;
1817*7c568831SAndroid Build Coastguard Worker int haveNext = 0;
1818*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr rewrite = NULL;
1819*7c568831SAndroid Build Coastguard Worker int lenrewrite = 0, len;
1820*7c568831SAndroid Build Coastguard Worker
1821*7c568831SAndroid Build Coastguard Worker if (catal == NULL)
1822*7c568831SAndroid Build Coastguard Worker return(NULL);
1823*7c568831SAndroid Build Coastguard Worker
1824*7c568831SAndroid Build Coastguard Worker if (URI == NULL)
1825*7c568831SAndroid Build Coastguard Worker return(NULL);
1826*7c568831SAndroid Build Coastguard Worker
1827*7c568831SAndroid Build Coastguard Worker if (catal->depth > MAX_CATAL_DEPTH) {
1828*7c568831SAndroid Build Coastguard Worker xmlCatalogErr(catal, NULL, XML_CATALOG_RECURSION,
1829*7c568831SAndroid Build Coastguard Worker "Detected recursion in catalog %s\n",
1830*7c568831SAndroid Build Coastguard Worker catal->name, NULL, NULL);
1831*7c568831SAndroid Build Coastguard Worker return(NULL);
1832*7c568831SAndroid Build Coastguard Worker }
1833*7c568831SAndroid Build Coastguard Worker
1834*7c568831SAndroid Build Coastguard Worker /*
1835*7c568831SAndroid Build Coastguard Worker * First tries steps 2/ 3/ 4/ if a system ID is provided.
1836*7c568831SAndroid Build Coastguard Worker */
1837*7c568831SAndroid Build Coastguard Worker cur = catal;
1838*7c568831SAndroid Build Coastguard Worker haveDelegate = 0;
1839*7c568831SAndroid Build Coastguard Worker while (cur != NULL) {
1840*7c568831SAndroid Build Coastguard Worker switch (cur->type) {
1841*7c568831SAndroid Build Coastguard Worker case XML_CATA_URI:
1842*7c568831SAndroid Build Coastguard Worker if (xmlStrEqual(URI, cur->name)) {
1843*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs)
1844*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
1845*7c568831SAndroid Build Coastguard Worker "Found URI match %s\n", cur->name);
1846*7c568831SAndroid Build Coastguard Worker return(xmlStrdup(cur->URL));
1847*7c568831SAndroid Build Coastguard Worker }
1848*7c568831SAndroid Build Coastguard Worker break;
1849*7c568831SAndroid Build Coastguard Worker case XML_CATA_REWRITE_URI:
1850*7c568831SAndroid Build Coastguard Worker len = xmlStrlen(cur->name);
1851*7c568831SAndroid Build Coastguard Worker if ((len > lenrewrite) &&
1852*7c568831SAndroid Build Coastguard Worker (!xmlStrncmp(URI, cur->name, len))) {
1853*7c568831SAndroid Build Coastguard Worker lenrewrite = len;
1854*7c568831SAndroid Build Coastguard Worker rewrite = cur;
1855*7c568831SAndroid Build Coastguard Worker }
1856*7c568831SAndroid Build Coastguard Worker break;
1857*7c568831SAndroid Build Coastguard Worker case XML_CATA_DELEGATE_URI:
1858*7c568831SAndroid Build Coastguard Worker if (!xmlStrncmp(URI, cur->name, xmlStrlen(cur->name)))
1859*7c568831SAndroid Build Coastguard Worker haveDelegate++;
1860*7c568831SAndroid Build Coastguard Worker break;
1861*7c568831SAndroid Build Coastguard Worker case XML_CATA_NEXT_CATALOG:
1862*7c568831SAndroid Build Coastguard Worker haveNext++;
1863*7c568831SAndroid Build Coastguard Worker break;
1864*7c568831SAndroid Build Coastguard Worker default:
1865*7c568831SAndroid Build Coastguard Worker break;
1866*7c568831SAndroid Build Coastguard Worker }
1867*7c568831SAndroid Build Coastguard Worker cur = cur->next;
1868*7c568831SAndroid Build Coastguard Worker }
1869*7c568831SAndroid Build Coastguard Worker if (rewrite != NULL) {
1870*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs)
1871*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
1872*7c568831SAndroid Build Coastguard Worker "Using rewriting rule %s\n", rewrite->name);
1873*7c568831SAndroid Build Coastguard Worker ret = xmlStrdup(rewrite->URL);
1874*7c568831SAndroid Build Coastguard Worker if (ret != NULL)
1875*7c568831SAndroid Build Coastguard Worker ret = xmlStrcat(ret, &URI[lenrewrite]);
1876*7c568831SAndroid Build Coastguard Worker return(ret);
1877*7c568831SAndroid Build Coastguard Worker }
1878*7c568831SAndroid Build Coastguard Worker if (haveDelegate) {
1879*7c568831SAndroid Build Coastguard Worker const xmlChar *delegates[MAX_DELEGATE];
1880*7c568831SAndroid Build Coastguard Worker int nbList = 0, i;
1881*7c568831SAndroid Build Coastguard Worker
1882*7c568831SAndroid Build Coastguard Worker /*
1883*7c568831SAndroid Build Coastguard Worker * Assume the entries have been sorted by decreasing substring
1884*7c568831SAndroid Build Coastguard Worker * matches when the list was produced.
1885*7c568831SAndroid Build Coastguard Worker */
1886*7c568831SAndroid Build Coastguard Worker cur = catal;
1887*7c568831SAndroid Build Coastguard Worker while (cur != NULL) {
1888*7c568831SAndroid Build Coastguard Worker if (((cur->type == XML_CATA_DELEGATE_SYSTEM) ||
1889*7c568831SAndroid Build Coastguard Worker (cur->type == XML_CATA_DELEGATE_URI)) &&
1890*7c568831SAndroid Build Coastguard Worker (!xmlStrncmp(URI, cur->name, xmlStrlen(cur->name)))) {
1891*7c568831SAndroid Build Coastguard Worker for (i = 0;i < nbList;i++)
1892*7c568831SAndroid Build Coastguard Worker if (xmlStrEqual(cur->URL, delegates[i]))
1893*7c568831SAndroid Build Coastguard Worker break;
1894*7c568831SAndroid Build Coastguard Worker if (i < nbList) {
1895*7c568831SAndroid Build Coastguard Worker cur = cur->next;
1896*7c568831SAndroid Build Coastguard Worker continue;
1897*7c568831SAndroid Build Coastguard Worker }
1898*7c568831SAndroid Build Coastguard Worker if (nbList < MAX_DELEGATE)
1899*7c568831SAndroid Build Coastguard Worker delegates[nbList++] = cur->URL;
1900*7c568831SAndroid Build Coastguard Worker
1901*7c568831SAndroid Build Coastguard Worker if (cur->children == NULL) {
1902*7c568831SAndroid Build Coastguard Worker xmlFetchXMLCatalogFile(cur);
1903*7c568831SAndroid Build Coastguard Worker }
1904*7c568831SAndroid Build Coastguard Worker if (cur->children != NULL) {
1905*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs)
1906*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
1907*7c568831SAndroid Build Coastguard Worker "Trying URI delegate %s\n", cur->URL);
1908*7c568831SAndroid Build Coastguard Worker ret = xmlCatalogListXMLResolveURI(
1909*7c568831SAndroid Build Coastguard Worker cur->children, URI);
1910*7c568831SAndroid Build Coastguard Worker if (ret != NULL)
1911*7c568831SAndroid Build Coastguard Worker return(ret);
1912*7c568831SAndroid Build Coastguard Worker }
1913*7c568831SAndroid Build Coastguard Worker }
1914*7c568831SAndroid Build Coastguard Worker cur = cur->next;
1915*7c568831SAndroid Build Coastguard Worker }
1916*7c568831SAndroid Build Coastguard Worker /*
1917*7c568831SAndroid Build Coastguard Worker * Apply the cut algorithm explained in 4/
1918*7c568831SAndroid Build Coastguard Worker */
1919*7c568831SAndroid Build Coastguard Worker return(XML_CATAL_BREAK);
1920*7c568831SAndroid Build Coastguard Worker }
1921*7c568831SAndroid Build Coastguard Worker if (haveNext) {
1922*7c568831SAndroid Build Coastguard Worker cur = catal;
1923*7c568831SAndroid Build Coastguard Worker while (cur != NULL) {
1924*7c568831SAndroid Build Coastguard Worker if (cur->type == XML_CATA_NEXT_CATALOG) {
1925*7c568831SAndroid Build Coastguard Worker if (cur->children == NULL) {
1926*7c568831SAndroid Build Coastguard Worker xmlFetchXMLCatalogFile(cur);
1927*7c568831SAndroid Build Coastguard Worker }
1928*7c568831SAndroid Build Coastguard Worker if (cur->children != NULL) {
1929*7c568831SAndroid Build Coastguard Worker ret = xmlCatalogListXMLResolveURI(cur->children, URI);
1930*7c568831SAndroid Build Coastguard Worker if (ret != NULL)
1931*7c568831SAndroid Build Coastguard Worker return(ret);
1932*7c568831SAndroid Build Coastguard Worker }
1933*7c568831SAndroid Build Coastguard Worker }
1934*7c568831SAndroid Build Coastguard Worker cur = cur->next;
1935*7c568831SAndroid Build Coastguard Worker }
1936*7c568831SAndroid Build Coastguard Worker }
1937*7c568831SAndroid Build Coastguard Worker
1938*7c568831SAndroid Build Coastguard Worker return(NULL);
1939*7c568831SAndroid Build Coastguard Worker }
1940*7c568831SAndroid Build Coastguard Worker
1941*7c568831SAndroid Build Coastguard Worker /**
1942*7c568831SAndroid Build Coastguard Worker * xmlCatalogListXMLResolve:
1943*7c568831SAndroid Build Coastguard Worker * @catal: a catalog list
1944*7c568831SAndroid Build Coastguard Worker * @pubID: the public ID string
1945*7c568831SAndroid Build Coastguard Worker * @sysID: the system ID string
1946*7c568831SAndroid Build Coastguard Worker *
1947*7c568831SAndroid Build Coastguard Worker * Do a complete resolution lookup of an External Identifier for a
1948*7c568831SAndroid Build Coastguard Worker * list of catalogs
1949*7c568831SAndroid Build Coastguard Worker *
1950*7c568831SAndroid Build Coastguard Worker * Implements (or tries to) 7.1. External Identifier Resolution
1951*7c568831SAndroid Build Coastguard Worker * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html
1952*7c568831SAndroid Build Coastguard Worker *
1953*7c568831SAndroid Build Coastguard Worker * Returns the URI of the resource or NULL if not found
1954*7c568831SAndroid Build Coastguard Worker */
1955*7c568831SAndroid Build Coastguard Worker static xmlChar *
xmlCatalogListXMLResolve(xmlCatalogEntryPtr catal,const xmlChar * pubID,const xmlChar * sysID)1956*7c568831SAndroid Build Coastguard Worker xmlCatalogListXMLResolve(xmlCatalogEntryPtr catal, const xmlChar *pubID,
1957*7c568831SAndroid Build Coastguard Worker const xmlChar *sysID) {
1958*7c568831SAndroid Build Coastguard Worker xmlChar *ret = NULL;
1959*7c568831SAndroid Build Coastguard Worker xmlChar *urnID = NULL;
1960*7c568831SAndroid Build Coastguard Worker xmlChar *normid;
1961*7c568831SAndroid Build Coastguard Worker
1962*7c568831SAndroid Build Coastguard Worker if (catal == NULL)
1963*7c568831SAndroid Build Coastguard Worker return(NULL);
1964*7c568831SAndroid Build Coastguard Worker if ((pubID == NULL) && (sysID == NULL))
1965*7c568831SAndroid Build Coastguard Worker return(NULL);
1966*7c568831SAndroid Build Coastguard Worker
1967*7c568831SAndroid Build Coastguard Worker normid = xmlCatalogNormalizePublic(pubID);
1968*7c568831SAndroid Build Coastguard Worker if (normid != NULL)
1969*7c568831SAndroid Build Coastguard Worker pubID = (*normid != 0 ? normid : NULL);
1970*7c568831SAndroid Build Coastguard Worker
1971*7c568831SAndroid Build Coastguard Worker if (!xmlStrncmp(pubID, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1)) {
1972*7c568831SAndroid Build Coastguard Worker urnID = xmlCatalogUnWrapURN(pubID);
1973*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs) {
1974*7c568831SAndroid Build Coastguard Worker if (urnID == NULL)
1975*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
1976*7c568831SAndroid Build Coastguard Worker "Public URN ID %s expanded to NULL\n", pubID);
1977*7c568831SAndroid Build Coastguard Worker else
1978*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
1979*7c568831SAndroid Build Coastguard Worker "Public URN ID expanded to %s\n", urnID);
1980*7c568831SAndroid Build Coastguard Worker }
1981*7c568831SAndroid Build Coastguard Worker ret = xmlCatalogListXMLResolve(catal, urnID, sysID);
1982*7c568831SAndroid Build Coastguard Worker if (urnID != NULL)
1983*7c568831SAndroid Build Coastguard Worker xmlFree(urnID);
1984*7c568831SAndroid Build Coastguard Worker if (normid != NULL)
1985*7c568831SAndroid Build Coastguard Worker xmlFree(normid);
1986*7c568831SAndroid Build Coastguard Worker return(ret);
1987*7c568831SAndroid Build Coastguard Worker }
1988*7c568831SAndroid Build Coastguard Worker if (!xmlStrncmp(sysID, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1)) {
1989*7c568831SAndroid Build Coastguard Worker urnID = xmlCatalogUnWrapURN(sysID);
1990*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs) {
1991*7c568831SAndroid Build Coastguard Worker if (urnID == NULL)
1992*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
1993*7c568831SAndroid Build Coastguard Worker "System URN ID %s expanded to NULL\n", sysID);
1994*7c568831SAndroid Build Coastguard Worker else
1995*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
1996*7c568831SAndroid Build Coastguard Worker "System URN ID expanded to %s\n", urnID);
1997*7c568831SAndroid Build Coastguard Worker }
1998*7c568831SAndroid Build Coastguard Worker if (pubID == NULL)
1999*7c568831SAndroid Build Coastguard Worker ret = xmlCatalogListXMLResolve(catal, urnID, NULL);
2000*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(pubID, urnID))
2001*7c568831SAndroid Build Coastguard Worker ret = xmlCatalogListXMLResolve(catal, pubID, NULL);
2002*7c568831SAndroid Build Coastguard Worker else {
2003*7c568831SAndroid Build Coastguard Worker ret = xmlCatalogListXMLResolve(catal, pubID, urnID);
2004*7c568831SAndroid Build Coastguard Worker }
2005*7c568831SAndroid Build Coastguard Worker if (urnID != NULL)
2006*7c568831SAndroid Build Coastguard Worker xmlFree(urnID);
2007*7c568831SAndroid Build Coastguard Worker if (normid != NULL)
2008*7c568831SAndroid Build Coastguard Worker xmlFree(normid);
2009*7c568831SAndroid Build Coastguard Worker return(ret);
2010*7c568831SAndroid Build Coastguard Worker }
2011*7c568831SAndroid Build Coastguard Worker while (catal != NULL) {
2012*7c568831SAndroid Build Coastguard Worker if (catal->type == XML_CATA_CATALOG) {
2013*7c568831SAndroid Build Coastguard Worker if (catal->children == NULL) {
2014*7c568831SAndroid Build Coastguard Worker xmlFetchXMLCatalogFile(catal);
2015*7c568831SAndroid Build Coastguard Worker }
2016*7c568831SAndroid Build Coastguard Worker if (catal->children != NULL) {
2017*7c568831SAndroid Build Coastguard Worker ret = xmlCatalogXMLResolve(catal->children, pubID, sysID);
2018*7c568831SAndroid Build Coastguard Worker if (ret != NULL) {
2019*7c568831SAndroid Build Coastguard Worker break;
2020*7c568831SAndroid Build Coastguard Worker } else if (catal->children->depth > MAX_CATAL_DEPTH) {
2021*7c568831SAndroid Build Coastguard Worker ret = NULL;
2022*7c568831SAndroid Build Coastguard Worker break;
2023*7c568831SAndroid Build Coastguard Worker }
2024*7c568831SAndroid Build Coastguard Worker }
2025*7c568831SAndroid Build Coastguard Worker }
2026*7c568831SAndroid Build Coastguard Worker catal = catal->next;
2027*7c568831SAndroid Build Coastguard Worker }
2028*7c568831SAndroid Build Coastguard Worker if (normid != NULL)
2029*7c568831SAndroid Build Coastguard Worker xmlFree(normid);
2030*7c568831SAndroid Build Coastguard Worker return(ret);
2031*7c568831SAndroid Build Coastguard Worker }
2032*7c568831SAndroid Build Coastguard Worker
2033*7c568831SAndroid Build Coastguard Worker /**
2034*7c568831SAndroid Build Coastguard Worker * xmlCatalogListXMLResolveURI:
2035*7c568831SAndroid Build Coastguard Worker * @catal: a catalog list
2036*7c568831SAndroid Build Coastguard Worker * @URI: the URI
2037*7c568831SAndroid Build Coastguard Worker *
2038*7c568831SAndroid Build Coastguard Worker * Do a complete resolution lookup of an URI for a list of catalogs
2039*7c568831SAndroid Build Coastguard Worker *
2040*7c568831SAndroid Build Coastguard Worker * Implements (or tries to) 7.2. URI Resolution
2041*7c568831SAndroid Build Coastguard Worker * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html
2042*7c568831SAndroid Build Coastguard Worker *
2043*7c568831SAndroid Build Coastguard Worker * Returns the URI of the resource or NULL if not found
2044*7c568831SAndroid Build Coastguard Worker */
2045*7c568831SAndroid Build Coastguard Worker static xmlChar *
xmlCatalogListXMLResolveURI(xmlCatalogEntryPtr catal,const xmlChar * URI)2046*7c568831SAndroid Build Coastguard Worker xmlCatalogListXMLResolveURI(xmlCatalogEntryPtr catal, const xmlChar *URI) {
2047*7c568831SAndroid Build Coastguard Worker xmlChar *ret = NULL;
2048*7c568831SAndroid Build Coastguard Worker xmlChar *urnID = NULL;
2049*7c568831SAndroid Build Coastguard Worker
2050*7c568831SAndroid Build Coastguard Worker if (catal == NULL)
2051*7c568831SAndroid Build Coastguard Worker return(NULL);
2052*7c568831SAndroid Build Coastguard Worker if (URI == NULL)
2053*7c568831SAndroid Build Coastguard Worker return(NULL);
2054*7c568831SAndroid Build Coastguard Worker
2055*7c568831SAndroid Build Coastguard Worker if (!xmlStrncmp(URI, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1)) {
2056*7c568831SAndroid Build Coastguard Worker urnID = xmlCatalogUnWrapURN(URI);
2057*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs) {
2058*7c568831SAndroid Build Coastguard Worker if (urnID == NULL)
2059*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
2060*7c568831SAndroid Build Coastguard Worker "URN ID %s expanded to NULL\n", URI);
2061*7c568831SAndroid Build Coastguard Worker else
2062*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
2063*7c568831SAndroid Build Coastguard Worker "URN ID expanded to %s\n", urnID);
2064*7c568831SAndroid Build Coastguard Worker }
2065*7c568831SAndroid Build Coastguard Worker ret = xmlCatalogListXMLResolve(catal, urnID, NULL);
2066*7c568831SAndroid Build Coastguard Worker if (urnID != NULL)
2067*7c568831SAndroid Build Coastguard Worker xmlFree(urnID);
2068*7c568831SAndroid Build Coastguard Worker return(ret);
2069*7c568831SAndroid Build Coastguard Worker }
2070*7c568831SAndroid Build Coastguard Worker while (catal != NULL) {
2071*7c568831SAndroid Build Coastguard Worker if (catal->type == XML_CATA_CATALOG) {
2072*7c568831SAndroid Build Coastguard Worker if (catal->children == NULL) {
2073*7c568831SAndroid Build Coastguard Worker xmlFetchXMLCatalogFile(catal);
2074*7c568831SAndroid Build Coastguard Worker }
2075*7c568831SAndroid Build Coastguard Worker if (catal->children != NULL) {
2076*7c568831SAndroid Build Coastguard Worker ret = xmlCatalogXMLResolveURI(catal->children, URI);
2077*7c568831SAndroid Build Coastguard Worker if (ret != NULL)
2078*7c568831SAndroid Build Coastguard Worker return(ret);
2079*7c568831SAndroid Build Coastguard Worker }
2080*7c568831SAndroid Build Coastguard Worker }
2081*7c568831SAndroid Build Coastguard Worker catal = catal->next;
2082*7c568831SAndroid Build Coastguard Worker }
2083*7c568831SAndroid Build Coastguard Worker return(ret);
2084*7c568831SAndroid Build Coastguard Worker }
2085*7c568831SAndroid Build Coastguard Worker
2086*7c568831SAndroid Build Coastguard Worker /************************************************************************
2087*7c568831SAndroid Build Coastguard Worker * *
2088*7c568831SAndroid Build Coastguard Worker * The SGML Catalog parser *
2089*7c568831SAndroid Build Coastguard Worker * *
2090*7c568831SAndroid Build Coastguard Worker ************************************************************************/
2091*7c568831SAndroid Build Coastguard Worker
2092*7c568831SAndroid Build Coastguard Worker
2093*7c568831SAndroid Build Coastguard Worker #define RAW *cur
2094*7c568831SAndroid Build Coastguard Worker #define NEXT cur++;
2095*7c568831SAndroid Build Coastguard Worker #define SKIP(x) cur += x;
2096*7c568831SAndroid Build Coastguard Worker
2097*7c568831SAndroid Build Coastguard Worker #define SKIP_BLANKS while (IS_BLANK_CH(*cur)) NEXT;
2098*7c568831SAndroid Build Coastguard Worker
2099*7c568831SAndroid Build Coastguard Worker /**
2100*7c568831SAndroid Build Coastguard Worker * xmlParseSGMLCatalogComment:
2101*7c568831SAndroid Build Coastguard Worker * @cur: the current character
2102*7c568831SAndroid Build Coastguard Worker *
2103*7c568831SAndroid Build Coastguard Worker * Skip a comment in an SGML catalog
2104*7c568831SAndroid Build Coastguard Worker *
2105*7c568831SAndroid Build Coastguard Worker * Returns new current character
2106*7c568831SAndroid Build Coastguard Worker */
2107*7c568831SAndroid Build Coastguard Worker static const xmlChar *
xmlParseSGMLCatalogComment(const xmlChar * cur)2108*7c568831SAndroid Build Coastguard Worker xmlParseSGMLCatalogComment(const xmlChar *cur) {
2109*7c568831SAndroid Build Coastguard Worker if ((cur[0] != '-') || (cur[1] != '-'))
2110*7c568831SAndroid Build Coastguard Worker return(cur);
2111*7c568831SAndroid Build Coastguard Worker SKIP(2);
2112*7c568831SAndroid Build Coastguard Worker while ((cur[0] != 0) && ((cur[0] != '-') || ((cur[1] != '-'))))
2113*7c568831SAndroid Build Coastguard Worker NEXT;
2114*7c568831SAndroid Build Coastguard Worker if (cur[0] == 0) {
2115*7c568831SAndroid Build Coastguard Worker return(NULL);
2116*7c568831SAndroid Build Coastguard Worker }
2117*7c568831SAndroid Build Coastguard Worker return(cur + 2);
2118*7c568831SAndroid Build Coastguard Worker }
2119*7c568831SAndroid Build Coastguard Worker
2120*7c568831SAndroid Build Coastguard Worker /**
2121*7c568831SAndroid Build Coastguard Worker * xmlParseSGMLCatalogPubid:
2122*7c568831SAndroid Build Coastguard Worker * @cur: the current character
2123*7c568831SAndroid Build Coastguard Worker * @id: the return location
2124*7c568831SAndroid Build Coastguard Worker *
2125*7c568831SAndroid Build Coastguard Worker * Parse an SGML catalog ID
2126*7c568831SAndroid Build Coastguard Worker *
2127*7c568831SAndroid Build Coastguard Worker * Returns new current character and store the value in @id
2128*7c568831SAndroid Build Coastguard Worker */
2129*7c568831SAndroid Build Coastguard Worker static const xmlChar *
xmlParseSGMLCatalogPubid(const xmlChar * cur,xmlChar ** id)2130*7c568831SAndroid Build Coastguard Worker xmlParseSGMLCatalogPubid(const xmlChar *cur, xmlChar **id) {
2131*7c568831SAndroid Build Coastguard Worker xmlChar *buf = NULL, *tmp;
2132*7c568831SAndroid Build Coastguard Worker int len = 0;
2133*7c568831SAndroid Build Coastguard Worker int size = 50;
2134*7c568831SAndroid Build Coastguard Worker xmlChar stop;
2135*7c568831SAndroid Build Coastguard Worker
2136*7c568831SAndroid Build Coastguard Worker *id = NULL;
2137*7c568831SAndroid Build Coastguard Worker
2138*7c568831SAndroid Build Coastguard Worker if (RAW == '"') {
2139*7c568831SAndroid Build Coastguard Worker NEXT;
2140*7c568831SAndroid Build Coastguard Worker stop = '"';
2141*7c568831SAndroid Build Coastguard Worker } else if (RAW == '\'') {
2142*7c568831SAndroid Build Coastguard Worker NEXT;
2143*7c568831SAndroid Build Coastguard Worker stop = '\'';
2144*7c568831SAndroid Build Coastguard Worker } else {
2145*7c568831SAndroid Build Coastguard Worker stop = ' ';
2146*7c568831SAndroid Build Coastguard Worker }
2147*7c568831SAndroid Build Coastguard Worker buf = xmlMalloc(size);
2148*7c568831SAndroid Build Coastguard Worker if (buf == NULL) {
2149*7c568831SAndroid Build Coastguard Worker xmlCatalogErrMemory();
2150*7c568831SAndroid Build Coastguard Worker return(NULL);
2151*7c568831SAndroid Build Coastguard Worker }
2152*7c568831SAndroid Build Coastguard Worker while (IS_PUBIDCHAR_CH(*cur) || (*cur == '?')) {
2153*7c568831SAndroid Build Coastguard Worker if ((*cur == stop) && (stop != ' '))
2154*7c568831SAndroid Build Coastguard Worker break;
2155*7c568831SAndroid Build Coastguard Worker if ((stop == ' ') && (IS_BLANK_CH(*cur)))
2156*7c568831SAndroid Build Coastguard Worker break;
2157*7c568831SAndroid Build Coastguard Worker if (len + 1 >= size) {
2158*7c568831SAndroid Build Coastguard Worker size *= 2;
2159*7c568831SAndroid Build Coastguard Worker tmp = (xmlChar *) xmlRealloc(buf, size);
2160*7c568831SAndroid Build Coastguard Worker if (tmp == NULL) {
2161*7c568831SAndroid Build Coastguard Worker xmlCatalogErrMemory();
2162*7c568831SAndroid Build Coastguard Worker xmlFree(buf);
2163*7c568831SAndroid Build Coastguard Worker return(NULL);
2164*7c568831SAndroid Build Coastguard Worker }
2165*7c568831SAndroid Build Coastguard Worker buf = tmp;
2166*7c568831SAndroid Build Coastguard Worker }
2167*7c568831SAndroid Build Coastguard Worker buf[len++] = *cur;
2168*7c568831SAndroid Build Coastguard Worker NEXT;
2169*7c568831SAndroid Build Coastguard Worker }
2170*7c568831SAndroid Build Coastguard Worker buf[len] = 0;
2171*7c568831SAndroid Build Coastguard Worker if (stop == ' ') {
2172*7c568831SAndroid Build Coastguard Worker if (!IS_BLANK_CH(*cur)) {
2173*7c568831SAndroid Build Coastguard Worker xmlFree(buf);
2174*7c568831SAndroid Build Coastguard Worker return(NULL);
2175*7c568831SAndroid Build Coastguard Worker }
2176*7c568831SAndroid Build Coastguard Worker } else {
2177*7c568831SAndroid Build Coastguard Worker if (*cur != stop) {
2178*7c568831SAndroid Build Coastguard Worker xmlFree(buf);
2179*7c568831SAndroid Build Coastguard Worker return(NULL);
2180*7c568831SAndroid Build Coastguard Worker }
2181*7c568831SAndroid Build Coastguard Worker NEXT;
2182*7c568831SAndroid Build Coastguard Worker }
2183*7c568831SAndroid Build Coastguard Worker *id = buf;
2184*7c568831SAndroid Build Coastguard Worker return(cur);
2185*7c568831SAndroid Build Coastguard Worker }
2186*7c568831SAndroid Build Coastguard Worker
2187*7c568831SAndroid Build Coastguard Worker /**
2188*7c568831SAndroid Build Coastguard Worker * xmlParseSGMLCatalogName:
2189*7c568831SAndroid Build Coastguard Worker * @cur: the current character
2190*7c568831SAndroid Build Coastguard Worker * @name: the return location
2191*7c568831SAndroid Build Coastguard Worker *
2192*7c568831SAndroid Build Coastguard Worker * Parse an SGML catalog name
2193*7c568831SAndroid Build Coastguard Worker *
2194*7c568831SAndroid Build Coastguard Worker * Returns new current character and store the value in @name
2195*7c568831SAndroid Build Coastguard Worker */
2196*7c568831SAndroid Build Coastguard Worker static const xmlChar *
xmlParseSGMLCatalogName(const xmlChar * cur,xmlChar ** name)2197*7c568831SAndroid Build Coastguard Worker xmlParseSGMLCatalogName(const xmlChar *cur, xmlChar **name) {
2198*7c568831SAndroid Build Coastguard Worker xmlChar buf[XML_MAX_NAMELEN + 5];
2199*7c568831SAndroid Build Coastguard Worker int len = 0;
2200*7c568831SAndroid Build Coastguard Worker int c;
2201*7c568831SAndroid Build Coastguard Worker
2202*7c568831SAndroid Build Coastguard Worker *name = NULL;
2203*7c568831SAndroid Build Coastguard Worker
2204*7c568831SAndroid Build Coastguard Worker /*
2205*7c568831SAndroid Build Coastguard Worker * Handler for more complex cases
2206*7c568831SAndroid Build Coastguard Worker */
2207*7c568831SAndroid Build Coastguard Worker c = *cur;
2208*7c568831SAndroid Build Coastguard Worker if ((!IS_LETTER(c) && (c != '_') && (c != ':'))) {
2209*7c568831SAndroid Build Coastguard Worker return(NULL);
2210*7c568831SAndroid Build Coastguard Worker }
2211*7c568831SAndroid Build Coastguard Worker
2212*7c568831SAndroid Build Coastguard Worker while (((IS_LETTER(c)) || (IS_DIGIT(c)) ||
2213*7c568831SAndroid Build Coastguard Worker (c == '.') || (c == '-') ||
2214*7c568831SAndroid Build Coastguard Worker (c == '_') || (c == ':'))) {
2215*7c568831SAndroid Build Coastguard Worker buf[len++] = c;
2216*7c568831SAndroid Build Coastguard Worker cur++;
2217*7c568831SAndroid Build Coastguard Worker c = *cur;
2218*7c568831SAndroid Build Coastguard Worker if (len >= XML_MAX_NAMELEN)
2219*7c568831SAndroid Build Coastguard Worker return(NULL);
2220*7c568831SAndroid Build Coastguard Worker }
2221*7c568831SAndroid Build Coastguard Worker *name = xmlStrndup(buf, len);
2222*7c568831SAndroid Build Coastguard Worker return(cur);
2223*7c568831SAndroid Build Coastguard Worker }
2224*7c568831SAndroid Build Coastguard Worker
2225*7c568831SAndroid Build Coastguard Worker /**
2226*7c568831SAndroid Build Coastguard Worker * xmlGetSGMLCatalogEntryType:
2227*7c568831SAndroid Build Coastguard Worker * @name: the entry name
2228*7c568831SAndroid Build Coastguard Worker *
2229*7c568831SAndroid Build Coastguard Worker * Get the Catalog entry type for a given SGML Catalog name
2230*7c568831SAndroid Build Coastguard Worker *
2231*7c568831SAndroid Build Coastguard Worker * Returns Catalog entry type
2232*7c568831SAndroid Build Coastguard Worker */
2233*7c568831SAndroid Build Coastguard Worker static xmlCatalogEntryType
xmlGetSGMLCatalogEntryType(const xmlChar * name)2234*7c568831SAndroid Build Coastguard Worker xmlGetSGMLCatalogEntryType(const xmlChar *name) {
2235*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryType type = XML_CATA_NONE;
2236*7c568831SAndroid Build Coastguard Worker if (xmlStrEqual(name, (const xmlChar *) "SYSTEM"))
2237*7c568831SAndroid Build Coastguard Worker type = SGML_CATA_SYSTEM;
2238*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "PUBLIC"))
2239*7c568831SAndroid Build Coastguard Worker type = SGML_CATA_PUBLIC;
2240*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "DELEGATE"))
2241*7c568831SAndroid Build Coastguard Worker type = SGML_CATA_DELEGATE;
2242*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "ENTITY"))
2243*7c568831SAndroid Build Coastguard Worker type = SGML_CATA_ENTITY;
2244*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "DOCTYPE"))
2245*7c568831SAndroid Build Coastguard Worker type = SGML_CATA_DOCTYPE;
2246*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "LINKTYPE"))
2247*7c568831SAndroid Build Coastguard Worker type = SGML_CATA_LINKTYPE;
2248*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "NOTATION"))
2249*7c568831SAndroid Build Coastguard Worker type = SGML_CATA_NOTATION;
2250*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "SGMLDECL"))
2251*7c568831SAndroid Build Coastguard Worker type = SGML_CATA_SGMLDECL;
2252*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "DOCUMENT"))
2253*7c568831SAndroid Build Coastguard Worker type = SGML_CATA_DOCUMENT;
2254*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "CATALOG"))
2255*7c568831SAndroid Build Coastguard Worker type = SGML_CATA_CATALOG;
2256*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "BASE"))
2257*7c568831SAndroid Build Coastguard Worker type = SGML_CATA_BASE;
2258*7c568831SAndroid Build Coastguard Worker return(type);
2259*7c568831SAndroid Build Coastguard Worker }
2260*7c568831SAndroid Build Coastguard Worker
2261*7c568831SAndroid Build Coastguard Worker /**
2262*7c568831SAndroid Build Coastguard Worker * xmlParseSGMLCatalog:
2263*7c568831SAndroid Build Coastguard Worker * @catal: the SGML Catalog
2264*7c568831SAndroid Build Coastguard Worker * @value: the content of the SGML Catalog serialization
2265*7c568831SAndroid Build Coastguard Worker * @file: the filepath for the catalog
2266*7c568831SAndroid Build Coastguard Worker * @super: should this be handled as a Super Catalog in which case
2267*7c568831SAndroid Build Coastguard Worker * parsing is not recursive
2268*7c568831SAndroid Build Coastguard Worker *
2269*7c568831SAndroid Build Coastguard Worker * Parse an SGML catalog content and fill up the @catal hash table with
2270*7c568831SAndroid Build Coastguard Worker * the new entries found.
2271*7c568831SAndroid Build Coastguard Worker *
2272*7c568831SAndroid Build Coastguard Worker * Returns 0 in case of success, -1 in case of error.
2273*7c568831SAndroid Build Coastguard Worker */
2274*7c568831SAndroid Build Coastguard Worker static int
xmlParseSGMLCatalog(xmlCatalogPtr catal,const xmlChar * value,const char * file,int super)2275*7c568831SAndroid Build Coastguard Worker xmlParseSGMLCatalog(xmlCatalogPtr catal, const xmlChar *value,
2276*7c568831SAndroid Build Coastguard Worker const char *file, int super) {
2277*7c568831SAndroid Build Coastguard Worker const xmlChar *cur = value;
2278*7c568831SAndroid Build Coastguard Worker xmlChar *base = NULL;
2279*7c568831SAndroid Build Coastguard Worker int res;
2280*7c568831SAndroid Build Coastguard Worker
2281*7c568831SAndroid Build Coastguard Worker if ((cur == NULL) || (file == NULL))
2282*7c568831SAndroid Build Coastguard Worker return(-1);
2283*7c568831SAndroid Build Coastguard Worker base = xmlStrdup((const xmlChar *) file);
2284*7c568831SAndroid Build Coastguard Worker
2285*7c568831SAndroid Build Coastguard Worker while ((cur != NULL) && (cur[0] != 0)) {
2286*7c568831SAndroid Build Coastguard Worker SKIP_BLANKS;
2287*7c568831SAndroid Build Coastguard Worker if (cur[0] == 0)
2288*7c568831SAndroid Build Coastguard Worker break;
2289*7c568831SAndroid Build Coastguard Worker if ((cur[0] == '-') && (cur[1] == '-')) {
2290*7c568831SAndroid Build Coastguard Worker cur = xmlParseSGMLCatalogComment(cur);
2291*7c568831SAndroid Build Coastguard Worker if (cur == NULL) {
2292*7c568831SAndroid Build Coastguard Worker /* error */
2293*7c568831SAndroid Build Coastguard Worker break;
2294*7c568831SAndroid Build Coastguard Worker }
2295*7c568831SAndroid Build Coastguard Worker } else {
2296*7c568831SAndroid Build Coastguard Worker xmlChar *sysid = NULL;
2297*7c568831SAndroid Build Coastguard Worker xmlChar *name = NULL;
2298*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryType type = XML_CATA_NONE;
2299*7c568831SAndroid Build Coastguard Worker
2300*7c568831SAndroid Build Coastguard Worker cur = xmlParseSGMLCatalogName(cur, &name);
2301*7c568831SAndroid Build Coastguard Worker if (cur == NULL || name == NULL) {
2302*7c568831SAndroid Build Coastguard Worker /* error */
2303*7c568831SAndroid Build Coastguard Worker break;
2304*7c568831SAndroid Build Coastguard Worker }
2305*7c568831SAndroid Build Coastguard Worker if (!IS_BLANK_CH(*cur)) {
2306*7c568831SAndroid Build Coastguard Worker /* error */
2307*7c568831SAndroid Build Coastguard Worker xmlFree(name);
2308*7c568831SAndroid Build Coastguard Worker break;
2309*7c568831SAndroid Build Coastguard Worker }
2310*7c568831SAndroid Build Coastguard Worker SKIP_BLANKS;
2311*7c568831SAndroid Build Coastguard Worker if (xmlStrEqual(name, (const xmlChar *) "SYSTEM"))
2312*7c568831SAndroid Build Coastguard Worker type = SGML_CATA_SYSTEM;
2313*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "PUBLIC"))
2314*7c568831SAndroid Build Coastguard Worker type = SGML_CATA_PUBLIC;
2315*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "DELEGATE"))
2316*7c568831SAndroid Build Coastguard Worker type = SGML_CATA_DELEGATE;
2317*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "ENTITY"))
2318*7c568831SAndroid Build Coastguard Worker type = SGML_CATA_ENTITY;
2319*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "DOCTYPE"))
2320*7c568831SAndroid Build Coastguard Worker type = SGML_CATA_DOCTYPE;
2321*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "LINKTYPE"))
2322*7c568831SAndroid Build Coastguard Worker type = SGML_CATA_LINKTYPE;
2323*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "NOTATION"))
2324*7c568831SAndroid Build Coastguard Worker type = SGML_CATA_NOTATION;
2325*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "SGMLDECL"))
2326*7c568831SAndroid Build Coastguard Worker type = SGML_CATA_SGMLDECL;
2327*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "DOCUMENT"))
2328*7c568831SAndroid Build Coastguard Worker type = SGML_CATA_DOCUMENT;
2329*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "CATALOG"))
2330*7c568831SAndroid Build Coastguard Worker type = SGML_CATA_CATALOG;
2331*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "BASE"))
2332*7c568831SAndroid Build Coastguard Worker type = SGML_CATA_BASE;
2333*7c568831SAndroid Build Coastguard Worker else if (xmlStrEqual(name, (const xmlChar *) "OVERRIDE")) {
2334*7c568831SAndroid Build Coastguard Worker xmlFree(name);
2335*7c568831SAndroid Build Coastguard Worker cur = xmlParseSGMLCatalogName(cur, &name);
2336*7c568831SAndroid Build Coastguard Worker if (name == NULL) {
2337*7c568831SAndroid Build Coastguard Worker /* error */
2338*7c568831SAndroid Build Coastguard Worker break;
2339*7c568831SAndroid Build Coastguard Worker }
2340*7c568831SAndroid Build Coastguard Worker xmlFree(name);
2341*7c568831SAndroid Build Coastguard Worker continue;
2342*7c568831SAndroid Build Coastguard Worker }
2343*7c568831SAndroid Build Coastguard Worker xmlFree(name);
2344*7c568831SAndroid Build Coastguard Worker name = NULL;
2345*7c568831SAndroid Build Coastguard Worker
2346*7c568831SAndroid Build Coastguard Worker switch(type) {
2347*7c568831SAndroid Build Coastguard Worker case SGML_CATA_ENTITY:
2348*7c568831SAndroid Build Coastguard Worker if (*cur == '%')
2349*7c568831SAndroid Build Coastguard Worker type = SGML_CATA_PENTITY;
2350*7c568831SAndroid Build Coastguard Worker /* Falls through. */
2351*7c568831SAndroid Build Coastguard Worker case SGML_CATA_PENTITY:
2352*7c568831SAndroid Build Coastguard Worker case SGML_CATA_DOCTYPE:
2353*7c568831SAndroid Build Coastguard Worker case SGML_CATA_LINKTYPE:
2354*7c568831SAndroid Build Coastguard Worker case SGML_CATA_NOTATION:
2355*7c568831SAndroid Build Coastguard Worker cur = xmlParseSGMLCatalogName(cur, &name);
2356*7c568831SAndroid Build Coastguard Worker if (cur == NULL) {
2357*7c568831SAndroid Build Coastguard Worker /* error */
2358*7c568831SAndroid Build Coastguard Worker break;
2359*7c568831SAndroid Build Coastguard Worker }
2360*7c568831SAndroid Build Coastguard Worker if (!IS_BLANK_CH(*cur)) {
2361*7c568831SAndroid Build Coastguard Worker /* error */
2362*7c568831SAndroid Build Coastguard Worker break;
2363*7c568831SAndroid Build Coastguard Worker }
2364*7c568831SAndroid Build Coastguard Worker SKIP_BLANKS;
2365*7c568831SAndroid Build Coastguard Worker cur = xmlParseSGMLCatalogPubid(cur, &sysid);
2366*7c568831SAndroid Build Coastguard Worker if (cur == NULL) {
2367*7c568831SAndroid Build Coastguard Worker /* error */
2368*7c568831SAndroid Build Coastguard Worker break;
2369*7c568831SAndroid Build Coastguard Worker }
2370*7c568831SAndroid Build Coastguard Worker break;
2371*7c568831SAndroid Build Coastguard Worker case SGML_CATA_PUBLIC:
2372*7c568831SAndroid Build Coastguard Worker case SGML_CATA_SYSTEM:
2373*7c568831SAndroid Build Coastguard Worker case SGML_CATA_DELEGATE:
2374*7c568831SAndroid Build Coastguard Worker cur = xmlParseSGMLCatalogPubid(cur, &name);
2375*7c568831SAndroid Build Coastguard Worker if (cur == NULL) {
2376*7c568831SAndroid Build Coastguard Worker /* error */
2377*7c568831SAndroid Build Coastguard Worker break;
2378*7c568831SAndroid Build Coastguard Worker }
2379*7c568831SAndroid Build Coastguard Worker if (type != SGML_CATA_SYSTEM) {
2380*7c568831SAndroid Build Coastguard Worker xmlChar *normid;
2381*7c568831SAndroid Build Coastguard Worker
2382*7c568831SAndroid Build Coastguard Worker normid = xmlCatalogNormalizePublic(name);
2383*7c568831SAndroid Build Coastguard Worker if (normid != NULL) {
2384*7c568831SAndroid Build Coastguard Worker if (name != NULL)
2385*7c568831SAndroid Build Coastguard Worker xmlFree(name);
2386*7c568831SAndroid Build Coastguard Worker if (*normid != 0)
2387*7c568831SAndroid Build Coastguard Worker name = normid;
2388*7c568831SAndroid Build Coastguard Worker else {
2389*7c568831SAndroid Build Coastguard Worker xmlFree(normid);
2390*7c568831SAndroid Build Coastguard Worker name = NULL;
2391*7c568831SAndroid Build Coastguard Worker }
2392*7c568831SAndroid Build Coastguard Worker }
2393*7c568831SAndroid Build Coastguard Worker }
2394*7c568831SAndroid Build Coastguard Worker if (!IS_BLANK_CH(*cur)) {
2395*7c568831SAndroid Build Coastguard Worker /* error */
2396*7c568831SAndroid Build Coastguard Worker break;
2397*7c568831SAndroid Build Coastguard Worker }
2398*7c568831SAndroid Build Coastguard Worker SKIP_BLANKS;
2399*7c568831SAndroid Build Coastguard Worker cur = xmlParseSGMLCatalogPubid(cur, &sysid);
2400*7c568831SAndroid Build Coastguard Worker if (cur == NULL) {
2401*7c568831SAndroid Build Coastguard Worker /* error */
2402*7c568831SAndroid Build Coastguard Worker break;
2403*7c568831SAndroid Build Coastguard Worker }
2404*7c568831SAndroid Build Coastguard Worker break;
2405*7c568831SAndroid Build Coastguard Worker case SGML_CATA_BASE:
2406*7c568831SAndroid Build Coastguard Worker case SGML_CATA_CATALOG:
2407*7c568831SAndroid Build Coastguard Worker case SGML_CATA_DOCUMENT:
2408*7c568831SAndroid Build Coastguard Worker case SGML_CATA_SGMLDECL:
2409*7c568831SAndroid Build Coastguard Worker cur = xmlParseSGMLCatalogPubid(cur, &sysid);
2410*7c568831SAndroid Build Coastguard Worker if (cur == NULL) {
2411*7c568831SAndroid Build Coastguard Worker /* error */
2412*7c568831SAndroid Build Coastguard Worker break;
2413*7c568831SAndroid Build Coastguard Worker }
2414*7c568831SAndroid Build Coastguard Worker break;
2415*7c568831SAndroid Build Coastguard Worker default:
2416*7c568831SAndroid Build Coastguard Worker break;
2417*7c568831SAndroid Build Coastguard Worker }
2418*7c568831SAndroid Build Coastguard Worker if (cur == NULL) {
2419*7c568831SAndroid Build Coastguard Worker if (name != NULL)
2420*7c568831SAndroid Build Coastguard Worker xmlFree(name);
2421*7c568831SAndroid Build Coastguard Worker if (sysid != NULL)
2422*7c568831SAndroid Build Coastguard Worker xmlFree(sysid);
2423*7c568831SAndroid Build Coastguard Worker break;
2424*7c568831SAndroid Build Coastguard Worker } else if (type == SGML_CATA_BASE) {
2425*7c568831SAndroid Build Coastguard Worker if (base != NULL)
2426*7c568831SAndroid Build Coastguard Worker xmlFree(base);
2427*7c568831SAndroid Build Coastguard Worker base = xmlStrdup(sysid);
2428*7c568831SAndroid Build Coastguard Worker } else if ((type == SGML_CATA_PUBLIC) ||
2429*7c568831SAndroid Build Coastguard Worker (type == SGML_CATA_SYSTEM)) {
2430*7c568831SAndroid Build Coastguard Worker xmlChar *filename;
2431*7c568831SAndroid Build Coastguard Worker
2432*7c568831SAndroid Build Coastguard Worker filename = xmlBuildURI(sysid, base);
2433*7c568831SAndroid Build Coastguard Worker if (filename != NULL) {
2434*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr entry;
2435*7c568831SAndroid Build Coastguard Worker
2436*7c568831SAndroid Build Coastguard Worker entry = xmlNewCatalogEntry(type, name, filename,
2437*7c568831SAndroid Build Coastguard Worker NULL, XML_CATA_PREFER_NONE, NULL);
2438*7c568831SAndroid Build Coastguard Worker res = xmlHashAddEntry(catal->sgml, name, entry);
2439*7c568831SAndroid Build Coastguard Worker if (res < 0) {
2440*7c568831SAndroid Build Coastguard Worker xmlFreeCatalogEntry(entry, NULL);
2441*7c568831SAndroid Build Coastguard Worker }
2442*7c568831SAndroid Build Coastguard Worker xmlFree(filename);
2443*7c568831SAndroid Build Coastguard Worker }
2444*7c568831SAndroid Build Coastguard Worker
2445*7c568831SAndroid Build Coastguard Worker } else if (type == SGML_CATA_CATALOG) {
2446*7c568831SAndroid Build Coastguard Worker if (super) {
2447*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr entry;
2448*7c568831SAndroid Build Coastguard Worker
2449*7c568831SAndroid Build Coastguard Worker entry = xmlNewCatalogEntry(type, sysid, NULL, NULL,
2450*7c568831SAndroid Build Coastguard Worker XML_CATA_PREFER_NONE, NULL);
2451*7c568831SAndroid Build Coastguard Worker res = xmlHashAddEntry(catal->sgml, sysid, entry);
2452*7c568831SAndroid Build Coastguard Worker if (res < 0) {
2453*7c568831SAndroid Build Coastguard Worker xmlFreeCatalogEntry(entry, NULL);
2454*7c568831SAndroid Build Coastguard Worker }
2455*7c568831SAndroid Build Coastguard Worker } else {
2456*7c568831SAndroid Build Coastguard Worker xmlChar *filename;
2457*7c568831SAndroid Build Coastguard Worker
2458*7c568831SAndroid Build Coastguard Worker filename = xmlBuildURI(sysid, base);
2459*7c568831SAndroid Build Coastguard Worker if (filename != NULL) {
2460*7c568831SAndroid Build Coastguard Worker xmlExpandCatalog(catal, (const char *)filename);
2461*7c568831SAndroid Build Coastguard Worker xmlFree(filename);
2462*7c568831SAndroid Build Coastguard Worker }
2463*7c568831SAndroid Build Coastguard Worker }
2464*7c568831SAndroid Build Coastguard Worker }
2465*7c568831SAndroid Build Coastguard Worker /*
2466*7c568831SAndroid Build Coastguard Worker * drop anything else we won't handle it
2467*7c568831SAndroid Build Coastguard Worker */
2468*7c568831SAndroid Build Coastguard Worker if (name != NULL)
2469*7c568831SAndroid Build Coastguard Worker xmlFree(name);
2470*7c568831SAndroid Build Coastguard Worker if (sysid != NULL)
2471*7c568831SAndroid Build Coastguard Worker xmlFree(sysid);
2472*7c568831SAndroid Build Coastguard Worker }
2473*7c568831SAndroid Build Coastguard Worker }
2474*7c568831SAndroid Build Coastguard Worker if (base != NULL)
2475*7c568831SAndroid Build Coastguard Worker xmlFree(base);
2476*7c568831SAndroid Build Coastguard Worker if (cur == NULL)
2477*7c568831SAndroid Build Coastguard Worker return(-1);
2478*7c568831SAndroid Build Coastguard Worker return(0);
2479*7c568831SAndroid Build Coastguard Worker }
2480*7c568831SAndroid Build Coastguard Worker
2481*7c568831SAndroid Build Coastguard Worker /************************************************************************
2482*7c568831SAndroid Build Coastguard Worker * *
2483*7c568831SAndroid Build Coastguard Worker * SGML Catalog handling *
2484*7c568831SAndroid Build Coastguard Worker * *
2485*7c568831SAndroid Build Coastguard Worker ************************************************************************/
2486*7c568831SAndroid Build Coastguard Worker
2487*7c568831SAndroid Build Coastguard Worker /**
2488*7c568831SAndroid Build Coastguard Worker * xmlCatalogGetSGMLPublic:
2489*7c568831SAndroid Build Coastguard Worker * @catal: an SGML catalog hash
2490*7c568831SAndroid Build Coastguard Worker * @pubID: the public ID string
2491*7c568831SAndroid Build Coastguard Worker *
2492*7c568831SAndroid Build Coastguard Worker * Try to lookup the catalog local reference associated to a public ID
2493*7c568831SAndroid Build Coastguard Worker *
2494*7c568831SAndroid Build Coastguard Worker * Returns the local resource if found or NULL otherwise.
2495*7c568831SAndroid Build Coastguard Worker */
2496*7c568831SAndroid Build Coastguard Worker static const xmlChar *
xmlCatalogGetSGMLPublic(xmlHashTablePtr catal,const xmlChar * pubID)2497*7c568831SAndroid Build Coastguard Worker xmlCatalogGetSGMLPublic(xmlHashTablePtr catal, const xmlChar *pubID) {
2498*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr entry;
2499*7c568831SAndroid Build Coastguard Worker xmlChar *normid;
2500*7c568831SAndroid Build Coastguard Worker
2501*7c568831SAndroid Build Coastguard Worker if (catal == NULL)
2502*7c568831SAndroid Build Coastguard Worker return(NULL);
2503*7c568831SAndroid Build Coastguard Worker
2504*7c568831SAndroid Build Coastguard Worker normid = xmlCatalogNormalizePublic(pubID);
2505*7c568831SAndroid Build Coastguard Worker if (normid != NULL)
2506*7c568831SAndroid Build Coastguard Worker pubID = (*normid != 0 ? normid : NULL);
2507*7c568831SAndroid Build Coastguard Worker
2508*7c568831SAndroid Build Coastguard Worker entry = (xmlCatalogEntryPtr) xmlHashLookup(catal, pubID);
2509*7c568831SAndroid Build Coastguard Worker if (entry == NULL) {
2510*7c568831SAndroid Build Coastguard Worker if (normid != NULL)
2511*7c568831SAndroid Build Coastguard Worker xmlFree(normid);
2512*7c568831SAndroid Build Coastguard Worker return(NULL);
2513*7c568831SAndroid Build Coastguard Worker }
2514*7c568831SAndroid Build Coastguard Worker if (entry->type == SGML_CATA_PUBLIC) {
2515*7c568831SAndroid Build Coastguard Worker if (normid != NULL)
2516*7c568831SAndroid Build Coastguard Worker xmlFree(normid);
2517*7c568831SAndroid Build Coastguard Worker return(entry->URL);
2518*7c568831SAndroid Build Coastguard Worker }
2519*7c568831SAndroid Build Coastguard Worker if (normid != NULL)
2520*7c568831SAndroid Build Coastguard Worker xmlFree(normid);
2521*7c568831SAndroid Build Coastguard Worker return(NULL);
2522*7c568831SAndroid Build Coastguard Worker }
2523*7c568831SAndroid Build Coastguard Worker
2524*7c568831SAndroid Build Coastguard Worker /**
2525*7c568831SAndroid Build Coastguard Worker * xmlCatalogGetSGMLSystem:
2526*7c568831SAndroid Build Coastguard Worker * @catal: an SGML catalog hash
2527*7c568831SAndroid Build Coastguard Worker * @sysID: the system ID string
2528*7c568831SAndroid Build Coastguard Worker *
2529*7c568831SAndroid Build Coastguard Worker * Try to lookup the catalog local reference for a system ID
2530*7c568831SAndroid Build Coastguard Worker *
2531*7c568831SAndroid Build Coastguard Worker * Returns the local resource if found or NULL otherwise.
2532*7c568831SAndroid Build Coastguard Worker */
2533*7c568831SAndroid Build Coastguard Worker static const xmlChar *
xmlCatalogGetSGMLSystem(xmlHashTablePtr catal,const xmlChar * sysID)2534*7c568831SAndroid Build Coastguard Worker xmlCatalogGetSGMLSystem(xmlHashTablePtr catal, const xmlChar *sysID) {
2535*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr entry;
2536*7c568831SAndroid Build Coastguard Worker
2537*7c568831SAndroid Build Coastguard Worker if (catal == NULL)
2538*7c568831SAndroid Build Coastguard Worker return(NULL);
2539*7c568831SAndroid Build Coastguard Worker
2540*7c568831SAndroid Build Coastguard Worker entry = (xmlCatalogEntryPtr) xmlHashLookup(catal, sysID);
2541*7c568831SAndroid Build Coastguard Worker if (entry == NULL)
2542*7c568831SAndroid Build Coastguard Worker return(NULL);
2543*7c568831SAndroid Build Coastguard Worker if (entry->type == SGML_CATA_SYSTEM)
2544*7c568831SAndroid Build Coastguard Worker return(entry->URL);
2545*7c568831SAndroid Build Coastguard Worker return(NULL);
2546*7c568831SAndroid Build Coastguard Worker }
2547*7c568831SAndroid Build Coastguard Worker
2548*7c568831SAndroid Build Coastguard Worker /**
2549*7c568831SAndroid Build Coastguard Worker * xmlCatalogSGMLResolve:
2550*7c568831SAndroid Build Coastguard Worker * @catal: the SGML catalog
2551*7c568831SAndroid Build Coastguard Worker * @pubID: the public ID string
2552*7c568831SAndroid Build Coastguard Worker * @sysID: the system ID string
2553*7c568831SAndroid Build Coastguard Worker *
2554*7c568831SAndroid Build Coastguard Worker * Do a complete resolution lookup of an External Identifier
2555*7c568831SAndroid Build Coastguard Worker *
2556*7c568831SAndroid Build Coastguard Worker * Returns the URI of the resource or NULL if not found
2557*7c568831SAndroid Build Coastguard Worker */
2558*7c568831SAndroid Build Coastguard Worker static const xmlChar *
xmlCatalogSGMLResolve(xmlCatalogPtr catal,const xmlChar * pubID,const xmlChar * sysID)2559*7c568831SAndroid Build Coastguard Worker xmlCatalogSGMLResolve(xmlCatalogPtr catal, const xmlChar *pubID,
2560*7c568831SAndroid Build Coastguard Worker const xmlChar *sysID) {
2561*7c568831SAndroid Build Coastguard Worker const xmlChar *ret = NULL;
2562*7c568831SAndroid Build Coastguard Worker
2563*7c568831SAndroid Build Coastguard Worker if (catal->sgml == NULL)
2564*7c568831SAndroid Build Coastguard Worker return(NULL);
2565*7c568831SAndroid Build Coastguard Worker
2566*7c568831SAndroid Build Coastguard Worker if (pubID != NULL)
2567*7c568831SAndroid Build Coastguard Worker ret = xmlCatalogGetSGMLPublic(catal->sgml, pubID);
2568*7c568831SAndroid Build Coastguard Worker if (ret != NULL)
2569*7c568831SAndroid Build Coastguard Worker return(ret);
2570*7c568831SAndroid Build Coastguard Worker if (sysID != NULL)
2571*7c568831SAndroid Build Coastguard Worker ret = xmlCatalogGetSGMLSystem(catal->sgml, sysID);
2572*7c568831SAndroid Build Coastguard Worker if (ret != NULL)
2573*7c568831SAndroid Build Coastguard Worker return(ret);
2574*7c568831SAndroid Build Coastguard Worker return(NULL);
2575*7c568831SAndroid Build Coastguard Worker }
2576*7c568831SAndroid Build Coastguard Worker
2577*7c568831SAndroid Build Coastguard Worker /************************************************************************
2578*7c568831SAndroid Build Coastguard Worker * *
2579*7c568831SAndroid Build Coastguard Worker * Specific Public interfaces *
2580*7c568831SAndroid Build Coastguard Worker * *
2581*7c568831SAndroid Build Coastguard Worker ************************************************************************/
2582*7c568831SAndroid Build Coastguard Worker
2583*7c568831SAndroid Build Coastguard Worker /**
2584*7c568831SAndroid Build Coastguard Worker * xmlLoadSGMLSuperCatalog:
2585*7c568831SAndroid Build Coastguard Worker * @filename: a file path
2586*7c568831SAndroid Build Coastguard Worker *
2587*7c568831SAndroid Build Coastguard Worker * Load an SGML super catalog. It won't expand CATALOG or DELEGATE
2588*7c568831SAndroid Build Coastguard Worker * references. This is only needed for manipulating SGML Super Catalogs
2589*7c568831SAndroid Build Coastguard Worker * like adding and removing CATALOG or DELEGATE entries.
2590*7c568831SAndroid Build Coastguard Worker *
2591*7c568831SAndroid Build Coastguard Worker * Returns the catalog parsed or NULL in case of error
2592*7c568831SAndroid Build Coastguard Worker */
2593*7c568831SAndroid Build Coastguard Worker xmlCatalogPtr
xmlLoadSGMLSuperCatalog(const char * filename)2594*7c568831SAndroid Build Coastguard Worker xmlLoadSGMLSuperCatalog(const char *filename)
2595*7c568831SAndroid Build Coastguard Worker {
2596*7c568831SAndroid Build Coastguard Worker xmlChar *content;
2597*7c568831SAndroid Build Coastguard Worker xmlCatalogPtr catal;
2598*7c568831SAndroid Build Coastguard Worker int ret;
2599*7c568831SAndroid Build Coastguard Worker
2600*7c568831SAndroid Build Coastguard Worker content = xmlLoadFileContent(filename);
2601*7c568831SAndroid Build Coastguard Worker if (content == NULL)
2602*7c568831SAndroid Build Coastguard Worker return(NULL);
2603*7c568831SAndroid Build Coastguard Worker
2604*7c568831SAndroid Build Coastguard Worker catal = xmlCreateNewCatalog(XML_SGML_CATALOG_TYPE, xmlCatalogDefaultPrefer);
2605*7c568831SAndroid Build Coastguard Worker if (catal == NULL) {
2606*7c568831SAndroid Build Coastguard Worker xmlFree(content);
2607*7c568831SAndroid Build Coastguard Worker return(NULL);
2608*7c568831SAndroid Build Coastguard Worker }
2609*7c568831SAndroid Build Coastguard Worker
2610*7c568831SAndroid Build Coastguard Worker ret = xmlParseSGMLCatalog(catal, content, filename, 1);
2611*7c568831SAndroid Build Coastguard Worker xmlFree(content);
2612*7c568831SAndroid Build Coastguard Worker if (ret < 0) {
2613*7c568831SAndroid Build Coastguard Worker xmlFreeCatalog(catal);
2614*7c568831SAndroid Build Coastguard Worker return(NULL);
2615*7c568831SAndroid Build Coastguard Worker }
2616*7c568831SAndroid Build Coastguard Worker return (catal);
2617*7c568831SAndroid Build Coastguard Worker }
2618*7c568831SAndroid Build Coastguard Worker
2619*7c568831SAndroid Build Coastguard Worker /**
2620*7c568831SAndroid Build Coastguard Worker * xmlLoadACatalog:
2621*7c568831SAndroid Build Coastguard Worker * @filename: a file path
2622*7c568831SAndroid Build Coastguard Worker *
2623*7c568831SAndroid Build Coastguard Worker * Load the catalog and build the associated data structures.
2624*7c568831SAndroid Build Coastguard Worker * This can be either an XML Catalog or an SGML Catalog
2625*7c568831SAndroid Build Coastguard Worker * It will recurse in SGML CATALOG entries. On the other hand XML
2626*7c568831SAndroid Build Coastguard Worker * Catalogs are not handled recursively.
2627*7c568831SAndroid Build Coastguard Worker *
2628*7c568831SAndroid Build Coastguard Worker * Returns the catalog parsed or NULL in case of error
2629*7c568831SAndroid Build Coastguard Worker */
2630*7c568831SAndroid Build Coastguard Worker xmlCatalogPtr
xmlLoadACatalog(const char * filename)2631*7c568831SAndroid Build Coastguard Worker xmlLoadACatalog(const char *filename)
2632*7c568831SAndroid Build Coastguard Worker {
2633*7c568831SAndroid Build Coastguard Worker xmlChar *content;
2634*7c568831SAndroid Build Coastguard Worker xmlChar *first;
2635*7c568831SAndroid Build Coastguard Worker xmlCatalogPtr catal;
2636*7c568831SAndroid Build Coastguard Worker int ret;
2637*7c568831SAndroid Build Coastguard Worker
2638*7c568831SAndroid Build Coastguard Worker content = xmlLoadFileContent(filename);
2639*7c568831SAndroid Build Coastguard Worker if (content == NULL)
2640*7c568831SAndroid Build Coastguard Worker return(NULL);
2641*7c568831SAndroid Build Coastguard Worker
2642*7c568831SAndroid Build Coastguard Worker
2643*7c568831SAndroid Build Coastguard Worker first = content;
2644*7c568831SAndroid Build Coastguard Worker
2645*7c568831SAndroid Build Coastguard Worker while ((*first != 0) && (*first != '-') && (*first != '<') &&
2646*7c568831SAndroid Build Coastguard Worker (!(((*first >= 'A') && (*first <= 'Z')) ||
2647*7c568831SAndroid Build Coastguard Worker ((*first >= 'a') && (*first <= 'z')))))
2648*7c568831SAndroid Build Coastguard Worker first++;
2649*7c568831SAndroid Build Coastguard Worker
2650*7c568831SAndroid Build Coastguard Worker if (*first != '<') {
2651*7c568831SAndroid Build Coastguard Worker catal = xmlCreateNewCatalog(XML_SGML_CATALOG_TYPE, xmlCatalogDefaultPrefer);
2652*7c568831SAndroid Build Coastguard Worker if (catal == NULL) {
2653*7c568831SAndroid Build Coastguard Worker xmlFree(content);
2654*7c568831SAndroid Build Coastguard Worker return(NULL);
2655*7c568831SAndroid Build Coastguard Worker }
2656*7c568831SAndroid Build Coastguard Worker ret = xmlParseSGMLCatalog(catal, content, filename, 0);
2657*7c568831SAndroid Build Coastguard Worker if (ret < 0) {
2658*7c568831SAndroid Build Coastguard Worker xmlFreeCatalog(catal);
2659*7c568831SAndroid Build Coastguard Worker xmlFree(content);
2660*7c568831SAndroid Build Coastguard Worker return(NULL);
2661*7c568831SAndroid Build Coastguard Worker }
2662*7c568831SAndroid Build Coastguard Worker } else {
2663*7c568831SAndroid Build Coastguard Worker catal = xmlCreateNewCatalog(XML_XML_CATALOG_TYPE, xmlCatalogDefaultPrefer);
2664*7c568831SAndroid Build Coastguard Worker if (catal == NULL) {
2665*7c568831SAndroid Build Coastguard Worker xmlFree(content);
2666*7c568831SAndroid Build Coastguard Worker return(NULL);
2667*7c568831SAndroid Build Coastguard Worker }
2668*7c568831SAndroid Build Coastguard Worker catal->xml = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL,
2669*7c568831SAndroid Build Coastguard Worker NULL, BAD_CAST filename, xmlCatalogDefaultPrefer, NULL);
2670*7c568831SAndroid Build Coastguard Worker }
2671*7c568831SAndroid Build Coastguard Worker xmlFree(content);
2672*7c568831SAndroid Build Coastguard Worker return (catal);
2673*7c568831SAndroid Build Coastguard Worker }
2674*7c568831SAndroid Build Coastguard Worker
2675*7c568831SAndroid Build Coastguard Worker /**
2676*7c568831SAndroid Build Coastguard Worker * xmlExpandCatalog:
2677*7c568831SAndroid Build Coastguard Worker * @catal: a catalog
2678*7c568831SAndroid Build Coastguard Worker * @filename: a file path
2679*7c568831SAndroid Build Coastguard Worker *
2680*7c568831SAndroid Build Coastguard Worker * Load the catalog and expand the existing catal structure.
2681*7c568831SAndroid Build Coastguard Worker * This can be either an XML Catalog or an SGML Catalog
2682*7c568831SAndroid Build Coastguard Worker *
2683*7c568831SAndroid Build Coastguard Worker * Returns 0 in case of success, -1 in case of error
2684*7c568831SAndroid Build Coastguard Worker */
2685*7c568831SAndroid Build Coastguard Worker static int
xmlExpandCatalog(xmlCatalogPtr catal,const char * filename)2686*7c568831SAndroid Build Coastguard Worker xmlExpandCatalog(xmlCatalogPtr catal, const char *filename)
2687*7c568831SAndroid Build Coastguard Worker {
2688*7c568831SAndroid Build Coastguard Worker int ret;
2689*7c568831SAndroid Build Coastguard Worker
2690*7c568831SAndroid Build Coastguard Worker if ((catal == NULL) || (filename == NULL))
2691*7c568831SAndroid Build Coastguard Worker return(-1);
2692*7c568831SAndroid Build Coastguard Worker
2693*7c568831SAndroid Build Coastguard Worker
2694*7c568831SAndroid Build Coastguard Worker if (catal->type == XML_SGML_CATALOG_TYPE) {
2695*7c568831SAndroid Build Coastguard Worker xmlChar *content;
2696*7c568831SAndroid Build Coastguard Worker
2697*7c568831SAndroid Build Coastguard Worker content = xmlLoadFileContent(filename);
2698*7c568831SAndroid Build Coastguard Worker if (content == NULL)
2699*7c568831SAndroid Build Coastguard Worker return(-1);
2700*7c568831SAndroid Build Coastguard Worker
2701*7c568831SAndroid Build Coastguard Worker ret = xmlParseSGMLCatalog(catal, content, filename, 0);
2702*7c568831SAndroid Build Coastguard Worker if (ret < 0) {
2703*7c568831SAndroid Build Coastguard Worker xmlFree(content);
2704*7c568831SAndroid Build Coastguard Worker return(-1);
2705*7c568831SAndroid Build Coastguard Worker }
2706*7c568831SAndroid Build Coastguard Worker xmlFree(content);
2707*7c568831SAndroid Build Coastguard Worker } else {
2708*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr tmp, cur;
2709*7c568831SAndroid Build Coastguard Worker tmp = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL,
2710*7c568831SAndroid Build Coastguard Worker NULL, BAD_CAST filename, xmlCatalogDefaultPrefer, NULL);
2711*7c568831SAndroid Build Coastguard Worker
2712*7c568831SAndroid Build Coastguard Worker cur = catal->xml;
2713*7c568831SAndroid Build Coastguard Worker if (cur == NULL) {
2714*7c568831SAndroid Build Coastguard Worker catal->xml = tmp;
2715*7c568831SAndroid Build Coastguard Worker } else {
2716*7c568831SAndroid Build Coastguard Worker while (cur->next != NULL) cur = cur->next;
2717*7c568831SAndroid Build Coastguard Worker cur->next = tmp;
2718*7c568831SAndroid Build Coastguard Worker }
2719*7c568831SAndroid Build Coastguard Worker }
2720*7c568831SAndroid Build Coastguard Worker return (0);
2721*7c568831SAndroid Build Coastguard Worker }
2722*7c568831SAndroid Build Coastguard Worker
2723*7c568831SAndroid Build Coastguard Worker /**
2724*7c568831SAndroid Build Coastguard Worker * xmlACatalogResolveSystem:
2725*7c568831SAndroid Build Coastguard Worker * @catal: a Catalog
2726*7c568831SAndroid Build Coastguard Worker * @sysID: the system ID string
2727*7c568831SAndroid Build Coastguard Worker *
2728*7c568831SAndroid Build Coastguard Worker * Try to lookup the catalog resource for a system ID
2729*7c568831SAndroid Build Coastguard Worker *
2730*7c568831SAndroid Build Coastguard Worker * Returns the resource if found or NULL otherwise, the value returned
2731*7c568831SAndroid Build Coastguard Worker * must be freed by the caller.
2732*7c568831SAndroid Build Coastguard Worker */
2733*7c568831SAndroid Build Coastguard Worker xmlChar *
xmlACatalogResolveSystem(xmlCatalogPtr catal,const xmlChar * sysID)2734*7c568831SAndroid Build Coastguard Worker xmlACatalogResolveSystem(xmlCatalogPtr catal, const xmlChar *sysID) {
2735*7c568831SAndroid Build Coastguard Worker xmlChar *ret = NULL;
2736*7c568831SAndroid Build Coastguard Worker
2737*7c568831SAndroid Build Coastguard Worker if ((sysID == NULL) || (catal == NULL))
2738*7c568831SAndroid Build Coastguard Worker return(NULL);
2739*7c568831SAndroid Build Coastguard Worker
2740*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs)
2741*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
2742*7c568831SAndroid Build Coastguard Worker "Resolve sysID %s\n", sysID);
2743*7c568831SAndroid Build Coastguard Worker
2744*7c568831SAndroid Build Coastguard Worker if (catal->type == XML_XML_CATALOG_TYPE) {
2745*7c568831SAndroid Build Coastguard Worker ret = xmlCatalogListXMLResolve(catal->xml, NULL, sysID);
2746*7c568831SAndroid Build Coastguard Worker if (ret == XML_CATAL_BREAK)
2747*7c568831SAndroid Build Coastguard Worker ret = NULL;
2748*7c568831SAndroid Build Coastguard Worker } else {
2749*7c568831SAndroid Build Coastguard Worker const xmlChar *sgml;
2750*7c568831SAndroid Build Coastguard Worker
2751*7c568831SAndroid Build Coastguard Worker sgml = xmlCatalogGetSGMLSystem(catal->sgml, sysID);
2752*7c568831SAndroid Build Coastguard Worker if (sgml != NULL)
2753*7c568831SAndroid Build Coastguard Worker ret = xmlStrdup(sgml);
2754*7c568831SAndroid Build Coastguard Worker }
2755*7c568831SAndroid Build Coastguard Worker return(ret);
2756*7c568831SAndroid Build Coastguard Worker }
2757*7c568831SAndroid Build Coastguard Worker
2758*7c568831SAndroid Build Coastguard Worker /**
2759*7c568831SAndroid Build Coastguard Worker * xmlACatalogResolvePublic:
2760*7c568831SAndroid Build Coastguard Worker * @catal: a Catalog
2761*7c568831SAndroid Build Coastguard Worker * @pubID: the public ID string
2762*7c568831SAndroid Build Coastguard Worker *
2763*7c568831SAndroid Build Coastguard Worker * Try to lookup the catalog local reference associated to a public ID in that catalog
2764*7c568831SAndroid Build Coastguard Worker *
2765*7c568831SAndroid Build Coastguard Worker * Returns the local resource if found or NULL otherwise, the value returned
2766*7c568831SAndroid Build Coastguard Worker * must be freed by the caller.
2767*7c568831SAndroid Build Coastguard Worker */
2768*7c568831SAndroid Build Coastguard Worker xmlChar *
xmlACatalogResolvePublic(xmlCatalogPtr catal,const xmlChar * pubID)2769*7c568831SAndroid Build Coastguard Worker xmlACatalogResolvePublic(xmlCatalogPtr catal, const xmlChar *pubID) {
2770*7c568831SAndroid Build Coastguard Worker xmlChar *ret = NULL;
2771*7c568831SAndroid Build Coastguard Worker
2772*7c568831SAndroid Build Coastguard Worker if ((pubID == NULL) || (catal == NULL))
2773*7c568831SAndroid Build Coastguard Worker return(NULL);
2774*7c568831SAndroid Build Coastguard Worker
2775*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs)
2776*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
2777*7c568831SAndroid Build Coastguard Worker "Resolve pubID %s\n", pubID);
2778*7c568831SAndroid Build Coastguard Worker
2779*7c568831SAndroid Build Coastguard Worker if (catal->type == XML_XML_CATALOG_TYPE) {
2780*7c568831SAndroid Build Coastguard Worker ret = xmlCatalogListXMLResolve(catal->xml, pubID, NULL);
2781*7c568831SAndroid Build Coastguard Worker if (ret == XML_CATAL_BREAK)
2782*7c568831SAndroid Build Coastguard Worker ret = NULL;
2783*7c568831SAndroid Build Coastguard Worker } else {
2784*7c568831SAndroid Build Coastguard Worker const xmlChar *sgml;
2785*7c568831SAndroid Build Coastguard Worker
2786*7c568831SAndroid Build Coastguard Worker sgml = xmlCatalogGetSGMLPublic(catal->sgml, pubID);
2787*7c568831SAndroid Build Coastguard Worker if (sgml != NULL)
2788*7c568831SAndroid Build Coastguard Worker ret = xmlStrdup(sgml);
2789*7c568831SAndroid Build Coastguard Worker }
2790*7c568831SAndroid Build Coastguard Worker return(ret);
2791*7c568831SAndroid Build Coastguard Worker }
2792*7c568831SAndroid Build Coastguard Worker
2793*7c568831SAndroid Build Coastguard Worker /**
2794*7c568831SAndroid Build Coastguard Worker * xmlACatalogResolve:
2795*7c568831SAndroid Build Coastguard Worker * @catal: a Catalog
2796*7c568831SAndroid Build Coastguard Worker * @pubID: the public ID string
2797*7c568831SAndroid Build Coastguard Worker * @sysID: the system ID string
2798*7c568831SAndroid Build Coastguard Worker *
2799*7c568831SAndroid Build Coastguard Worker * Do a complete resolution lookup of an External Identifier
2800*7c568831SAndroid Build Coastguard Worker *
2801*7c568831SAndroid Build Coastguard Worker * Returns the URI of the resource or NULL if not found, it must be freed
2802*7c568831SAndroid Build Coastguard Worker * by the caller.
2803*7c568831SAndroid Build Coastguard Worker */
2804*7c568831SAndroid Build Coastguard Worker xmlChar *
xmlACatalogResolve(xmlCatalogPtr catal,const xmlChar * pubID,const xmlChar * sysID)2805*7c568831SAndroid Build Coastguard Worker xmlACatalogResolve(xmlCatalogPtr catal, const xmlChar * pubID,
2806*7c568831SAndroid Build Coastguard Worker const xmlChar * sysID)
2807*7c568831SAndroid Build Coastguard Worker {
2808*7c568831SAndroid Build Coastguard Worker xmlChar *ret = NULL;
2809*7c568831SAndroid Build Coastguard Worker
2810*7c568831SAndroid Build Coastguard Worker if (((pubID == NULL) && (sysID == NULL)) || (catal == NULL))
2811*7c568831SAndroid Build Coastguard Worker return (NULL);
2812*7c568831SAndroid Build Coastguard Worker
2813*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs) {
2814*7c568831SAndroid Build Coastguard Worker if ((pubID != NULL) && (sysID != NULL)) {
2815*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
2816*7c568831SAndroid Build Coastguard Worker "Resolve: pubID %s sysID %s\n", pubID, sysID);
2817*7c568831SAndroid Build Coastguard Worker } else if (pubID != NULL) {
2818*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
2819*7c568831SAndroid Build Coastguard Worker "Resolve: pubID %s\n", pubID);
2820*7c568831SAndroid Build Coastguard Worker } else {
2821*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
2822*7c568831SAndroid Build Coastguard Worker "Resolve: sysID %s\n", sysID);
2823*7c568831SAndroid Build Coastguard Worker }
2824*7c568831SAndroid Build Coastguard Worker }
2825*7c568831SAndroid Build Coastguard Worker
2826*7c568831SAndroid Build Coastguard Worker if (catal->type == XML_XML_CATALOG_TYPE) {
2827*7c568831SAndroid Build Coastguard Worker ret = xmlCatalogListXMLResolve(catal->xml, pubID, sysID);
2828*7c568831SAndroid Build Coastguard Worker if (ret == XML_CATAL_BREAK)
2829*7c568831SAndroid Build Coastguard Worker ret = NULL;
2830*7c568831SAndroid Build Coastguard Worker } else {
2831*7c568831SAndroid Build Coastguard Worker const xmlChar *sgml;
2832*7c568831SAndroid Build Coastguard Worker
2833*7c568831SAndroid Build Coastguard Worker sgml = xmlCatalogSGMLResolve(catal, pubID, sysID);
2834*7c568831SAndroid Build Coastguard Worker if (sgml != NULL)
2835*7c568831SAndroid Build Coastguard Worker ret = xmlStrdup(sgml);
2836*7c568831SAndroid Build Coastguard Worker }
2837*7c568831SAndroid Build Coastguard Worker return (ret);
2838*7c568831SAndroid Build Coastguard Worker }
2839*7c568831SAndroid Build Coastguard Worker
2840*7c568831SAndroid Build Coastguard Worker /**
2841*7c568831SAndroid Build Coastguard Worker * xmlACatalogResolveURI:
2842*7c568831SAndroid Build Coastguard Worker * @catal: a Catalog
2843*7c568831SAndroid Build Coastguard Worker * @URI: the URI
2844*7c568831SAndroid Build Coastguard Worker *
2845*7c568831SAndroid Build Coastguard Worker * Do a complete resolution lookup of an URI
2846*7c568831SAndroid Build Coastguard Worker *
2847*7c568831SAndroid Build Coastguard Worker * Returns the URI of the resource or NULL if not found, it must be freed
2848*7c568831SAndroid Build Coastguard Worker * by the caller.
2849*7c568831SAndroid Build Coastguard Worker */
2850*7c568831SAndroid Build Coastguard Worker xmlChar *
xmlACatalogResolveURI(xmlCatalogPtr catal,const xmlChar * URI)2851*7c568831SAndroid Build Coastguard Worker xmlACatalogResolveURI(xmlCatalogPtr catal, const xmlChar *URI) {
2852*7c568831SAndroid Build Coastguard Worker xmlChar *ret = NULL;
2853*7c568831SAndroid Build Coastguard Worker
2854*7c568831SAndroid Build Coastguard Worker if ((URI == NULL) || (catal == NULL))
2855*7c568831SAndroid Build Coastguard Worker return(NULL);
2856*7c568831SAndroid Build Coastguard Worker
2857*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs)
2858*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
2859*7c568831SAndroid Build Coastguard Worker "Resolve URI %s\n", URI);
2860*7c568831SAndroid Build Coastguard Worker
2861*7c568831SAndroid Build Coastguard Worker if (catal->type == XML_XML_CATALOG_TYPE) {
2862*7c568831SAndroid Build Coastguard Worker ret = xmlCatalogListXMLResolveURI(catal->xml, URI);
2863*7c568831SAndroid Build Coastguard Worker if (ret == XML_CATAL_BREAK)
2864*7c568831SAndroid Build Coastguard Worker ret = NULL;
2865*7c568831SAndroid Build Coastguard Worker } else {
2866*7c568831SAndroid Build Coastguard Worker const xmlChar *sgml;
2867*7c568831SAndroid Build Coastguard Worker
2868*7c568831SAndroid Build Coastguard Worker sgml = xmlCatalogSGMLResolve(catal, NULL, URI);
2869*7c568831SAndroid Build Coastguard Worker if (sgml != NULL)
2870*7c568831SAndroid Build Coastguard Worker ret = xmlStrdup(sgml);
2871*7c568831SAndroid Build Coastguard Worker }
2872*7c568831SAndroid Build Coastguard Worker return(ret);
2873*7c568831SAndroid Build Coastguard Worker }
2874*7c568831SAndroid Build Coastguard Worker
2875*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
2876*7c568831SAndroid Build Coastguard Worker /**
2877*7c568831SAndroid Build Coastguard Worker * xmlACatalogDump:
2878*7c568831SAndroid Build Coastguard Worker * @catal: a Catalog
2879*7c568831SAndroid Build Coastguard Worker * @out: the file.
2880*7c568831SAndroid Build Coastguard Worker *
2881*7c568831SAndroid Build Coastguard Worker * Dump the given catalog to the given file.
2882*7c568831SAndroid Build Coastguard Worker */
2883*7c568831SAndroid Build Coastguard Worker void
xmlACatalogDump(xmlCatalogPtr catal,FILE * out)2884*7c568831SAndroid Build Coastguard Worker xmlACatalogDump(xmlCatalogPtr catal, FILE *out) {
2885*7c568831SAndroid Build Coastguard Worker if ((out == NULL) || (catal == NULL))
2886*7c568831SAndroid Build Coastguard Worker return;
2887*7c568831SAndroid Build Coastguard Worker
2888*7c568831SAndroid Build Coastguard Worker if (catal->type == XML_XML_CATALOG_TYPE) {
2889*7c568831SAndroid Build Coastguard Worker xmlDumpXMLCatalog(out, catal->xml);
2890*7c568831SAndroid Build Coastguard Worker } else {
2891*7c568831SAndroid Build Coastguard Worker xmlHashScan(catal->sgml, xmlCatalogDumpEntry, out);
2892*7c568831SAndroid Build Coastguard Worker }
2893*7c568831SAndroid Build Coastguard Worker }
2894*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_OUTPUT_ENABLED */
2895*7c568831SAndroid Build Coastguard Worker
2896*7c568831SAndroid Build Coastguard Worker /**
2897*7c568831SAndroid Build Coastguard Worker * xmlACatalogAdd:
2898*7c568831SAndroid Build Coastguard Worker * @catal: a Catalog
2899*7c568831SAndroid Build Coastguard Worker * @type: the type of record to add to the catalog
2900*7c568831SAndroid Build Coastguard Worker * @orig: the system, public or prefix to match
2901*7c568831SAndroid Build Coastguard Worker * @replace: the replacement value for the match
2902*7c568831SAndroid Build Coastguard Worker *
2903*7c568831SAndroid Build Coastguard Worker * Add an entry in the catalog, it may overwrite existing but
2904*7c568831SAndroid Build Coastguard Worker * different entries.
2905*7c568831SAndroid Build Coastguard Worker *
2906*7c568831SAndroid Build Coastguard Worker * Returns 0 if successful, -1 otherwise
2907*7c568831SAndroid Build Coastguard Worker */
2908*7c568831SAndroid Build Coastguard Worker int
xmlACatalogAdd(xmlCatalogPtr catal,const xmlChar * type,const xmlChar * orig,const xmlChar * replace)2909*7c568831SAndroid Build Coastguard Worker xmlACatalogAdd(xmlCatalogPtr catal, const xmlChar * type,
2910*7c568831SAndroid Build Coastguard Worker const xmlChar * orig, const xmlChar * replace)
2911*7c568831SAndroid Build Coastguard Worker {
2912*7c568831SAndroid Build Coastguard Worker int res = -1;
2913*7c568831SAndroid Build Coastguard Worker
2914*7c568831SAndroid Build Coastguard Worker if (catal == NULL)
2915*7c568831SAndroid Build Coastguard Worker return(-1);
2916*7c568831SAndroid Build Coastguard Worker
2917*7c568831SAndroid Build Coastguard Worker if (catal->type == XML_XML_CATALOG_TYPE) {
2918*7c568831SAndroid Build Coastguard Worker res = xmlAddXMLCatalog(catal->xml, type, orig, replace);
2919*7c568831SAndroid Build Coastguard Worker } else {
2920*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryType cattype;
2921*7c568831SAndroid Build Coastguard Worker
2922*7c568831SAndroid Build Coastguard Worker cattype = xmlGetSGMLCatalogEntryType(type);
2923*7c568831SAndroid Build Coastguard Worker if (cattype != XML_CATA_NONE) {
2924*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr entry;
2925*7c568831SAndroid Build Coastguard Worker
2926*7c568831SAndroid Build Coastguard Worker entry = xmlNewCatalogEntry(cattype, orig, replace, NULL,
2927*7c568831SAndroid Build Coastguard Worker XML_CATA_PREFER_NONE, NULL);
2928*7c568831SAndroid Build Coastguard Worker if (catal->sgml == NULL)
2929*7c568831SAndroid Build Coastguard Worker catal->sgml = xmlHashCreate(10);
2930*7c568831SAndroid Build Coastguard Worker res = xmlHashAddEntry(catal->sgml, orig, entry);
2931*7c568831SAndroid Build Coastguard Worker if (res < 0)
2932*7c568831SAndroid Build Coastguard Worker xmlFreeCatalogEntry(entry, NULL);
2933*7c568831SAndroid Build Coastguard Worker }
2934*7c568831SAndroid Build Coastguard Worker }
2935*7c568831SAndroid Build Coastguard Worker return (res);
2936*7c568831SAndroid Build Coastguard Worker }
2937*7c568831SAndroid Build Coastguard Worker
2938*7c568831SAndroid Build Coastguard Worker /**
2939*7c568831SAndroid Build Coastguard Worker * xmlACatalogRemove:
2940*7c568831SAndroid Build Coastguard Worker * @catal: a Catalog
2941*7c568831SAndroid Build Coastguard Worker * @value: the value to remove
2942*7c568831SAndroid Build Coastguard Worker *
2943*7c568831SAndroid Build Coastguard Worker * Remove an entry from the catalog
2944*7c568831SAndroid Build Coastguard Worker *
2945*7c568831SAndroid Build Coastguard Worker * Returns the number of entries removed if successful, -1 otherwise
2946*7c568831SAndroid Build Coastguard Worker */
2947*7c568831SAndroid Build Coastguard Worker int
xmlACatalogRemove(xmlCatalogPtr catal,const xmlChar * value)2948*7c568831SAndroid Build Coastguard Worker xmlACatalogRemove(xmlCatalogPtr catal, const xmlChar *value) {
2949*7c568831SAndroid Build Coastguard Worker int res = -1;
2950*7c568831SAndroid Build Coastguard Worker
2951*7c568831SAndroid Build Coastguard Worker if ((catal == NULL) || (value == NULL))
2952*7c568831SAndroid Build Coastguard Worker return(-1);
2953*7c568831SAndroid Build Coastguard Worker
2954*7c568831SAndroid Build Coastguard Worker if (catal->type == XML_XML_CATALOG_TYPE) {
2955*7c568831SAndroid Build Coastguard Worker res = xmlDelXMLCatalog(catal->xml, value);
2956*7c568831SAndroid Build Coastguard Worker } else {
2957*7c568831SAndroid Build Coastguard Worker res = xmlHashRemoveEntry(catal->sgml, value, xmlFreeCatalogEntry);
2958*7c568831SAndroid Build Coastguard Worker if (res == 0)
2959*7c568831SAndroid Build Coastguard Worker res = 1;
2960*7c568831SAndroid Build Coastguard Worker }
2961*7c568831SAndroid Build Coastguard Worker return(res);
2962*7c568831SAndroid Build Coastguard Worker }
2963*7c568831SAndroid Build Coastguard Worker
2964*7c568831SAndroid Build Coastguard Worker /**
2965*7c568831SAndroid Build Coastguard Worker * xmlNewCatalog:
2966*7c568831SAndroid Build Coastguard Worker * @sgml: should this create an SGML catalog
2967*7c568831SAndroid Build Coastguard Worker *
2968*7c568831SAndroid Build Coastguard Worker * create a new Catalog.
2969*7c568831SAndroid Build Coastguard Worker *
2970*7c568831SAndroid Build Coastguard Worker * Returns the xmlCatalogPtr or NULL in case of error
2971*7c568831SAndroid Build Coastguard Worker */
2972*7c568831SAndroid Build Coastguard Worker xmlCatalogPtr
xmlNewCatalog(int sgml)2973*7c568831SAndroid Build Coastguard Worker xmlNewCatalog(int sgml) {
2974*7c568831SAndroid Build Coastguard Worker xmlCatalogPtr catal = NULL;
2975*7c568831SAndroid Build Coastguard Worker
2976*7c568831SAndroid Build Coastguard Worker if (sgml) {
2977*7c568831SAndroid Build Coastguard Worker catal = xmlCreateNewCatalog(XML_SGML_CATALOG_TYPE,
2978*7c568831SAndroid Build Coastguard Worker xmlCatalogDefaultPrefer);
2979*7c568831SAndroid Build Coastguard Worker if ((catal != NULL) && (catal->sgml == NULL))
2980*7c568831SAndroid Build Coastguard Worker catal->sgml = xmlHashCreate(10);
2981*7c568831SAndroid Build Coastguard Worker } else
2982*7c568831SAndroid Build Coastguard Worker catal = xmlCreateNewCatalog(XML_XML_CATALOG_TYPE,
2983*7c568831SAndroid Build Coastguard Worker xmlCatalogDefaultPrefer);
2984*7c568831SAndroid Build Coastguard Worker return(catal);
2985*7c568831SAndroid Build Coastguard Worker }
2986*7c568831SAndroid Build Coastguard Worker
2987*7c568831SAndroid Build Coastguard Worker /**
2988*7c568831SAndroid Build Coastguard Worker * xmlCatalogIsEmpty:
2989*7c568831SAndroid Build Coastguard Worker * @catal: should this create an SGML catalog
2990*7c568831SAndroid Build Coastguard Worker *
2991*7c568831SAndroid Build Coastguard Worker * Check is a catalog is empty
2992*7c568831SAndroid Build Coastguard Worker *
2993*7c568831SAndroid Build Coastguard Worker * Returns 1 if the catalog is empty, 0 if not, amd -1 in case of error.
2994*7c568831SAndroid Build Coastguard Worker */
2995*7c568831SAndroid Build Coastguard Worker int
xmlCatalogIsEmpty(xmlCatalogPtr catal)2996*7c568831SAndroid Build Coastguard Worker xmlCatalogIsEmpty(xmlCatalogPtr catal) {
2997*7c568831SAndroid Build Coastguard Worker if (catal == NULL)
2998*7c568831SAndroid Build Coastguard Worker return(-1);
2999*7c568831SAndroid Build Coastguard Worker
3000*7c568831SAndroid Build Coastguard Worker if (catal->type == XML_XML_CATALOG_TYPE) {
3001*7c568831SAndroid Build Coastguard Worker if (catal->xml == NULL)
3002*7c568831SAndroid Build Coastguard Worker return(1);
3003*7c568831SAndroid Build Coastguard Worker if ((catal->xml->type != XML_CATA_CATALOG) &&
3004*7c568831SAndroid Build Coastguard Worker (catal->xml->type != XML_CATA_BROKEN_CATALOG))
3005*7c568831SAndroid Build Coastguard Worker return(-1);
3006*7c568831SAndroid Build Coastguard Worker if (catal->xml->children == NULL)
3007*7c568831SAndroid Build Coastguard Worker return(1);
3008*7c568831SAndroid Build Coastguard Worker return(0);
3009*7c568831SAndroid Build Coastguard Worker } else {
3010*7c568831SAndroid Build Coastguard Worker int res;
3011*7c568831SAndroid Build Coastguard Worker
3012*7c568831SAndroid Build Coastguard Worker if (catal->sgml == NULL)
3013*7c568831SAndroid Build Coastguard Worker return(1);
3014*7c568831SAndroid Build Coastguard Worker res = xmlHashSize(catal->sgml);
3015*7c568831SAndroid Build Coastguard Worker if (res == 0)
3016*7c568831SAndroid Build Coastguard Worker return(1);
3017*7c568831SAndroid Build Coastguard Worker if (res < 0)
3018*7c568831SAndroid Build Coastguard Worker return(-1);
3019*7c568831SAndroid Build Coastguard Worker }
3020*7c568831SAndroid Build Coastguard Worker return(0);
3021*7c568831SAndroid Build Coastguard Worker }
3022*7c568831SAndroid Build Coastguard Worker
3023*7c568831SAndroid Build Coastguard Worker /************************************************************************
3024*7c568831SAndroid Build Coastguard Worker * *
3025*7c568831SAndroid Build Coastguard Worker * Public interfaces manipulating the global shared default catalog *
3026*7c568831SAndroid Build Coastguard Worker * *
3027*7c568831SAndroid Build Coastguard Worker ************************************************************************/
3028*7c568831SAndroid Build Coastguard Worker
3029*7c568831SAndroid Build Coastguard Worker /**
3030*7c568831SAndroid Build Coastguard Worker * xmlInitCatalogInternal:
3031*7c568831SAndroid Build Coastguard Worker *
3032*7c568831SAndroid Build Coastguard Worker * Do the catalog initialization only of global data, doesn't try to load
3033*7c568831SAndroid Build Coastguard Worker * any catalog actually.
3034*7c568831SAndroid Build Coastguard Worker */
3035*7c568831SAndroid Build Coastguard Worker void
xmlInitCatalogInternal(void)3036*7c568831SAndroid Build Coastguard Worker xmlInitCatalogInternal(void) {
3037*7c568831SAndroid Build Coastguard Worker if (getenv("XML_DEBUG_CATALOG"))
3038*7c568831SAndroid Build Coastguard Worker xmlDebugCatalogs = 1;
3039*7c568831SAndroid Build Coastguard Worker xmlInitRMutex(&xmlCatalogMutex);
3040*7c568831SAndroid Build Coastguard Worker }
3041*7c568831SAndroid Build Coastguard Worker
3042*7c568831SAndroid Build Coastguard Worker /**
3043*7c568831SAndroid Build Coastguard Worker * xmlInitializeCatalog:
3044*7c568831SAndroid Build Coastguard Worker *
3045*7c568831SAndroid Build Coastguard Worker * Load the default system catalog.
3046*7c568831SAndroid Build Coastguard Worker */
3047*7c568831SAndroid Build Coastguard Worker void
xmlInitializeCatalog(void)3048*7c568831SAndroid Build Coastguard Worker xmlInitializeCatalog(void) {
3049*7c568831SAndroid Build Coastguard Worker if (xmlCatalogInitialized != 0)
3050*7c568831SAndroid Build Coastguard Worker return;
3051*7c568831SAndroid Build Coastguard Worker
3052*7c568831SAndroid Build Coastguard Worker xmlInitParser();
3053*7c568831SAndroid Build Coastguard Worker
3054*7c568831SAndroid Build Coastguard Worker xmlRMutexLock(&xmlCatalogMutex);
3055*7c568831SAndroid Build Coastguard Worker
3056*7c568831SAndroid Build Coastguard Worker if (xmlDefaultCatalog == NULL) {
3057*7c568831SAndroid Build Coastguard Worker const char *catalogs;
3058*7c568831SAndroid Build Coastguard Worker char *path;
3059*7c568831SAndroid Build Coastguard Worker const char *cur, *paths;
3060*7c568831SAndroid Build Coastguard Worker xmlCatalogPtr catal;
3061*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr *nextent;
3062*7c568831SAndroid Build Coastguard Worker
3063*7c568831SAndroid Build Coastguard Worker catalogs = (const char *) getenv("XML_CATALOG_FILES");
3064*7c568831SAndroid Build Coastguard Worker if (catalogs == NULL)
3065*7c568831SAndroid Build Coastguard Worker catalogs = XML_XML_DEFAULT_CATALOG;
3066*7c568831SAndroid Build Coastguard Worker
3067*7c568831SAndroid Build Coastguard Worker catal = xmlCreateNewCatalog(XML_XML_CATALOG_TYPE,
3068*7c568831SAndroid Build Coastguard Worker xmlCatalogDefaultPrefer);
3069*7c568831SAndroid Build Coastguard Worker if (catal != NULL) {
3070*7c568831SAndroid Build Coastguard Worker /* the XML_CATALOG_FILES envvar is allowed to contain a
3071*7c568831SAndroid Build Coastguard Worker space-separated list of entries. */
3072*7c568831SAndroid Build Coastguard Worker cur = catalogs;
3073*7c568831SAndroid Build Coastguard Worker nextent = &catal->xml;
3074*7c568831SAndroid Build Coastguard Worker while (*cur != '\0') {
3075*7c568831SAndroid Build Coastguard Worker while (xmlIsBlank_ch(*cur))
3076*7c568831SAndroid Build Coastguard Worker cur++;
3077*7c568831SAndroid Build Coastguard Worker if (*cur != 0) {
3078*7c568831SAndroid Build Coastguard Worker paths = cur;
3079*7c568831SAndroid Build Coastguard Worker while ((*cur != 0) && (!xmlIsBlank_ch(*cur)))
3080*7c568831SAndroid Build Coastguard Worker cur++;
3081*7c568831SAndroid Build Coastguard Worker path = (char *) xmlStrndup((const xmlChar *)paths, cur - paths);
3082*7c568831SAndroid Build Coastguard Worker if (path != NULL) {
3083*7c568831SAndroid Build Coastguard Worker *nextent = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL,
3084*7c568831SAndroid Build Coastguard Worker NULL, BAD_CAST path, xmlCatalogDefaultPrefer, NULL);
3085*7c568831SAndroid Build Coastguard Worker if (*nextent != NULL)
3086*7c568831SAndroid Build Coastguard Worker nextent = &((*nextent)->next);
3087*7c568831SAndroid Build Coastguard Worker xmlFree(path);
3088*7c568831SAndroid Build Coastguard Worker }
3089*7c568831SAndroid Build Coastguard Worker }
3090*7c568831SAndroid Build Coastguard Worker }
3091*7c568831SAndroid Build Coastguard Worker xmlDefaultCatalog = catal;
3092*7c568831SAndroid Build Coastguard Worker }
3093*7c568831SAndroid Build Coastguard Worker }
3094*7c568831SAndroid Build Coastguard Worker
3095*7c568831SAndroid Build Coastguard Worker xmlRMutexUnlock(&xmlCatalogMutex);
3096*7c568831SAndroid Build Coastguard Worker
3097*7c568831SAndroid Build Coastguard Worker xmlCatalogInitialized = 1;
3098*7c568831SAndroid Build Coastguard Worker }
3099*7c568831SAndroid Build Coastguard Worker
3100*7c568831SAndroid Build Coastguard Worker
3101*7c568831SAndroid Build Coastguard Worker /**
3102*7c568831SAndroid Build Coastguard Worker * xmlLoadCatalog:
3103*7c568831SAndroid Build Coastguard Worker * @filename: a file path
3104*7c568831SAndroid Build Coastguard Worker *
3105*7c568831SAndroid Build Coastguard Worker * Load the catalog and makes its definitions effective for the default
3106*7c568831SAndroid Build Coastguard Worker * external entity loader. It will recurse in SGML CATALOG entries.
3107*7c568831SAndroid Build Coastguard Worker * this function is not thread safe, catalog initialization should
3108*7c568831SAndroid Build Coastguard Worker * preferably be done once at startup
3109*7c568831SAndroid Build Coastguard Worker *
3110*7c568831SAndroid Build Coastguard Worker * Returns 0 in case of success -1 in case of error
3111*7c568831SAndroid Build Coastguard Worker */
3112*7c568831SAndroid Build Coastguard Worker int
xmlLoadCatalog(const char * filename)3113*7c568831SAndroid Build Coastguard Worker xmlLoadCatalog(const char *filename)
3114*7c568831SAndroid Build Coastguard Worker {
3115*7c568831SAndroid Build Coastguard Worker int ret;
3116*7c568831SAndroid Build Coastguard Worker xmlCatalogPtr catal;
3117*7c568831SAndroid Build Coastguard Worker
3118*7c568831SAndroid Build Coastguard Worker xmlInitParser();
3119*7c568831SAndroid Build Coastguard Worker
3120*7c568831SAndroid Build Coastguard Worker xmlRMutexLock(&xmlCatalogMutex);
3121*7c568831SAndroid Build Coastguard Worker
3122*7c568831SAndroid Build Coastguard Worker if (xmlDefaultCatalog == NULL) {
3123*7c568831SAndroid Build Coastguard Worker catal = xmlLoadACatalog(filename);
3124*7c568831SAndroid Build Coastguard Worker if (catal == NULL) {
3125*7c568831SAndroid Build Coastguard Worker xmlRMutexUnlock(&xmlCatalogMutex);
3126*7c568831SAndroid Build Coastguard Worker return(-1);
3127*7c568831SAndroid Build Coastguard Worker }
3128*7c568831SAndroid Build Coastguard Worker
3129*7c568831SAndroid Build Coastguard Worker xmlDefaultCatalog = catal;
3130*7c568831SAndroid Build Coastguard Worker xmlRMutexUnlock(&xmlCatalogMutex);
3131*7c568831SAndroid Build Coastguard Worker xmlCatalogInitialized = 1;
3132*7c568831SAndroid Build Coastguard Worker return(0);
3133*7c568831SAndroid Build Coastguard Worker }
3134*7c568831SAndroid Build Coastguard Worker
3135*7c568831SAndroid Build Coastguard Worker ret = xmlExpandCatalog(xmlDefaultCatalog, filename);
3136*7c568831SAndroid Build Coastguard Worker xmlRMutexUnlock(&xmlCatalogMutex);
3137*7c568831SAndroid Build Coastguard Worker return(ret);
3138*7c568831SAndroid Build Coastguard Worker }
3139*7c568831SAndroid Build Coastguard Worker
3140*7c568831SAndroid Build Coastguard Worker /**
3141*7c568831SAndroid Build Coastguard Worker * xmlLoadCatalogs:
3142*7c568831SAndroid Build Coastguard Worker * @pathss: a list of directories separated by a colon or a space.
3143*7c568831SAndroid Build Coastguard Worker *
3144*7c568831SAndroid Build Coastguard Worker * Load the catalogs and makes their definitions effective for the default
3145*7c568831SAndroid Build Coastguard Worker * external entity loader.
3146*7c568831SAndroid Build Coastguard Worker * this function is not thread safe, catalog initialization should
3147*7c568831SAndroid Build Coastguard Worker * preferably be done once at startup
3148*7c568831SAndroid Build Coastguard Worker */
3149*7c568831SAndroid Build Coastguard Worker void
xmlLoadCatalogs(const char * pathss)3150*7c568831SAndroid Build Coastguard Worker xmlLoadCatalogs(const char *pathss) {
3151*7c568831SAndroid Build Coastguard Worker const char *cur;
3152*7c568831SAndroid Build Coastguard Worker const char *paths;
3153*7c568831SAndroid Build Coastguard Worker xmlChar *path;
3154*7c568831SAndroid Build Coastguard Worker #ifdef _WIN32
3155*7c568831SAndroid Build Coastguard Worker int i, iLen;
3156*7c568831SAndroid Build Coastguard Worker #endif
3157*7c568831SAndroid Build Coastguard Worker
3158*7c568831SAndroid Build Coastguard Worker if (pathss == NULL)
3159*7c568831SAndroid Build Coastguard Worker return;
3160*7c568831SAndroid Build Coastguard Worker
3161*7c568831SAndroid Build Coastguard Worker cur = pathss;
3162*7c568831SAndroid Build Coastguard Worker while (*cur != 0) {
3163*7c568831SAndroid Build Coastguard Worker while (xmlIsBlank_ch(*cur)) cur++;
3164*7c568831SAndroid Build Coastguard Worker if (*cur != 0) {
3165*7c568831SAndroid Build Coastguard Worker paths = cur;
3166*7c568831SAndroid Build Coastguard Worker while ((*cur != 0) && (*cur != PATH_SEPARATOR) && (!xmlIsBlank_ch(*cur)))
3167*7c568831SAndroid Build Coastguard Worker cur++;
3168*7c568831SAndroid Build Coastguard Worker path = xmlStrndup((const xmlChar *)paths, cur - paths);
3169*7c568831SAndroid Build Coastguard Worker if (path != NULL) {
3170*7c568831SAndroid Build Coastguard Worker #ifdef _WIN32
3171*7c568831SAndroid Build Coastguard Worker iLen = strlen((const char*)path);
3172*7c568831SAndroid Build Coastguard Worker for(i = 0; i < iLen; i++) {
3173*7c568831SAndroid Build Coastguard Worker if(path[i] == '\\') {
3174*7c568831SAndroid Build Coastguard Worker path[i] = '/';
3175*7c568831SAndroid Build Coastguard Worker }
3176*7c568831SAndroid Build Coastguard Worker }
3177*7c568831SAndroid Build Coastguard Worker #endif
3178*7c568831SAndroid Build Coastguard Worker xmlLoadCatalog((const char *) path);
3179*7c568831SAndroid Build Coastguard Worker xmlFree(path);
3180*7c568831SAndroid Build Coastguard Worker }
3181*7c568831SAndroid Build Coastguard Worker }
3182*7c568831SAndroid Build Coastguard Worker while (*cur == PATH_SEPARATOR)
3183*7c568831SAndroid Build Coastguard Worker cur++;
3184*7c568831SAndroid Build Coastguard Worker }
3185*7c568831SAndroid Build Coastguard Worker }
3186*7c568831SAndroid Build Coastguard Worker
3187*7c568831SAndroid Build Coastguard Worker /**
3188*7c568831SAndroid Build Coastguard Worker * xmlCatalogCleanup:
3189*7c568831SAndroid Build Coastguard Worker *
3190*7c568831SAndroid Build Coastguard Worker * Free up all the memory associated with catalogs
3191*7c568831SAndroid Build Coastguard Worker */
3192*7c568831SAndroid Build Coastguard Worker void
xmlCatalogCleanup(void)3193*7c568831SAndroid Build Coastguard Worker xmlCatalogCleanup(void) {
3194*7c568831SAndroid Build Coastguard Worker xmlRMutexLock(&xmlCatalogMutex);
3195*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs)
3196*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
3197*7c568831SAndroid Build Coastguard Worker "Catalogs cleanup\n");
3198*7c568831SAndroid Build Coastguard Worker if (xmlCatalogXMLFiles != NULL)
3199*7c568831SAndroid Build Coastguard Worker xmlHashFree(xmlCatalogXMLFiles, xmlFreeCatalogHashEntryList);
3200*7c568831SAndroid Build Coastguard Worker xmlCatalogXMLFiles = NULL;
3201*7c568831SAndroid Build Coastguard Worker if (xmlDefaultCatalog != NULL)
3202*7c568831SAndroid Build Coastguard Worker xmlFreeCatalog(xmlDefaultCatalog);
3203*7c568831SAndroid Build Coastguard Worker xmlDefaultCatalog = NULL;
3204*7c568831SAndroid Build Coastguard Worker xmlDebugCatalogs = 0;
3205*7c568831SAndroid Build Coastguard Worker xmlCatalogInitialized = 0;
3206*7c568831SAndroid Build Coastguard Worker xmlRMutexUnlock(&xmlCatalogMutex);
3207*7c568831SAndroid Build Coastguard Worker }
3208*7c568831SAndroid Build Coastguard Worker
3209*7c568831SAndroid Build Coastguard Worker /**
3210*7c568831SAndroid Build Coastguard Worker * xmlCleanupCatalogInternal:
3211*7c568831SAndroid Build Coastguard Worker *
3212*7c568831SAndroid Build Coastguard Worker * Free global data.
3213*7c568831SAndroid Build Coastguard Worker */
3214*7c568831SAndroid Build Coastguard Worker void
xmlCleanupCatalogInternal(void)3215*7c568831SAndroid Build Coastguard Worker xmlCleanupCatalogInternal(void) {
3216*7c568831SAndroid Build Coastguard Worker xmlCleanupRMutex(&xmlCatalogMutex);
3217*7c568831SAndroid Build Coastguard Worker }
3218*7c568831SAndroid Build Coastguard Worker
3219*7c568831SAndroid Build Coastguard Worker /**
3220*7c568831SAndroid Build Coastguard Worker * xmlCatalogResolveSystem:
3221*7c568831SAndroid Build Coastguard Worker * @sysID: the system ID string
3222*7c568831SAndroid Build Coastguard Worker *
3223*7c568831SAndroid Build Coastguard Worker * Try to lookup the catalog resource for a system ID
3224*7c568831SAndroid Build Coastguard Worker *
3225*7c568831SAndroid Build Coastguard Worker * Returns the resource if found or NULL otherwise, the value returned
3226*7c568831SAndroid Build Coastguard Worker * must be freed by the caller.
3227*7c568831SAndroid Build Coastguard Worker */
3228*7c568831SAndroid Build Coastguard Worker xmlChar *
xmlCatalogResolveSystem(const xmlChar * sysID)3229*7c568831SAndroid Build Coastguard Worker xmlCatalogResolveSystem(const xmlChar *sysID) {
3230*7c568831SAndroid Build Coastguard Worker xmlChar *ret;
3231*7c568831SAndroid Build Coastguard Worker
3232*7c568831SAndroid Build Coastguard Worker if (!xmlCatalogInitialized)
3233*7c568831SAndroid Build Coastguard Worker xmlInitializeCatalog();
3234*7c568831SAndroid Build Coastguard Worker
3235*7c568831SAndroid Build Coastguard Worker ret = xmlACatalogResolveSystem(xmlDefaultCatalog, sysID);
3236*7c568831SAndroid Build Coastguard Worker return(ret);
3237*7c568831SAndroid Build Coastguard Worker }
3238*7c568831SAndroid Build Coastguard Worker
3239*7c568831SAndroid Build Coastguard Worker /**
3240*7c568831SAndroid Build Coastguard Worker * xmlCatalogResolvePublic:
3241*7c568831SAndroid Build Coastguard Worker * @pubID: the public ID string
3242*7c568831SAndroid Build Coastguard Worker *
3243*7c568831SAndroid Build Coastguard Worker * Try to lookup the catalog reference associated to a public ID
3244*7c568831SAndroid Build Coastguard Worker *
3245*7c568831SAndroid Build Coastguard Worker * Returns the resource if found or NULL otherwise, the value returned
3246*7c568831SAndroid Build Coastguard Worker * must be freed by the caller.
3247*7c568831SAndroid Build Coastguard Worker */
3248*7c568831SAndroid Build Coastguard Worker xmlChar *
xmlCatalogResolvePublic(const xmlChar * pubID)3249*7c568831SAndroid Build Coastguard Worker xmlCatalogResolvePublic(const xmlChar *pubID) {
3250*7c568831SAndroid Build Coastguard Worker xmlChar *ret;
3251*7c568831SAndroid Build Coastguard Worker
3252*7c568831SAndroid Build Coastguard Worker if (!xmlCatalogInitialized)
3253*7c568831SAndroid Build Coastguard Worker xmlInitializeCatalog();
3254*7c568831SAndroid Build Coastguard Worker
3255*7c568831SAndroid Build Coastguard Worker ret = xmlACatalogResolvePublic(xmlDefaultCatalog, pubID);
3256*7c568831SAndroid Build Coastguard Worker return(ret);
3257*7c568831SAndroid Build Coastguard Worker }
3258*7c568831SAndroid Build Coastguard Worker
3259*7c568831SAndroid Build Coastguard Worker /**
3260*7c568831SAndroid Build Coastguard Worker * xmlCatalogResolve:
3261*7c568831SAndroid Build Coastguard Worker * @pubID: the public ID string
3262*7c568831SAndroid Build Coastguard Worker * @sysID: the system ID string
3263*7c568831SAndroid Build Coastguard Worker *
3264*7c568831SAndroid Build Coastguard Worker * Do a complete resolution lookup of an External Identifier
3265*7c568831SAndroid Build Coastguard Worker *
3266*7c568831SAndroid Build Coastguard Worker * Returns the URI of the resource or NULL if not found, it must be freed
3267*7c568831SAndroid Build Coastguard Worker * by the caller.
3268*7c568831SAndroid Build Coastguard Worker */
3269*7c568831SAndroid Build Coastguard Worker xmlChar *
xmlCatalogResolve(const xmlChar * pubID,const xmlChar * sysID)3270*7c568831SAndroid Build Coastguard Worker xmlCatalogResolve(const xmlChar *pubID, const xmlChar *sysID) {
3271*7c568831SAndroid Build Coastguard Worker xmlChar *ret;
3272*7c568831SAndroid Build Coastguard Worker
3273*7c568831SAndroid Build Coastguard Worker if (!xmlCatalogInitialized)
3274*7c568831SAndroid Build Coastguard Worker xmlInitializeCatalog();
3275*7c568831SAndroid Build Coastguard Worker
3276*7c568831SAndroid Build Coastguard Worker ret = xmlACatalogResolve(xmlDefaultCatalog, pubID, sysID);
3277*7c568831SAndroid Build Coastguard Worker return(ret);
3278*7c568831SAndroid Build Coastguard Worker }
3279*7c568831SAndroid Build Coastguard Worker
3280*7c568831SAndroid Build Coastguard Worker /**
3281*7c568831SAndroid Build Coastguard Worker * xmlCatalogResolveURI:
3282*7c568831SAndroid Build Coastguard Worker * @URI: the URI
3283*7c568831SAndroid Build Coastguard Worker *
3284*7c568831SAndroid Build Coastguard Worker * Do a complete resolution lookup of an URI
3285*7c568831SAndroid Build Coastguard Worker *
3286*7c568831SAndroid Build Coastguard Worker * Returns the URI of the resource or NULL if not found, it must be freed
3287*7c568831SAndroid Build Coastguard Worker * by the caller.
3288*7c568831SAndroid Build Coastguard Worker */
3289*7c568831SAndroid Build Coastguard Worker xmlChar *
xmlCatalogResolveURI(const xmlChar * URI)3290*7c568831SAndroid Build Coastguard Worker xmlCatalogResolveURI(const xmlChar *URI) {
3291*7c568831SAndroid Build Coastguard Worker xmlChar *ret;
3292*7c568831SAndroid Build Coastguard Worker
3293*7c568831SAndroid Build Coastguard Worker if (!xmlCatalogInitialized)
3294*7c568831SAndroid Build Coastguard Worker xmlInitializeCatalog();
3295*7c568831SAndroid Build Coastguard Worker
3296*7c568831SAndroid Build Coastguard Worker ret = xmlACatalogResolveURI(xmlDefaultCatalog, URI);
3297*7c568831SAndroid Build Coastguard Worker return(ret);
3298*7c568831SAndroid Build Coastguard Worker }
3299*7c568831SAndroid Build Coastguard Worker
3300*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
3301*7c568831SAndroid Build Coastguard Worker /**
3302*7c568831SAndroid Build Coastguard Worker * xmlCatalogDump:
3303*7c568831SAndroid Build Coastguard Worker * @out: the file.
3304*7c568831SAndroid Build Coastguard Worker *
3305*7c568831SAndroid Build Coastguard Worker * Dump all the global catalog content to the given file.
3306*7c568831SAndroid Build Coastguard Worker */
3307*7c568831SAndroid Build Coastguard Worker void
xmlCatalogDump(FILE * out)3308*7c568831SAndroid Build Coastguard Worker xmlCatalogDump(FILE *out) {
3309*7c568831SAndroid Build Coastguard Worker if (out == NULL)
3310*7c568831SAndroid Build Coastguard Worker return;
3311*7c568831SAndroid Build Coastguard Worker
3312*7c568831SAndroid Build Coastguard Worker if (!xmlCatalogInitialized)
3313*7c568831SAndroid Build Coastguard Worker xmlInitializeCatalog();
3314*7c568831SAndroid Build Coastguard Worker
3315*7c568831SAndroid Build Coastguard Worker xmlACatalogDump(xmlDefaultCatalog, out);
3316*7c568831SAndroid Build Coastguard Worker }
3317*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_OUTPUT_ENABLED */
3318*7c568831SAndroid Build Coastguard Worker
3319*7c568831SAndroid Build Coastguard Worker /**
3320*7c568831SAndroid Build Coastguard Worker * xmlCatalogAdd:
3321*7c568831SAndroid Build Coastguard Worker * @type: the type of record to add to the catalog
3322*7c568831SAndroid Build Coastguard Worker * @orig: the system, public or prefix to match
3323*7c568831SAndroid Build Coastguard Worker * @replace: the replacement value for the match
3324*7c568831SAndroid Build Coastguard Worker *
3325*7c568831SAndroid Build Coastguard Worker * Add an entry in the catalog, it may overwrite existing but
3326*7c568831SAndroid Build Coastguard Worker * different entries.
3327*7c568831SAndroid Build Coastguard Worker * If called before any other catalog routine, allows to override the
3328*7c568831SAndroid Build Coastguard Worker * default shared catalog put in place by xmlInitializeCatalog();
3329*7c568831SAndroid Build Coastguard Worker *
3330*7c568831SAndroid Build Coastguard Worker * Returns 0 if successful, -1 otherwise
3331*7c568831SAndroid Build Coastguard Worker */
3332*7c568831SAndroid Build Coastguard Worker int
xmlCatalogAdd(const xmlChar * type,const xmlChar * orig,const xmlChar * replace)3333*7c568831SAndroid Build Coastguard Worker xmlCatalogAdd(const xmlChar *type, const xmlChar *orig, const xmlChar *replace) {
3334*7c568831SAndroid Build Coastguard Worker int res = -1;
3335*7c568831SAndroid Build Coastguard Worker
3336*7c568831SAndroid Build Coastguard Worker xmlInitParser();
3337*7c568831SAndroid Build Coastguard Worker
3338*7c568831SAndroid Build Coastguard Worker xmlRMutexLock(&xmlCatalogMutex);
3339*7c568831SAndroid Build Coastguard Worker /*
3340*7c568831SAndroid Build Coastguard Worker * Specific case where one want to override the default catalog
3341*7c568831SAndroid Build Coastguard Worker * put in place by xmlInitializeCatalog();
3342*7c568831SAndroid Build Coastguard Worker */
3343*7c568831SAndroid Build Coastguard Worker if ((xmlDefaultCatalog == NULL) &&
3344*7c568831SAndroid Build Coastguard Worker (xmlStrEqual(type, BAD_CAST "catalog"))) {
3345*7c568831SAndroid Build Coastguard Worker xmlDefaultCatalog = xmlCreateNewCatalog(XML_XML_CATALOG_TYPE,
3346*7c568831SAndroid Build Coastguard Worker xmlCatalogDefaultPrefer);
3347*7c568831SAndroid Build Coastguard Worker if (xmlDefaultCatalog != NULL) {
3348*7c568831SAndroid Build Coastguard Worker xmlDefaultCatalog->xml = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL,
3349*7c568831SAndroid Build Coastguard Worker orig, NULL, xmlCatalogDefaultPrefer, NULL);
3350*7c568831SAndroid Build Coastguard Worker }
3351*7c568831SAndroid Build Coastguard Worker xmlRMutexUnlock(&xmlCatalogMutex);
3352*7c568831SAndroid Build Coastguard Worker xmlCatalogInitialized = 1;
3353*7c568831SAndroid Build Coastguard Worker return(0);
3354*7c568831SAndroid Build Coastguard Worker }
3355*7c568831SAndroid Build Coastguard Worker
3356*7c568831SAndroid Build Coastguard Worker res = xmlACatalogAdd(xmlDefaultCatalog, type, orig, replace);
3357*7c568831SAndroid Build Coastguard Worker xmlRMutexUnlock(&xmlCatalogMutex);
3358*7c568831SAndroid Build Coastguard Worker return(res);
3359*7c568831SAndroid Build Coastguard Worker }
3360*7c568831SAndroid Build Coastguard Worker
3361*7c568831SAndroid Build Coastguard Worker /**
3362*7c568831SAndroid Build Coastguard Worker * xmlCatalogRemove:
3363*7c568831SAndroid Build Coastguard Worker * @value: the value to remove
3364*7c568831SAndroid Build Coastguard Worker *
3365*7c568831SAndroid Build Coastguard Worker * Remove an entry from the catalog
3366*7c568831SAndroid Build Coastguard Worker *
3367*7c568831SAndroid Build Coastguard Worker * Returns the number of entries removed if successful, -1 otherwise
3368*7c568831SAndroid Build Coastguard Worker */
3369*7c568831SAndroid Build Coastguard Worker int
xmlCatalogRemove(const xmlChar * value)3370*7c568831SAndroid Build Coastguard Worker xmlCatalogRemove(const xmlChar *value) {
3371*7c568831SAndroid Build Coastguard Worker int res;
3372*7c568831SAndroid Build Coastguard Worker
3373*7c568831SAndroid Build Coastguard Worker if (!xmlCatalogInitialized)
3374*7c568831SAndroid Build Coastguard Worker xmlInitializeCatalog();
3375*7c568831SAndroid Build Coastguard Worker
3376*7c568831SAndroid Build Coastguard Worker xmlRMutexLock(&xmlCatalogMutex);
3377*7c568831SAndroid Build Coastguard Worker res = xmlACatalogRemove(xmlDefaultCatalog, value);
3378*7c568831SAndroid Build Coastguard Worker xmlRMutexUnlock(&xmlCatalogMutex);
3379*7c568831SAndroid Build Coastguard Worker return(res);
3380*7c568831SAndroid Build Coastguard Worker }
3381*7c568831SAndroid Build Coastguard Worker
3382*7c568831SAndroid Build Coastguard Worker /**
3383*7c568831SAndroid Build Coastguard Worker * xmlCatalogConvert:
3384*7c568831SAndroid Build Coastguard Worker *
3385*7c568831SAndroid Build Coastguard Worker * Convert all the SGML catalog entries as XML ones
3386*7c568831SAndroid Build Coastguard Worker *
3387*7c568831SAndroid Build Coastguard Worker * Returns the number of entries converted if successful, -1 otherwise
3388*7c568831SAndroid Build Coastguard Worker */
3389*7c568831SAndroid Build Coastguard Worker int
xmlCatalogConvert(void)3390*7c568831SAndroid Build Coastguard Worker xmlCatalogConvert(void) {
3391*7c568831SAndroid Build Coastguard Worker int res = -1;
3392*7c568831SAndroid Build Coastguard Worker
3393*7c568831SAndroid Build Coastguard Worker if (!xmlCatalogInitialized)
3394*7c568831SAndroid Build Coastguard Worker xmlInitializeCatalog();
3395*7c568831SAndroid Build Coastguard Worker
3396*7c568831SAndroid Build Coastguard Worker xmlRMutexLock(&xmlCatalogMutex);
3397*7c568831SAndroid Build Coastguard Worker res = xmlConvertSGMLCatalog(xmlDefaultCatalog);
3398*7c568831SAndroid Build Coastguard Worker xmlRMutexUnlock(&xmlCatalogMutex);
3399*7c568831SAndroid Build Coastguard Worker return(res);
3400*7c568831SAndroid Build Coastguard Worker }
3401*7c568831SAndroid Build Coastguard Worker
3402*7c568831SAndroid Build Coastguard Worker /************************************************************************
3403*7c568831SAndroid Build Coastguard Worker * *
3404*7c568831SAndroid Build Coastguard Worker * Public interface manipulating the common preferences *
3405*7c568831SAndroid Build Coastguard Worker * *
3406*7c568831SAndroid Build Coastguard Worker ************************************************************************/
3407*7c568831SAndroid Build Coastguard Worker
3408*7c568831SAndroid Build Coastguard Worker /**
3409*7c568831SAndroid Build Coastguard Worker * xmlCatalogGetDefaults:
3410*7c568831SAndroid Build Coastguard Worker *
3411*7c568831SAndroid Build Coastguard Worker * DEPRECATED: Use XML_PARSE_NO_SYS_CATALOG and
3412*7c568831SAndroid Build Coastguard Worker * XML_PARSE_NO_CATALOG_PI.
3413*7c568831SAndroid Build Coastguard Worker *
3414*7c568831SAndroid Build Coastguard Worker * Used to get the user preference w.r.t. to what catalogs should
3415*7c568831SAndroid Build Coastguard Worker * be accepted
3416*7c568831SAndroid Build Coastguard Worker *
3417*7c568831SAndroid Build Coastguard Worker * Returns the current xmlCatalogAllow value
3418*7c568831SAndroid Build Coastguard Worker */
3419*7c568831SAndroid Build Coastguard Worker xmlCatalogAllow
xmlCatalogGetDefaults(void)3420*7c568831SAndroid Build Coastguard Worker xmlCatalogGetDefaults(void) {
3421*7c568831SAndroid Build Coastguard Worker return(xmlCatalogDefaultAllow);
3422*7c568831SAndroid Build Coastguard Worker }
3423*7c568831SAndroid Build Coastguard Worker
3424*7c568831SAndroid Build Coastguard Worker /**
3425*7c568831SAndroid Build Coastguard Worker * xmlCatalogSetDefaults:
3426*7c568831SAndroid Build Coastguard Worker * @allow: what catalogs should be accepted
3427*7c568831SAndroid Build Coastguard Worker *
3428*7c568831SAndroid Build Coastguard Worker * DEPRECATED: Use XML_PARSE_NO_SYS_CATALOG and
3429*7c568831SAndroid Build Coastguard Worker * XML_PARSE_NO_CATALOG_PI.
3430*7c568831SAndroid Build Coastguard Worker *
3431*7c568831SAndroid Build Coastguard Worker * Used to set the user preference w.r.t. to what catalogs should
3432*7c568831SAndroid Build Coastguard Worker * be accepted
3433*7c568831SAndroid Build Coastguard Worker */
3434*7c568831SAndroid Build Coastguard Worker void
xmlCatalogSetDefaults(xmlCatalogAllow allow)3435*7c568831SAndroid Build Coastguard Worker xmlCatalogSetDefaults(xmlCatalogAllow allow) {
3436*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs) {
3437*7c568831SAndroid Build Coastguard Worker switch (allow) {
3438*7c568831SAndroid Build Coastguard Worker case XML_CATA_ALLOW_NONE:
3439*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
3440*7c568831SAndroid Build Coastguard Worker "Disabling catalog usage\n");
3441*7c568831SAndroid Build Coastguard Worker break;
3442*7c568831SAndroid Build Coastguard Worker case XML_CATA_ALLOW_GLOBAL:
3443*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
3444*7c568831SAndroid Build Coastguard Worker "Allowing only global catalogs\n");
3445*7c568831SAndroid Build Coastguard Worker break;
3446*7c568831SAndroid Build Coastguard Worker case XML_CATA_ALLOW_DOCUMENT:
3447*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
3448*7c568831SAndroid Build Coastguard Worker "Allowing only catalogs from the document\n");
3449*7c568831SAndroid Build Coastguard Worker break;
3450*7c568831SAndroid Build Coastguard Worker case XML_CATA_ALLOW_ALL:
3451*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
3452*7c568831SAndroid Build Coastguard Worker "Allowing all catalogs\n");
3453*7c568831SAndroid Build Coastguard Worker break;
3454*7c568831SAndroid Build Coastguard Worker }
3455*7c568831SAndroid Build Coastguard Worker }
3456*7c568831SAndroid Build Coastguard Worker xmlCatalogDefaultAllow = allow;
3457*7c568831SAndroid Build Coastguard Worker }
3458*7c568831SAndroid Build Coastguard Worker
3459*7c568831SAndroid Build Coastguard Worker /**
3460*7c568831SAndroid Build Coastguard Worker * xmlCatalogSetDefaultPrefer:
3461*7c568831SAndroid Build Coastguard Worker * @prefer: the default preference for delegation
3462*7c568831SAndroid Build Coastguard Worker *
3463*7c568831SAndroid Build Coastguard Worker * DEPRECATED: This setting is global and not thread-safe.
3464*7c568831SAndroid Build Coastguard Worker *
3465*7c568831SAndroid Build Coastguard Worker * Allows to set the preference between public and system for deletion
3466*7c568831SAndroid Build Coastguard Worker * in XML Catalog resolution. C.f. section 4.1.1 of the spec
3467*7c568831SAndroid Build Coastguard Worker * Values accepted are XML_CATA_PREFER_PUBLIC or XML_CATA_PREFER_SYSTEM
3468*7c568831SAndroid Build Coastguard Worker *
3469*7c568831SAndroid Build Coastguard Worker * Returns the previous value of the default preference for delegation
3470*7c568831SAndroid Build Coastguard Worker */
3471*7c568831SAndroid Build Coastguard Worker xmlCatalogPrefer
xmlCatalogSetDefaultPrefer(xmlCatalogPrefer prefer)3472*7c568831SAndroid Build Coastguard Worker xmlCatalogSetDefaultPrefer(xmlCatalogPrefer prefer) {
3473*7c568831SAndroid Build Coastguard Worker xmlCatalogPrefer ret = xmlCatalogDefaultPrefer;
3474*7c568831SAndroid Build Coastguard Worker
3475*7c568831SAndroid Build Coastguard Worker if (prefer == XML_CATA_PREFER_NONE)
3476*7c568831SAndroid Build Coastguard Worker return(ret);
3477*7c568831SAndroid Build Coastguard Worker
3478*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs) {
3479*7c568831SAndroid Build Coastguard Worker switch (prefer) {
3480*7c568831SAndroid Build Coastguard Worker case XML_CATA_PREFER_PUBLIC:
3481*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
3482*7c568831SAndroid Build Coastguard Worker "Setting catalog preference to PUBLIC\n");
3483*7c568831SAndroid Build Coastguard Worker break;
3484*7c568831SAndroid Build Coastguard Worker case XML_CATA_PREFER_SYSTEM:
3485*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
3486*7c568831SAndroid Build Coastguard Worker "Setting catalog preference to SYSTEM\n");
3487*7c568831SAndroid Build Coastguard Worker break;
3488*7c568831SAndroid Build Coastguard Worker default:
3489*7c568831SAndroid Build Coastguard Worker return(ret);
3490*7c568831SAndroid Build Coastguard Worker }
3491*7c568831SAndroid Build Coastguard Worker }
3492*7c568831SAndroid Build Coastguard Worker xmlCatalogDefaultPrefer = prefer;
3493*7c568831SAndroid Build Coastguard Worker return(ret);
3494*7c568831SAndroid Build Coastguard Worker }
3495*7c568831SAndroid Build Coastguard Worker
3496*7c568831SAndroid Build Coastguard Worker /**
3497*7c568831SAndroid Build Coastguard Worker * xmlCatalogSetDebug:
3498*7c568831SAndroid Build Coastguard Worker * @level: the debug level of catalogs required
3499*7c568831SAndroid Build Coastguard Worker *
3500*7c568831SAndroid Build Coastguard Worker * Used to set the debug level for catalog operation, 0 disable
3501*7c568831SAndroid Build Coastguard Worker * debugging, 1 enable it
3502*7c568831SAndroid Build Coastguard Worker *
3503*7c568831SAndroid Build Coastguard Worker * Returns the previous value of the catalog debugging level
3504*7c568831SAndroid Build Coastguard Worker */
3505*7c568831SAndroid Build Coastguard Worker int
xmlCatalogSetDebug(int level)3506*7c568831SAndroid Build Coastguard Worker xmlCatalogSetDebug(int level) {
3507*7c568831SAndroid Build Coastguard Worker int ret = xmlDebugCatalogs;
3508*7c568831SAndroid Build Coastguard Worker
3509*7c568831SAndroid Build Coastguard Worker if (level <= 0)
3510*7c568831SAndroid Build Coastguard Worker xmlDebugCatalogs = 0;
3511*7c568831SAndroid Build Coastguard Worker else
3512*7c568831SAndroid Build Coastguard Worker xmlDebugCatalogs = level;
3513*7c568831SAndroid Build Coastguard Worker return(ret);
3514*7c568831SAndroid Build Coastguard Worker }
3515*7c568831SAndroid Build Coastguard Worker
3516*7c568831SAndroid Build Coastguard Worker /************************************************************************
3517*7c568831SAndroid Build Coastguard Worker * *
3518*7c568831SAndroid Build Coastguard Worker * Minimal interfaces used for per-document catalogs by the parser *
3519*7c568831SAndroid Build Coastguard Worker * *
3520*7c568831SAndroid Build Coastguard Worker ************************************************************************/
3521*7c568831SAndroid Build Coastguard Worker
3522*7c568831SAndroid Build Coastguard Worker /**
3523*7c568831SAndroid Build Coastguard Worker * xmlCatalogFreeLocal:
3524*7c568831SAndroid Build Coastguard Worker * @catalogs: a document's list of catalogs
3525*7c568831SAndroid Build Coastguard Worker *
3526*7c568831SAndroid Build Coastguard Worker * Free up the memory associated to the catalog list
3527*7c568831SAndroid Build Coastguard Worker */
3528*7c568831SAndroid Build Coastguard Worker void
xmlCatalogFreeLocal(void * catalogs)3529*7c568831SAndroid Build Coastguard Worker xmlCatalogFreeLocal(void *catalogs) {
3530*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr catal;
3531*7c568831SAndroid Build Coastguard Worker
3532*7c568831SAndroid Build Coastguard Worker catal = (xmlCatalogEntryPtr) catalogs;
3533*7c568831SAndroid Build Coastguard Worker if (catal != NULL)
3534*7c568831SAndroid Build Coastguard Worker xmlFreeCatalogEntryList(catal);
3535*7c568831SAndroid Build Coastguard Worker }
3536*7c568831SAndroid Build Coastguard Worker
3537*7c568831SAndroid Build Coastguard Worker
3538*7c568831SAndroid Build Coastguard Worker /**
3539*7c568831SAndroid Build Coastguard Worker * xmlCatalogAddLocal:
3540*7c568831SAndroid Build Coastguard Worker * @catalogs: a document's list of catalogs
3541*7c568831SAndroid Build Coastguard Worker * @URL: the URL to a new local catalog
3542*7c568831SAndroid Build Coastguard Worker *
3543*7c568831SAndroid Build Coastguard Worker * Add the new entry to the catalog list
3544*7c568831SAndroid Build Coastguard Worker *
3545*7c568831SAndroid Build Coastguard Worker * Returns the updated list
3546*7c568831SAndroid Build Coastguard Worker */
3547*7c568831SAndroid Build Coastguard Worker void *
xmlCatalogAddLocal(void * catalogs,const xmlChar * URL)3548*7c568831SAndroid Build Coastguard Worker xmlCatalogAddLocal(void *catalogs, const xmlChar *URL) {
3549*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr catal, add;
3550*7c568831SAndroid Build Coastguard Worker
3551*7c568831SAndroid Build Coastguard Worker xmlInitParser();
3552*7c568831SAndroid Build Coastguard Worker
3553*7c568831SAndroid Build Coastguard Worker if (URL == NULL)
3554*7c568831SAndroid Build Coastguard Worker return(catalogs);
3555*7c568831SAndroid Build Coastguard Worker
3556*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs)
3557*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
3558*7c568831SAndroid Build Coastguard Worker "Adding document catalog %s\n", URL);
3559*7c568831SAndroid Build Coastguard Worker
3560*7c568831SAndroid Build Coastguard Worker add = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL, URL, NULL,
3561*7c568831SAndroid Build Coastguard Worker xmlCatalogDefaultPrefer, NULL);
3562*7c568831SAndroid Build Coastguard Worker if (add == NULL)
3563*7c568831SAndroid Build Coastguard Worker return(catalogs);
3564*7c568831SAndroid Build Coastguard Worker
3565*7c568831SAndroid Build Coastguard Worker catal = (xmlCatalogEntryPtr) catalogs;
3566*7c568831SAndroid Build Coastguard Worker if (catal == NULL)
3567*7c568831SAndroid Build Coastguard Worker return((void *) add);
3568*7c568831SAndroid Build Coastguard Worker
3569*7c568831SAndroid Build Coastguard Worker while (catal->next != NULL)
3570*7c568831SAndroid Build Coastguard Worker catal = catal->next;
3571*7c568831SAndroid Build Coastguard Worker catal->next = add;
3572*7c568831SAndroid Build Coastguard Worker return(catalogs);
3573*7c568831SAndroid Build Coastguard Worker }
3574*7c568831SAndroid Build Coastguard Worker
3575*7c568831SAndroid Build Coastguard Worker /**
3576*7c568831SAndroid Build Coastguard Worker * xmlCatalogLocalResolve:
3577*7c568831SAndroid Build Coastguard Worker * @catalogs: a document's list of catalogs
3578*7c568831SAndroid Build Coastguard Worker * @pubID: the public ID string
3579*7c568831SAndroid Build Coastguard Worker * @sysID: the system ID string
3580*7c568831SAndroid Build Coastguard Worker *
3581*7c568831SAndroid Build Coastguard Worker * Do a complete resolution lookup of an External Identifier using a
3582*7c568831SAndroid Build Coastguard Worker * document's private catalog list
3583*7c568831SAndroid Build Coastguard Worker *
3584*7c568831SAndroid Build Coastguard Worker * Returns the URI of the resource or NULL if not found, it must be freed
3585*7c568831SAndroid Build Coastguard Worker * by the caller.
3586*7c568831SAndroid Build Coastguard Worker */
3587*7c568831SAndroid Build Coastguard Worker xmlChar *
xmlCatalogLocalResolve(void * catalogs,const xmlChar * pubID,const xmlChar * sysID)3588*7c568831SAndroid Build Coastguard Worker xmlCatalogLocalResolve(void *catalogs, const xmlChar *pubID,
3589*7c568831SAndroid Build Coastguard Worker const xmlChar *sysID) {
3590*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr catal;
3591*7c568831SAndroid Build Coastguard Worker xmlChar *ret;
3592*7c568831SAndroid Build Coastguard Worker
3593*7c568831SAndroid Build Coastguard Worker if ((pubID == NULL) && (sysID == NULL))
3594*7c568831SAndroid Build Coastguard Worker return(NULL);
3595*7c568831SAndroid Build Coastguard Worker
3596*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs) {
3597*7c568831SAndroid Build Coastguard Worker if ((pubID != NULL) && (sysID != NULL)) {
3598*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
3599*7c568831SAndroid Build Coastguard Worker "Local Resolve: pubID %s sysID %s\n", pubID, sysID);
3600*7c568831SAndroid Build Coastguard Worker } else if (pubID != NULL) {
3601*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
3602*7c568831SAndroid Build Coastguard Worker "Local Resolve: pubID %s\n", pubID);
3603*7c568831SAndroid Build Coastguard Worker } else {
3604*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
3605*7c568831SAndroid Build Coastguard Worker "Local Resolve: sysID %s\n", sysID);
3606*7c568831SAndroid Build Coastguard Worker }
3607*7c568831SAndroid Build Coastguard Worker }
3608*7c568831SAndroid Build Coastguard Worker
3609*7c568831SAndroid Build Coastguard Worker catal = (xmlCatalogEntryPtr) catalogs;
3610*7c568831SAndroid Build Coastguard Worker if (catal == NULL)
3611*7c568831SAndroid Build Coastguard Worker return(NULL);
3612*7c568831SAndroid Build Coastguard Worker ret = xmlCatalogListXMLResolve(catal, pubID, sysID);
3613*7c568831SAndroid Build Coastguard Worker if ((ret != NULL) && (ret != XML_CATAL_BREAK))
3614*7c568831SAndroid Build Coastguard Worker return(ret);
3615*7c568831SAndroid Build Coastguard Worker return(NULL);
3616*7c568831SAndroid Build Coastguard Worker }
3617*7c568831SAndroid Build Coastguard Worker
3618*7c568831SAndroid Build Coastguard Worker /**
3619*7c568831SAndroid Build Coastguard Worker * xmlCatalogLocalResolveURI:
3620*7c568831SAndroid Build Coastguard Worker * @catalogs: a document's list of catalogs
3621*7c568831SAndroid Build Coastguard Worker * @URI: the URI
3622*7c568831SAndroid Build Coastguard Worker *
3623*7c568831SAndroid Build Coastguard Worker * Do a complete resolution lookup of an URI using a
3624*7c568831SAndroid Build Coastguard Worker * document's private catalog list
3625*7c568831SAndroid Build Coastguard Worker *
3626*7c568831SAndroid Build Coastguard Worker * Returns the URI of the resource or NULL if not found, it must be freed
3627*7c568831SAndroid Build Coastguard Worker * by the caller.
3628*7c568831SAndroid Build Coastguard Worker */
3629*7c568831SAndroid Build Coastguard Worker xmlChar *
xmlCatalogLocalResolveURI(void * catalogs,const xmlChar * URI)3630*7c568831SAndroid Build Coastguard Worker xmlCatalogLocalResolveURI(void *catalogs, const xmlChar *URI) {
3631*7c568831SAndroid Build Coastguard Worker xmlCatalogEntryPtr catal;
3632*7c568831SAndroid Build Coastguard Worker xmlChar *ret;
3633*7c568831SAndroid Build Coastguard Worker
3634*7c568831SAndroid Build Coastguard Worker if (URI == NULL)
3635*7c568831SAndroid Build Coastguard Worker return(NULL);
3636*7c568831SAndroid Build Coastguard Worker
3637*7c568831SAndroid Build Coastguard Worker if (xmlDebugCatalogs)
3638*7c568831SAndroid Build Coastguard Worker xmlCatalogPrintDebug(
3639*7c568831SAndroid Build Coastguard Worker "Resolve URI %s\n", URI);
3640*7c568831SAndroid Build Coastguard Worker
3641*7c568831SAndroid Build Coastguard Worker catal = (xmlCatalogEntryPtr) catalogs;
3642*7c568831SAndroid Build Coastguard Worker if (catal == NULL)
3643*7c568831SAndroid Build Coastguard Worker return(NULL);
3644*7c568831SAndroid Build Coastguard Worker ret = xmlCatalogListXMLResolveURI(catal, URI);
3645*7c568831SAndroid Build Coastguard Worker if ((ret != NULL) && (ret != XML_CATAL_BREAK))
3646*7c568831SAndroid Build Coastguard Worker return(ret);
3647*7c568831SAndroid Build Coastguard Worker return(NULL);
3648*7c568831SAndroid Build Coastguard Worker }
3649*7c568831SAndroid Build Coastguard Worker
3650*7c568831SAndroid Build Coastguard Worker /************************************************************************
3651*7c568831SAndroid Build Coastguard Worker * *
3652*7c568831SAndroid Build Coastguard Worker * Deprecated interfaces *
3653*7c568831SAndroid Build Coastguard Worker * *
3654*7c568831SAndroid Build Coastguard Worker ************************************************************************/
3655*7c568831SAndroid Build Coastguard Worker /**
3656*7c568831SAndroid Build Coastguard Worker * xmlCatalogGetSystem:
3657*7c568831SAndroid Build Coastguard Worker * @sysID: the system ID string
3658*7c568831SAndroid Build Coastguard Worker *
3659*7c568831SAndroid Build Coastguard Worker * Try to lookup the catalog reference associated to a system ID
3660*7c568831SAndroid Build Coastguard Worker * DEPRECATED, use xmlCatalogResolveSystem()
3661*7c568831SAndroid Build Coastguard Worker *
3662*7c568831SAndroid Build Coastguard Worker * Returns the resource if found or NULL otherwise.
3663*7c568831SAndroid Build Coastguard Worker */
3664*7c568831SAndroid Build Coastguard Worker const xmlChar *
xmlCatalogGetSystem(const xmlChar * sysID)3665*7c568831SAndroid Build Coastguard Worker xmlCatalogGetSystem(const xmlChar *sysID) {
3666*7c568831SAndroid Build Coastguard Worker xmlChar *ret;
3667*7c568831SAndroid Build Coastguard Worker static xmlChar result[1000];
3668*7c568831SAndroid Build Coastguard Worker static int msg = 0;
3669*7c568831SAndroid Build Coastguard Worker
3670*7c568831SAndroid Build Coastguard Worker if (!xmlCatalogInitialized)
3671*7c568831SAndroid Build Coastguard Worker xmlInitializeCatalog();
3672*7c568831SAndroid Build Coastguard Worker
3673*7c568831SAndroid Build Coastguard Worker if (msg == 0) {
3674*7c568831SAndroid Build Coastguard Worker xmlPrintErrorMessage(
3675*7c568831SAndroid Build Coastguard Worker "Use of deprecated xmlCatalogGetSystem() call\n");
3676*7c568831SAndroid Build Coastguard Worker msg++;
3677*7c568831SAndroid Build Coastguard Worker }
3678*7c568831SAndroid Build Coastguard Worker
3679*7c568831SAndroid Build Coastguard Worker if (sysID == NULL)
3680*7c568831SAndroid Build Coastguard Worker return(NULL);
3681*7c568831SAndroid Build Coastguard Worker
3682*7c568831SAndroid Build Coastguard Worker /*
3683*7c568831SAndroid Build Coastguard Worker * Check first the XML catalogs
3684*7c568831SAndroid Build Coastguard Worker */
3685*7c568831SAndroid Build Coastguard Worker if (xmlDefaultCatalog != NULL) {
3686*7c568831SAndroid Build Coastguard Worker ret = xmlCatalogListXMLResolve(xmlDefaultCatalog->xml, NULL, sysID);
3687*7c568831SAndroid Build Coastguard Worker if ((ret != NULL) && (ret != XML_CATAL_BREAK)) {
3688*7c568831SAndroid Build Coastguard Worker snprintf((char *) result, sizeof(result) - 1, "%s", (char *) ret);
3689*7c568831SAndroid Build Coastguard Worker result[sizeof(result) - 1] = 0;
3690*7c568831SAndroid Build Coastguard Worker return(result);
3691*7c568831SAndroid Build Coastguard Worker }
3692*7c568831SAndroid Build Coastguard Worker }
3693*7c568831SAndroid Build Coastguard Worker
3694*7c568831SAndroid Build Coastguard Worker if (xmlDefaultCatalog != NULL)
3695*7c568831SAndroid Build Coastguard Worker return(xmlCatalogGetSGMLSystem(xmlDefaultCatalog->sgml, sysID));
3696*7c568831SAndroid Build Coastguard Worker return(NULL);
3697*7c568831SAndroid Build Coastguard Worker }
3698*7c568831SAndroid Build Coastguard Worker
3699*7c568831SAndroid Build Coastguard Worker /**
3700*7c568831SAndroid Build Coastguard Worker * xmlCatalogGetPublic:
3701*7c568831SAndroid Build Coastguard Worker * @pubID: the public ID string
3702*7c568831SAndroid Build Coastguard Worker *
3703*7c568831SAndroid Build Coastguard Worker * Try to lookup the catalog reference associated to a public ID
3704*7c568831SAndroid Build Coastguard Worker * DEPRECATED, use xmlCatalogResolvePublic()
3705*7c568831SAndroid Build Coastguard Worker *
3706*7c568831SAndroid Build Coastguard Worker * Returns the resource if found or NULL otherwise.
3707*7c568831SAndroid Build Coastguard Worker */
3708*7c568831SAndroid Build Coastguard Worker const xmlChar *
xmlCatalogGetPublic(const xmlChar * pubID)3709*7c568831SAndroid Build Coastguard Worker xmlCatalogGetPublic(const xmlChar *pubID) {
3710*7c568831SAndroid Build Coastguard Worker xmlChar *ret;
3711*7c568831SAndroid Build Coastguard Worker static xmlChar result[1000];
3712*7c568831SAndroid Build Coastguard Worker static int msg = 0;
3713*7c568831SAndroid Build Coastguard Worker
3714*7c568831SAndroid Build Coastguard Worker if (!xmlCatalogInitialized)
3715*7c568831SAndroid Build Coastguard Worker xmlInitializeCatalog();
3716*7c568831SAndroid Build Coastguard Worker
3717*7c568831SAndroid Build Coastguard Worker if (msg == 0) {
3718*7c568831SAndroid Build Coastguard Worker xmlPrintErrorMessage(
3719*7c568831SAndroid Build Coastguard Worker "Use of deprecated xmlCatalogGetPublic() call\n");
3720*7c568831SAndroid Build Coastguard Worker msg++;
3721*7c568831SAndroid Build Coastguard Worker }
3722*7c568831SAndroid Build Coastguard Worker
3723*7c568831SAndroid Build Coastguard Worker if (pubID == NULL)
3724*7c568831SAndroid Build Coastguard Worker return(NULL);
3725*7c568831SAndroid Build Coastguard Worker
3726*7c568831SAndroid Build Coastguard Worker /*
3727*7c568831SAndroid Build Coastguard Worker * Check first the XML catalogs
3728*7c568831SAndroid Build Coastguard Worker */
3729*7c568831SAndroid Build Coastguard Worker if (xmlDefaultCatalog != NULL) {
3730*7c568831SAndroid Build Coastguard Worker ret = xmlCatalogListXMLResolve(xmlDefaultCatalog->xml, pubID, NULL);
3731*7c568831SAndroid Build Coastguard Worker if ((ret != NULL) && (ret != XML_CATAL_BREAK)) {
3732*7c568831SAndroid Build Coastguard Worker snprintf((char *) result, sizeof(result) - 1, "%s", (char *) ret);
3733*7c568831SAndroid Build Coastguard Worker result[sizeof(result) - 1] = 0;
3734*7c568831SAndroid Build Coastguard Worker return(result);
3735*7c568831SAndroid Build Coastguard Worker }
3736*7c568831SAndroid Build Coastguard Worker }
3737*7c568831SAndroid Build Coastguard Worker
3738*7c568831SAndroid Build Coastguard Worker if (xmlDefaultCatalog != NULL)
3739*7c568831SAndroid Build Coastguard Worker return(xmlCatalogGetSGMLPublic(xmlDefaultCatalog->sgml, pubID));
3740*7c568831SAndroid Build Coastguard Worker return(NULL);
3741*7c568831SAndroid Build Coastguard Worker }
3742*7c568831SAndroid Build Coastguard Worker
3743*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_CATALOG_ENABLED */
3744