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