38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlcatalog.c : a small utility program to handle XML catalogs
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * See Copyright for the status of this software.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * daniel@veillard.com
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define XML_SGML_DEFAULT_CATALOG "/etc/sgml/catalog"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Shell Interface *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlShellReadline:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @prompt: the prompt value
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Read a string
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns a pointer to it or NULL on EOF the caller is expected to
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * free the returned string.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic char *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Get a line from the user. */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* If the line has any text in it, save it on the history. */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (1) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Parse the command itself
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (i == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Parse the argument string
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while ((*cur != '\n') && (*cur != '\r') && (*cur != 0)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (i != 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Parse the arguments
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (*cur != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while ((*cur != 0) && (*cur != ' ') && (*cur != '\t'))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * start interpreting the command
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ans = xmlCatalogResolvePublic((const xmlChar *) argv[0]);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ans = xmlCatalogResolveSystem((const xmlChar *) argv[0]);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlCatalogAdd(BAD_CAST argv[0], BAD_CAST argv[1],
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlCatalogAdd(BAD_CAST argv[0], BAD_CAST argv[1],
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync printf("\tpublic PublicID: make a PUBLIC identifier lookup\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync printf("\tsystem SystemID: make a SYSTEM identifier lookup\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync printf("\tresolve PublicID SystemID: do a full resolver lookup\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync printf("\tadd 'type' 'orig' 'replace' : add an entry\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync printf("\tdump: print the current catalog state\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* split into 2 printf's to avoid overly long string (gcc warning) */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncUsage : %s [options] catalogfile entities...\n\
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync\tParse the catalog file and query it for the entities\n\
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync\t--sgml : handle SGML Super catalogs for --add and --del\n\
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync\t--shell : run a shell allowing interactive queries\n\
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync\t--create : create a new catalog\n\
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync\t--add 'type' 'orig' 'replace' : add an XML entry\n\
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync\t--del 'values' : remove values\n\
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync\t--noout: avoid dumping the result on stdout\n\
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync\t used with --add or --del, it saves the catalog changes\n\
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync\t and with --sgml it automatically updates the super catalog\n\
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync\t--no-super-update: do not update the SGML super catalog\n\
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync\t-v --verbose : provide debug informations\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if ((!strcmp(argv[i], "-no-super-update")) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* No catalog entry specified */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "No catalog entry specified to remove from\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCatalogAdd(BAD_CAST "catalog", BAD_CAST argv[i], NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (strcmp(argv[i], "-add") && strcmp(argv[i], "--add") &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync strcmp(argv[i], "-del") && strcmp(argv[i], "--del"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Maintenance of SGML catalogs.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync super = xmlLoadSGMLSuperCatalog(XML_SGML_DEFAULT_CATALOG);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlACatalogRemove(catal, BAD_CAST argv[i + 2]);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "Failed to remove entry from %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((!no_super_update) && (noout) && (catal != NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Failed to remove entry from %s\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "could not open %s for saving\n",
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((argv[i + 3] == NULL) || (argv[i + 3][0] == 0))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (shell) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (i++; i < argc; i++) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ans = xmlCatalogResolvePublic((const xmlChar *) argv[i]);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ans = xmlCatalogResolveSystem((const xmlChar *) argv[i]);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ans = xmlCatalogResolveURI ((const xmlChar *) argv[i]);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((!sgml) && ((add) || (del) || (create) || (convert))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "could not open %s for saving\n", filename);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Cleanup and check for memory leaks
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync fprintf(stderr, "libxml was not compiled with catalog and output support\n");