Blame xmlcatalog.c

Packit Service a31ea6
/*
Packit Service a31ea6
 * xmlcatalog.c : a small utility program to handle XML catalogs
Packit Service a31ea6
 *
Packit Service a31ea6
 * See Copyright for the status of this software.
Packit Service a31ea6
 *
Packit Service a31ea6
 * daniel@veillard.com
Packit Service a31ea6
 */
Packit Service a31ea6
Packit Service a31ea6
#include "libxml.h"
Packit Service a31ea6
Packit Service a31ea6
#include <string.h>
Packit Service a31ea6
#include <stdio.h>
Packit Service a31ea6
#include <stdarg.h>
Packit Service a31ea6
Packit Service a31ea6
#ifdef HAVE_STDLIB_H
Packit Service a31ea6
#include <stdlib.h>
Packit Service a31ea6
#endif
Packit Service a31ea6
Packit Service a31ea6
#ifdef HAVE_LIBREADLINE
Packit Service a31ea6
#include <readline/readline.h>
Packit Service a31ea6
#ifdef HAVE_LIBHISTORY
Packit Service a31ea6
#include <readline/history.h>
Packit Service a31ea6
#endif
Packit Service a31ea6
#endif
Packit Service a31ea6
Packit Service a31ea6
#include <libxml/xmlmemory.h>
Packit Service a31ea6
#include <libxml/uri.h>
Packit Service a31ea6
#include <libxml/catalog.h>
Packit Service a31ea6
#include <libxml/parser.h>
Packit Service a31ea6
#include <libxml/globals.h>
Packit Service a31ea6
Packit Service a31ea6
#if defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
Packit Service a31ea6
static int shell = 0;
Packit Service a31ea6
static int sgml = 0;
Packit Service a31ea6
static int noout = 0;
Packit Service a31ea6
static int create = 0;
Packit Service a31ea6
static int add = 0;
Packit Service a31ea6
static int del = 0;
Packit Service a31ea6
static int convert = 0;
Packit Service a31ea6
static int no_super_update = 0;
Packit Service a31ea6
static int verbose = 0;
Packit Service a31ea6
static char *filename = NULL;
Packit Service a31ea6
Packit Service a31ea6
Packit Service a31ea6
#ifndef XML_SGML_DEFAULT_CATALOG
Packit Service a31ea6
#define XML_SGML_DEFAULT_CATALOG "/etc/sgml/catalog"
Packit Service a31ea6
#endif
Packit Service a31ea6
Packit Service a31ea6
/************************************************************************
Packit Service a31ea6
 *									*
Packit Service a31ea6
 *			Shell Interface					*
Packit Service a31ea6
 *									*
Packit Service a31ea6
 ************************************************************************/
Packit Service a31ea6
/**
Packit Service a31ea6
 * xmlShellReadline:
Packit Service a31ea6
 * @prompt:  the prompt value
Packit Service a31ea6
 *
Packit Service a31ea6
 * Read a string
Packit Service a31ea6
 *
Packit Service a31ea6
 * Returns a pointer to it or NULL on EOF the caller is expected to
Packit Service a31ea6
 *     free the returned string.
Packit Service a31ea6
 */
Packit Service a31ea6
static char *
Packit Service a31ea6
xmlShellReadline(const char *prompt) {
Packit Service a31ea6
#ifdef HAVE_LIBREADLINE
Packit Service a31ea6
    char *line_read;
Packit Service a31ea6
Packit Service a31ea6
    /* Get a line from the user. */
Packit Service a31ea6
    line_read = readline (prompt);
Packit Service a31ea6
Packit Service a31ea6
    /* If the line has any text in it, save it on the history. */
Packit Service a31ea6
    if (line_read && *line_read)
Packit Service a31ea6
	add_history (line_read);
Packit Service a31ea6
Packit Service a31ea6
    return (line_read);
Packit Service a31ea6
#else
Packit Service a31ea6
    char line_read[501];
Packit Service a31ea6
    char *ret;
Packit Service a31ea6
    int len;
Packit Service a31ea6
Packit Service a31ea6
    if (prompt != NULL)
Packit Service a31ea6
	fprintf(stdout, "%s", prompt);
Packit Service a31ea6
    fflush(stdout);
Packit Service a31ea6
    if (!fgets(line_read, 500, stdin))
Packit Service a31ea6
        return(NULL);
Packit Service a31ea6
    line_read[500] = 0;
Packit Service a31ea6
    len = strlen(line_read);
Packit Service a31ea6
    ret = (char *) malloc(len + 1);
Packit Service a31ea6
    if (ret != NULL) {
Packit Service a31ea6
	memcpy (ret, line_read, len + 1);
Packit Service a31ea6
    }
Packit Service a31ea6
    return(ret);
Packit Service a31ea6
#endif
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
static void usershell(void) {
Packit Service a31ea6
    char *cmdline = NULL, *cur;
Packit Service a31ea6
    int nbargs;
Packit Service a31ea6
    char command[100];
Packit Service a31ea6
    char arg[400];
Packit Service a31ea6
    char *argv[20];
Packit Service a31ea6
    int i, ret;
Packit Service a31ea6
    xmlChar *ans;
Packit Service a31ea6
Packit Service a31ea6
    while (1) {
Packit Service a31ea6
	cmdline = xmlShellReadline("> ");
Packit Service a31ea6
	if (cmdline == NULL)
Packit Service a31ea6
	    return;
Packit Service a31ea6
Packit Service a31ea6
	/*
Packit Service a31ea6
	 * Parse the command itself
Packit Service a31ea6
	 */
Packit Service a31ea6
	cur = cmdline;
Packit Service a31ea6
	nbargs = 0;
Packit Service a31ea6
	while ((*cur == ' ') || (*cur == '\t')) cur++;
Packit Service a31ea6
	i = 0;
Packit Service a31ea6
	while ((*cur != ' ') && (*cur != '\t') &&
Packit Service a31ea6
	       (*cur != '\n') && (*cur != '\r')) {
Packit Service a31ea6
	    if (*cur == 0)
Packit Service a31ea6
		break;
Packit Service a31ea6
	    command[i++] = *cur++;
Packit Service a31ea6
	}
Packit Service a31ea6
	command[i] = 0;
Packit Service a31ea6
	if (i == 0) {
Packit Service a31ea6
	    free(cmdline);
Packit Service a31ea6
	    continue;
Packit Service a31ea6
	}
Packit Service a31ea6
Packit Service a31ea6
	/*
Packit Service a31ea6
	 * Parse the argument string
Packit Service a31ea6
	 */
Packit Service a31ea6
	memset(arg, 0, sizeof(arg));
Packit Service a31ea6
	while ((*cur == ' ') || (*cur == '\t')) cur++;
Packit Service a31ea6
	i = 0;
Packit Service a31ea6
	while ((*cur != '\n') && (*cur != '\r') && (*cur != 0)) {
Packit Service a31ea6
	    if (*cur == 0)
Packit Service a31ea6
		break;
Packit Service a31ea6
	    arg[i++] = *cur++;
Packit Service a31ea6
	}
Packit Service a31ea6
	arg[i] = 0;
Packit Service a31ea6
Packit Service a31ea6
	/*
Packit Service a31ea6
	 * Parse the arguments
Packit Service a31ea6
	 */
Packit Service a31ea6
	i = 0;
Packit Service a31ea6
	nbargs = 0;
Packit Service a31ea6
	cur = arg;
Packit Service a31ea6
	memset(argv, 0, sizeof(argv));
Packit Service a31ea6
	while (*cur != 0) {
Packit Service a31ea6
	    while ((*cur == ' ') || (*cur == '\t')) cur++;
Packit Service a31ea6
	    if (*cur == '\'') {
Packit Service a31ea6
		cur++;
Packit Service a31ea6
		argv[i] = cur;
Packit Service a31ea6
		while ((*cur != 0) && (*cur != '\'')) cur++;
Packit Service a31ea6
		if (*cur == '\'') {
Packit Service a31ea6
		    *cur = 0;
Packit Service a31ea6
		    nbargs++;
Packit Service a31ea6
		    i++;
Packit Service a31ea6
		    cur++;
Packit Service a31ea6
		}
Packit Service a31ea6
	    } else if (*cur == '"') {
Packit Service a31ea6
		cur++;
Packit Service a31ea6
		argv[i] = cur;
Packit Service a31ea6
		while ((*cur != 0) && (*cur != '"')) cur++;
Packit Service a31ea6
		if (*cur == '"') {
Packit Service a31ea6
		    *cur = 0;
Packit Service a31ea6
		    nbargs++;
Packit Service a31ea6
		    i++;
Packit Service a31ea6
		    cur++;
Packit Service a31ea6
		}
Packit Service a31ea6
	    } else {
Packit Service a31ea6
		argv[i] = cur;
Packit Service a31ea6
		while ((*cur != 0) && (*cur != ' ') && (*cur != '\t'))
Packit Service a31ea6
		    cur++;
Packit Service a31ea6
		*cur = 0;
Packit Service a31ea6
		nbargs++;
Packit Service a31ea6
		i++;
Packit Service a31ea6
		cur++;
Packit Service a31ea6
	    }
Packit Service a31ea6
	}
Packit Service a31ea6
Packit Service a31ea6
	/*
Packit Service a31ea6
	 * start interpreting the command
Packit Service a31ea6
	 */
Packit Service a31ea6
	if (!strcmp(command, "exit") ||
Packit Service a31ea6
	    !strcmp(command, "quit") ||
Packit Service a31ea6
	    !strcmp(command, "bye")) {
Packit Service a31ea6
	    free(cmdline);
Packit Service a31ea6
	    break;
Packit Service a31ea6
	}
Packit Service a31ea6
Packit Service a31ea6
	if (!strcmp(command, "public")) {
Packit Service a31ea6
	    if (nbargs != 1) {
Packit Service a31ea6
		printf("public requires 1 arguments\n");
Packit Service a31ea6
	    } else {
Packit Service a31ea6
		ans = xmlCatalogResolvePublic((const xmlChar *) argv[0]);
Packit Service a31ea6
		if (ans == NULL) {
Packit Service a31ea6
		    printf("No entry for PUBLIC %s\n", argv[0]);
Packit Service a31ea6
		} else {
Packit Service a31ea6
		    printf("%s\n", (char *) ans);
Packit Service a31ea6
		    xmlFree(ans);
Packit Service a31ea6
		}
Packit Service a31ea6
	    }
Packit Service a31ea6
	} else if (!strcmp(command, "system")) {
Packit Service a31ea6
	    if (nbargs != 1) {
Packit Service a31ea6
		printf("system requires 1 arguments\n");
Packit Service a31ea6
	    } else {
Packit Service a31ea6
		ans = xmlCatalogResolveSystem((const xmlChar *) argv[0]);
Packit Service a31ea6
		if (ans == NULL) {
Packit Service a31ea6
		    printf("No entry for SYSTEM %s\n", argv[0]);
Packit Service a31ea6
		} else {
Packit Service a31ea6
		    printf("%s\n", (char *) ans);
Packit Service a31ea6
		    xmlFree(ans);
Packit Service a31ea6
		}
Packit Service a31ea6
	    }
Packit Service a31ea6
	} else if (!strcmp(command, "add")) {
Packit Service a31ea6
	    if (sgml) {
Packit Service a31ea6
		if ((nbargs != 3) && (nbargs != 2)) {
Packit Service a31ea6
		    printf("add requires 2 or 3 arguments\n");
Packit Service a31ea6
		} else {
Packit Service a31ea6
		    if (argv[2] == NULL)
Packit Service a31ea6
			ret = xmlCatalogAdd(BAD_CAST argv[0], NULL,
Packit Service a31ea6
					    BAD_CAST argv[1]);
Packit Service a31ea6
		    else
Packit Service a31ea6
			ret = xmlCatalogAdd(BAD_CAST argv[0], BAD_CAST argv[1],
Packit Service a31ea6
					    BAD_CAST argv[2]);
Packit Service a31ea6
		    if (ret != 0)
Packit Service a31ea6
			printf("add command failed\n");
Packit Service a31ea6
		}
Packit Service a31ea6
	    } else {
Packit Service a31ea6
		if ((nbargs != 3) && (nbargs != 2)) {
Packit Service a31ea6
		    printf("add requires 2 or 3 arguments\n");
Packit Service a31ea6
		} else {
Packit Service a31ea6
		    if (argv[2] == NULL)
Packit Service a31ea6
			ret = xmlCatalogAdd(BAD_CAST argv[0], NULL,
Packit Service a31ea6
					    BAD_CAST argv[1]);
Packit Service a31ea6
		    else
Packit Service a31ea6
			ret = xmlCatalogAdd(BAD_CAST argv[0], BAD_CAST argv[1],
Packit Service a31ea6
					    BAD_CAST argv[2]);
Packit Service a31ea6
		    if (ret != 0)
Packit Service a31ea6
			printf("add command failed\n");
Packit Service a31ea6
		}
Packit Service a31ea6
	    }
Packit Service a31ea6
	} else if (!strcmp(command, "del")) {
Packit Service a31ea6
	    if (nbargs != 1) {
Packit Service a31ea6
		printf("del requires 1\n");
Packit Service a31ea6
	    } else {
Packit Service a31ea6
		ret = xmlCatalogRemove(BAD_CAST argv[0]);
Packit Service a31ea6
		if (ret <= 0)
Packit Service a31ea6
		    printf("del command failed\n");
Packit Service a31ea6
Packit Service a31ea6
	    }
Packit Service a31ea6
	} else if (!strcmp(command, "resolve")) {
Packit Service a31ea6
	    if (nbargs != 2) {
Packit Service a31ea6
		printf("resolve requires 2 arguments\n");
Packit Service a31ea6
	    } else {
Packit Service a31ea6
		ans = xmlCatalogResolve(BAD_CAST argv[0],
Packit Service a31ea6
			                BAD_CAST argv[1]);
Packit Service a31ea6
		if (ans == NULL) {
Packit Service a31ea6
		    printf("Resolver failed to find an answer\n");
Packit Service a31ea6
		} else {
Packit Service a31ea6
		    printf("%s\n", (char *) ans);
Packit Service a31ea6
		    xmlFree(ans);
Packit Service a31ea6
		}
Packit Service a31ea6
	    }
Packit Service a31ea6
	} else if (!strcmp(command, "dump")) {
Packit Service a31ea6
	    if (nbargs != 0) {
Packit Service a31ea6
		printf("dump has no arguments\n");
Packit Service a31ea6
	    } else {
Packit Service a31ea6
		xmlCatalogDump(stdout);
Packit Service a31ea6
	    }
Packit Service a31ea6
	} else if (!strcmp(command, "debug")) {
Packit Service a31ea6
	    if (nbargs != 0) {
Packit Service a31ea6
		printf("debug has no arguments\n");
Packit Service a31ea6
	    } else {
Packit Service a31ea6
		verbose++;
Packit Service a31ea6
		xmlCatalogSetDebug(verbose);
Packit Service a31ea6
	    }
Packit Service a31ea6
	} else if (!strcmp(command, "quiet")) {
Packit Service a31ea6
	    if (nbargs != 0) {
Packit Service a31ea6
		printf("quiet has no arguments\n");
Packit Service a31ea6
	    } else {
Packit Service a31ea6
		if (verbose > 0)
Packit Service a31ea6
		    verbose--;
Packit Service a31ea6
		xmlCatalogSetDebug(verbose);
Packit Service a31ea6
	    }
Packit Service a31ea6
	} else {
Packit Service a31ea6
	    if (strcmp(command, "help")) {
Packit Service a31ea6
		printf("Unrecognized command %s\n", command);
Packit Service a31ea6
	    }
Packit Service a31ea6
	    printf("Commands available:\n");
Packit Service a31ea6
	    printf("\tpublic PublicID: make a PUBLIC identifier lookup\n");
Packit Service a31ea6
	    printf("\tsystem SystemID: make a SYSTEM identifier lookup\n");
Packit Service a31ea6
	    printf("\tresolve PublicID SystemID: do a full resolver lookup\n");
Packit Service a31ea6
	    printf("\tadd 'type' 'orig' 'replace' : add an entry\n");
Packit Service a31ea6
	    printf("\tdel 'values' : remove values\n");
Packit Service a31ea6
	    printf("\tdump: print the current catalog state\n");
Packit Service a31ea6
	    printf("\tdebug: increase the verbosity level\n");
Packit Service a31ea6
	    printf("\tquiet: decrease the verbosity level\n");
Packit Service a31ea6
	    printf("\texit:  quit the shell\n");
Packit Service a31ea6
	}
Packit Service a31ea6
	free(cmdline); /* not xmlFree here ! */
Packit Service a31ea6
    }
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/************************************************************************
Packit Service a31ea6
 *									*
Packit Service a31ea6
 *			Main						*
Packit Service a31ea6
 *									*
Packit Service a31ea6
 ************************************************************************/
Packit Service a31ea6
static void usage(const char *name) {
Packit Service a31ea6
    /* split into 2 printf's to avoid overly long string (gcc warning) */
Packit Service a31ea6
    printf("\
Packit Service a31ea6
Usage : %s [options] catalogfile entities...\n\
Packit Service a31ea6
\tParse the catalog file (void specification possibly expressed as \"\"\n\
Packit Service a31ea6
\tappoints the default system one) and query it for the entities\n\
Packit Service a31ea6
\t--sgml : handle SGML Super catalogs for --add and --del\n\
Packit Service a31ea6
\t--shell : run a shell allowing interactive queries\n\
Packit Service a31ea6
\t--create : create a new catalog\n\
Packit Service a31ea6
\t--add 'type' 'orig' 'replace' : add an XML entry\n\
Packit Service a31ea6
\t--add 'entry' : add an SGML entry\n", name);
Packit Service a31ea6
    printf("\
Packit Service a31ea6
\t--del 'values' : remove values\n\
Packit Service a31ea6
\t--noout: avoid dumping the result on stdout\n\
Packit Service a31ea6
\t         used with --add or --del, it saves the catalog changes\n\
Packit Service a31ea6
\t         and with --sgml it automatically updates the super catalog\n\
Packit Service a31ea6
\t--no-super-update: do not update the SGML super catalog\n\
Packit Service a31ea6
\t-v --verbose : provide debug informations\n");
Packit Service a31ea6
}
Packit Service a31ea6
int main(int argc, char **argv) {
Packit Service a31ea6
    int i;
Packit Service a31ea6
    int ret;
Packit Service a31ea6
    int exit_value = 0;
Packit Service a31ea6
Packit Service a31ea6
Packit Service a31ea6
    if (argc <= 1) {
Packit Service a31ea6
	usage(argv[0]);
Packit Service a31ea6
	return(1);
Packit Service a31ea6
    }
Packit Service a31ea6
Packit Service a31ea6
    LIBXML_TEST_VERSION
Packit Service a31ea6
    for (i = 1; i < argc ; i++) {
Packit Service a31ea6
	if (!strcmp(argv[i], "-"))
Packit Service a31ea6
	    break;
Packit Service a31ea6
Packit Service a31ea6
	if (argv[i][0] != '-')
Packit Service a31ea6
	    break;
Packit Service a31ea6
	if ((!strcmp(argv[i], "-verbose")) ||
Packit Service a31ea6
	    (!strcmp(argv[i], "-v")) ||
Packit Service a31ea6
	    (!strcmp(argv[i], "--verbose"))) {
Packit Service a31ea6
	    verbose++;
Packit Service a31ea6
	    xmlCatalogSetDebug(verbose);
Packit Service a31ea6
	} else if ((!strcmp(argv[i], "-noout")) ||
Packit Service a31ea6
	    (!strcmp(argv[i], "--noout"))) {
Packit Service a31ea6
            noout = 1;
Packit Service a31ea6
	} else if ((!strcmp(argv[i], "-shell")) ||
Packit Service a31ea6
	    (!strcmp(argv[i], "--shell"))) {
Packit Service a31ea6
	    shell++;
Packit Service a31ea6
            noout = 1;
Packit Service a31ea6
	} else if ((!strcmp(argv[i], "-sgml")) ||
Packit Service a31ea6
	    (!strcmp(argv[i], "--sgml"))) {
Packit Service a31ea6
	    sgml++;
Packit Service a31ea6
	} else if ((!strcmp(argv[i], "-create")) ||
Packit Service a31ea6
	    (!strcmp(argv[i], "--create"))) {
Packit Service a31ea6
	    create++;
Packit Service a31ea6
	} else if ((!strcmp(argv[i], "-convert")) ||
Packit Service a31ea6
	    (!strcmp(argv[i], "--convert"))) {
Packit Service a31ea6
	    convert++;
Packit Service a31ea6
	} else if ((!strcmp(argv[i], "-no-super-update")) ||
Packit Service a31ea6
	    (!strcmp(argv[i], "--no-super-update"))) {
Packit Service a31ea6
	    no_super_update++;
Packit Service a31ea6
	} else if ((!strcmp(argv[i], "-add")) ||
Packit Service a31ea6
	    (!strcmp(argv[i], "--add"))) {
Packit Service a31ea6
	    if (sgml)
Packit Service a31ea6
		i += 2;
Packit Service a31ea6
	    else
Packit Service a31ea6
		i += 3;
Packit Service a31ea6
	    add++;
Packit Service a31ea6
	} else if ((!strcmp(argv[i], "-del")) ||
Packit Service a31ea6
	    (!strcmp(argv[i], "--del"))) {
Packit Service a31ea6
	    i += 1;
Packit Service a31ea6
	    del++;
Packit Service a31ea6
	} else {
Packit Service a31ea6
	    fprintf(stderr, "Unknown option %s\n", argv[i]);
Packit Service a31ea6
	    usage(argv[0]);
Packit Service a31ea6
	    return(1);
Packit Service a31ea6
	}
Packit Service a31ea6
    }
Packit Service a31ea6
Packit Service a31ea6
    for (i = 1; i < argc; i++) {
Packit Service a31ea6
	if ((!strcmp(argv[i], "-add")) ||
Packit Service a31ea6
	    (!strcmp(argv[i], "--add"))) {
Packit Service a31ea6
	    if (sgml)
Packit Service a31ea6
		i += 2;
Packit Service a31ea6
	    else
Packit Service a31ea6
		i += 3;
Packit Service a31ea6
	    continue;
Packit Service a31ea6
	} else if ((!strcmp(argv[i], "-del")) ||
Packit Service a31ea6
	    (!strcmp(argv[i], "--del"))) {
Packit Service a31ea6
	    i += 1;
Packit Service a31ea6
Packit Service a31ea6
	    /* No catalog entry specified */
Packit Service a31ea6
	    if (i == argc || (sgml && i + 1 == argc)) {
Packit Service a31ea6
		fprintf(stderr, "No catalog entry specified to remove from\n");
Packit Service a31ea6
		usage (argv[0]);
Packit Service a31ea6
		return(1);
Packit Service a31ea6
	    }
Packit Service a31ea6
Packit Service a31ea6
	    continue;
Packit Service a31ea6
	} else if (argv[i][0] == '-')
Packit Service a31ea6
	    continue;
Packit Service a31ea6
Packit Service a31ea6
	if (filename == NULL && argv[i][0] == '\0') {
Packit Service a31ea6
	    /* Interpret empty-string catalog specification as
Packit Service a31ea6
	       a shortcut for a default system catalog. */
Packit Service a31ea6
	    xmlInitializeCatalog();
Packit Service a31ea6
	} else {
Packit Service a31ea6
	    filename = argv[i];
Packit Service a31ea6
	    ret = xmlLoadCatalog(argv[i]);
Packit Service a31ea6
	    if ((ret < 0) && (create)) {
Packit Service a31ea6
		xmlCatalogAdd(BAD_CAST "catalog", BAD_CAST argv[i], NULL);
Packit Service a31ea6
	    }
Packit Service a31ea6
	}
Packit Service a31ea6
	break;
Packit Service a31ea6
    }
Packit Service a31ea6
Packit Service a31ea6
    if (convert)
Packit Service a31ea6
        ret = xmlCatalogConvert();
Packit Service a31ea6
Packit Service a31ea6
    if ((add) || (del)) {
Packit Service a31ea6
	for (i = 1; i < argc ; i++) {
Packit Service a31ea6
	    if (!strcmp(argv[i], "-"))
Packit Service a31ea6
		break;
Packit Service a31ea6
Packit Service a31ea6
	    if (argv[i][0] != '-')
Packit Service a31ea6
		continue;
Packit Service a31ea6
	    if (strcmp(argv[i], "-add") && strcmp(argv[i], "--add") &&
Packit Service a31ea6
		strcmp(argv[i], "-del") && strcmp(argv[i], "--del"))
Packit Service a31ea6
		continue;
Packit Service a31ea6
Packit Service a31ea6
	    if (sgml) {
Packit Service a31ea6
		/*
Packit Service a31ea6
		 * Maintenance of SGML catalogs.
Packit Service a31ea6
		 */
Packit Service a31ea6
		xmlCatalogPtr catal = NULL;
Packit Service a31ea6
		xmlCatalogPtr super = NULL;
Packit Service a31ea6
Packit Service a31ea6
		catal = xmlLoadSGMLSuperCatalog(argv[i + 1]);
Packit Service a31ea6
Packit Service a31ea6
		if ((!strcmp(argv[i], "-add")) ||
Packit Service a31ea6
		    (!strcmp(argv[i], "--add"))) {
Packit Service a31ea6
		    if (catal == NULL)
Packit Service a31ea6
			catal = xmlNewCatalog(1);
Packit Service a31ea6
		    xmlACatalogAdd(catal, BAD_CAST "CATALOG",
Packit Service a31ea6
					 BAD_CAST argv[i + 2], NULL);
Packit Service a31ea6
Packit Service a31ea6
		    if (!no_super_update) {
Packit Service a31ea6
			super = xmlLoadSGMLSuperCatalog(XML_SGML_DEFAULT_CATALOG);
Packit Service a31ea6
			if (super == NULL)
Packit Service a31ea6
			    super = xmlNewCatalog(1);
Packit Service a31ea6
Packit Service a31ea6
			xmlACatalogAdd(super, BAD_CAST "CATALOG",
Packit Service a31ea6
					     BAD_CAST argv[i + 1], NULL);
Packit Service a31ea6
		    }
Packit Service a31ea6
		} else {
Packit Service a31ea6
		    if (catal != NULL)
Packit Service a31ea6
			ret = xmlACatalogRemove(catal, BAD_CAST argv[i + 2]);
Packit Service a31ea6
		    else
Packit Service a31ea6
			ret = -1;
Packit Service a31ea6
		    if (ret < 0) {
Packit Service a31ea6
			fprintf(stderr, "Failed to remove entry from %s\n",
Packit Service a31ea6
				argv[i + 1]);
Packit Service a31ea6
			exit_value = 1;
Packit Service a31ea6
		    }
Packit Service a31ea6
		    if ((!no_super_update) && (noout) && (catal != NULL) &&
Packit Service a31ea6
			(xmlCatalogIsEmpty(catal))) {
Packit Service a31ea6
			super = xmlLoadSGMLSuperCatalog(
Packit Service a31ea6
				   XML_SGML_DEFAULT_CATALOG);
Packit Service a31ea6
			if (super != NULL) {
Packit Service a31ea6
			    ret = xmlACatalogRemove(super,
Packit Service a31ea6
				    BAD_CAST argv[i + 1]);
Packit Service a31ea6
			    if (ret < 0) {
Packit Service a31ea6
				fprintf(stderr,
Packit Service a31ea6
					"Failed to remove entry from %s\n",
Packit Service a31ea6
					XML_SGML_DEFAULT_CATALOG);
Packit Service a31ea6
				exit_value = 1;
Packit Service a31ea6
			    }
Packit Service a31ea6
			}
Packit Service a31ea6
		    }
Packit Service a31ea6
		}
Packit Service a31ea6
		if (noout) {
Packit Service a31ea6
		    FILE *out;
Packit Service a31ea6
Packit Service a31ea6
		    if (xmlCatalogIsEmpty(catal)) {
Packit Service a31ea6
			remove(argv[i + 1]);
Packit Service a31ea6
		    } else {
Packit Service a31ea6
			out = fopen(argv[i + 1], "w");
Packit Service a31ea6
			if (out == NULL) {
Packit Service a31ea6
			    fprintf(stderr, "could not open %s for saving\n",
Packit Service a31ea6
				    argv[i + 1]);
Packit Service a31ea6
			    exit_value = 2;
Packit Service a31ea6
			    noout = 0;
Packit Service a31ea6
			} else {
Packit Service a31ea6
			    xmlACatalogDump(catal, out);
Packit Service a31ea6
			    fclose(out);
Packit Service a31ea6
			}
Packit Service a31ea6
		    }
Packit Service a31ea6
		    if (!no_super_update && super != NULL) {
Packit Service a31ea6
			if (xmlCatalogIsEmpty(super)) {
Packit Service a31ea6
			    remove(XML_SGML_DEFAULT_CATALOG);
Packit Service a31ea6
			} else {
Packit Service a31ea6
			    out = fopen(XML_SGML_DEFAULT_CATALOG, "w");
Packit Service a31ea6
			    if (out == NULL) {
Packit Service a31ea6
				fprintf(stderr,
Packit Service a31ea6
					"could not open %s for saving\n",
Packit Service a31ea6
					XML_SGML_DEFAULT_CATALOG);
Packit Service a31ea6
				exit_value = 2;
Packit Service a31ea6
				noout = 0;
Packit Service a31ea6
			    } else {
Packit Service a31ea6
Packit Service a31ea6
				xmlACatalogDump(super, out);
Packit Service a31ea6
				fclose(out);
Packit Service a31ea6
			    }
Packit Service a31ea6
			}
Packit Service a31ea6
		    }
Packit Service a31ea6
		} else {
Packit Service a31ea6
		    xmlACatalogDump(catal, stdout);
Packit Service a31ea6
		}
Packit Service a31ea6
		i += 2;
Packit Service a31ea6
	    } else {
Packit Service a31ea6
		if ((!strcmp(argv[i], "-add")) ||
Packit Service a31ea6
		    (!strcmp(argv[i], "--add"))) {
Packit Service a31ea6
			if ((argv[i + 3] == NULL) || (argv[i + 3][0] == 0))
Packit Service a31ea6
			    ret = xmlCatalogAdd(BAD_CAST argv[i + 1], NULL,
Packit Service a31ea6
						BAD_CAST argv[i + 2]);
Packit Service a31ea6
			else
Packit Service a31ea6
			    ret = xmlCatalogAdd(BAD_CAST argv[i + 1],
Packit Service a31ea6
						BAD_CAST argv[i + 2],
Packit Service a31ea6
						BAD_CAST argv[i + 3]);
Packit Service a31ea6
			if (ret != 0) {
Packit Service a31ea6
			    printf("add command failed\n");
Packit Service a31ea6
			    exit_value = 3;
Packit Service a31ea6
			}
Packit Service a31ea6
			i += 3;
Packit Service a31ea6
		} else if ((!strcmp(argv[i], "-del")) ||
Packit Service a31ea6
		    (!strcmp(argv[i], "--del"))) {
Packit Service a31ea6
		    ret = xmlCatalogRemove(BAD_CAST argv[i + 1]);
Packit Service a31ea6
		    if (ret < 0) {
Packit Service a31ea6
			fprintf(stderr, "Failed to remove entry %s\n",
Packit Service a31ea6
				argv[i + 1]);
Packit Service a31ea6
			exit_value = 1;
Packit Service a31ea6
		    }
Packit Service a31ea6
		    i += 1;
Packit Service a31ea6
		}
Packit Service a31ea6
	    }
Packit Service a31ea6
	}
Packit Service a31ea6
Packit Service a31ea6
    } else if (shell) {
Packit Service a31ea6
	usershell();
Packit Service a31ea6
    } else {
Packit Service a31ea6
	for (i++; i < argc; i++) {
Packit Service a31ea6
	    xmlURIPtr uri;
Packit Service a31ea6
	    xmlChar *ans;
Packit Service a31ea6
Packit Service a31ea6
	    uri = xmlParseURI(argv[i]);
Packit Service a31ea6
	    if (uri == NULL) {
Packit Service a31ea6
		ans = xmlCatalogResolvePublic((const xmlChar *) argv[i]);
Packit Service a31ea6
		if (ans == NULL) {
Packit Service a31ea6
		    printf("No entry for PUBLIC %s\n", argv[i]);
Packit Service a31ea6
		    exit_value = 4;
Packit Service a31ea6
		} else {
Packit Service a31ea6
		    printf("%s\n", (char *) ans);
Packit Service a31ea6
		    xmlFree(ans);
Packit Service a31ea6
		}
Packit Service a31ea6
	    } else {
Packit Service a31ea6
                xmlFreeURI(uri);
Packit Service a31ea6
		ans = xmlCatalogResolveSystem((const xmlChar *) argv[i]);
Packit Service a31ea6
		if (ans == NULL) {
Packit Service a31ea6
		    printf("No entry for SYSTEM %s\n", argv[i]);
Packit Service a31ea6
		    ans = xmlCatalogResolveURI ((const xmlChar *) argv[i]);
Packit Service a31ea6
		    if (ans == NULL) {
Packit Service a31ea6
			printf ("No entry for URI %s\n", argv[i]);
Packit Service a31ea6
		        exit_value = 4;
Packit Service a31ea6
		    } else {
Packit Service a31ea6
		        printf("%s\n", (char *) ans);
Packit Service a31ea6
			xmlFree (ans);
Packit Service a31ea6
		    }
Packit Service a31ea6
		} else {
Packit Service a31ea6
		    printf("%s\n", (char *) ans);
Packit Service a31ea6
		    xmlFree(ans);
Packit Service a31ea6
		}
Packit Service a31ea6
	    }
Packit Service a31ea6
	}
Packit Service a31ea6
    }
Packit Service a31ea6
    if ((!sgml) && ((add) || (del) || (create) || (convert))) {
Packit Service a31ea6
	if (noout && filename && *filename) {
Packit Service a31ea6
	    FILE *out;
Packit Service a31ea6
Packit Service a31ea6
	    out = fopen(filename, "w");
Packit Service a31ea6
	    if (out == NULL) {
Packit Service a31ea6
		fprintf(stderr, "could not open %s for saving\n", filename);
Packit Service a31ea6
		exit_value = 2;
Packit Service a31ea6
		noout = 0;
Packit Service a31ea6
	    } else {
Packit Service a31ea6
		xmlCatalogDump(out);
Packit Service a31ea6
	    }
Packit Service a31ea6
	} else {
Packit Service a31ea6
	    xmlCatalogDump(stdout);
Packit Service a31ea6
	}
Packit Service a31ea6
    }
Packit Service a31ea6
Packit Service a31ea6
    /*
Packit Service a31ea6
     * Cleanup and check for memory leaks
Packit Service a31ea6
     */
Packit Service a31ea6
    xmlCleanupParser();
Packit Service a31ea6
    xmlMemoryDump();
Packit Service a31ea6
    return(exit_value);
Packit Service a31ea6
}
Packit Service a31ea6
#else
Packit Service a31ea6
int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
Packit Service a31ea6
    fprintf(stderr, "libxml was not compiled with catalog and output support\n");
Packit Service a31ea6
    return(1);
Packit Service a31ea6
}
Packit Service a31ea6
#endif