1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlcatalog.c : a small utility program to handle XML catalogs
3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See Copyright for the status of this software.
5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * daniel@veillard.com
7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h"
10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h>
12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <stdio.h>
13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <stdarg.h>
14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_STDLIB_H
16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <stdlib.h>
17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_LIBREADLINE
20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <readline/readline.h>
21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_LIBHISTORY
22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <readline/history.h>
23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlmemory.h>
27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/uri.h>
28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/catalog.h>
29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parser.h>
30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/globals.h>
31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int shell = 0;
34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int sgml = 0;
35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int noout = 0;
36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int create = 0;
37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int add = 0;
38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int del = 0;
39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int convert = 0;
40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int no_super_update = 0;
41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int verbose = 0;
42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic char *filename = NULL;
43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef XML_SGML_DEFAULT_CATALOG
46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SGML_DEFAULT_CATALOG "/etc/sgml/catalog"
47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Shell Interface					*
52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlShellReadline:
56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prompt:  the prompt value
57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Read a string
59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a pointer to it or NULL on EOF the caller is expected to
61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     free the returned string.
62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic char *
64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlShellReadline(const char *prompt) {
65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_LIBREADLINE
66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char *line_read;
67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Get a line from the user. */
69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    line_read = readline (prompt);
70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* If the line has any text in it, save it on the history. */
72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (line_read && *line_read)
73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	add_history (line_read);
74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (line_read);
76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char line_read[501];
78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char *ret;
79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int len;
80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (prompt != NULL)
82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(stdout, "%s", prompt);
83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!fgets(line_read, 500, stdin))
84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    line_read[500] = 0;
86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    len = strlen(line_read);
87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (char *) malloc(len + 1);
88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != NULL) {
89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memcpy (ret, line_read, len + 1);
90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void usershell(void) {
96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char *cmdline = NULL, *cur;
97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbargs;
98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char command[100];
99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char arg[400];
100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char *argv[20];
101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, ret;
102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ans;
103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (1) {
105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cmdline = xmlShellReadline("> ");
106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cmdline == NULL)
107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Parse the command itself
111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cmdline;
113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nbargs = 0;
114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((*cur == ' ') || (*cur == '\t')) cur++;
115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	i = 0;
116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((*cur != ' ') && (*cur != '\t') &&
117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       (*cur != '\n') && (*cur != '\r')) {
118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (*cur == 0)
119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    command[i++] = *cur++;
121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	command[i] = 0;
123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (i == 0) {
124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    free(cmdline);
125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Parse the argument string
130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memset(arg, 0, sizeof(arg));
132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((*cur == ' ') || (*cur == '\t')) cur++;
133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	i = 0;
134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((*cur != '\n') && (*cur != '\r') && (*cur != 0)) {
135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (*cur == 0)
136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    arg[i++] = *cur++;
138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	arg[i] = 0;
140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Parse the arguments
143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	i = 0;
145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nbargs = 0;
146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = arg;
147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memset(argv, 0, sizeof(argv));
148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (*cur != 0) {
149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while ((*cur == ' ') || (*cur == '\t')) cur++;
150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (*cur == '\'') {
151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur++;
152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		argv[i] = cur;
153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while ((*cur != 0) && (*cur != '\'')) cur++;
154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (*cur == '\'') {
155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *cur = 0;
156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    nbargs++;
157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    i++;
158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur++;
159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (*cur == '"') {
161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur++;
162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		argv[i] = cur;
163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while ((*cur != 0) && (*cur != '"')) cur++;
164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (*cur == '"') {
165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *cur = 0;
166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    nbargs++;
167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    i++;
168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur++;
169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		argv[i] = cur;
172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while ((*cur != 0) && (*cur != ' ') && (*cur != '\t'))
173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur++;
174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*cur = 0;
175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		nbargs++;
176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		i++;
177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur++;
178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * start interpreting the command
183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (!strcmp(command, "exit"))
185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (!strcmp(command, "quit"))
187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (!strcmp(command, "bye"))
189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!strcmp(command, "public")) {
191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (nbargs != 1) {
192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("public requires 1 arguments\n");
193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ans = xmlCatalogResolvePublic((const xmlChar *) argv[0]);
195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ans == NULL) {
196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("No entry for PUBLIC %s\n", argv[0]);
197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("%s\n", (char *) ans);
199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(ans);
200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (!strcmp(command, "system")) {
203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (nbargs != 1) {
204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("system requires 1 arguments\n");
205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ans = xmlCatalogResolveSystem((const xmlChar *) argv[0]);
207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ans == NULL) {
208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("No entry for SYSTEM %s\n", argv[0]);
209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("%s\n", (char *) ans);
211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(ans);
212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (!strcmp(command, "add")) {
215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (sgml) {
216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((nbargs != 3) && (nbargs != 2)) {
217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("add requires 2 or 3 arguments\n");
218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (argv[2] == NULL)
220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = xmlCatalogAdd(BAD_CAST argv[0], NULL,
221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					    BAD_CAST argv[1]);
222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = xmlCatalogAdd(BAD_CAST argv[0], BAD_CAST argv[1],
224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					    BAD_CAST argv[2]);
225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret != 0)
226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			printf("add command failed\n");
227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((nbargs != 3) && (nbargs != 2)) {
230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("add requires 2 or 3 arguments\n");
231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (argv[2] == NULL)
233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = xmlCatalogAdd(BAD_CAST argv[0], NULL,
234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					    BAD_CAST argv[1]);
235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = xmlCatalogAdd(BAD_CAST argv[0], BAD_CAST argv[1],
237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					    BAD_CAST argv[2]);
238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret != 0)
239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			printf("add command failed\n");
240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (!strcmp(command, "del")) {
243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (nbargs != 1) {
244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("del requires 1\n");
245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlCatalogRemove(BAD_CAST argv[0]);
247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret <= 0)
248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("del command failed\n");
249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (!strcmp(command, "resolve")) {
252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (nbargs != 2) {
253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("resolve requires 2 arguments\n");
254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ans = xmlCatalogResolve(BAD_CAST argv[0],
256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			                BAD_CAST argv[1]);
257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ans == NULL) {
258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("Resolver failed to find an answer\n");
259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("%s\n", (char *) ans);
261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(ans);
262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (!strcmp(command, "dump")) {
265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (nbargs != 0) {
266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("dump has no arguments\n");
267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlCatalogDump(stdout);
269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (!strcmp(command, "debug")) {
271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (nbargs != 0) {
272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("debug has no arguments\n");
273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		verbose++;
275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlCatalogSetDebug(verbose);
276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (!strcmp(command, "quiet")) {
278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (nbargs != 0) {
279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("quiet has no arguments\n");
280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (verbose > 0)
282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    verbose--;
283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlCatalogSetDebug(verbose);
284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (strcmp(command, "help")) {
287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		printf("Unrecognized command %s\n", command);
288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("Commands available:\n");
290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("\tpublic PublicID: make a PUBLIC identifier lookup\n");
291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("\tsystem SystemID: make a SYSTEM identifier lookup\n");
292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("\tresolve PublicID SystemID: do a full resolver lookup\n");
293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("\tadd 'type' 'orig' 'replace' : add an entry\n");
294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("\tdel 'values' : remove values\n");
295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("\tdump: print the current catalog state\n");
296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("\tdebug: increase the verbosity level\n");
297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("\tquiet: decrease the verbosity level\n");
298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    printf("\texit:  quit the shell\n");
299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	free(cmdline); /* not xmlFree here ! */
301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Main						*
307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void usage(const char *name) {
310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* split into 2 printf's to avoid overly long string (gcc warning) */
311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("\
312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectUsage : %s [options] catalogfile entities...\n\
313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project\tParse the catalog file and query it for the entities\n\
314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project\t--sgml : handle SGML Super catalogs for --add and --del\n\
315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project\t--shell : run a shell allowing interactive queries\n\
316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project\t--create : create a new catalog\n\
317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project\t--add 'type' 'orig' 'replace' : add an XML entry\n\
318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project\t--add 'entry' : add an SGML entry\n", name);
319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    printf("\
320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project\t--del 'values' : remove values\n\
321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project\t--noout: avoid dumping the result on stdout\n\
322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project\t         used with --add or --del, it saves the catalog changes\n\
323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project\t         and with --sgml it automatically updates the super catalog\n\
324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project\t--no-super-update: do not update the SGML super catalog\n\
325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project\t-v --verbose : provide debug informations\n");
326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint main(int argc, char **argv) {
328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int exit_value = 0;
331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (argc <= 1) {
334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	usage(argv[0]);
335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    LIBXML_TEST_VERSION
339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 1; i < argc ; i++) {
340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!strcmp(argv[i], "-"))
341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (argv[i][0] != '-')
344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((!strcmp(argv[i], "-verbose")) ||
346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (!strcmp(argv[i], "-v")) ||
347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (!strcmp(argv[i], "--verbose"))) {
348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    verbose++;
349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlCatalogSetDebug(verbose);
350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((!strcmp(argv[i], "-noout")) ||
351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (!strcmp(argv[i], "--noout"))) {
352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            noout = 1;
353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((!strcmp(argv[i], "-shell")) ||
354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (!strcmp(argv[i], "--shell"))) {
355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    shell++;
356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            noout = 1;
357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((!strcmp(argv[i], "-sgml")) ||
358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (!strcmp(argv[i], "--sgml"))) {
359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sgml++;
360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((!strcmp(argv[i], "-create")) ||
361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (!strcmp(argv[i], "--create"))) {
362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    create++;
363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((!strcmp(argv[i], "-convert")) ||
364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (!strcmp(argv[i], "--convert"))) {
365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    convert++;
366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((!strcmp(argv[i], "-no-super-update")) ||
367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (!strcmp(argv[i], "--no-super-update"))) {
368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    no_super_update++;
369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((!strcmp(argv[i], "-add")) ||
370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (!strcmp(argv[i], "--add"))) {
371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (sgml)
372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		i += 2;
373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		i += 3;
375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    add++;
376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((!strcmp(argv[i], "-del")) ||
377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (!strcmp(argv[i], "--del"))) {
378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    i += 1;
379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    del++;
380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(stderr, "Unknown option %s\n", argv[i]);
382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    usage(argv[0]);
383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 1; i < argc; i++) {
388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((!strcmp(argv[i], "-add")) ||
389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (!strcmp(argv[i], "--add"))) {
390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (sgml)
391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		i += 2;
392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		i += 3;
394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((!strcmp(argv[i], "-del")) ||
396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (!strcmp(argv[i], "--del"))) {
397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    i += 1;
398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* No catalog entry specified */
400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (i == argc || (sgml && i + 1 == argc)) {
401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(stderr, "No catalog entry specified to remove from\n");
402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		usage (argv[0]);
403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(1);
404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (argv[i][0] == '-')
408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	filename = argv[i];
410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlLoadCatalog(argv[i]);
411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((ret < 0) && (create)) {
412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlCatalogAdd(BAD_CAST "catalog", BAD_CAST argv[i], NULL);
413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	break;
415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (convert)
418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlCatalogConvert();
419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((add) || (del)) {
421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 1; i < argc ; i++) {
422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (!strcmp(argv[i], "-"))
423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (argv[i][0] != '-')
426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (strcmp(argv[i], "-add") && strcmp(argv[i], "--add") &&
428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		strcmp(argv[i], "-del") && strcmp(argv[i], "--del"))
429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (sgml) {
432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * Maintenance of SGML catalogs.
434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 */
435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlCatalogPtr catal = NULL;
436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlCatalogPtr super = NULL;
437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		catal = xmlLoadSGMLSuperCatalog(argv[i + 1]);
439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((!strcmp(argv[i], "-add")) ||
441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (!strcmp(argv[i], "--add"))) {
442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (catal == NULL)
443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			catal = xmlNewCatalog(1);
444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlACatalogAdd(catal, BAD_CAST "CATALOG",
445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					 BAD_CAST argv[i + 2], NULL);
446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (!no_super_update) {
448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			super = xmlLoadSGMLSuperCatalog(XML_SGML_DEFAULT_CATALOG);
449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (super == NULL)
450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    super = xmlNewCatalog(1);
451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlACatalogAdd(super, BAD_CAST "CATALOG",
453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					     BAD_CAST argv[i + 1], NULL);
454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (catal != NULL)
457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = xmlACatalogRemove(catal, BAD_CAST argv[i + 2]);
458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = -1;
460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret < 0) {
461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			fprintf(stderr, "Failed to remove entry from %s\n",
462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				argv[i + 1]);
463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			exit_value = 1;
464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((!no_super_update) && (noout) && (catal != NULL) &&
466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlCatalogIsEmpty(catal))) {
467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			super = xmlLoadSGMLSuperCatalog(
468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   XML_SGML_DEFAULT_CATALOG);
469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (super != NULL) {
470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = xmlACatalogRemove(super,
471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    BAD_CAST argv[i + 1]);
472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (ret < 0) {
473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				fprintf(stderr,
474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					"Failed to remove entry from %s\n",
475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					XML_SGML_DEFAULT_CATALOG);
476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				exit_value = 1;
477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (noout) {
482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FILE *out;
483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlCatalogIsEmpty(catal)) {
485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			remove(argv[i + 1]);
486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			out = fopen(argv[i + 1], "w");
488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (out == NULL) {
489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    fprintf(stderr, "could not open %s for saving\n",
490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    argv[i + 1]);
491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    exit_value = 2;
492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    noout = 0;
493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else {
494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlACatalogDump(catal, out);
495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    fclose(out);
496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (!no_super_update && super != NULL) {
499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlCatalogIsEmpty(super)) {
500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    remove(XML_SGML_DEFAULT_CATALOG);
501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else {
502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    out = fopen(XML_SGML_DEFAULT_CATALOG, "w");
503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (out == NULL) {
504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				fprintf(stderr,
505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					"could not open %s for saving\n",
506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					XML_SGML_DEFAULT_CATALOG);
507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				exit_value = 2;
508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				noout = 0;
509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    } else {
510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlACatalogDump(super, out);
512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				fclose(out);
513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlACatalogDump(catal, stdout);
518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		i += 2;
520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((!strcmp(argv[i], "-add")) ||
522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (!strcmp(argv[i], "--add"))) {
523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((argv[i + 3] == NULL) || (argv[i + 3][0] == 0))
524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = xmlCatalogAdd(BAD_CAST argv[i + 1], NULL,
525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						BAD_CAST argv[i + 2]);
526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = xmlCatalogAdd(BAD_CAST argv[i + 1],
528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						BAD_CAST argv[i + 2],
529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						BAD_CAST argv[i + 3]);
530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (ret != 0) {
531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    printf("add command failed\n");
532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    exit_value = 3;
533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			i += 3;
535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if ((!strcmp(argv[i], "-del")) ||
536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (!strcmp(argv[i], "--del"))) {
537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlCatalogRemove(BAD_CAST argv[i + 1]);
538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret < 0) {
539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			fprintf(stderr, "Failed to remove entry %s\n",
540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				argv[i + 1]);
541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			exit_value = 1;
542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    i += 1;
544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (shell) {
549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	usershell();
550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i++; i < argc; i++) {
552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlURIPtr uri;
553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *ans;
554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    uri = xmlParseURI(argv[i]);
556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (uri == NULL) {
557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ans = xmlCatalogResolvePublic((const xmlChar *) argv[i]);
558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ans == NULL) {
559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("No entry for PUBLIC %s\n", argv[i]);
560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    exit_value = 4;
561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("%s\n", (char *) ans);
563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(ans);
564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFreeURI(uri);
567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ans = xmlCatalogResolveSystem((const xmlChar *) argv[i]);
568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ans == NULL) {
569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("No entry for SYSTEM %s\n", argv[i]);
570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ans = xmlCatalogResolveURI ((const xmlChar *) argv[i]);
571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ans == NULL) {
572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			printf ("No entry for URI %s\n", argv[i]);
573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        exit_value = 4;
574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        printf("%s\n", (char *) ans);
576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFree (ans);
577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    printf("%s\n", (char *) ans);
580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(ans);
581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((!sgml) && ((add) || (del) || (create) || (convert))) {
586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (noout && filename && *filename) {
587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FILE *out;
588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    out = fopen(filename, "w");
590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (out == NULL) {
591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(stderr, "could not open %s for saving\n", filename);
592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		exit_value = 2;
593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		noout = 0;
594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlCatalogDump(out);
596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlCatalogDump(stdout);
599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Cleanup and check for memory leaks
604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlCleanupParser();
606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlMemoryDump();
607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(exit_value);
608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(stderr, "libxml was not compiled with catalog and output support\n");
612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(1);
613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
615