15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * catalog.c: set of generic Catalog related routines
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reference:  SGML Open Technical Resolution TR9401:1997.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *             http://www.jclark.com/sp/catalog.htm
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *             XML Catalogs Working Draft 06 August 2001
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *             http://www.oasis-open.org/committees/entity/spec-2001-08-06.html
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See Copyright for the status of this software.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Daniel.Veillard@imag.fr
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IN_LIBXML
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_CATALOG_ENABLED
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_TYPES_H
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/types.h>
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_STAT_H
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/stat.h>
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_UNISTD_H
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <unistd.h>
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_FCNTL_H
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <fcntl.h>
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STDLIB_H
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h>
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h>
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlmemory.h>
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/hash.h>
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/uri.h>
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/parserInternals.h>
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/catalog.h>
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlerror.h>
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/threads.h>
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/globals.h>
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAX_DELEGATE	50
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAX_CATAL_DEPTH	50
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef _WIN32
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define PATH_SEAPARATOR ';'
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define PATH_SEAPARATOR ':'
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO:
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * macro to flag unimplemented blocks
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XML_CATALOG_PREFER user env to select between system/public prefered
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * option. C.f. Richard Tobin <richard@cogsci.ed.ac.uk>
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *> Just FYI, I am using an environment variable XML_CATALOG_PREFER with
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *> values "system" and "public".  I have made the default be "system" to
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *> match yours.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TODO 								\
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext,				\
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "Unimplemented block at %s:%d\n",				\
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            __FILE__, __LINE__);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_URN_PUBID "urn:publicid:"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_CATAL_BREAK ((xmlChar *) -1)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef XML_XML_DEFAULT_CATALOG
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_XML_DEFAULT_CATALOG "file:///etc/xml/catalog"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef XML_SGML_DEFAULT_CATALOG
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SGML_DEFAULT_CATALOG "file:///etc/sgml/catalog"
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_WIN32) && defined(_MSC_VER)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef XML_XML_DEFAULT_CATALOG
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char XML_XML_DEFAULT_CATALOG[256] = "file:///etc/xml/catalog";
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_WIN32_WCE)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Windows CE don't have a A variant */
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GetModuleHandleA GetModuleHandle
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GetModuleFileNameA GetModuleFileName
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* __stdcall GetModuleHandleA(const char*);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned long __stdcall GetModuleFileNameA(void*, char*, unsigned long);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar *xmlCatalogNormalizePublic(const xmlChar *pubID);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlExpandCatalog(xmlCatalogPtr catal, const char *filename);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			Types, all private				*
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef enum {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_CATA_REMOVED = -1,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_CATA_NONE = 0,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_CATA_CATALOG,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_CATA_BROKEN_CATALOG,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_CATA_NEXT_CATALOG,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_CATA_GROUP,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_CATA_PUBLIC,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_CATA_SYSTEM,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_CATA_REWRITE_SYSTEM,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_CATA_DELEGATE_PUBLIC,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_CATA_DELEGATE_SYSTEM,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_CATA_URI,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_CATA_REWRITE_URI,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_CATA_DELEGATE_URI,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SGML_CATA_SYSTEM,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SGML_CATA_PUBLIC,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SGML_CATA_ENTITY,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SGML_CATA_PENTITY,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SGML_CATA_DOCTYPE,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SGML_CATA_LINKTYPE,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SGML_CATA_NOTATION,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SGML_CATA_DELEGATE,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SGML_CATA_BASE,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SGML_CATA_CATALOG,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SGML_CATA_DOCUMENT,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SGML_CATA_SGMLDECL
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} xmlCatalogEntryType;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlCatalogEntry xmlCatalogEntry;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlCatalogEntry *xmlCatalogEntryPtr;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlCatalogEntry {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct _xmlCatalogEntry *next;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct _xmlCatalogEntry *parent;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct _xmlCatalogEntry *children;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogEntryType type;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *name;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *value;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *URL;  /* The expanded URL using the base */
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogPrefer prefer;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int dealloc;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int depth;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct _xmlCatalogEntry *group;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef enum {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_XML_CATALOG_TYPE = 1,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_SGML_CATALOG_TYPE
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} xmlCatalogType;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_MAX_SGML_CATA_DEPTH 10
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlCatalog {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogType type;	/* either XML or SGML */
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * SGML Catalogs are stored as a simple hash table of catalog entries
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Catalog stack to check against overflows when building the
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * SGML catalog
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *catalTab[XML_MAX_SGML_CATA_DEPTH];	/* stack of catals */
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int          catalNr;	/* Number of current catal streams */
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int          catalMax;	/* Max number of catal streams */
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHashTablePtr sgml;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * XML Catalogs are stored as a tree of Catalog entries
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogPrefer prefer;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogEntryPtr xml;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			Global variables				*
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Those are preferences
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlDebugCatalogs = 0;   /* used for debugging */
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlCatalogAllow xmlCatalogDefaultAllow = XML_CATA_ALLOW_ALL;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlCatalogPrefer xmlCatalogDefaultPrefer = XML_CATA_PREFER_PUBLIC;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Hash table containing all the trees of XML catalogs parsed by
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the application.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlHashTablePtr xmlCatalogXMLFiles = NULL;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The default catalog in use by the application
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlCatalogPtr xmlDefaultCatalog = NULL;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A mutex for modifying the shared global catalog(s)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDefaultCatalog tree.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * It also protects xmlCatalogXMLFiles
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The core of this readers/writer scheme is in xmlFetchXMLCatalogFile()
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRMutexPtr xmlCatalogMutex = NULL;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Whether the catalog support was initialized.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlCatalogInitialized = 0;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 			Catalog error handlers				*
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogErrMemory:
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @extra:  extra informations
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle an out of memory condition
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogErrMemory(const char *extra)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_CATALOG,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    XML_ERR_NO_MEMORY, XML_ERR_ERROR, NULL, 0,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    extra, NULL, NULL, 0, 0,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Memory allocation failed : %s\n", extra);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogErr:
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal: the Catalog entry
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the context node
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg:  the error message
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @extra:  extra informations
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle a catalog error
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogErr(xmlCatalogEntryPtr catal, xmlNodePtr node, int error,
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const char *msg, const xmlChar *str1, const xmlChar *str2,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       const xmlChar *str3)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __xmlRaiseError(NULL, NULL, NULL, catal, node, XML_FROM_CATALOG,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    error, XML_ERR_ERROR, NULL, 0,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (const char *) str1, (const char *) str2,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (const char *) str3, 0, 0,
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    msg, str1, str2, str3);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			Allocation and Freeing				*
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewCatalogEntry:
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  type of entry
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  name of the entry
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value:  value of the entry
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @prefer:  the PUBLIC vs. SYSTEM current preference value
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @group:  for members of a group, the group entry
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * create a new Catalog entry, this type is shared both by XML and
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SGML catalogs, but the acceptable types values differs.
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the xmlCatalogEntryPtr or NULL in case of error
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlCatalogEntryPtr
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewCatalogEntry(xmlCatalogEntryType type, const xmlChar *name,
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   const xmlChar *value, const xmlChar *URL, xmlCatalogPrefer prefer,
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   xmlCatalogEntryPtr group) {
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogEntryPtr ret;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *normid = NULL;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlCatalogEntryPtr) xmlMalloc(sizeof(xmlCatalogEntry));
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlCatalogErrMemory("allocating catalog entry");
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->next = NULL;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->parent = NULL;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->children = NULL;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->type = type;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type == XML_CATA_PUBLIC || type == XML_CATA_DELEGATE_PUBLIC) {
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        normid = xmlCatalogNormalizePublic(name);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (normid != NULL)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            name = (*normid != 0 ? normid : NULL);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name != NULL)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->name = xmlStrdup(name);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->name = NULL;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (normid != NULL)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(normid);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value != NULL)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->value = xmlStrdup(value);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->value = NULL;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (URL == NULL)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	URL = value;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (URL != NULL)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->URL = xmlStrdup(URL);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->URL = NULL;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->prefer = prefer;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->dealloc = 0;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->depth = 0;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->group = group;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFreeCatalogEntryList(xmlCatalogEntryPtr ret);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFreeCatalogEntry:
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ret:  a Catalog entry
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free the memory allocated to a Catalog entry
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFreeCatalogEntry(xmlCatalogEntryPtr ret) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Entries stored in the file hash must be deallocated
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * only by the file hash cleaner !
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret->dealloc == 1)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlDebugCatalogs) {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret->name != NULL)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Free catalog entry %s\n", ret->name);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if (ret->value != NULL)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Free catalog entry %s\n", ret->value);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Free catalog entry\n");
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret->name != NULL)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(ret->name);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret->value != NULL)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(ret->value);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret->URL != NULL)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(ret->URL);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(ret);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFreeCatalogEntryList:
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ret:  a Catalog entry list
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free the memory allocated to a full chained list of Catalog entries
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFreeCatalogEntryList(xmlCatalogEntryPtr ret) {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogEntryPtr next;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (ret != NULL) {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	next = ret->next;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeCatalogEntry(ret);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = next;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFreeCatalogHashEntryList:
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ret:  a Catalog entry list
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free the memory allocated to list of Catalog entries from the
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * catalog file hash.
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFreeCatalogHashEntryList(xmlCatalogEntryPtr catal) {
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogEntryPtr children, next;
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal == NULL)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    children = catal->children;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (children != NULL) {
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	next = children->next;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	children->dealloc = 0;
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	children->children = NULL;
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeCatalogEntry(children);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	children = next;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    catal->dealloc = 0;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFreeCatalogEntry(catal);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCreateNewCatalog:
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  type of catalog
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @prefer:  the PUBLIC vs. SYSTEM current preference value
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * create a new Catalog, this type is shared both by XML and
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SGML catalogs, but the acceptable types values differs.
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the xmlCatalogPtr or NULL in case of error
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlCatalogPtr
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCreateNewCatalog(xmlCatalogType type, xmlCatalogPrefer prefer) {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogPtr ret;
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlCatalogPtr) xmlMalloc(sizeof(xmlCatalog));
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlCatalogErrMemory("allocating catalog");
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlCatalog));
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->type = type;
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->catalNr = 0;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->catalMax = XML_MAX_SGML_CATA_DEPTH;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->prefer = prefer;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret->type == XML_SGML_CATALOG_TYPE)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->sgml = xmlHashCreate(10);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFreeCatalog:
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal:  a Catalog
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free the memory allocated to a Catalog
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFreeCatalog(xmlCatalogPtr catal) {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal == NULL)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal->xml != NULL)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeCatalogEntryList(catal->xml);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal->sgml != NULL)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlHashFree(catal->sgml,
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlHashDeallocator) xmlFreeCatalogEntry);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(catal);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			Serializing Catalogs				*
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogDumpEntry:
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @entry:  the catalog entry
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @out:  the file.
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Serialize an SGML Catalog entry
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogDumpEntry(xmlCatalogEntryPtr entry, FILE *out) {
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((entry == NULL) || (out == NULL))
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (entry->type) {
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_ENTITY:
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(out, "ENTITY "); break;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_PENTITY:
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(out, "ENTITY %%"); break;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_DOCTYPE:
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(out, "DOCTYPE "); break;
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_LINKTYPE:
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(out, "LINKTYPE "); break;
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_NOTATION:
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(out, "NOTATION "); break;
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_PUBLIC:
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(out, "PUBLIC "); break;
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_SYSTEM:
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(out, "SYSTEM "); break;
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_DELEGATE:
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(out, "DELEGATE "); break;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_BASE:
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(out, "BASE "); break;
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_CATALOG:
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(out, "CATALOG "); break;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_DOCUMENT:
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(out, "DOCUMENT "); break;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_SGMLDECL:
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(out, "SGMLDECL "); break;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return;
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (entry->type) {
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_ENTITY:
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_PENTITY:
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_DOCTYPE:
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_LINKTYPE:
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_NOTATION:
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(out, "%s", (const char *) entry->name); break;
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_PUBLIC:
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_SYSTEM:
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_SGMLDECL:
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_DOCUMENT:
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_CATALOG:
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_BASE:
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_DELEGATE:
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(out, "\"%s\"", entry->name); break;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (entry->type) {
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_ENTITY:
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_PENTITY:
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_DOCTYPE:
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_LINKTYPE:
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_NOTATION:
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_PUBLIC:
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_SYSTEM:
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_DELEGATE:
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(out, " \"%s\"", entry->value); break;
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(out, "\n");
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDumpXMLCatalogNode:
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal:  top catalog entry
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catalog: pointer to the xml tree
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: the containing document
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns: the current namespace
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cgroup: group node for group members
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Serializes a Catalog entry, called by xmlDumpXMLCatalog and recursively
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for group entries
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void xmlDumpXMLCatalogNode(xmlCatalogEntryPtr catal, xmlNodePtr catalog,
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlDocPtr doc, xmlNsPtr ns, xmlCatalogEntryPtr cgroup) {
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr node;
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogEntryPtr cur;
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * add all the catalog entries
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = catal;
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (cur->group == cgroup) {
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    switch (cur->type) {
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        case XML_CATA_REMOVED:
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        case XML_CATA_BROKEN_CATALOG:
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        case XML_CATA_CATALOG:
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (cur == catal) {
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			cur = cur->children;
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        continue;
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_CATA_NEXT_CATALOG:
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    node = xmlNewDocNode(doc, ns, BAD_CAST "nextCatalog", NULL);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSetProp(node, BAD_CAST "catalog", cur->value);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlAddChild(catalog, node);
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    break;
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_CATA_NONE:
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_CATA_GROUP:
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    node = xmlNewDocNode(doc, ns, BAD_CAST "group", NULL);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSetProp(node, BAD_CAST "id", cur->name);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (cur->value != NULL) {
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        xmlNsPtr xns;
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xns = xmlSearchNsByHref(doc, node, XML_XML_NAMESPACE);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (xns != NULL)
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlSetNsProp(node, xns, BAD_CAST "base",
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    		 cur->value);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    switch (cur->prefer) {
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			case XML_CATA_PREFER_NONE:
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		            break;
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			case XML_CATA_PREFER_PUBLIC:
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		            xmlSetProp(node, BAD_CAST "prefer", BAD_CAST "public");
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    break;
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			case XML_CATA_PREFER_SYSTEM:
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		            xmlSetProp(node, BAD_CAST "prefer", BAD_CAST "system");
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    break;
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlDumpXMLCatalogNode(cur->next, node, doc, ns, cur);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlAddChild(catalog, node);
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	            break;
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_CATA_PUBLIC:
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    node = xmlNewDocNode(doc, ns, BAD_CAST "public", NULL);
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSetProp(node, BAD_CAST "publicId", cur->name);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSetProp(node, BAD_CAST "uri", cur->value);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlAddChild(catalog, node);
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_CATA_SYSTEM:
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    node = xmlNewDocNode(doc, ns, BAD_CAST "system", NULL);
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSetProp(node, BAD_CAST "systemId", cur->name);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSetProp(node, BAD_CAST "uri", cur->value);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlAddChild(catalog, node);
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_CATA_REWRITE_SYSTEM:
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    node = xmlNewDocNode(doc, ns, BAD_CAST "rewriteSystem", NULL);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSetProp(node, BAD_CAST "systemIdStartString", cur->name);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSetProp(node, BAD_CAST "rewritePrefix", cur->value);
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlAddChild(catalog, node);
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_CATA_DELEGATE_PUBLIC:
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    node = xmlNewDocNode(doc, ns, BAD_CAST "delegatePublic", NULL);
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSetProp(node, BAD_CAST "publicIdStartString", cur->name);
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSetProp(node, BAD_CAST "catalog", cur->value);
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlAddChild(catalog, node);
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_CATA_DELEGATE_SYSTEM:
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    node = xmlNewDocNode(doc, ns, BAD_CAST "delegateSystem", NULL);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSetProp(node, BAD_CAST "systemIdStartString", cur->name);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSetProp(node, BAD_CAST "catalog", cur->value);
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlAddChild(catalog, node);
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_CATA_URI:
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    node = xmlNewDocNode(doc, ns, BAD_CAST "uri", NULL);
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSetProp(node, BAD_CAST "name", cur->name);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSetProp(node, BAD_CAST "uri", cur->value);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlAddChild(catalog, node);
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_CATA_REWRITE_URI:
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    node = xmlNewDocNode(doc, ns, BAD_CAST "rewriteURI", NULL);
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSetProp(node, BAD_CAST "uriStartString", cur->name);
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSetProp(node, BAD_CAST "rewritePrefix", cur->value);
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlAddChild(catalog, node);
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_CATA_DELEGATE_URI:
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    node = xmlNewDocNode(doc, ns, BAD_CAST "delegateURI", NULL);
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSetProp(node, BAD_CAST "uriStartString", cur->name);
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSetProp(node, BAD_CAST "catalog", cur->value);
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlAddChild(catalog, node);
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case SGML_CATA_SYSTEM:
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case SGML_CATA_PUBLIC:
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case SGML_CATA_ENTITY:
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case SGML_CATA_PENTITY:
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case SGML_CATA_DOCTYPE:
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case SGML_CATA_LINKTYPE:
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case SGML_CATA_NOTATION:
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case SGML_CATA_DELEGATE:
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case SGML_CATA_BASE:
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case SGML_CATA_CATALOG:
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case SGML_CATA_DOCUMENT:
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case SGML_CATA_SGMLDECL:
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = cur->next;
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDumpXMLCatalog(FILE *out, xmlCatalogEntryPtr catal) {
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr doc;
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr ns;
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDtdPtr dtd;
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr catalog;
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlOutputBufferPtr buf;
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Rebuild a catalog
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    doc = xmlNewDoc(NULL);
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc == NULL)
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dtd = xmlNewDtd(doc, BAD_CAST "catalog",
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       BAD_CAST "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN",
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BAD_CAST "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd");
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAddChild((xmlNodePtr) doc, (xmlNodePtr) dtd);
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ns = xmlNewNs(NULL, XML_CATALOGS_NAMESPACE, NULL);
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ns == NULL) {
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeDoc(doc);
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    catalog = xmlNewDocNode(doc, ns, BAD_CAST "catalog", NULL);
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catalog == NULL) {
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeNs(ns);
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeDoc(doc);
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    catalog->nsDef = ns;
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAddChild((xmlNodePtr) doc, catalog);
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDumpXMLCatalogNode(catal, catalog, doc, ns, NULL);
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * reserialize it
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf = xmlOutputBufferCreateFile(out, NULL);
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf == NULL) {
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeDoc(doc);
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlSaveFormatFileTo(buf, doc, NULL, 1);
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Free it
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFreeDoc(doc);
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			Converting SGML Catalogs to XML			*
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogConvertEntry:
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @entry:  the entry
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal:  pointer to the catalog being converted
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Convert one entry from the catalog
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogConvertEntry(xmlCatalogEntryPtr entry, xmlCatalogPtr catal) {
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((entry == NULL) || (catal == NULL) || (catal->sgml == NULL) ||
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(catal->xml == NULL))
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (entry->type) {
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_ENTITY:
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    entry->type = XML_CATA_PUBLIC;
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_PENTITY:
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    entry->type = XML_CATA_PUBLIC;
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_DOCTYPE:
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    entry->type = XML_CATA_PUBLIC;
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_LINKTYPE:
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    entry->type = XML_CATA_PUBLIC;
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_NOTATION:
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    entry->type = XML_CATA_PUBLIC;
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_PUBLIC:
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    entry->type = XML_CATA_PUBLIC;
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_SYSTEM:
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    entry->type = XML_CATA_SYSTEM;
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_DELEGATE:
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    entry->type = XML_CATA_DELEGATE_PUBLIC;
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SGML_CATA_CATALOG:
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    entry->type = XML_CATA_CATALOG;
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlHashRemoveEntry(catal->sgml, entry->name,
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		               (xmlHashDeallocator) xmlFreeCatalogEntry);
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return;
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Conversion successful, remove from the SGML catalog
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * and add it to the default XML one
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHashRemoveEntry(catal->sgml, entry->name, NULL);
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->parent = catal->xml;
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->next = NULL;
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal->xml->children == NULL)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	catal->xml->children = entry;
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else {
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlCatalogEntryPtr prev;
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prev = catal->xml->children;
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (prev->next != NULL)
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    prev = prev->next;
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prev->next = entry;
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlConvertSGMLCatalog:
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal: the catalog
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Convert all the SGML catalog entries as XML ones
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of entries converted if successful, -1 otherwise
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlConvertSGMLCatalog(xmlCatalogPtr catal) {
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((catal == NULL) || (catal->type != XML_SGML_CATALOG_TYPE))
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlDebugCatalogs) {
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext,
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Converting SGML catalog to XML\n");
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHashScan(catal->sgml,
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlHashScanner) xmlCatalogConvertEntry,
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		&catal);
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			Helper function					*
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogUnWrapURN:
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @urn:  an "urn:publicid:" to unwrap
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Expand the URN into the equivalent Public Identifier
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new identifier or NULL, the string must be deallocated
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         by the caller.
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar *
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogUnWrapURN(const xmlChar *urn) {
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar result[2000];
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int i = 0;
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlStrncmp(urn, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1))
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    urn += sizeof(XML_URN_PUBID) - 1;
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (*urn != 0) {
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (i > sizeof(result) - 4)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (*urn == '+') {
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    result[i++] = ' ';
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    urn++;
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (*urn == ':') {
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    result[i++] = '/';
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    result[i++] = '/';
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    urn++;
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (*urn == ';') {
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    result[i++] = ':';
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    result[i++] = ':';
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    urn++;
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (*urn == '%') {
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((urn[1] == '2') && (urn[2] == 'B'))
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		result[i++] = '+';
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if ((urn[1] == '3') && (urn[2] == 'A'))
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		result[i++] = ':';
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if ((urn[1] == '2') && (urn[2] == 'F'))
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		result[i++] = '/';
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if ((urn[1] == '3') && (urn[2] == 'B'))
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		result[i++] = ';';
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if ((urn[1] == '2') && (urn[2] == '7'))
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		result[i++] = '\'';
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if ((urn[1] == '3') && (urn[2] == 'F'))
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		result[i++] = '?';
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if ((urn[1] == '2') && (urn[2] == '3'))
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		result[i++] = '#';
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if ((urn[1] == '2') && (urn[2] == '5'))
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		result[i++] = '%';
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else {
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		result[i++] = *urn;
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		urn++;
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    urn += 3;
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    result[i++] = *urn;
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    urn++;
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result[i] = 0;
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlStrdup(result));
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParseCatalogFile:
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename:  the filename
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse an XML file and build a tree. It's like xmlParseFile()
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * except it bypass all catalog lookups.
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the resulting document tree or NULL in case of error
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDocPtr
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParseCatalogFile(const char *filename) {
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr ret;
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserCtxtPtr ctxt;
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *directory = NULL;
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputPtr inputStream;
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputBufferPtr buf;
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt = xmlNewParserCtxt();
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL) {
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SAX1_ENABLED
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlDefaultSAXHandler.error != NULL) {
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDefaultSAXHandler.error(NULL, "out of memory\n");
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf = xmlParserInputBufferCreateFilename(filename, XML_CHAR_ENCODING_NONE);
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf == NULL) {
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeParserCtxt(ctxt);
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inputStream = xmlNewInputStream(ctxt);
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (inputStream == NULL) {
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeParserCtxt(ctxt);
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inputStream->filename = (char *) xmlCanonicPath((const xmlChar *)filename);
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inputStream->buf = buf;
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inputStream->base = inputStream->buf->buffer->content;
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inputStream->cur = inputStream->buf->buffer->content;
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inputStream->end =
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	&inputStream->buf->buffer->content[inputStream->buf->buffer->use];
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inputPush(ctxt, inputStream);
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt->directory == NULL) && (directory == NULL))
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        directory = xmlParserGetDirectory(filename);
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt->directory == NULL) && (directory != NULL))
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt->directory = directory;
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->valid = 0;
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->validate = 0;
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->loadsubset = 0;
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->pedantic = 0;
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->dictNames = 1;
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParseDocument(ctxt);
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->wellFormed)
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = ctxt->myDoc;
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else {
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = NULL;
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFreeDoc(ctxt->myDoc);
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt->myDoc = NULL;
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFreeParserCtxt(ctxt);
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlLoadFileContent:
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename:  a file path
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Load a file content into memory.
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the 0 terminated string or NULL in case of error
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar *
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlLoadFileContent(const char *filename)
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STAT
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int fd;
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FILE *fd;
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int len;
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    long size;
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STAT
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct stat info;
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *content;
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (filename == NULL)
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STAT
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (stat(filename, &info) < 0)
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STAT
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((fd = open(filename, O_RDONLY)) < 0)
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((fd = fopen(filename, "rb")) == NULL)
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STAT
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size = info.st_size;
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (fseek(fd, 0, SEEK_END) || (size = ftell(fd)) == EOF || fseek(fd, 0, SEEK_SET)) {        /* File operations denied? ok, just close and return failure */
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fclose(fd);
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content = xmlMallocAtomic(size + 10);
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (content == NULL) {
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlCatalogErrMemory("allocating catalog data");
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STAT
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    len = read(fd, content, size);
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    len = fread(content, 1, size, fd);
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len < 0) {
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(content);
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STAT
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    close(fd);
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fclose(fd);
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content[len] = 0;
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(content);
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogNormalizePublic:
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pubID:  the public ID string
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  Normalizes the Public Identifier
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implements 6.2. Public Identifier Normalization
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new string or NULL, the string must be deallocated
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         by the caller.
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar *
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogNormalizePublic(const xmlChar *pubID)
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ok = 1;
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int white;
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *p;
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *ret;
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *q;
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pubID == NULL)
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    white = 1;
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (p = pubID;*p != 0 && ok;p++) {
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!xmlIsBlank_ch(*p))
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            white = 0;
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (*p == 0x20 && !white)
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            white = 1;
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ok = 0;
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ok && !white)	/* is normalized */
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlStrdup(pubID);
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    q = ret;
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    white = 0;
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (p = pubID;*p != 0;p++) {
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (xmlIsBlank_ch(*p)) {
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (q != ret)
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                white = 1;
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (white) {
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *(q++) = 0x20;
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                white = 0;
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *(q++) = *p;
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *q = 0;
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			The XML Catalog parser				*
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlCatalogEntryPtr
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParseXMLCatalogFile(xmlCatalogPrefer prefer, const xmlChar *filename);
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParseXMLCatalogNodeList(xmlNodePtr cur, xmlCatalogPrefer prefer,
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                   xmlCatalogEntryPtr parent, xmlCatalogEntryPtr cgroup);
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar *
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogListXMLResolve(xmlCatalogEntryPtr catal, const xmlChar *pubID,
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	              const xmlChar *sysID);
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar *
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogListXMLResolveURI(xmlCatalogEntryPtr catal, const xmlChar *URI);
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetXMLCatalogEntryType:
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the name
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * lookup the internal type associated to an XML catalog entry name
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the type associated with that name
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlCatalogEntryType
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetXMLCatalogEntryType(const xmlChar *name) {
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogEntryType type = XML_CATA_NONE;
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlStrEqual(name, (const xmlChar *) "system"))
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = XML_CATA_SYSTEM;
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(name, (const xmlChar *) "public"))
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = XML_CATA_PUBLIC;
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(name, (const xmlChar *) "rewriteSystem"))
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = XML_CATA_REWRITE_SYSTEM;
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(name, (const xmlChar *) "delegatePublic"))
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = XML_CATA_DELEGATE_PUBLIC;
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(name, (const xmlChar *) "delegateSystem"))
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = XML_CATA_DELEGATE_SYSTEM;
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(name, (const xmlChar *) "uri"))
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = XML_CATA_URI;
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(name, (const xmlChar *) "rewriteURI"))
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = XML_CATA_REWRITE_URI;
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(name, (const xmlChar *) "delegateURI"))
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = XML_CATA_DELEGATE_URI;
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(name, (const xmlChar *) "nextCatalog"))
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = XML_CATA_NEXT_CATALOG;
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(name, (const xmlChar *) "catalog"))
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = XML_CATA_CATALOG;
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(type);
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParseXMLCatalogOneNode:
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the XML node
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the type of Catalog entry
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the name of the node
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @attrName:  the attribute holding the value
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @uriAttrName:  the attribute holding the URI-Reference
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @prefer:  the PUBLIC vs. SYSTEM current preference value
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cgroup:  the group which includes this node
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Finishes the examination of an XML tree node of a catalog and build
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a Catalog entry from it.
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new Catalog entry node or NULL in case of error.
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlCatalogEntryPtr
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParseXMLCatalogOneNode(xmlNodePtr cur, xmlCatalogEntryType type,
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  const xmlChar *name, const xmlChar *attrName,
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  const xmlChar *uriAttrName, xmlCatalogPrefer prefer,
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  xmlCatalogEntryPtr cgroup) {
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ok = 1;
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *uriValue;
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *nameValue = NULL;
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *base = NULL;
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *URL = NULL;
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogEntryPtr ret = NULL;
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attrName != NULL) {
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nameValue = xmlGetProp(cur, attrName);
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (nameValue == NULL) {
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlCatalogErr(ret, cur, XML_CATALOG_MISSING_ATTR,
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  "%s entry lacks '%s'\n", name, attrName, NULL);
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ok = 0;
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uriValue = xmlGetProp(cur, uriAttrName);
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (uriValue == NULL) {
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlCatalogErr(ret, cur, XML_CATALOG_MISSING_ATTR,
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"%s entry lacks '%s'\n", name, uriAttrName, NULL);
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ok = 0;
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ok) {
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (nameValue != NULL)
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(nameValue);
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (uriValue != NULL)
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(uriValue);
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base = xmlNodeGetBase(cur->doc, cur);
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URL = xmlBuildURI(uriValue, base);
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (URL != NULL) {
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlDebugCatalogs > 1) {
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (nameValue != NULL)
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Found %s: '%s' '%s'\n", name, nameValue, URL);
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Found %s: '%s'\n", name, URL);
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlNewCatalogEntry(type, nameValue, uriValue, URL, prefer, cgroup);
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlCatalogErr(ret, cur, XML_CATALOG_ENTRY_BROKEN,
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"%s entry '%s' broken ?: %s\n", name, uriAttrName, uriValue);
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nameValue != NULL)
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(nameValue);
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (uriValue != NULL)
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(uriValue);
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (base != NULL)
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(base);
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (URL != NULL)
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(URL);
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParseXMLCatalogNode:
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the XML node
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @prefer:  the PUBLIC vs. SYSTEM current preference value
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @parent:  the parent Catalog entry
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cgroup:  the group which includes this node
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Examines an XML tree node of a catalog and build
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a Catalog entry from it adding it to its parent. The examination can
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * be recursive.
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParseXMLCatalogNode(xmlNodePtr cur, xmlCatalogPrefer prefer,
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	               xmlCatalogEntryPtr parent, xmlCatalogEntryPtr cgroup)
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *base = NULL;
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogEntryPtr entry = NULL;
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL)
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlStrEqual(cur->name, BAD_CAST "group")) {
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlChar *prop;
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlCatalogPrefer pref = XML_CATA_PREFER_NONE;
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prop = xmlGetProp(cur, BAD_CAST "prefer");
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (prop != NULL) {
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (xmlStrEqual(prop, BAD_CAST "system")) {
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                prefer = XML_CATA_PREFER_SYSTEM;
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else if (xmlStrEqual(prop, BAD_CAST "public")) {
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                prefer = XML_CATA_PREFER_PUBLIC;
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else {
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlCatalogErr(parent, cur, XML_CATALOG_PREFER_VALUE,
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "Invalid value for prefer: '%s'\n",
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      prop, NULL, NULL);
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlFree(prop);
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    pref = prefer;
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prop = xmlGetProp(cur, BAD_CAST "id");
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	base = xmlGetNsProp(cur, BAD_CAST "base", XML_XML_NAMESPACE);
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	entry = xmlNewCatalogEntry(XML_CATA_GROUP, prop, base, NULL, pref, cgroup);
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(prop);
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (xmlStrEqual(cur->name, BAD_CAST "public")) {
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_PUBLIC,
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BAD_CAST "public", BAD_CAST "publicId", BAD_CAST "uri", prefer, cgroup);
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (xmlStrEqual(cur->name, BAD_CAST "system")) {
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_SYSTEM,
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BAD_CAST "system", BAD_CAST "systemId", BAD_CAST "uri", prefer, cgroup);
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (xmlStrEqual(cur->name, BAD_CAST "rewriteSystem")) {
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_REWRITE_SYSTEM,
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BAD_CAST "rewriteSystem", BAD_CAST "systemIdStartString",
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BAD_CAST "rewritePrefix", prefer, cgroup);
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (xmlStrEqual(cur->name, BAD_CAST "delegatePublic")) {
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_DELEGATE_PUBLIC,
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BAD_CAST "delegatePublic", BAD_CAST "publicIdStartString",
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BAD_CAST "catalog", prefer, cgroup);
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (xmlStrEqual(cur->name, BAD_CAST "delegateSystem")) {
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_DELEGATE_SYSTEM,
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BAD_CAST "delegateSystem", BAD_CAST "systemIdStartString",
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BAD_CAST "catalog", prefer, cgroup);
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (xmlStrEqual(cur->name, BAD_CAST "uri")) {
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_URI,
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BAD_CAST "uri", BAD_CAST "name",
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BAD_CAST "uri", prefer, cgroup);
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (xmlStrEqual(cur->name, BAD_CAST "rewriteURI")) {
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_REWRITE_URI,
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BAD_CAST "rewriteURI", BAD_CAST "uriStartString",
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BAD_CAST "rewritePrefix", prefer, cgroup);
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (xmlStrEqual(cur->name, BAD_CAST "delegateURI")) {
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_DELEGATE_URI,
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BAD_CAST "delegateURI", BAD_CAST "uriStartString",
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BAD_CAST "catalog", prefer, cgroup);
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (xmlStrEqual(cur->name, BAD_CAST "nextCatalog")) {
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_NEXT_CATALOG,
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BAD_CAST "nextCatalog", NULL,
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BAD_CAST "catalog", prefer, cgroup);
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (entry != NULL) {
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (parent != NULL) {
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    entry->parent = parent;
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (parent->children == NULL)
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		parent->children = entry;
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else {
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlCatalogEntryPtr prev;
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		prev = parent->children;
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while (prev->next != NULL)
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    prev = prev->next;
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		prev->next = entry;
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (entry->type == XML_CATA_GROUP) {
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * Recurse to propagate prefer to the subtree
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * (xml:base handling is automated)
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlParseXMLCatalogNodeList(cur->children, prefer, parent, entry);
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (base != NULL)
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(base);
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParseXMLCatalogNodeList:
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the XML node list of siblings
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @prefer:  the PUBLIC vs. SYSTEM current preference value
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @parent:  the parent Catalog entry
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cgroup:  the group which includes this list
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Examines a list of XML sibling nodes of a catalog and build
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a list of Catalog entry from it adding it to the parent.
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The examination will recurse to examine node subtrees.
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParseXMLCatalogNodeList(xmlNodePtr cur, xmlCatalogPrefer prefer,
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                   xmlCatalogEntryPtr parent, xmlCatalogEntryPtr cgroup) {
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((cur->ns != NULL) && (cur->ns->href != NULL) &&
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (xmlStrEqual(cur->ns->href, XML_CATALOGS_NAMESPACE))) {
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlParseXMLCatalogNode(cur, prefer, parent, cgroup);
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = cur->next;
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* TODO: sort the list according to REWRITE lengths and prefer value */
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParseXMLCatalogFile:
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @prefer:  the PUBLIC vs. SYSTEM current preference value
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename:  the filename for the catalog
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parses the catalog file to extract the XML tree and then analyze the
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * tree to build a list of Catalog entries corresponding to this catalog
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the resulting Catalog entries list
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlCatalogEntryPtr
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParseXMLCatalogFile(xmlCatalogPrefer prefer, const xmlChar *filename) {
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr doc;
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *prop;
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogEntryPtr parent = NULL;
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (filename == NULL)
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    doc = xmlParseCatalogFile((const char *) filename);
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc == NULL) {
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlDebugCatalogs)
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Failed to parse catalog %s\n", filename);
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlDebugCatalogs)
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext,
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"%d Parsing catalog %s\n", xmlGetThreadId(), filename);
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = xmlDocGetRootElement(doc);
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur != NULL) && (xmlStrEqual(cur->name, BAD_CAST "catalog")) &&
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(cur->ns != NULL) && (cur->ns->href != NULL) &&
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(xmlStrEqual(cur->ns->href, XML_CATALOGS_NAMESPACE))) {
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	parent = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL,
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    (const xmlChar *)filename, NULL, prefer, NULL);
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (parent == NULL) {
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFreeDoc(doc);
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prop = xmlGetProp(cur, BAD_CAST "prefer");
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (prop != NULL) {
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlStrEqual(prop, BAD_CAST "system")) {
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		prefer = XML_CATA_PREFER_SYSTEM;
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (xmlStrEqual(prop, BAD_CAST "public")) {
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		prefer = XML_CATA_PREFER_PUBLIC;
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlCatalogErr(NULL, cur, XML_CATALOG_PREFER_VALUE,
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      "Invalid value for prefer: '%s'\n",
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      prop, NULL, NULL);
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(prop);
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = cur->children;
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlParseXMLCatalogNodeList(cur, prefer, parent, NULL);
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlCatalogErr(NULL, (xmlNodePtr) doc, XML_CATALOG_NOT_CATALOG,
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      "File %s is not an XML Catalog\n",
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      filename, NULL, NULL);
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeDoc(doc);
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFreeDoc(doc);
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(parent);
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFetchXMLCatalogFile:
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal:  an existing but incomplete catalog entry
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Fetch and parse the subcatalog referenced by an entry
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success, -1 otherwise
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFetchXMLCatalogFile(xmlCatalogEntryPtr catal) {
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogEntryPtr doc;
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal == NULL)
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal->URL == NULL)
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal->children != NULL)
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * lock the whole catalog for modification
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRMutexLock(xmlCatalogMutex);
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal->children != NULL) {
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* Okay someone else did it in the meantime */
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRMutexUnlock(xmlCatalogMutex);
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlCatalogXMLFiles != NULL) {
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	doc = (xmlCatalogEntryPtr)
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlHashLookup(xmlCatalogXMLFiles, catal->URL);
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (doc != NULL) {
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlDebugCatalogs)
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Found %s in file hash\n", catal->URL);
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (catal->type == XML_CATA_CATALOG)
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		catal->children = doc->children;
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		catal->children = doc;
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    catal->dealloc = 0;
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlRMutexUnlock(xmlCatalogMutex);
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(0);
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlDebugCatalogs)
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"%s not found in file hash\n", catal->URL);
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Fetch and parse. Note that xmlParseXMLCatalogFile does not
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * use the existing catalog, there is no recursion allowed at
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * that level.
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    doc = xmlParseXMLCatalogFile(catal->prefer, catal->URL);
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc == NULL) {
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	catal->type = XML_CATA_BROKEN_CATALOG;
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRMutexUnlock(xmlCatalogMutex);
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal->type == XML_CATA_CATALOG)
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	catal->children = doc->children;
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	catal->children = doc;
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    doc->dealloc = 1;
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlCatalogXMLFiles == NULL)
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlCatalogXMLFiles = xmlHashCreate(10);
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlCatalogXMLFiles != NULL) {
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlDebugCatalogs)
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"%s added to file hash\n", catal->URL);
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlHashAddEntry(xmlCatalogXMLFiles, catal->URL, doc);
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRMutexUnlock(xmlCatalogMutex);
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			XML Catalog handling				*
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlAddXMLCatalog:
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal:  top of an XML catalog
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the type of record to add to the catalog
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @orig:  the system, public or prefix to match (or NULL)
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @replace:  the replacement value for the match
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add an entry in the XML catalog, it may overwrite existing but
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * different entries.
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if successful, -1 otherwise
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAddXMLCatalog(xmlCatalogEntryPtr catal, const xmlChar *type,
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      const xmlChar *orig, const xmlChar *replace) {
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogEntryPtr cur;
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogEntryType typ;
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int doregister = 0;
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((catal == NULL) ||
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((catal->type != XML_CATA_CATALOG) &&
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 (catal->type != XML_CATA_BROKEN_CATALOG)))
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal->children == NULL) {
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFetchXMLCatalogFile(catal);
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal->children == NULL)
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	doregister = 1;
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typ = xmlGetXMLCatalogEntryType(type);
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (typ == XML_CATA_NONE) {
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlDebugCatalogs)
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Failed to add unknown element %s to catalog\n", type);
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = catal->children;
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Might be a simple "update in place"
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur != NULL) {
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (cur != NULL) {
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((orig != NULL) && (cur->type == typ) &&
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlStrEqual(orig, cur->name))) {
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlDebugCatalogs)
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlGenericError(xmlGenericErrorContext,
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "Updating element %s to catalog\n", type);
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (cur->value != NULL)
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(cur->value);
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (cur->URL != NULL)
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(cur->URL);
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur->value = xmlStrdup(replace);
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur->URL = xmlStrdup(replace);
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(0);
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->next == NULL)
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->next;
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlDebugCatalogs)
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext,
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Adding element %s to catalog\n", type);
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL)
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	catal->children = xmlNewCatalogEntry(typ, orig, replace,
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		                             NULL, catal->prefer, NULL);
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->next = xmlNewCatalogEntry(typ, orig, replace,
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		                       NULL, catal->prefer, NULL);
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doregister) {
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        catal->type = XML_CATA_CATALOG;
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = xmlHashLookup(xmlCatalogXMLFiles, catal->URL);
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur != NULL)
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->children = catal->children;
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDelXMLCatalog:
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal:  top of an XML catalog
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value:  the value to remove from the catalog
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Remove entries in the XML catalog where the value or the URI
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is equal to @value
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of entries removed if successful, -1 otherwise
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDelXMLCatalog(xmlCatalogEntryPtr catal, const xmlChar *value) {
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogEntryPtr cur;
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((catal == NULL) ||
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((catal->type != XML_CATA_CATALOG) &&
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 (catal->type != XML_CATA_BROKEN_CATALOG)))
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value == NULL)
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal->children == NULL) {
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFetchXMLCatalogFile(catal);
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Scan the children
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = catal->children;
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (((cur->name != NULL) && (xmlStrEqual(value, cur->name))) ||
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (xmlStrEqual(value, cur->value))) {
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlDebugCatalogs) {
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (cur->name != NULL)
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlGenericError(xmlGenericErrorContext,
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "Removing element %s from catalog\n", cur->name);
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlGenericError(xmlGenericErrorContext,
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "Removing element %s from catalog\n", cur->value);
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->type = XML_CATA_REMOVED;
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = cur->next;
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogXMLResolve:
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal:  a catalog list
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pubID:  the public ID string
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sysID:  the system ID string
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a complete resolution lookup of an External Identifier for a
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * list of catalog entries.
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implements (or tries to) 7.1. External Identifier Resolution
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the URI of the resource or NULL if not found
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar *
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogXMLResolve(xmlCatalogEntryPtr catal, const xmlChar *pubID,
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	              const xmlChar *sysID) {
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *ret = NULL;
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogEntryPtr cur;
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int haveDelegate = 0;
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int haveNext = 0;
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * protection against loops
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal->depth > MAX_CATAL_DEPTH) {
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlCatalogErr(catal, NULL, XML_CATALOG_RECURSION,
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      "Detected recursion in catalog %s\n",
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      catal->name, NULL, NULL);
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    catal->depth++;
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * First tries steps 2/ 3/ 4/ if a system ID is provided.
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (sysID != NULL) {
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlCatalogEntryPtr rewrite = NULL;
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int lenrewrite = 0, len;
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = catal;
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	haveDelegate = 0;
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (cur != NULL) {
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    switch (cur->type) {
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_CATA_SYSTEM:
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlStrEqual(sysID, cur->name)) {
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (xmlDebugCatalogs)
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlGenericError(xmlGenericErrorContext,
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    "Found system match %s, using %s\n",
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				            cur->name, cur->URL);
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			catal->depth--;
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return(xmlStrdup(cur->URL));
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_CATA_REWRITE_SYSTEM:
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    len = xmlStrlen(cur->name);
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((len > lenrewrite) &&
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(!xmlStrncmp(sysID, cur->name, len))) {
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			lenrewrite = len;
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			rewrite = cur;
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_CATA_DELEGATE_SYSTEM:
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (!xmlStrncmp(sysID, cur->name, xmlStrlen(cur->name)))
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			haveDelegate++;
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_CATA_NEXT_CATALOG:
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    haveNext++;
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		default:
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->next;
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (rewrite != NULL) {
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlDebugCatalogs)
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Using rewriting rule %s\n", rewrite->name);
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlStrdup(rewrite->URL);
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret != NULL)
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlStrcat(ret, &sysID[lenrewrite]);
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    catal->depth--;
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(ret);
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (haveDelegate) {
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    const xmlChar *delegates[MAX_DELEGATE];
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int nbList = 0, i;
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * Assume the entries have been sorted by decreasing substring
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * matches when the list was produced.
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = catal;
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (cur != NULL) {
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((cur->type == XML_CATA_DELEGATE_SYSTEM) &&
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (!xmlStrncmp(sysID, cur->name, xmlStrlen(cur->name)))) {
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    for (i = 0;i < nbList;i++)
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (xmlStrEqual(cur->URL, delegates[i]))
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    break;
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (i < nbList) {
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			cur = cur->next;
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			continue;
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (nbList < MAX_DELEGATE)
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			delegates[nbList++] = cur->URL;
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (cur->children == NULL) {
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlFetchXMLCatalogFile(cur);
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (cur->children != NULL) {
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (xmlDebugCatalogs)
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlGenericError(xmlGenericErrorContext,
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    "Trying system delegate %s\n", cur->URL);
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ret = xmlCatalogListXMLResolve(
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				cur->children, NULL, sysID);
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (ret != NULL) {
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    catal->depth--;
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    return(ret);
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur = cur->next;
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * Apply the cut algorithm explained in 4/
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    catal->depth--;
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(XML_CATAL_BREAK);
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Then tries 5/ 6/ if a public ID is provided
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pubID != NULL) {
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = catal;
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	haveDelegate = 0;
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (cur != NULL) {
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    switch (cur->type) {
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_CATA_PUBLIC:
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlStrEqual(pubID, cur->name)) {
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (xmlDebugCatalogs)
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlGenericError(xmlGenericErrorContext,
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    "Found public match %s\n", cur->name);
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			catal->depth--;
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return(xmlStrdup(cur->URL));
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_CATA_DELEGATE_PUBLIC:
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (!xmlStrncmp(pubID, cur->name, xmlStrlen(cur->name)) &&
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(cur->prefer == XML_CATA_PREFER_PUBLIC))
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			haveDelegate++;
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_CATA_NEXT_CATALOG:
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (sysID == NULL)
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			haveNext++;
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		default:
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->next;
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (haveDelegate) {
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    const xmlChar *delegates[MAX_DELEGATE];
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int nbList = 0, i;
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * Assume the entries have been sorted by decreasing substring
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * matches when the list was produced.
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = catal;
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (cur != NULL) {
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((cur->type == XML_CATA_DELEGATE_PUBLIC) &&
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (cur->prefer == XML_CATA_PREFER_PUBLIC) &&
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (!xmlStrncmp(pubID, cur->name, xmlStrlen(cur->name)))) {
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    for (i = 0;i < nbList;i++)
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (xmlStrEqual(cur->URL, delegates[i]))
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    break;
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (i < nbList) {
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			cur = cur->next;
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			continue;
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (nbList < MAX_DELEGATE)
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			delegates[nbList++] = cur->URL;
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (cur->children == NULL) {
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlFetchXMLCatalogFile(cur);
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (cur->children != NULL) {
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (xmlDebugCatalogs)
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlGenericError(xmlGenericErrorContext,
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    "Trying public delegate %s\n", cur->URL);
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ret = xmlCatalogListXMLResolve(
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				cur->children, pubID, NULL);
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (ret != NULL) {
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    catal->depth--;
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    return(ret);
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur = cur->next;
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * Apply the cut algorithm explained in 4/
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    catal->depth--;
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(XML_CATAL_BREAK);
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (haveNext) {
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = catal;
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (cur != NULL) {
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->type == XML_CATA_NEXT_CATALOG) {
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (cur->children == NULL) {
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFetchXMLCatalogFile(cur);
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (cur->children != NULL) {
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = xmlCatalogListXMLResolve(cur->children, pubID, sysID);
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ret != NULL) {
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			catal->depth--;
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return(ret);
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } else if (catal->depth > MAX_CATAL_DEPTH) {
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        return(NULL);
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->next;
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    catal->depth--;
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogXMLResolveURI:
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal:  a catalog list
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URI:  the URI
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sysID:  the system ID string
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a complete resolution lookup of an External Identifier for a
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * list of catalog entries.
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implements (or tries to) 7.2.2. URI Resolution
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the URI of the resource or NULL if not found
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar *
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogXMLResolveURI(xmlCatalogEntryPtr catal, const xmlChar *URI) {
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *ret = NULL;
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogEntryPtr cur;
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int haveDelegate = 0;
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int haveNext = 0;
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogEntryPtr rewrite = NULL;
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int lenrewrite = 0, len;
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal == NULL)
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (URI == NULL)
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal->depth > MAX_CATAL_DEPTH) {
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlCatalogErr(catal, NULL, XML_CATALOG_RECURSION,
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      "Detected recursion in catalog %s\n",
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      catal->name, NULL, NULL);
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * First tries steps 2/ 3/ 4/ if a system ID is provided.
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = catal;
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    haveDelegate = 0;
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (cur->type) {
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_CATA_URI:
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlStrEqual(URI, cur->name)) {
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlDebugCatalogs)
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlGenericError(xmlGenericErrorContext,
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				"Found URI match %s\n", cur->name);
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(xmlStrdup(cur->URL));
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_CATA_REWRITE_URI:
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		len = xmlStrlen(cur->name);
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((len > lenrewrite) &&
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (!xmlStrncmp(URI, cur->name, len))) {
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    lenrewrite = len;
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    rewrite = cur;
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_CATA_DELEGATE_URI:
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (!xmlStrncmp(URI, cur->name, xmlStrlen(cur->name)))
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    haveDelegate++;
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_CATA_NEXT_CATALOG:
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		haveNext++;
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = cur->next;
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (rewrite != NULL) {
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlDebugCatalogs)
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Using rewriting rule %s\n", rewrite->name);
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlStrdup(rewrite->URL);
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret != NULL)
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlStrcat(ret, &URI[lenrewrite]);
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ret);
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (haveDelegate) {
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const xmlChar *delegates[MAX_DELEGATE];
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int nbList = 0, i;
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * Assume the entries have been sorted by decreasing substring
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * matches when the list was produced.
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = catal;
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (cur != NULL) {
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (((cur->type == XML_CATA_DELEGATE_SYSTEM) ||
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (cur->type == XML_CATA_DELEGATE_URI)) &&
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(!xmlStrncmp(URI, cur->name, xmlStrlen(cur->name)))) {
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		for (i = 0;i < nbList;i++)
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlStrEqual(cur->URL, delegates[i]))
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (i < nbList) {
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur = cur->next;
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    continue;
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (nbList < MAX_DELEGATE)
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    delegates[nbList++] = cur->URL;
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (cur->children == NULL) {
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFetchXMLCatalogFile(cur);
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (cur->children != NULL) {
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlDebugCatalogs)
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlGenericError(xmlGenericErrorContext,
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				"Trying URI delegate %s\n", cur->URL);
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = xmlCatalogListXMLResolveURI(
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    cur->children, URI);
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ret != NULL)
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return(ret);
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->next;
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * Apply the cut algorithm explained in 4/
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(XML_CATAL_BREAK);
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (haveNext) {
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = catal;
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (cur != NULL) {
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->type == XML_CATA_NEXT_CATALOG) {
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (cur->children == NULL) {
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFetchXMLCatalogFile(cur);
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (cur->children != NULL) {
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = xmlCatalogListXMLResolveURI(cur->children, URI);
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ret != NULL)
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return(ret);
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->next;
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogListXMLResolve:
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal:  a catalog list
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pubID:  the public ID string
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sysID:  the system ID string
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a complete resolution lookup of an External Identifier for a
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * list of catalogs
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implements (or tries to) 7.1. External Identifier Resolution
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the URI of the resource or NULL if not found
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar *
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogListXMLResolve(xmlCatalogEntryPtr catal, const xmlChar *pubID,
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	              const xmlChar *sysID) {
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *ret = NULL;
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *urnID = NULL;
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *normid;
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal == NULL)
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((pubID == NULL) && (sysID == NULL))
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    normid = xmlCatalogNormalizePublic(pubID);
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (normid != NULL)
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pubID = (*normid != 0 ? normid : NULL);
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlStrncmp(pubID, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1)) {
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	urnID = xmlCatalogUnWrapURN(pubID);
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlDebugCatalogs) {
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (urnID == NULL)
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Public URN ID %s expanded to NULL\n", pubID);
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Public URN ID expanded to %s\n", urnID);
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlCatalogListXMLResolve(catal, urnID, sysID);
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (urnID != NULL)
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(urnID);
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (normid != NULL)
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(normid);
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ret);
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlStrncmp(sysID, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1)) {
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	urnID = xmlCatalogUnWrapURN(sysID);
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlDebugCatalogs) {
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (urnID == NULL)
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"System URN ID %s expanded to NULL\n", sysID);
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"System URN ID expanded to %s\n", urnID);
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (pubID == NULL)
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlCatalogListXMLResolve(catal, urnID, NULL);
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if (xmlStrEqual(pubID, urnID))
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlCatalogListXMLResolve(catal, pubID, NULL);
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else {
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlCatalogListXMLResolve(catal, pubID, urnID);
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (urnID != NULL)
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(urnID);
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (normid != NULL)
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(normid);
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ret);
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (catal != NULL) {
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (catal->type == XML_CATA_CATALOG) {
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (catal->children == NULL) {
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFetchXMLCatalogFile(catal);
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (catal->children != NULL) {
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlCatalogXMLResolve(catal->children, pubID, sysID);
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret != NULL) {
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                } else if ((catal->children != NULL) &&
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		           (catal->children->depth > MAX_CATAL_DEPTH)) {
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	            ret = NULL;
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        }
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	catal = catal->next;
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (normid != NULL)
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(normid);
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogListXMLResolveURI:
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal:  a catalog list
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URI:  the URI
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a complete resolution lookup of an URI for a list of catalogs
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implements (or tries to) 7.2. URI Resolution
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the URI of the resource or NULL if not found
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar *
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogListXMLResolveURI(xmlCatalogEntryPtr catal, const xmlChar *URI) {
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *ret = NULL;
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *urnID = NULL;
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal == NULL)
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (URI == NULL)
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlStrncmp(URI, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1)) {
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	urnID = xmlCatalogUnWrapURN(URI);
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlDebugCatalogs) {
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (urnID == NULL)
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"URN ID %s expanded to NULL\n", URI);
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"URN ID expanded to %s\n", urnID);
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlCatalogListXMLResolve(catal, urnID, NULL);
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (urnID != NULL)
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(urnID);
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ret);
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (catal != NULL) {
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (catal->type == XML_CATA_CATALOG) {
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (catal->children == NULL) {
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFetchXMLCatalogFile(catal);
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (catal->children != NULL) {
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlCatalogXMLResolveURI(catal->children, URI);
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret != NULL)
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(ret);
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	catal = catal->next;
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			The SGML Catalog parser				*
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define RAW *cur
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NEXT cur++;
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SKIP(x) cur += x;
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SKIP_BLANKS while (IS_BLANK_CH(*cur)) NEXT;
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParseSGMLCatalogComment:
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the current character
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Skip a comment in an SGML catalog
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns new current character
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParseSGMLCatalogComment(const xmlChar *cur) {
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur[0] != '-') || (cur[1] != '-'))
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(cur);
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SKIP(2);
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((cur[0] != 0) && ((cur[0] != '-') || ((cur[1] != '-'))))
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	NEXT;
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur[0] == 0) {
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur + 2);
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParseSGMLCatalogPubid:
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the current character
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @id:  the return location
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parse an SGML catalog ID
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns new current character and store the value in @id
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParseSGMLCatalogPubid(const xmlChar *cur, xmlChar **id) {
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *buf = NULL, *tmp;
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int len = 0;
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int size = 50;
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar stop;
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int count = 0;
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *id = NULL;
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (RAW == '"') {
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NEXT;
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	stop = '"';
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (RAW == '\'') {
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NEXT;
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	stop = '\'';
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	stop = ' ';
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar));
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf == NULL) {
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlCatalogErrMemory("allocating public ID");
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (IS_PUBIDCHAR_CH(*cur) || (*cur == '?')) {
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((*cur == stop) && (stop != ' '))
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((stop == ' ') && (IS_BLANK_CH(*cur)))
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (len + 1 >= size) {
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    size *= 2;
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar));
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (tmp == NULL) {
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlCatalogErrMemory("allocating public ID");
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(buf);
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(NULL);
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    buf = tmp;
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	buf[len++] = *cur;
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	count++;
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	NEXT;
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf[len] = 0;
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (stop == ' ') {
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (!IS_BLANK_CH(*cur)) {
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(buf);
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (*cur != stop) {
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(buf);
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	NEXT;
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *id = buf;
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParseSGMLCatalogName:
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the current character
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the return location
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parse an SGML catalog name
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns new current character and store the value in @name
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParseSGMLCatalogName(const xmlChar *cur, xmlChar **name) {
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar buf[XML_MAX_NAMELEN + 5];
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int len = 0;
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int c;
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *name = NULL;
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Handler for more complex cases
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    c = *cur;
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((!IS_LETTER(c) && (c != '_') && (c != ':'))) {
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (((IS_LETTER(c)) || (IS_DIGIT(c)) ||
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (c == '.') || (c == '-') ||
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (c == '_') || (c == ':'))) {
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	buf[len++] = c;
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur++;
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	c = *cur;
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (len >= XML_MAX_NAMELEN)
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *name = xmlStrndup(buf, len);
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetSGMLCatalogEntryType:
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the entry name
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get the Catalog entry type for a given SGML Catalog name
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns Catalog entry type
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlCatalogEntryType
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetSGMLCatalogEntryType(const xmlChar *name) {
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogEntryType type = XML_CATA_NONE;
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlStrEqual(name, (const xmlChar *) "SYSTEM"))
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = SGML_CATA_SYSTEM;
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(name, (const xmlChar *) "PUBLIC"))
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = SGML_CATA_PUBLIC;
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(name, (const xmlChar *) "DELEGATE"))
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = SGML_CATA_DELEGATE;
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(name, (const xmlChar *) "ENTITY"))
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = SGML_CATA_ENTITY;
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(name, (const xmlChar *) "DOCTYPE"))
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = SGML_CATA_DOCTYPE;
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(name, (const xmlChar *) "LINKTYPE"))
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = SGML_CATA_LINKTYPE;
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(name, (const xmlChar *) "NOTATION"))
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = SGML_CATA_NOTATION;
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(name, (const xmlChar *) "SGMLDECL"))
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = SGML_CATA_SGMLDECL;
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(name, (const xmlChar *) "DOCUMENT"))
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = SGML_CATA_DOCUMENT;
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(name, (const xmlChar *) "CATALOG"))
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = SGML_CATA_CATALOG;
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (xmlStrEqual(name, (const xmlChar *) "BASE"))
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	type = SGML_CATA_BASE;
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(type);
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParseSGMLCatalog:
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal:  the SGML Catalog
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value:  the content of the SGML Catalog serialization
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @file:  the filepath for the catalog
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @super:  should this be handled as a Super Catalog in which case
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *          parsing is not recursive
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parse an SGML catalog content and fill up the @catal hash table with
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the new entries found.
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success, -1 in case of error.
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParseSGMLCatalog(xmlCatalogPtr catal, const xmlChar *value,
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	            const char *file, int super) {
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *cur = value;
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *base = NULL;
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res;
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur == NULL) || (file == NULL))
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base = xmlStrdup((const xmlChar *) file);
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((cur != NULL) && (cur[0] != 0)) {
23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	SKIP_BLANKS;
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur[0] == 0)
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((cur[0] == '-') && (cur[1] == '-')) {
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = xmlParseSGMLCatalogComment(cur);
23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur == NULL) {
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* error */
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *sysid = NULL;
23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *name = NULL;
23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlCatalogEntryType type = XML_CATA_NONE;
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = xmlParseSGMLCatalogName(cur, &name);
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (name == NULL) {
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* error */
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (!IS_BLANK_CH(*cur)) {
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* error */
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    SKIP_BLANKS;
23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlStrEqual(name, (const xmlChar *) "SYSTEM"))
23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                type = SGML_CATA_SYSTEM;
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if (xmlStrEqual(name, (const xmlChar *) "PUBLIC"))
23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                type = SGML_CATA_PUBLIC;
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if (xmlStrEqual(name, (const xmlChar *) "DELEGATE"))
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                type = SGML_CATA_DELEGATE;
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if (xmlStrEqual(name, (const xmlChar *) "ENTITY"))
23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                type = SGML_CATA_ENTITY;
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if (xmlStrEqual(name, (const xmlChar *) "DOCTYPE"))
23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                type = SGML_CATA_DOCTYPE;
23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if (xmlStrEqual(name, (const xmlChar *) "LINKTYPE"))
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                type = SGML_CATA_LINKTYPE;
23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if (xmlStrEqual(name, (const xmlChar *) "NOTATION"))
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                type = SGML_CATA_NOTATION;
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if (xmlStrEqual(name, (const xmlChar *) "SGMLDECL"))
23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                type = SGML_CATA_SGMLDECL;
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if (xmlStrEqual(name, (const xmlChar *) "DOCUMENT"))
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                type = SGML_CATA_DOCUMENT;
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if (xmlStrEqual(name, (const xmlChar *) "CATALOG"))
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                type = SGML_CATA_CATALOG;
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if (xmlStrEqual(name, (const xmlChar *) "BASE"))
23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                type = SGML_CATA_BASE;
23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else if (xmlStrEqual(name, (const xmlChar *) "OVERRIDE")) {
23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(name);
23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur = xmlParseSGMLCatalogName(cur, &name);
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (name == NULL) {
23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /* error */
23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(name);
23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(name);
23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    name = NULL;
23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    switch(type) {
23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case SGML_CATA_ENTITY:
23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (*cur == '%')
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			type = SGML_CATA_PENTITY;
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case SGML_CATA_PENTITY:
23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case SGML_CATA_DOCTYPE:
24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case SGML_CATA_LINKTYPE:
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case SGML_CATA_NOTATION:
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur = xmlParseSGMLCatalogName(cur, &name);
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (cur == NULL) {
24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/* error */
24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (!IS_BLANK_CH(*cur)) {
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/* error */
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    SKIP_BLANKS;
24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur = xmlParseSGMLCatalogPubid(cur, &sysid);
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (cur == NULL) {
24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/* error */
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case SGML_CATA_PUBLIC:
24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case SGML_CATA_SYSTEM:
24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case SGML_CATA_DELEGATE:
24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur = xmlParseSGMLCatalogPubid(cur, &name);
24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (cur == NULL) {
24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/* error */
24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (type != SGML_CATA_SYSTEM) {
24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        xmlChar *normid;
24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        normid = xmlCatalogNormalizePublic(name);
24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        if (normid != NULL) {
24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		            if (name != NULL)
24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		                xmlFree(name);
24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		            if (*normid != 0)
24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		                name = normid;
24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		            else {
24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		                xmlFree(normid);
24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		                name = NULL;
24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		            }
24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        }
24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (!IS_BLANK_CH(*cur)) {
24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/* error */
24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    SKIP_BLANKS;
24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur = xmlParseSGMLCatalogPubid(cur, &sysid);
24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (cur == NULL) {
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/* error */
24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case SGML_CATA_BASE:
24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case SGML_CATA_CATALOG:
24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case SGML_CATA_DOCUMENT:
24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case SGML_CATA_SGMLDECL:
24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur = xmlParseSGMLCatalogPubid(cur, &sysid);
24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (cur == NULL) {
24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/* error */
24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		default:
24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur == NULL) {
24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (name != NULL)
24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(name);
24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (sysid != NULL)
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(sysid);
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (type == SGML_CATA_BASE) {
24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (base != NULL)
24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(base);
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		base = xmlStrdup(sysid);
24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if ((type == SGML_CATA_PUBLIC) ||
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       (type == SGML_CATA_SYSTEM)) {
24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlChar *filename;
24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		filename = xmlBuildURI(sysid, base);
24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (filename != NULL) {
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlCatalogEntryPtr entry;
24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    entry = xmlNewCatalogEntry(type, name, filename,
24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			                       NULL, XML_CATA_PREFER_NONE, NULL);
24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    res = xmlHashAddEntry(catal->sgml, name, entry);
24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (res < 0) {
24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlFreeCatalogEntry(entry);
24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(filename);
24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (type == SGML_CATA_CATALOG) {
24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (super) {
24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlCatalogEntryPtr entry;
24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    entry = xmlNewCatalogEntry(type, sysid, NULL, NULL,
24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			                       XML_CATA_PREFER_NONE, NULL);
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    res = xmlHashAddEntry(catal->sgml, sysid, entry);
24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (res < 0) {
25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlFreeCatalogEntry(entry);
25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlChar *filename;
25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    filename = xmlBuildURI(sysid, base);
25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (filename != NULL) {
25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlExpandCatalog(catal, (const char *)filename);
25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlFree(filename);
25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * drop anything else we won't handle it
25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (name != NULL)
25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(name);
25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (sysid != NULL)
25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(sysid);
25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (base != NULL)
25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(base);
25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL)
25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			SGML Catalog handling				*
25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogGetSGMLPublic:
25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal:  an SGML catalog hash
25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pubID:  the public ID string
25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Try to lookup the catalog local reference associated to a public ID
25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the local resource if found or NULL otherwise.
25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *
25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogGetSGMLPublic(xmlHashTablePtr catal, const xmlChar *pubID) {
25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogEntryPtr entry;
25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *normid;
25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal == NULL)
25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    normid = xmlCatalogNormalizePublic(pubID);
25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (normid != NULL)
25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pubID = (*normid != 0 ? normid : NULL);
25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry = (xmlCatalogEntryPtr) xmlHashLookup(catal, pubID);
25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (entry == NULL) {
25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (normid != NULL)
25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(normid);
25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (entry->type == SGML_CATA_PUBLIC) {
25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (normid != NULL)
25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(normid);
25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(entry->URL);
25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (normid != NULL)
25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(normid);
25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogGetSGMLSystem:
25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal:  an SGML catalog hash
25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sysID:  the system ID string
25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Try to lookup the catalog local reference for a system ID
25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the local resource if found or NULL otherwise.
25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *
25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogGetSGMLSystem(xmlHashTablePtr catal, const xmlChar *sysID) {
25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogEntryPtr entry;
25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal == NULL)
25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry = (xmlCatalogEntryPtr) xmlHashLookup(catal, sysID);
25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (entry == NULL)
25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (entry->type == SGML_CATA_SYSTEM)
25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(entry->URL);
25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogSGMLResolve:
25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal:  the SGML catalog
25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pubID:  the public ID string
25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sysID:  the system ID string
26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a complete resolution lookup of an External Identifier
26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the URI of the resource or NULL if not found
26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xmlChar *
26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogSGMLResolve(xmlCatalogPtr catal, const xmlChar *pubID,
26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	              const xmlChar *sysID) {
26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *ret = NULL;
26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal->sgml == NULL)
26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pubID != NULL)
26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlCatalogGetSGMLPublic(catal->sgml, pubID);
26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != NULL)
26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ret);
26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (sysID != NULL)
26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlCatalogGetSGMLSystem(catal->sgml, sysID);
26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != NULL)
26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ret);
26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			Specific Public interfaces			*
26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlLoadSGMLSuperCatalog:
26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename:  a file path
26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Load an SGML super catalog. It won't expand CATALOG or DELEGATE
26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * references. This is only needed for manipulating SGML Super Catalogs
26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * like adding and removing CATALOG or DELEGATE entries.
26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the catalog parsed or NULL in case of error
26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogPtr
26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlLoadSGMLSuperCatalog(const char *filename)
26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *content;
26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogPtr catal;
26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content = xmlLoadFileContent(filename);
26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (content == NULL)
26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    catal = xmlCreateNewCatalog(XML_SGML_CATALOG_TYPE, xmlCatalogDefaultPrefer);
26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal == NULL) {
26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(content);
26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlParseSGMLCatalog(catal, content, filename, 1);
26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(content);
26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret < 0) {
26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeCatalog(catal);
26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (catal);
26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlLoadACatalog:
26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename:  a file path
26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Load the catalog and build the associated data structures.
26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This can be either an XML Catalog or an SGML Catalog
26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * It will recurse in SGML CATALOG entries. On the other hand XML
26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Catalogs are not handled recursively.
26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the catalog parsed or NULL in case of error
26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogPtr
26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlLoadACatalog(const char *filename)
26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *content;
26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *first;
26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogPtr catal;
26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content = xmlLoadFileContent(filename);
26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (content == NULL)
26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first = content;
26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((*first != 0) && (*first != '-') && (*first != '<') &&
26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   (!(((*first >= 'A') && (*first <= 'Z')) ||
26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      ((*first >= 'a') && (*first <= 'z')))))
26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	first++;
26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (*first != '<') {
26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	catal = xmlCreateNewCatalog(XML_SGML_CATALOG_TYPE, xmlCatalogDefaultPrefer);
26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (catal == NULL) {
27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(content);
27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = xmlParseSGMLCatalog(catal, content, filename, 0);
27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret < 0) {
27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFreeCatalog(catal);
27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(content);
27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	catal = xmlCreateNewCatalog(XML_XML_CATALOG_TYPE, xmlCatalogDefaultPrefer);
27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (catal == NULL) {
27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(content);
27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        catal->xml = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL,
27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       NULL, BAD_CAST filename, xmlCatalogDefaultPrefer, NULL);
27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(content);
27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (catal);
27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlExpandCatalog:
27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal:  a catalog
27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename:  a file path
27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Load the catalog and expand the existing catal structure.
27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This can be either an XML Catalog or an SGML Catalog
27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success, -1 in case of error
27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlExpandCatalog(xmlCatalogPtr catal, const char *filename)
27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((catal == NULL) || (filename == NULL))
27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal->type == XML_SGML_CATALOG_TYPE) {
27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar *content;
27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	content = xmlLoadFileContent(filename);
27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (content == NULL)
27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = xmlParseSGMLCatalog(catal, content, filename, 0);
27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret < 0) {
27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(content);
27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(content);
27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlCatalogEntryPtr tmp, cur;
27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	tmp = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL,
27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       NULL, BAD_CAST filename, xmlCatalogDefaultPrefer, NULL);
27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = catal->xml;
27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur == NULL) {
27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    catal->xml = tmp;
27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (cur->next != NULL) cur = cur->next;
27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->next = tmp;
27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlACatalogResolveSystem:
27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal:  a Catalog
27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sysID:  the system ID string
27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Try to lookup the catalog resource for a system ID
27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the resource if found or NULL otherwise, the value returned
27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      must be freed by the caller.
27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar *
27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlACatalogResolveSystem(xmlCatalogPtr catal, const xmlChar *sysID) {
27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *ret = NULL;
27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((sysID == NULL) || (catal == NULL))
27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlDebugCatalogs)
27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext,
27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Resolve sysID %s\n", sysID);
27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal->type == XML_XML_CATALOG_TYPE) {
27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlCatalogListXMLResolve(catal->xml, NULL, sysID);
27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret == XML_CATAL_BREAK)
27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = NULL;
27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const xmlChar *sgml;
27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	sgml = xmlCatalogGetSGMLSystem(catal->sgml, sysID);
27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (sgml != NULL)
28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlStrdup(sgml);
28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlACatalogResolvePublic:
28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal:  a Catalog
28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pubID:  the public ID string
28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Try to lookup the catalog local reference associated to a public ID in that catalog
28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the local resource if found or NULL otherwise, the value returned
28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      must be freed by the caller.
28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar *
28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlACatalogResolvePublic(xmlCatalogPtr catal, const xmlChar *pubID) {
28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *ret = NULL;
28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((pubID == NULL) || (catal == NULL))
28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlDebugCatalogs)
28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext,
28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Resolve pubID %s\n", pubID);
28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal->type == XML_XML_CATALOG_TYPE) {
28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlCatalogListXMLResolve(catal->xml, pubID, NULL);
28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret == XML_CATAL_BREAK)
28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = NULL;
28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const xmlChar *sgml;
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	sgml = xmlCatalogGetSGMLPublic(catal->sgml, pubID);
28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (sgml != NULL)
28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlStrdup(sgml);
28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlACatalogResolve:
28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal:  a Catalog
28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pubID:  the public ID string
28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sysID:  the system ID string
28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a complete resolution lookup of an External Identifier
28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the URI of the resource or NULL if not found, it must be freed
28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      by the caller.
28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar *
28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlACatalogResolve(xmlCatalogPtr catal, const xmlChar * pubID,
28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const xmlChar * sysID)
28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *ret = NULL;
28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (((pubID == NULL) && (sysID == NULL)) || (catal == NULL))
28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlDebugCatalogs) {
28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if ((pubID != NULL) && (sysID != NULL)) {
28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             xmlGenericError(xmlGenericErrorContext,
28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             "Resolve: pubID %s sysID %s\n", pubID, sysID);
28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         } else if (pubID != NULL) {
28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             xmlGenericError(xmlGenericErrorContext,
28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             "Resolve: pubID %s\n", pubID);
28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         } else {
28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             xmlGenericError(xmlGenericErrorContext,
28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             "Resolve: sysID %s\n", sysID);
28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal->type == XML_XML_CATALOG_TYPE) {
28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = xmlCatalogListXMLResolve(catal->xml, pubID, sysID);
28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret == XML_CATAL_BREAK)
28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = NULL;
28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const xmlChar *sgml;
28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sgml = xmlCatalogSGMLResolve(catal, pubID, sysID);
28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (sgml != NULL)
28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret = xmlStrdup(sgml);
28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlACatalogResolveURI:
28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal:  a Catalog
28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URI:  the URI
28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a complete resolution lookup of an URI
28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the URI of the resource or NULL if not found, it must be freed
28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      by the caller.
28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar *
28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlACatalogResolveURI(xmlCatalogPtr catal, const xmlChar *URI) {
28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *ret = NULL;
29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((URI == NULL) || (catal == NULL))
29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlDebugCatalogs)
29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext,
29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Resolve URI %s\n", URI);
29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal->type == XML_XML_CATALOG_TYPE) {
29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlCatalogListXMLResolveURI(catal->xml, URI);
29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret == XML_CATAL_BREAK)
29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = NULL;
29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const xmlChar *sgml;
29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	sgml = xmlCatalogSGMLResolve(catal, NULL, URI);
29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (sgml != NULL)
29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret = xmlStrdup(sgml);
29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlACatalogDump:
29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal:  a Catalog
29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @out:  the file.
29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dump the given catalog to the given file.
29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlACatalogDump(xmlCatalogPtr catal, FILE *out) {
29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((out == NULL) || (catal == NULL))
29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal->type == XML_XML_CATALOG_TYPE) {
29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDumpXMLCatalog(out, catal->xml);
29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlHashScan(catal->sgml,
29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlHashScanner) xmlCatalogDumpEntry, out);
29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlACatalogAdd:
29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal:  a Catalog
29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the type of record to add to the catalog
29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @orig:  the system, public or prefix to match
29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @replace:  the replacement value for the match
29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add an entry in the catalog, it may overwrite existing but
29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * different entries.
29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if successful, -1 otherwise
29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlACatalogAdd(xmlCatalogPtr catal, const xmlChar * type,
29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              const xmlChar * orig, const xmlChar * replace)
29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res = -1;
29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal == NULL)
29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal->type == XML_XML_CATALOG_TYPE) {
29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        res = xmlAddXMLCatalog(catal->xml, type, orig, replace);
29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlCatalogEntryType cattype;
29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cattype = xmlGetSGMLCatalogEntryType(type);
29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (cattype != XML_CATA_NONE) {
29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCatalogEntryPtr entry;
29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            entry = xmlNewCatalogEntry(cattype, orig, replace, NULL,
29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       XML_CATA_PREFER_NONE, NULL);
29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (catal->sgml == NULL)
29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		catal->sgml = xmlHashCreate(10);
29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            res = xmlHashAddEntry(catal->sgml, orig, entry);
29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (res);
29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlACatalogRemove:
29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal:  a Catalog
29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value:  the value to remove
29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Remove an entry from the catalog
29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of entries removed if successful, -1 otherwise
29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlACatalogRemove(xmlCatalogPtr catal, const xmlChar *value) {
29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res = -1;
29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((catal == NULL) || (value == NULL))
29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal->type == XML_XML_CATALOG_TYPE) {
30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = xmlDelXMLCatalog(catal->xml, value);
30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = xmlHashRemoveEntry(catal->sgml, value,
30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlHashDeallocator) xmlFreeCatalogEntry);
30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res == 0)
30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = 1;
30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(res);
30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewCatalog:
30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sgml:  should this create an SGML catalog
30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * create a new Catalog.
30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the xmlCatalogPtr or NULL in case of error
30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogPtr
30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewCatalog(int sgml) {
30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogPtr catal = NULL;
30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (sgml) {
30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	catal = xmlCreateNewCatalog(XML_SGML_CATALOG_TYPE,
30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		                    xmlCatalogDefaultPrefer);
30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((catal != NULL) && (catal->sgml == NULL))
30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    catal->sgml = xmlHashCreate(10);
30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	catal = xmlCreateNewCatalog(XML_XML_CATALOG_TYPE,
30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		                    xmlCatalogDefaultPrefer);
30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(catal);
30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogIsEmpty:
30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catal:  should this create an SGML catalog
30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check is a catalog is empty
30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if the catalog is empty, 0 if not, amd -1 in case of error.
30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogIsEmpty(xmlCatalogPtr catal) {
30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal == NULL)
30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal->type == XML_XML_CATALOG_TYPE) {
30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (catal->xml == NULL)
30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(1);
30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((catal->xml->type != XML_CATA_CATALOG) &&
30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (catal->xml->type != XML_CATA_BROKEN_CATALOG))
30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (catal->xml->children == NULL)
30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(1);
30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(0);
30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int res;
30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (catal->sgml == NULL)
30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(1);
30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = xmlHashSize(catal->sgml);
30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res == 0)
30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(1);
30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res < 0)
30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   Public interfaces manipulating the global shared default catalog	*
30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlInitializeCatalogData:
30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do the catalog initialization only of global data, doesn't try to load
30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * any catalog actually.
30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * this function is not thread safe, catalog initialization should
30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * preferably be done once at startup
30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlInitializeCatalogData(void) {
30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlCatalogInitialized != 0)
30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (getenv("XML_DEBUG_CATALOG"))
30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDebugCatalogs = 1;
30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogMutex = xmlNewRMutex();
30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogInitialized = 1;
30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlInitializeCatalog:
30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do the catalog initialization.
30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * this function is not thread safe, catalog initialization should
31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * preferably be done once at startup
31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlInitializeCatalog(void) {
31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlCatalogInitialized != 0)
31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlInitializeCatalogData();
31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRMutexLock(xmlCatalogMutex);
31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (getenv("XML_DEBUG_CATALOG"))
31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDebugCatalogs = 1;
31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlDefaultCatalog == NULL) {
31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const char *catalogs;
31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	char *path;
31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const char *cur, *paths;
31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlCatalogPtr catal;
31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlCatalogEntryPtr *nextent;
31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	catalogs = (const char *) getenv("XML_CATALOG_FILES");
31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (catalogs == NULL)
31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_WIN32) && defined(_MSC_VER)
31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		void* hmodule;
31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		hmodule = GetModuleHandleA("libxml2.dll");
31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (hmodule == NULL)
31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			hmodule = GetModuleHandleA(NULL);
31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (hmodule != NULL) {
31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			char buf[256];
31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			unsigned long len = GetModuleFileNameA(hmodule, buf, 255);
31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (len != 0) {
31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				char* p = &(buf[len]);
31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				while (*p != '\\' && p > buf)
31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					p--;
31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				if (p != buf) {
31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					xmlChar* uri;
31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					strncpy(p, "\\..\\etc\\catalog", 255 - (p - buf));
31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					uri = xmlCanonicPath(buf);
31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					if (uri != NULL) {
31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						strncpy(XML_XML_DEFAULT_CATALOG, uri, 255);
31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						xmlFree(uri);
31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					}
31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				}
31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		catalogs = XML_XML_DEFAULT_CATALOG;
31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    catalogs = XML_XML_DEFAULT_CATALOG;
31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	catal = xmlCreateNewCatalog(XML_XML_CATALOG_TYPE,
31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlCatalogDefaultPrefer);
31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (catal != NULL) {
31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* the XML_CATALOG_FILES envvar is allowed to contain a
31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       space-separated list of entries. */
31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = catalogs;
31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nextent = &catal->xml;
31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (*cur != '\0') {
31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while (xmlIsBlank_ch(*cur))
31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur++;
31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (*cur != 0) {
31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    paths = cur;
31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    while ((*cur != 0) && (!xmlIsBlank_ch(*cur)))
31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			cur++;
31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    path = (char *) xmlStrndup((const xmlChar *)paths, cur - paths);
31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (path != NULL) {
31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*nextent = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL,
31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				NULL, BAD_CAST path, xmlCatalogDefaultPrefer, NULL);
31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (*nextent != NULL)
31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    nextent = &((*nextent)->next);
31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlFree(path);
31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDefaultCatalog = catal;
31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRMutexUnlock(xmlCatalogMutex);
31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlLoadCatalog:
31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename:  a file path
31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Load the catalog and makes its definitions effective for the default
31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * external entity loader. It will recurse in SGML CATALOG entries.
31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * this function is not thread safe, catalog initialization should
31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * preferably be done once at startup
31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success -1 in case of error
31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlLoadCatalog(const char *filename)
31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogPtr catal;
32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlCatalogInitialized)
32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlInitializeCatalogData();
32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRMutexLock(xmlCatalogMutex);
32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlDefaultCatalog == NULL) {
32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	catal = xmlLoadACatalog(filename);
32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (catal == NULL) {
32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlRMutexUnlock(xmlCatalogMutex);
32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDefaultCatalog = catal;
32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRMutexUnlock(xmlCatalogMutex);
32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlExpandCatalog(xmlDefaultCatalog, filename);
32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRMutexUnlock(xmlCatalogMutex);
32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlLoadCatalogs:
32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pathss:  a list of directories separated by a colon or a space.
32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Load the catalogs and makes their definitions effective for the default
32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * external entity loader.
32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * this function is not thread safe, catalog initialization should
32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * preferably be done once at startup
32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlLoadCatalogs(const char *pathss) {
32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *cur;
32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *paths;
32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *path;
32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef _WIN32
32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i, iLen;
32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pathss == NULL)
32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = pathss;
32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (*cur != 0) {
32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (xmlIsBlank_ch(*cur)) cur++;
32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (*cur != 0) {
32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    paths = cur;
32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while ((*cur != 0) && (*cur != PATH_SEAPARATOR) && (!xmlIsBlank_ch(*cur)))
32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur++;
32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    path = xmlStrndup((const xmlChar *)paths, cur - paths);
32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef _WIN32
32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        iLen = strlen(path);
32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for(i = 0; i < iLen; i++) {
32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if(path[i] == '\\') {
32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                path[i] = '/';
32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (path != NULL) {
32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlLoadCatalog((const char *) path);
32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(path);
32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (*cur == PATH_SEAPARATOR)
32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur++;
32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogCleanup:
32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free up all the memory associated with catalogs
32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogCleanup(void) {
32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlCatalogInitialized == 0)
32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRMutexLock(xmlCatalogMutex);
32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlDebugCatalogs)
32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext,
32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Catalogs cleanup\n");
32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlCatalogXMLFiles != NULL)
32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlHashFree(xmlCatalogXMLFiles,
32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlHashDeallocator)xmlFreeCatalogHashEntryList);
32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogXMLFiles = NULL;
32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlDefaultCatalog != NULL)
32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeCatalog(xmlDefaultCatalog);
32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDefaultCatalog = NULL;
32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDebugCatalogs = 0;
32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogInitialized = 0;
32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRMutexUnlock(xmlCatalogMutex);
32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFreeRMutex(xmlCatalogMutex);
32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogResolveSystem:
32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sysID:  the system ID string
33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Try to lookup the catalog resource for a system ID
33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the resource if found or NULL otherwise, the value returned
33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      must be freed by the caller.
33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar *
33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogResolveSystem(const xmlChar *sysID) {
33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *ret;
33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlCatalogInitialized)
33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlInitializeCatalog();
33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlACatalogResolveSystem(xmlDefaultCatalog, sysID);
33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogResolvePublic:
33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pubID:  the public ID string
33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Try to lookup the catalog reference associated to a public ID
33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the resource if found or NULL otherwise, the value returned
33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      must be freed by the caller.
33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar *
33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogResolvePublic(const xmlChar *pubID) {
33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *ret;
33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlCatalogInitialized)
33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlInitializeCatalog();
33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlACatalogResolvePublic(xmlDefaultCatalog, pubID);
33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogResolve:
33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pubID:  the public ID string
33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sysID:  the system ID string
33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a complete resolution lookup of an External Identifier
33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the URI of the resource or NULL if not found, it must be freed
33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      by the caller.
33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar *
33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogResolve(const xmlChar *pubID, const xmlChar *sysID) {
33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *ret;
33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlCatalogInitialized)
33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlInitializeCatalog();
33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlACatalogResolve(xmlDefaultCatalog, pubID, sysID);
33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogResolveURI:
33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URI:  the URI
33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a complete resolution lookup of an URI
33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the URI of the resource or NULL if not found, it must be freed
33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      by the caller.
33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar *
33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogResolveURI(const xmlChar *URI) {
33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *ret;
33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlCatalogInitialized)
33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlInitializeCatalog();
33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlACatalogResolveURI(xmlDefaultCatalog, URI);
33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogDump:
33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @out:  the file.
33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dump all the global catalog content to the given file.
33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogDump(FILE *out) {
33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (out == NULL)
33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlCatalogInitialized)
33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlInitializeCatalog();
33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlACatalogDump(xmlDefaultCatalog, out);
33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogAdd:
33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the type of record to add to the catalog
34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @orig:  the system, public or prefix to match
34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @replace:  the replacement value for the match
34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add an entry in the catalog, it may overwrite existing but
34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * different entries.
34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If called before any other catalog routine, allows to override the
34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * default shared catalog put in place by xmlInitializeCatalog();
34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if successful, -1 otherwise
34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogAdd(const xmlChar *type, const xmlChar *orig, const xmlChar *replace) {
34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res = -1;
34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlCatalogInitialized)
34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlInitializeCatalogData();
34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRMutexLock(xmlCatalogMutex);
34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Specific case where one want to override the default catalog
34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * put in place by xmlInitializeCatalog();
34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((xmlDefaultCatalog == NULL) &&
34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(xmlStrEqual(type, BAD_CAST "catalog"))) {
34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDefaultCatalog = xmlCreateNewCatalog(XML_XML_CATALOG_TYPE,
34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		                          xmlCatalogDefaultPrefer);
34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDefaultCatalog->xml = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL,
34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    orig, NULL,  xmlCatalogDefaultPrefer, NULL);
34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRMutexUnlock(xmlCatalogMutex);
34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = xmlACatalogAdd(xmlDefaultCatalog, type, orig, replace);
34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRMutexUnlock(xmlCatalogMutex);
34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(res);
34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogRemove:
34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value:  the value to remove
34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Remove an entry from the catalog
34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of entries removed if successful, -1 otherwise
34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogRemove(const xmlChar *value) {
34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res;
34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlCatalogInitialized)
34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlInitializeCatalog();
34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRMutexLock(xmlCatalogMutex);
34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = xmlACatalogRemove(xmlDefaultCatalog, value);
34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRMutexUnlock(xmlCatalogMutex);
34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(res);
34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogConvert:
34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Convert all the SGML catalog entries as XML ones
34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of entries converted if successful, -1 otherwise
34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogConvert(void) {
34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res = -1;
34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlCatalogInitialized)
34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlInitializeCatalog();
34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRMutexLock(xmlCatalogMutex);
34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = xmlConvertSGMLCatalog(xmlDefaultCatalog);
34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRMutexUnlock(xmlCatalogMutex);
34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(res);
34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *	Public interface manipulating the common preferences		*
34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogGetDefaults:
34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Used to get the user preference w.r.t. to what catalogs should
34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * be accepted
34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the current xmlCatalogAllow value
34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogAllow
34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogGetDefaults(void) {
34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlCatalogDefaultAllow);
34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogSetDefaults:
35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @allow:  what catalogs should be accepted
35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Used to set the user preference w.r.t. to what catalogs should
35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * be accepted
35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogSetDefaults(xmlCatalogAllow allow) {
35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlDebugCatalogs) {
35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (allow) {
35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_CATA_ALLOW_NONE:
35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Disabling catalog usage\n");
35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_CATA_ALLOW_GLOBAL:
35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Allowing only global catalogs\n");
35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_CATA_ALLOW_DOCUMENT:
35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Allowing only catalogs from the document\n");
35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_CATA_ALLOW_ALL:
35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Allowing all catalogs\n");
35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogDefaultAllow = allow;
35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogSetDefaultPrefer:
35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @prefer:  the default preference for delegation
35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Allows to set the preference between public and system for deletion
35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in XML Catalog resolution. C.f. section 4.1.1 of the spec
35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Values accepted are XML_CATA_PREFER_PUBLIC or XML_CATA_PREFER_SYSTEM
35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the previous value of the default preference for delegation
35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogPrefer
35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogSetDefaultPrefer(xmlCatalogPrefer prefer) {
35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogPrefer ret = xmlCatalogDefaultPrefer;
35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prefer == XML_CATA_PREFER_NONE)
35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ret);
35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlDebugCatalogs) {
35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (prefer) {
35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_CATA_PREFER_PUBLIC:
35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Setting catalog preference to PUBLIC\n");
35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_CATA_PREFER_SYSTEM:
35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Setting catalog preference to SYSTEM\n");
35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_CATA_PREFER_NONE:
35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogDefaultPrefer = prefer;
35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogSetDebug:
35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @level:  the debug level of catalogs required
35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Used to set the debug level for catalog operation, 0 disable
35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * debugging, 1 enable it
35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the previous value of the catalog debugging level
35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogSetDebug(int level) {
35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = xmlDebugCatalogs;
35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (level <= 0)
35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlDebugCatalogs = 0;
35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDebugCatalogs = level;
35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   Minimal interfaces used for per-document catalogs by the parser	*
35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogFreeLocal:
35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catalogs:  a document's list of catalogs
35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free up the memory associated to the catalog list
35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogFreeLocal(void *catalogs) {
35995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogEntryPtr catal;
36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlCatalogInitialized)
36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlInitializeCatalog();
36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    catal = (xmlCatalogEntryPtr) catalogs;
36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal != NULL)
36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeCatalogEntryList(catal);
36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogAddLocal:
36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catalogs:  a document's list of catalogs
36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URL:  the URL to a new local catalog
36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add the new entry to the catalog list
36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the updated list
36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void *
36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogAddLocal(void *catalogs, const xmlChar *URL) {
36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogEntryPtr catal, add;
36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlCatalogInitialized)
36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlInitializeCatalog();
36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (URL == NULL)
36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(catalogs);
36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlDebugCatalogs)
36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext,
36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Adding document catalog %s\n", URL);
36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    add = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL, URL, NULL,
36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                     xmlCatalogDefaultPrefer, NULL);
36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (add == NULL)
36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(catalogs);
36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    catal = (xmlCatalogEntryPtr) catalogs;
36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal == NULL)
36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return((void *) add);
36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (catal->next != NULL)
36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	catal = catal->next;
36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    catal->next = add;
36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(catalogs);
36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogLocalResolve:
36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catalogs:  a document's list of catalogs
36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pubID:  the public ID string
36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sysID:  the system ID string
36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a complete resolution lookup of an External Identifier using a
36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * document's private catalog list
36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the URI of the resource or NULL if not found, it must be freed
36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      by the caller.
36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar *
36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogLocalResolve(void *catalogs, const xmlChar *pubID,
36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	               const xmlChar *sysID) {
36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogEntryPtr catal;
36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *ret;
36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlCatalogInitialized)
36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlInitializeCatalog();
36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((pubID == NULL) && (sysID == NULL))
36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlDebugCatalogs) {
36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((pubID != NULL) && (sysID != NULL)) {
36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlGenericError(xmlGenericErrorContext,
36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            "Local Resolve: pubID %s sysID %s\n", pubID, sysID);
36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (pubID != NULL) {
36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlGenericError(xmlGenericErrorContext,
36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            "Local Resolve: pubID %s\n", pubID);
36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlGenericError(xmlGenericErrorContext,
36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            "Local Resolve: sysID %s\n", sysID);
36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    catal = (xmlCatalogEntryPtr) catalogs;
36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal == NULL)
36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlCatalogListXMLResolve(catal, pubID, sysID);
36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ret != NULL) && (ret != XML_CATAL_BREAK))
36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ret);
36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogLocalResolveURI:
36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @catalogs:  a document's list of catalogs
36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URI:  the URI
36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a complete resolution lookup of an URI using a
37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * document's private catalog list
37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the URI of the resource or NULL if not found, it must be freed
37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      by the caller.
37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar *
37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogLocalResolveURI(void *catalogs, const xmlChar *URI) {
37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCatalogEntryPtr catal;
37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *ret;
37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlCatalogInitialized)
37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlInitializeCatalog();
37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (URI == NULL)
37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlDebugCatalogs)
37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext,
37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Resolve URI %s\n", URI);
37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    catal = (xmlCatalogEntryPtr) catalogs;
37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (catal == NULL)
37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlCatalogListXMLResolveURI(catal, URI);
37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ret != NULL) && (ret != XML_CATAL_BREAK))
37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(ret);
37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			Deprecated interfaces				*
37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogGetSystem:
37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sysID:  the system ID string
37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Try to lookup the catalog reference associated to a system ID
37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DEPRECATED, use xmlCatalogResolveSystem()
37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the resource if found or NULL otherwise.
37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const xmlChar *
37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogGetSystem(const xmlChar *sysID) {
37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *ret;
37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static xmlChar result[1000];
37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static int msg = 0;
37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlCatalogInitialized)
37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlInitializeCatalog();
37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (msg == 0) {
37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext,
37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Use of deprecated xmlCatalogGetSystem() call\n");
37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg++;
37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
37575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (sysID == NULL)
37595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
37605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Check first the XML catalogs
37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlDefaultCatalog != NULL) {
37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlCatalogListXMLResolve(xmlDefaultCatalog->xml, NULL, sysID);
37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((ret != NULL) && (ret != XML_CATAL_BREAK)) {
37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    snprintf((char *) result, sizeof(result) - 1, "%s", (char *) ret);
37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    result[sizeof(result) - 1] = 0;
37695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(result);
37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlDefaultCatalog != NULL)
37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(xmlCatalogGetSGMLSystem(xmlDefaultCatalog->sgml, sysID));
37755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
37765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCatalogGetPublic:
37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pubID:  the public ID string
37815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Try to lookup the catalog reference associated to a public ID
37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DEPRECATED, use xmlCatalogResolvePublic()
37845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the resource if found or NULL otherwise.
37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
37875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const xmlChar *
37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCatalogGetPublic(const xmlChar *pubID) {
37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *ret;
37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static xmlChar result[1000];
37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static int msg = 0;
37925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlCatalogInitialized)
37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlInitializeCatalog();
37955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (msg == 0) {
37975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext,
37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Use of deprecated xmlCatalogGetPublic() call\n");
37995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	msg++;
38005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
38015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pubID == NULL)
38035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
38065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Check first the XML catalogs
38075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
38085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlDefaultCatalog != NULL) {
38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlCatalogListXMLResolve(xmlDefaultCatalog->xml, pubID, NULL);
38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((ret != NULL) && (ret != XML_CATAL_BREAK)) {
38115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    snprintf((char *) result, sizeof(result) - 1, "%s", (char *) ret);
38125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    result[sizeof(result) - 1] = 0;
38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(result);
38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
38165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlDefaultCatalog != NULL)
38185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(xmlCatalogGetSGMLPublic(xmlDefaultCatalog->sgml, pubID));
38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
38205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define bottom_catalog
38235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "elfgcchack.h"
38245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_CATALOG_ENABLED */
3825