15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlcatalog.c : a small utility program to handle XML catalogs
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See Copyright for the status of this software.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * daniel@veillard.com
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdarg.h>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STDLIB_H
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_LIBREADLINE
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <readline/readline.h>
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_LIBHISTORY
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <readline/history.h>
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlmemory.h>
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/uri.h>
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/catalog.h>
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/parser.h>
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/globals.h>
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int shell = 0;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int sgml = 0;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int noout = 0;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int create = 0;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int add = 0;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int del = 0;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int convert = 0;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int no_super_update = 0;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int verbose = 0;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char *filename = NULL;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef XML_SGML_DEFAULT_CATALOG
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SGML_DEFAULT_CATALOG "/etc/sgml/catalog"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 			Shell Interface					*
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlShellReadline:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @prompt:  the prompt value
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Read a string
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to it or NULL on EOF the caller is expected to
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     free the returned string.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char *
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlShellReadline(const char *prompt) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_LIBREADLINE
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *line_read;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Get a line from the user. */
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    line_read = readline (prompt);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* If the line has any text in it, save it on the history. */
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (line_read && *line_read)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	add_history (line_read);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (line_read);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char line_read[501];
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *ret;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int len;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prompt != NULL)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stdout, "%s", prompt);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!fgets(line_read, 500, stdin))
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    line_read[500] = 0;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    len = strlen(line_read);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (char *) malloc(len + 1);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != NULL) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	memcpy (ret, line_read, len + 1);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void usershell(void) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *cmdline = NULL, *cur;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nbargs;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char command[100];
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char arg[400];
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *argv[20];
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i, ret;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *ans;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (1) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cmdline = xmlShellReadline("> ");
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cmdline == NULL)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * Parse the command itself
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = cmdline;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nbargs = 0;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while ((*cur == ' ') || (*cur == '\t')) cur++;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	i = 0;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while ((*cur != ' ') && (*cur != '\t') &&
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       (*cur != '\n') && (*cur != '\r')) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (*cur == 0)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    command[i++] = *cur++;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	command[i] = 0;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (i == 0) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    free(cmdline);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * Parse the argument string
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	memset(arg, 0, sizeof(arg));
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while ((*cur == ' ') || (*cur == '\t')) cur++;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	i = 0;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while ((*cur != '\n') && (*cur != '\r') && (*cur != 0)) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (*cur == 0)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    arg[i++] = *cur++;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	arg[i] = 0;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * Parse the arguments
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	i = 0;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nbargs = 0;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = arg;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	memset(argv, 0, sizeof(argv));
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (*cur != 0) {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while ((*cur == ' ') || (*cur == '\t')) cur++;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (*cur == '\'') {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur++;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		argv[i] = cur;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while ((*cur != 0) && (*cur != '\'')) cur++;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (*cur == '\'') {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *cur = 0;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    nbargs++;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    i++;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur++;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (*cur == '"') {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur++;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		argv[i] = cur;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while ((*cur != 0) && (*cur != '"')) cur++;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (*cur == '"') {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *cur = 0;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    nbargs++;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    i++;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur++;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		argv[i] = cur;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while ((*cur != 0) && (*cur != ' ') && (*cur != '\t'))
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur++;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*cur = 0;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		nbargs++;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		i++;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur++;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * start interpreting the command
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!strcmp(command, "exit"))
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!strcmp(command, "quit"))
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!strcmp(command, "bye"))
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (!strcmp(command, "public")) {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (nbargs != 1) {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		printf("public requires 1 arguments\n");
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ans = xmlCatalogResolvePublic((const xmlChar *) argv[0]);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ans == NULL) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    printf("No entry for PUBLIC %s\n", argv[0]);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    printf("%s\n", (char *) ans);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(ans);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (!strcmp(command, "system")) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (nbargs != 1) {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		printf("system requires 1 arguments\n");
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ans = xmlCatalogResolveSystem((const xmlChar *) argv[0]);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ans == NULL) {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    printf("No entry for SYSTEM %s\n", argv[0]);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    printf("%s\n", (char *) ans);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(ans);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (!strcmp(command, "add")) {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (sgml) {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((nbargs != 3) && (nbargs != 2)) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    printf("add requires 2 or 3 arguments\n");
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (argv[2] == NULL)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ret = xmlCatalogAdd(BAD_CAST argv[0], NULL,
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					    BAD_CAST argv[1]);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ret = xmlCatalogAdd(BAD_CAST argv[0], BAD_CAST argv[1],
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					    BAD_CAST argv[2]);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ret != 0)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			printf("add command failed\n");
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((nbargs != 3) && (nbargs != 2)) {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    printf("add requires 2 or 3 arguments\n");
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (argv[2] == NULL)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ret = xmlCatalogAdd(BAD_CAST argv[0], NULL,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					    BAD_CAST argv[1]);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ret = xmlCatalogAdd(BAD_CAST argv[0], BAD_CAST argv[1],
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					    BAD_CAST argv[2]);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ret != 0)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			printf("add command failed\n");
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (!strcmp(command, "del")) {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (nbargs != 1) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		printf("del requires 1\n");
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlCatalogRemove(BAD_CAST argv[0]);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret <= 0)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    printf("del command failed\n");
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (!strcmp(command, "resolve")) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (nbargs != 2) {
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		printf("resolve requires 2 arguments\n");
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ans = xmlCatalogResolve(BAD_CAST argv[0],
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			                BAD_CAST argv[1]);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ans == NULL) {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    printf("Resolver failed to find an answer\n");
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    printf("%s\n", (char *) ans);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(ans);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (!strcmp(command, "dump")) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (nbargs != 0) {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		printf("dump has no arguments\n");
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlCatalogDump(stdout);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (!strcmp(command, "debug")) {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (nbargs != 0) {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		printf("debug has no arguments\n");
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		verbose++;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlCatalogSetDebug(verbose);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (!strcmp(command, "quiet")) {
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (nbargs != 0) {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		printf("quiet has no arguments\n");
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (verbose > 0)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    verbose--;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlCatalogSetDebug(verbose);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (strcmp(command, "help")) {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		printf("Unrecognized command %s\n", command);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    printf("Commands available:\n");
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    printf("\tpublic PublicID: make a PUBLIC identifier lookup\n");
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    printf("\tsystem SystemID: make a SYSTEM identifier lookup\n");
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    printf("\tresolve PublicID SystemID: do a full resolver lookup\n");
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    printf("\tadd 'type' 'orig' 'replace' : add an entry\n");
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    printf("\tdel 'values' : remove values\n");
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    printf("\tdump: print the current catalog state\n");
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    printf("\tdebug: increase the verbosity level\n");
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    printf("\tquiet: decrease the verbosity level\n");
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    printf("\texit:  quit the shell\n");
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	free(cmdline); /* not xmlFree here ! */
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 			Main						*
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void usage(const char *name) {
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* split into 2 printf's to avoid overly long string (gcc warning) */
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Usage : %s [options] catalogfile entities...\n\
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\tParse the catalog file and query it for the entities\n\
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\t--sgml : handle SGML Super catalogs for --add and --del\n\
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\t--shell : run a shell allowing interactive queries\n\
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\t--create : create a new catalog\n\
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\t--add 'type' 'orig' 'replace' : add an XML entry\n\
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\t--add 'entry' : add an SGML entry\n", name);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\t--del 'values' : remove values\n\
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\t--noout: avoid dumping the result on stdout\n\
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\t         used with --add or --del, it saves the catalog changes\n\
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\t         and with --sgml it automatically updates the super catalog\n\
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\t--no-super-update: do not update the SGML super catalog\n\
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\t-v --verbose : provide debug informations\n");
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main(int argc, char **argv) {
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int exit_value = 0;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (argc <= 1) {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	usage(argv[0]);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(1);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LIBXML_TEST_VERSION
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 1; i < argc ; i++) {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (!strcmp(argv[i], "-"))
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (argv[i][0] != '-')
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((!strcmp(argv[i], "-verbose")) ||
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (!strcmp(argv[i], "-v")) ||
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (!strcmp(argv[i], "--verbose"))) {
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    verbose++;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlCatalogSetDebug(verbose);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-noout")) ||
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (!strcmp(argv[i], "--noout"))) {
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            noout = 1;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-shell")) ||
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (!strcmp(argv[i], "--shell"))) {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    shell++;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            noout = 1;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-sgml")) ||
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (!strcmp(argv[i], "--sgml"))) {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    sgml++;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-create")) ||
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (!strcmp(argv[i], "--create"))) {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    create++;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-convert")) ||
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (!strcmp(argv[i], "--convert"))) {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    convert++;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-no-super-update")) ||
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (!strcmp(argv[i], "--no-super-update"))) {
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    no_super_update++;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-add")) ||
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (!strcmp(argv[i], "--add"))) {
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (sgml)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		i += 2;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		i += 3;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    add++;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-del")) ||
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (!strcmp(argv[i], "--del"))) {
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i += 1;
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    del++;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(stderr, "Unknown option %s\n", argv[i]);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    usage(argv[0]);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(1);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 1; i < argc; i++) {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((!strcmp(argv[i], "-add")) ||
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (!strcmp(argv[i], "--add"))) {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (sgml)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		i += 2;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		i += 3;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-del")) ||
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (!strcmp(argv[i], "--del"))) {
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i += 1;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* No catalog entry specified */
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (i == argc || (sgml && i + 1 == argc)) {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(stderr, "No catalog entry specified to remove from\n");
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		usage (argv[0]);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(1);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (argv[i][0] == '-')
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	filename = argv[i];
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlLoadCatalog(argv[i]);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((ret < 0) && (create)) {
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlCatalogAdd(BAD_CAST "catalog", BAD_CAST argv[i], NULL);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	break;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (convert)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = xmlCatalogConvert();
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((add) || (del)) {
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = 1; i < argc ; i++) {
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (!strcmp(argv[i], "-"))
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (argv[i][0] != '-')
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (strcmp(argv[i], "-add") && strcmp(argv[i], "--add") &&
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		strcmp(argv[i], "-del") && strcmp(argv[i], "--del"))
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (sgml) {
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 * Maintenance of SGML catalogs.
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 */
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlCatalogPtr catal = NULL;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlCatalogPtr super = NULL;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		catal = xmlLoadSGMLSuperCatalog(argv[i + 1]);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((!strcmp(argv[i], "-add")) ||
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (!strcmp(argv[i], "--add"))) {
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (catal == NULL)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			catal = xmlNewCatalog(1);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlACatalogAdd(catal, BAD_CAST "CATALOG",
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 BAD_CAST argv[i + 2], NULL);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (!no_super_update) {
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			super = xmlLoadSGMLSuperCatalog(XML_SGML_DEFAULT_CATALOG);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (super == NULL)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    super = xmlNewCatalog(1);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlACatalogAdd(super, BAD_CAST "CATALOG",
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					     BAD_CAST argv[i + 1], NULL);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (catal != NULL)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ret = xmlACatalogRemove(catal, BAD_CAST argv[i + 2]);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ret = -1;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ret < 0) {
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			fprintf(stderr, "Failed to remove entry from %s\n",
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				argv[i + 1]);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			exit_value = 1;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((!no_super_update) && (noout) && (catal != NULL) &&
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(xmlCatalogIsEmpty(catal))) {
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			super = xmlLoadSGMLSuperCatalog(
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   XML_SGML_DEFAULT_CATALOG);
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (super != NULL) {
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    ret = xmlACatalogRemove(super,
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    BAD_CAST argv[i + 1]);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (ret < 0) {
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				fprintf(stderr,
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					"Failed to remove entry from %s\n",
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					XML_SGML_DEFAULT_CATALOG);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				exit_value = 1;
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (noout) {
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FILE *out;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlCatalogIsEmpty(catal)) {
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			remove(argv[i + 1]);
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } else {
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			out = fopen(argv[i + 1], "w");
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (out == NULL) {
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    fprintf(stderr, "could not open %s for saving\n",
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    argv[i + 1]);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    exit_value = 2;
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    noout = 0;
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			} else {
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlACatalogDump(catal, out);
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    fclose(out);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (!no_super_update && super != NULL) {
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (xmlCatalogIsEmpty(super)) {
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    remove(XML_SGML_DEFAULT_CATALOG);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			} else {
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    out = fopen(XML_SGML_DEFAULT_CATALOG, "w");
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (out == NULL) {
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				fprintf(stderr,
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					"could not open %s for saving\n",
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					XML_SGML_DEFAULT_CATALOG);
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				exit_value = 2;
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				noout = 0;
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    } else {
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlACatalogDump(super, out);
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				fclose(out);
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlACatalogDump(catal, stdout);
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		i += 2;
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((!strcmp(argv[i], "-add")) ||
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (!strcmp(argv[i], "--add"))) {
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if ((argv[i + 3] == NULL) || (argv[i + 3][0] == 0))
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    ret = xmlCatalogAdd(BAD_CAST argv[i + 1], NULL,
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						BAD_CAST argv[i + 2]);
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			else
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    ret = xmlCatalogAdd(BAD_CAST argv[i + 1],
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						BAD_CAST argv[i + 2],
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						BAD_CAST argv[i + 3]);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (ret != 0) {
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    printf("add command failed\n");
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    exit_value = 3;
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			i += 3;
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if ((!strcmp(argv[i], "-del")) ||
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (!strcmp(argv[i], "--del"))) {
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = xmlCatalogRemove(BAD_CAST argv[i + 1]);
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ret < 0) {
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			fprintf(stderr, "Failed to remove entry %s\n",
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				argv[i + 1]);
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			exit_value = 1;
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    i += 1;
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (shell) {
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	usershell();
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i++; i < argc; i++) {
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlURIPtr uri;
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *ans;
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    uri = xmlParseURI(argv[i]);
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (uri == NULL) {
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ans = xmlCatalogResolvePublic((const xmlChar *) argv[i]);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ans == NULL) {
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    printf("No entry for PUBLIC %s\n", argv[i]);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    exit_value = 4;
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    printf("%s\n", (char *) ans);
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(ans);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlFreeURI(uri);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ans = xmlCatalogResolveSystem((const xmlChar *) argv[i]);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ans == NULL) {
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    printf("No entry for SYSTEM %s\n", argv[i]);
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ans = xmlCatalogResolveURI ((const xmlChar *) argv[i]);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ans == NULL) {
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			printf ("No entry for URI %s\n", argv[i]);
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        exit_value = 4;
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } else {
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        printf("%s\n", (char *) ans);
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlFree (ans);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    printf("%s\n", (char *) ans);
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(ans);
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((!sgml) && ((add) || (del) || (create) || (convert))) {
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (noout && filename && *filename) {
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FILE *out;
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    out = fopen(filename, "w");
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (out == NULL) {
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(stderr, "could not open %s for saving\n", filename);
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		exit_value = 2;
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		noout = 0;
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlCatalogDump(out);
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlCatalogDump(stdout);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Cleanup and check for memory leaks
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCleanupParser();
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlMemoryDump();
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(exit_value);
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stderr, "libxml was not compiled with catalog and output support\n");
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(1);
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
615