diff --git a/Makefile.am b/Makefile.am index fe325c74..d21d1b35 100644 --- a/Makefile.am +++ b/Makefile.am @@ -182,6 +182,7 @@ if WITH_DEBUG_SOURCES endif if WITH_CATALOG_SOURCES ASAN_OPTIONS=detect_leaks=0 test/catalogs/test.sh ./xmlcatalog$(EXEEXT) + ASAN_OPTIONS=detect_leaks=0 test/catalogs/test_sgml.sh ./xmlcatalog$(EXEEXT) endif endif diff --git a/catalog.c b/catalog.c index e4c36027..f5c6fd4c 100644 --- a/catalog.c +++ b/catalog.c @@ -57,9 +57,12 @@ #ifndef XML_XML_DEFAULT_CATALOG #define XML_XML_DEFAULT_CATALOG "file://" XML_SYSCONFDIR "/xml/catalog" #endif + +#ifdef LIBXML_SGML_CATALOG_ENABLED #ifndef XML_SGML_DEFAULT_CATALOG #define XML_SGML_DEFAULT_CATALOG "file://" XML_SYSCONFDIR "/sgml/catalog" #endif +#endif static xmlChar *xmlCatalogNormalizePublic(const xmlChar *pubID); static int xmlExpandCatalog(xmlCatalogPtr catal, const char *filename); @@ -84,7 +87,9 @@ typedef enum { XML_CATA_DELEGATE_SYSTEM, XML_CATA_URI, XML_CATA_REWRITE_URI, - XML_CATA_DELEGATE_URI, + XML_CATA_DELEGATE_URI +#ifdef LIBXML_SGML_CATALOG_ENABLED + , SGML_CATA_SYSTEM, SGML_CATA_PUBLIC, SGML_CATA_ENTITY, @@ -97,6 +102,7 @@ typedef enum { SGML_CATA_CATALOG, SGML_CATA_DOCUMENT, SGML_CATA_SGMLDECL +#endif } xmlCatalogEntryType; typedef struct _xmlCatalogEntry xmlCatalogEntry; @@ -116,14 +122,20 @@ struct _xmlCatalogEntry { }; typedef enum { - XML_XML_CATALOG_TYPE = 1, + XML_XML_CATALOG_TYPE = 1 +#ifdef LIBXML_SGML_CATALOG_ENABLED + , XML_SGML_CATALOG_TYPE +#endif } xmlCatalogType; +#ifdef LIBXML_SGML_CATALOG_ENABLED #define XML_MAX_SGML_CATA_DEPTH 10 +#endif struct _xmlCatalog { xmlCatalogType type; /* either XML or SGML */ +#ifdef LIBXML_SGML_CATALOG_ENABLED /* * SGML Catalogs are stored as a simple hash table of catalog entries * Catalog stack to check against overflows when building the @@ -133,6 +145,7 @@ struct _xmlCatalog { int catalNr; /* Number of current catal streams */ int catalMax; /* Max number of catal streams */ xmlHashTablePtr sgml; +#endif /* * XML Catalogs are stored as a tree of Catalog entries @@ -396,11 +409,13 @@ xmlCreateNewCatalog(xmlCatalogType type, xmlCatalogPrefer prefer) { } memset(ret, 0, sizeof(xmlCatalog)); ret->type = type; + ret->prefer = prefer; +#ifdef LIBXML_SGML_CATALOG_ENABLED ret->catalNr = 0; ret->catalMax = XML_MAX_SGML_CATA_DEPTH; - ret->prefer = prefer; if (ret->type == XML_SGML_CATALOG_TYPE) ret->sgml = xmlHashCreate(10); +#endif return(ret); } @@ -417,8 +432,10 @@ xmlFreeCatalog(xmlCatalog *catal) { return; if (catal->xml != NULL) xmlFreeCatalogEntryList(catal->xml); +#ifdef LIBXML_SGML_CATALOG_ENABLED if (catal->sgml != NULL) xmlHashFree(catal->sgml, xmlFreeCatalogEntry); +#endif xmlFree(catal); } @@ -429,6 +446,7 @@ xmlFreeCatalog(xmlCatalog *catal) { ************************************************************************/ #ifdef LIBXML_OUTPUT_ENABLED +#ifdef LIBXML_SGML_CATALOG_ENABLED /** * Serialize an SGML Catalog entry * @@ -504,6 +522,7 @@ xmlCatalogDumpEntry(void *payload, void *data, } fprintf(out, "\n"); } +#endif /* LIBXML_SGML_CATALOG_ENABLED */ /** * Serializes a Catalog entry, called by xmlDumpXMLCatalog and recursively @@ -613,18 +632,7 @@ static void xmlDumpXMLCatalogNode(xmlCatalogEntryPtr catal, xmlNodePtr catalog, xmlSetProp(node, BAD_CAST "catalog", cur->value); xmlAddChild(catalog, node); break; - case SGML_CATA_SYSTEM: - case SGML_CATA_PUBLIC: - case SGML_CATA_ENTITY: - case SGML_CATA_PENTITY: - case SGML_CATA_DOCTYPE: - case SGML_CATA_LINKTYPE: - case SGML_CATA_NOTATION: - case SGML_CATA_DELEGATE: - case SGML_CATA_BASE: - case SGML_CATA_CATALOG: - case SGML_CATA_DOCUMENT: - case SGML_CATA_SGMLDECL: + default: break; } } @@ -694,6 +702,8 @@ BAD_CAST "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd"); * * ************************************************************************/ +#ifdef LIBXML_SGML_CATALOG_ENABLED + /** * Convert one entry from the catalog * @@ -782,6 +792,8 @@ xmlConvertSGMLCatalog(xmlCatalog *catal) { return(0); } +#endif /* LIBXML_SGML_CATALOG_ENABLED */ + /************************************************************************ * * * Helper function * @@ -2050,6 +2062,8 @@ xmlCatalogListXMLResolveURI(xmlCatalogEntryPtr catal, const xmlChar *URI) { return(ret); } +#ifdef LIBXML_SGML_CATALOG_ENABLED + /************************************************************************ * * * The SGML Catalog parser * @@ -2534,12 +2548,15 @@ xmlCatalogSGMLResolve(xmlCatalogPtr catal, const xmlChar *pubID, return(NULL); } +#endif /* LIBXML_SGML_CATALOG_ENABLED */ + /************************************************************************ * * * Specific Public interfaces * * * ************************************************************************/ +#ifdef LIBXML_SGML_CATALOG_ENABLED /** * Load an SGML super catalog. It won't expand CATALOG or DELEGATE * references. This is only needed for manipulating SGML Super Catalogs @@ -2575,6 +2592,7 @@ xmlLoadSGMLSuperCatalog(const char *filename) } return (catal); } +#endif /* LIBXML_SGML_CATALOG_ENABLED */ /** * Load the catalog and build the associated data structures. @@ -2593,7 +2611,6 @@ xmlLoadACatalog(const char *filename) xmlChar *content; xmlChar *first; xmlCatalogPtr catal; - int ret; content = xmlLoadFileContent(filename); if (content == NULL) @@ -2607,7 +2624,10 @@ xmlLoadACatalog(const char *filename) ((*first >= 'a') && (*first <= 'z'))))) first++; +#ifdef LIBXML_SGML_CATALOG_ENABLED if (*first != '<') { + int ret; + catal = xmlCreateNewCatalog(XML_SGML_CATALOG_TYPE, xmlCatalogDefaultPrefer); if (catal == NULL) { xmlFree(content); @@ -2619,7 +2639,9 @@ xmlLoadACatalog(const char *filename) xmlFree(content); return(NULL); } - } else { + } else +#endif /* LIBXML_SGML_CATALOG_ENABLED */ + { catal = xmlCreateNewCatalog(XML_XML_CATALOG_TYPE, xmlCatalogDefaultPrefer); if (catal == NULL) { xmlFree(content); @@ -2643,14 +2665,13 @@ xmlLoadACatalog(const char *filename) static int xmlExpandCatalog(xmlCatalogPtr catal, const char *filename) { - int ret; - if ((catal == NULL) || (filename == NULL)) return(-1); - +#ifdef LIBXML_SGML_CATALOG_ENABLED if (catal->type == XML_SGML_CATALOG_TYPE) { xmlChar *content; + int ret; content = xmlLoadFileContent(filename); if (content == NULL) @@ -2662,7 +2683,9 @@ xmlExpandCatalog(xmlCatalogPtr catal, const char *filename) return(-1); } xmlFree(content); - } else { + } else +#endif /* LIBXML_SGML_CATALOG_ENABLED */ + { xmlCatalogEntryPtr tmp, cur; tmp = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL, NULL, BAD_CAST filename, xmlCatalogDefaultPrefer, NULL); @@ -2699,16 +2722,19 @@ xmlACatalogResolveSystem(xmlCatalog *catal, const xmlChar *sysID) { xmlCatalogPrintDebug( "Resolve sysID %s\n", sysID); - if (catal->type == XML_XML_CATALOG_TYPE) { - ret = xmlCatalogListXMLResolve(catal->xml, NULL, sysID); - if (ret == XML_CATAL_BREAK) - ret = NULL; - } else { +#ifdef LIBXML_SGML_CATALOG_ENABLED + if (catal->type == XML_SGML_CATALOG_TYPE) { const xmlChar *sgml; sgml = xmlCatalogGetSGMLSystem(catal->sgml, sysID); if (sgml != NULL) ret = xmlStrdup(sgml); + } else +#endif /* LIBXML_SGML_CATALOG_ENABLED */ + { + ret = xmlCatalogListXMLResolve(catal->xml, NULL, sysID); + if (ret == XML_CATAL_BREAK) + ret = NULL; } return(ret); } @@ -2734,16 +2760,19 @@ xmlACatalogResolvePublic(xmlCatalog *catal, const xmlChar *pubID) { xmlCatalogPrintDebug( "Resolve pubID %s\n", pubID); - if (catal->type == XML_XML_CATALOG_TYPE) { - ret = xmlCatalogListXMLResolve(catal->xml, pubID, NULL); - if (ret == XML_CATAL_BREAK) - ret = NULL; - } else { +#ifdef LIBXML_SGML_CATALOG_ENABLED + if (catal->type == XML_SGML_CATALOG_TYPE) { const xmlChar *sgml; sgml = xmlCatalogGetSGMLPublic(catal->sgml, pubID); if (sgml != NULL) ret = xmlStrdup(sgml); + } else +#endif /* LIBXML_SGML_CATALOG_ENABLED */ + { + ret = xmlCatalogListXMLResolve(catal->xml, pubID, NULL); + if (ret == XML_CATAL_BREAK) + ret = NULL; } return(ret); } @@ -2781,16 +2810,19 @@ xmlACatalogResolve(xmlCatalog *catal, const xmlChar * pubID, } } - if (catal->type == XML_XML_CATALOG_TYPE) { - ret = xmlCatalogListXMLResolve(catal->xml, pubID, sysID); - if (ret == XML_CATAL_BREAK) - ret = NULL; - } else { +#ifdef LIBXML_SGML_CATALOG_ENABLED + if (catal->type == XML_SGML_CATALOG_TYPE) { const xmlChar *sgml; sgml = xmlCatalogSGMLResolve(catal, pubID, sysID); if (sgml != NULL) ret = xmlStrdup(sgml); + } else +#endif /* LIBXML_SGML_CATALOG_ENABLED */ + { + ret = xmlCatalogListXMLResolve(catal->xml, pubID, sysID); + if (ret == XML_CATAL_BREAK) + ret = NULL; } return (ret); } @@ -2816,16 +2848,19 @@ xmlACatalogResolveURI(xmlCatalog *catal, const xmlChar *URI) { xmlCatalogPrintDebug( "Resolve URI %s\n", URI); - if (catal->type == XML_XML_CATALOG_TYPE) { - ret = xmlCatalogListXMLResolveURI(catal->xml, URI); - if (ret == XML_CATAL_BREAK) - ret = NULL; - } else { +#ifdef LIBXML_SGML_CATALOG_ENABLED + if (catal->type == XML_SGML_CATALOG_TYPE) { const xmlChar *sgml; sgml = xmlCatalogSGMLResolve(catal, NULL, URI); if (sgml != NULL) ret = xmlStrdup(sgml); + } else +#endif /* LIBXML_SGML_CATALOG_ENABLED */ + { + ret = xmlCatalogListXMLResolveURI(catal->xml, URI); + if (ret == XML_CATAL_BREAK) + ret = NULL; } return(ret); } @@ -2844,10 +2879,13 @@ xmlACatalogDump(xmlCatalog *catal, FILE *out) { if ((out == NULL) || (catal == NULL)) return; - if (catal->type == XML_XML_CATALOG_TYPE) { - xmlDumpXMLCatalog(out, catal->xml); - } else { +#ifdef LIBXML_SGML_CATALOG_ENABLED + if (catal->type == XML_SGML_CATALOG_TYPE) { xmlHashScan(catal->sgml, xmlCatalogDumpEntry, out); + } else +#endif /* LIBXML_SGML_CATALOG_ENABLED */ + { + xmlDumpXMLCatalog(out, catal->xml); } } #endif /* LIBXML_OUTPUT_ENABLED */ @@ -2873,9 +2911,8 @@ xmlACatalogAdd(xmlCatalog *catal, const xmlChar * type, if (catal == NULL) return(-1); - if (catal->type == XML_XML_CATALOG_TYPE) { - res = xmlAddXMLCatalog(catal->xml, type, orig, replace); - } else { +#ifdef LIBXML_SGML_CATALOG_ENABLED + if (catal->type == XML_SGML_CATALOG_TYPE) { xmlCatalogEntryType cattype; cattype = xmlGetSGMLCatalogEntryType(type); @@ -2890,6 +2927,10 @@ xmlACatalogAdd(xmlCatalog *catal, const xmlChar * type, if (res < 0) xmlFreeCatalogEntry(entry, NULL); } + } else +#endif /* LIBXML_SGML_CATALOG_ENABLED */ + { + res = xmlAddXMLCatalog(catal->xml, type, orig, replace); } return (res); } @@ -2910,12 +2951,15 @@ xmlACatalogRemove(xmlCatalog *catal, const xmlChar *value) { if ((catal == NULL) || (value == NULL)) return(-1); - if (catal->type == XML_XML_CATALOG_TYPE) { - res = xmlDelXMLCatalog(catal->xml, value); - } else { +#ifdef LIBXML_SGML_CATALOG_ENABLED + if (catal->type == XML_SGML_CATALOG_TYPE) { res = xmlHashRemoveEntry(catal->sgml, value, xmlFreeCatalogEntry); if (res == 0) res = 1; + } else +#endif /* LIBXML_SGML_CATALOG_ENABLED */ + { + res = xmlDelXMLCatalog(catal->xml, value); } return(res); } @@ -2932,14 +2976,20 @@ xmlCatalog * xmlNewCatalog(int sgml) { xmlCatalogPtr catal = NULL; + (void) sgml; + +#ifdef LIBXML_SGML_CATALOG_ENABLED if (sgml) { catal = xmlCreateNewCatalog(XML_SGML_CATALOG_TYPE, xmlCatalogDefaultPrefer); if ((catal != NULL) && (catal->sgml == NULL)) catal->sgml = xmlHashCreate(10); } else +#endif /* LIBXML_SGML_CATALOG_ENABLED */ + { catal = xmlCreateNewCatalog(XML_XML_CATALOG_TYPE, xmlCatalogDefaultPrefer); + } return(catal); } @@ -2956,16 +3006,8 @@ xmlCatalogIsEmpty(xmlCatalog *catal) { if (catal == NULL) return(-1); - if (catal->type == XML_XML_CATALOG_TYPE) { - if (catal->xml == NULL) - return(1); - if ((catal->xml->type != XML_CATA_CATALOG) && - (catal->xml->type != XML_CATA_BROKEN_CATALOG)) - return(-1); - if (catal->xml->children == NULL) - return(1); - return(0); - } else { +#ifdef LIBXML_SGML_CATALOG_ENABLED + if (catal->type == XML_SGML_CATALOG_TYPE) { int res; if (catal->sgml == NULL) @@ -2975,6 +3017,17 @@ xmlCatalogIsEmpty(xmlCatalog *catal) { return(1); if (res < 0) return(-1); + } else +#endif /* LIBXML_SGML_CATALOG_ENABLED */ + { + if (catal->xml == NULL) + return(1); + if ((catal->xml->type != XML_CATA_CATALOG) && + (catal->xml->type != XML_CATA_BROKEN_CATALOG)) + return(-1); + if (catal->xml->children == NULL) + return(1); + return(0); } return(0); } @@ -3314,6 +3367,7 @@ xmlCatalogRemove(const xmlChar *value) { return(res); } +#ifdef LIBXML_SGML_CATALOG_ENABLED /** * Convert all the SGML catalog entries as XML ones * @@ -3331,6 +3385,7 @@ xmlCatalogConvert(void) { xmlRMutexUnlock(&xmlCatalogMutex); return(res); } +#endif /* LIBXML_SGML_CATALOG_ENABLED */ /************************************************************************ * * @@ -3609,8 +3664,10 @@ xmlCatalogGetSystem(const xmlChar *sysID) { } } +#ifdef LIBXML_SGML_CATALOG_ENABLED if (xmlDefaultCatalog != NULL) return(xmlCatalogGetSGMLSystem(xmlDefaultCatalog->sgml, sysID)); +#endif return(NULL); } @@ -3652,8 +3709,10 @@ xmlCatalogGetPublic(const xmlChar *pubID) { } } +#ifdef LIBXML_SGML_CATALOG_ENABLED if (xmlDefaultCatalog != NULL) return(xmlCatalogGetSGMLPublic(xmlDefaultCatalog->sgml, pubID)); +#endif return(NULL); } diff --git a/codegen/xmlmod.py b/codegen/xmlmod.py index de4ee0de..a79778c1 100644 --- a/codegen/xmlmod.py +++ b/codegen/xmlmod.py @@ -63,6 +63,10 @@ symbolMap1 = { 'xmlCtxtGetValidCtxt': 'VALID', 'xmlFreeValidCtxt': 'VALID', 'xmlNewValidCtxt': 'VALID', + + 'xmlCatalogConvert': 'SGML_CATALOG', + 'xmlConvertSGMLCatalog': 'SGML_CATALOG', + 'xmlLoadSGMLSuperCatalog': 'SGML_CATALOG', } symbolMap2 = { diff --git a/include/libxml/catalog.h b/include/libxml/catalog.h index a5fb9fc7..88a7483c 100644 --- a/include/libxml/catalog.h +++ b/include/libxml/catalog.h @@ -76,12 +76,14 @@ XMLPUBFUN xmlCatalog * XML_DEPRECATED XMLPUBFUN xmlCatalog * xmlLoadACatalog (const char *filename); +#ifdef LIBXML_SGML_CATALOG_ENABLED XML_DEPRECATED XMLPUBFUN xmlCatalog * xmlLoadSGMLSuperCatalog (const char *filename); XML_DEPRECATED XMLPUBFUN int xmlConvertSGMLCatalog (xmlCatalog *catal); +#endif /* LIBXML_SGML_CATALOG_ENABLED */ XML_DEPRECATED XMLPUBFUN int xmlACatalogAdd (xmlCatalog *catal, @@ -155,9 +157,11 @@ XMLPUBFUN int XML_DEPRECATED XMLPUBFUN xmlDoc * xmlParseCatalogFile (const char *filename); +#ifdef LIBXML_SGML_CATALOG_ENABLED XML_DEPRECATED XMLPUBFUN int xmlCatalogConvert (void); +#endif /* LIBXML_SGML_CATALOG_ENABLED */ /* * Strictly minimal interfaces for per-document catalogs used diff --git a/include/libxml/xmlversion.h.in b/include/libxml/xmlversion.h.in index 93b8ca10..cfa8bbb1 100644 --- a/include/libxml/xmlversion.h.in +++ b/include/libxml/xmlversion.h.in @@ -138,6 +138,7 @@ * Whether the Catalog support is configured in */ #define LIBXML_CATALOG_ENABLED +#define LIBXML_SGML_CATALOG_ENABLED #endif #if @WITH_XPATH@ diff --git a/meson.build b/meson.build index 77cdbf0d..664a8cf8 100644 --- a/meson.build +++ b/meson.build @@ -548,6 +548,9 @@ if want_output test('xmlcatalog shell', sh, args: [ 'test/catalogs/test.sh', xmlcatalog.full_path() ], workdir: meson.current_source_dir()) + test('xmlcatalog shell SGML', sh, + args: [ 'test/catalogs/test_sgml.sh', xmlcatalog.full_path() ], + workdir: meson.current_source_dir()) endif endif endif diff --git a/test/catalogs/test.sh b/test/catalogs/test.sh index 697fc52d..9c5f5a88 100755 --- a/test/catalogs/test.sh +++ b/test/catalogs/test.sh @@ -33,27 +33,6 @@ for i in test/catalogs/*.script ; do fi done -for i in test/catalogs/*.script ; do - name=$(basename $i .script) - sgml="./test/catalogs/$name.sgml" - - if [ -f $sgml ] ; then - if [ ! -f result/catalogs/$name ] ; then - echo New test file $name - $xmlcatalog --shell $sgml < $i > result/catalogs/$name - else - $xmlcatalog --shell $sgml < $i > catalog.out - log=$(diff result/catalogs/$name catalog.out) - if [ -n "$log" ] ; then - echo $name result - echo "$log" - exitcode=1 - fi - rm catalog.out - fi - fi -done - # Add and del operations on XML Catalogs $xmlcatalog --create --noout mycatalog diff --git a/test/catalogs/test_sgml.sh b/test/catalogs/test_sgml.sh new file mode 100755 index 00000000..a3029639 --- /dev/null +++ b/test/catalogs/test_sgml.sh @@ -0,0 +1,36 @@ +#!/bin/sh + +set -e + +echo "## SGML catalog regression tests" + +if [ -n "$1" ]; then + xmlcatalog=$1 +else + xmlcatalog=./xmlcatalog +fi + +exitcode=0 + +for i in test/catalogs/*.script ; do + name=$(basename $i .script) + sgml="./test/catalogs/$name.sgml" + + if [ -f $sgml ] ; then + if [ ! -f result/catalogs/$name ] ; then + echo New test file $name + $xmlcatalog --shell $sgml < $i > result/catalogs/$name + else + $xmlcatalog --shell $sgml < $i > catalog_sgml.out + log=$(diff result/catalogs/$name catalog_sgml.out) + if [ -n "$log" ] ; then + echo $name result + echo "$log" + exitcode=1 + fi + rm catalog_sgml.out + fi + fi +done + +exit $exitcode diff --git a/testapi.c b/testapi.c index 292eb7c1..67b7e447 100644 --- a/testapi.c +++ b/testapi.c @@ -625,7 +625,6 @@ main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { xmlCatalogAdd(NULL, NULL, NULL); xmlCatalogAddLocal(NULL, NULL); xmlCatalogCleanup(); - xmlCatalogConvert(); xmlCatalogFreeLocal(NULL); xmlCatalogGetDefaults(); xmlCatalogIsEmpty(NULL); @@ -639,13 +638,11 @@ main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { xmlCatalogSetDebug(0); xmlCatalogSetDefaultPrefer(0); xmlCatalogSetDefaults(0); - xmlConvertSGMLCatalog(NULL); xmlFreeCatalog(NULL); xmlInitializeCatalog(); xmlFreeCatalog(xmlLoadACatalog(NULL)); xmlLoadCatalog(NULL); xmlLoadCatalogs(NULL); - xmlFreeCatalog(xmlLoadSGMLSuperCatalog(NULL)); xmlFreeCatalog(xmlNewCatalog(0)); xmlFreeDoc(xmlParseCatalogFile(NULL)); #ifdef LIBXML_OUTPUT_ENABLED @@ -1096,6 +1093,12 @@ main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { xmlSchematronValidateDoc(NULL, NULL); #endif /* LIBXML_SCHEMATRON_ENABLED */ +#ifdef LIBXML_SGML_CATALOG_ENABLED + xmlCatalogConvert(); + xmlConvertSGMLCatalog(NULL); + xmlFreeCatalog(xmlLoadSGMLSuperCatalog(NULL)); +#endif /* LIBXML_SGML_CATALOG_ENABLED */ + #ifdef LIBXML_VALID_ENABLED xmlFreeValidCtxt(xmlCtxtGetValidCtxt(NULL)); xmlFreeDtd(xmlCtxtParseDtd(NULL, NULL, NULL, NULL)); diff --git a/xmlcatalog.c b/xmlcatalog.c index 29e78db2..b400c7cb 100644 --- a/xmlcatalog.c +++ b/xmlcatalog.c @@ -40,20 +40,26 @@ #if defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) static int shell = 0; +#ifdef LIBXML_SGML_CATALOG_ENABLED static int sgml = 0; +#endif static int noout = 0; static int create = 0; static int add = 0; static int del = 0; +#ifdef LIBXML_SGML_CATALOG_ENABLED static int convert = 0; static int no_super_update = 0; +#endif static int verbose = 0; static char *filename = NULL; +#ifdef LIBXML_SGML_CATALOG_ENABLED #ifndef XML_SGML_DEFAULT_CATALOG #define XML_SGML_DEFAULT_CATALOG XML_SYSCONFDIR "/sgml/catalog" #endif +#endif /************************************************************************ * * @@ -306,22 +312,26 @@ static void usershell(void) { ************************************************************************/ static void usage(const char *name) { /* split into 2 printf's to avoid overly long string (gcc warning) */ - printf("\ -Usage : %s [options] catalogfile entities...\n\ -\tParse the catalog file (void specification possibly expressed as \"\"\n\ -\tappoints the default system one) and query it for the entities\n\ -\t--sgml : handle SGML Super catalogs for --add and --del\n\ -\t--shell : run a shell allowing interactive queries\n\ -\t--create : create a new catalog\n\ -\t--add 'type' 'orig' 'replace' : add an XML entry\n\ -\t--add 'entry' : add an SGML entry\n", name); - printf("\ -\t--del 'values' : remove values\n\ -\t--noout: avoid dumping the result on stdout\n\ -\t used with --add or --del, it saves the catalog changes\n\ -\t and with --sgml it automatically updates the super catalog\n\ -\t--no-super-update: do not update the SGML super catalog\n\ -\t-v --verbose : provide debug information\n"); + printf( +"Usage : %s [options] catalogfile entities...\n" +"\tParse the catalog file (void specification possibly expressed as \"\"\n" +"\tappoints the default system one) and query it for the entities\n" +#ifdef LIBXML_SGML_CATALOG_ENABLED +"\t--sgml : handle SGML Super catalogs for --add and --del\n" +#endif +"\t--shell : run a shell allowing interactive queries\n" +"\t--create : create a new catalog\n" +"\t--add 'type' 'orig' 'replace' : add an XML entry\n" +"\t--add 'entry' : add an SGML entry\n", name); + printf( +"\t--del 'values' : remove values\n" +"\t--noout: avoid dumping the result on stdout\n" +"\t used with --add or --del, it saves the catalog changes\n" +"\t and with --sgml it automatically updates the super catalog\n" +#ifdef LIBXML_SGML_CATALOG_ENABLED +"\t--no-super-update: do not update the SGML super catalog\n" +#endif +"\t-v --verbose : provide debug information\n"); } int main(int argc, char **argv) { int i; @@ -358,23 +368,29 @@ int main(int argc, char **argv) { (!strcmp(argv[i], "--shell"))) { shell++; noout = 1; +#ifdef LIBXML_SGML_CATALOG_ENABLED } else if ((!strcmp(argv[i], "-sgml")) || (!strcmp(argv[i], "--sgml"))) { sgml++; +#endif } else if ((!strcmp(argv[i], "-create")) || (!strcmp(argv[i], "--create"))) { create++; +#ifdef LIBXML_SGML_CATALOG_ENABLED } else if ((!strcmp(argv[i], "-convert")) || (!strcmp(argv[i], "--convert"))) { convert++; } else if ((!strcmp(argv[i], "-no-super-update")) || (!strcmp(argv[i], "--no-super-update"))) { no_super_update++; +#endif } else if ((!strcmp(argv[i], "-add")) || (!strcmp(argv[i], "--add"))) { +#ifdef LIBXML_SGML_CATALOG_ENABLED if (sgml) i += 2; else +#endif i += 3; add++; } else if ((!strcmp(argv[i], "-del")) || @@ -391,9 +407,11 @@ int main(int argc, char **argv) { for (i = 1; i < argc; i++) { if ((!strcmp(argv[i], "-add")) || (!strcmp(argv[i], "--add"))) { +#ifdef LIBXML_SGML_CATALOG_ENABLED if (sgml) i += 2; else +#endif i += 3; continue; } else if ((!strcmp(argv[i], "-del")) || @@ -401,7 +419,11 @@ int main(int argc, char **argv) { i += 1; /* No catalog entry specified */ - if (i == argc || (sgml && i + 1 == argc)) { + if (i == argc +#ifdef LIBXML_SGML_CATALOG_ENABLED + || (sgml && i + 1 == argc) +#endif + ) { fprintf(stderr, "No catalog entry specified to remove from\n"); usage (argv[0]); return(1); @@ -432,8 +454,10 @@ int main(int argc, char **argv) { break; } +#ifdef LIBXML_SGML_CATALOG_ENABLED if (convert) ret = xmlCatalogConvert(); +#endif if ((add) || (del)) { for (i = 1; i < argc ; i++) { @@ -446,6 +470,7 @@ int main(int argc, char **argv) { strcmp(argv[i], "-del") && strcmp(argv[i], "--del")) continue; +#ifdef LIBXML_SGML_CATALOG_ENABLED if (sgml) { /* * Maintenance of SGML catalogs. @@ -538,7 +563,9 @@ int main(int argc, char **argv) { xmlFreeCatalog(catal); xmlFreeCatalog(super); - } else { + } else +#endif /* LIBXML_SGML_CATALOG_ENABLED */ + { if ((!strcmp(argv[i], "-add")) || (!strcmp(argv[i], "--add"))) { if ((argv[i + 3] == NULL) || (argv[i + 3][0] == 0)) @@ -603,7 +630,15 @@ int main(int argc, char **argv) { } } } - if ((!sgml) && ((add) || (del) || (create) || (convert))) { + if ( +#ifdef LIBXML_SGML_CATALOG_ENABLED + (!sgml) && +#endif + ((add) || (del) || (create) +#ifdef LIBXML_SGML_CATALOG_ENABLED + || (convert) +#endif + )) { if (noout && filename && *filename) { FILE *out;