/**
 * Summary: interfaces to the Catalog handling system
 * Description: the catalog module implements the support for
 * XML Catalogs and SGML catalogs
 *
 * SGML Open Technical Resolution TR9401:1997.
 * http://www.jclark.com/sp/catalog.htm
 *
 * XML Catalogs Working Draft 06 August 2001
 * http://www.oasis-open.org/committees/entity/spec-2001-08-06.html
 *
 * Copy: See Copyright for the status of this software.
 *
 * Author: Daniel Veillard
 */

#ifndef __XML_CATALOG_H__
#define __XML_CATALOG_H__

#include <stdio.h>

#include "xmlversion.h"
#include "xmlstring.h"
#include "tree.h"

#ifdef LIBXML_CATALOG_ENABLED

#ifdef __cplusplus
extern "C" {
#endif

/**
 * XML_CATALOGS_NAMESPACE:
 *
 * The namespace for the XML Catalogs elements.
 */
#define XML_CATALOGS_NAMESPACE                                  \
    (const xmlChar *) "urn:oasis:names:tc:entity:xmlns:xml:catalog"
/**
 * XML_CATALOG_PI:
 *
 * The specific XML Catalog Processing Instuction name.
 */
#define XML_CATALOG_PI                                          \
    (const xmlChar *) "oasis-xml-catalog"

/*
 * The API is voluntarily limited to general cataloging.
 */
typedef enum {
    XML_CATA_PREFER_NONE = 0,
    XML_CATA_PREFER_PUBLIC = 1,
    XML_CATA_PREFER_SYSTEM
} xmlCatalogPrefer;

typedef enum {
    XML_CATA_ALLOW_NONE = 0,
    XML_CATA_ALLOW_GLOBAL = 1,
    XML_CATA_ALLOW_DOCUMENT = 2,
    XML_CATA_ALLOW_ALL = 3
} xmlCatalogAllow;

typedef struct _xmlCatalog xmlCatalog;
typedef xmlCatalog *xmlCatalogPtr;

/*
 * Operations on a given catalog.
 */
XMLPUBFUN xmlCatalogPtr XMLCALL
                xmlNewCatalog           (int sgml);
XMLPUBFUN xmlCatalogPtr XMLCALL 
                xmlLoadACatalog         (const char *filename);
XMLPUBFUN xmlCatalogPtr XMLCALL 
                xmlLoadSGMLSuperCatalog (const char *filename);
XMLPUBFUN int XMLCALL           
                xmlConvertSGMLCatalog   (xmlCatalogPtr catal);
XMLPUBFUN int XMLCALL           
                xmlACatalogAdd          (xmlCatalogPtr catal,
                                         const xmlChar *type,
                                         const xmlChar *orig,
                                         const xmlChar *replace);
XMLPUBFUN int XMLCALL           
                xmlACatalogRemove       (xmlCatalogPtr catal,
                                         const xmlChar *value);
XMLPUBFUN xmlChar * XMLCALL     
                xmlACatalogResolve      (xmlCatalogPtr catal,
                                         const xmlChar *pubID,
                                         const xmlChar *sysID);
XMLPUBFUN xmlChar * XMLCALL     
                xmlACatalogResolveSystem(xmlCatalogPtr catal,
                                         const xmlChar *sysID);
XMLPUBFUN xmlChar * XMLCALL     
                xmlACatalogResolvePublic(xmlCatalogPtr catal,
                                         const xmlChar *pubID);
XMLPUBFUN xmlChar * XMLCALL     
                xmlACatalogResolveURI   (xmlCatalogPtr catal,
                                         const xmlChar *URI);
#ifdef LIBXML_OUTPUT_ENABLED
XMLPUBFUN void XMLCALL          
                xmlACatalogDump         (xmlCatalogPtr catal,
                                         FILE *out);
#endif /* LIBXML_OUTPUT_ENABLED */
XMLPUBFUN void XMLCALL          
                xmlFreeCatalog          (xmlCatalogPtr catal);
XMLPUBFUN int XMLCALL           
                xmlCatalogIsEmpty       (xmlCatalogPtr catal);

/*
 * Global operations.
 */
XMLPUBFUN void XMLCALL          
                xmlInitializeCatalog    (void);
XMLPUBFUN int XMLCALL           
                xmlLoadCatalog          (const char *filename);
XMLPUBFUN void XMLCALL          
                xmlLoadCatalogs         (const char *paths);
XMLPUBFUN void XMLCALL          
                xmlCatalogCleanup       (void);
#ifdef LIBXML_OUTPUT_ENABLED
XMLPUBFUN void XMLCALL          
                xmlCatalogDump          (FILE *out);
#endif /* LIBXML_OUTPUT_ENABLED */
XMLPUBFUN xmlChar * XMLCALL     
                xmlCatalogResolve       (const xmlChar *pubID,
                                         const xmlChar *sysID);
XMLPUBFUN xmlChar * XMLCALL     
                xmlCatalogResolveSystem (const xmlChar *sysID);
XMLPUBFUN xmlChar * XMLCALL     
                xmlCatalogResolvePublic (const xmlChar *pubID);
XMLPUBFUN xmlChar * XMLCALL     
                xmlCatalogResolveURI    (const xmlChar *URI);
XMLPUBFUN int XMLCALL           
                xmlCatalogAdd           (const xmlChar *type,
                                         const xmlChar *orig,
                                         const xmlChar *replace);
XMLPUBFUN int XMLCALL           
                xmlCatalogRemove        (const xmlChar *value);
XMLPUBFUN xmlDocPtr XMLCALL     
                xmlParseCatalogFile     (const char *filename);
XMLPUBFUN int XMLCALL           
                xmlCatalogConvert       (void);

/*
 * Strictly minimal interfaces for per-document catalogs used
 * by the parser.
 */
XMLPUBFUN void XMLCALL          
                xmlCatalogFreeLocal     (void *catalogs);
XMLPUBFUN void * XMLCALL                
                xmlCatalogAddLocal      (void *catalogs,
                                         const xmlChar *URL);
XMLPUBFUN xmlChar * XMLCALL     
                xmlCatalogLocalResolve  (void *catalogs,
                                         const xmlChar *pubID,
                                         const xmlChar *sysID);
XMLPUBFUN xmlChar * XMLCALL     
                xmlCatalogLocalResolveURI(void *catalogs,
                                         const xmlChar *URI);
/*
 * Preference settings.
 */
XMLPUBFUN int XMLCALL           
                xmlCatalogSetDebug      (int level);
XMLPUBFUN xmlCatalogPrefer XMLCALL 
                xmlCatalogSetDefaultPrefer(xmlCatalogPrefer prefer);
XMLPUBFUN void XMLCALL          
                xmlCatalogSetDefaults   (xmlCatalogAllow allow);
XMLPUBFUN xmlCatalogAllow XMLCALL       
                xmlCatalogGetDefaults   (void);


/* DEPRECATED interfaces */
XMLPUBFUN const xmlChar * XMLCALL       
                xmlCatalogGetSystem     (const xmlChar *sysID);
XMLPUBFUN const xmlChar * XMLCALL       
                xmlCatalogGetPublic     (const xmlChar *pubID);

#ifdef __cplusplus
}
#endif
#endif /* LIBXML_CATALOG_ENABLED */
#endif /* __XML_CATALOG_H__ */
