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