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