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