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