15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * debugXML.c : This is a set of routines used for debugging the tree
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *              produced by the XML parser.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See Copyright for the status of this software.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Daniel Veillard <daniel@veillard.com>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IN_LIBXML
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DEBUG_ENABLED
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STDLIB_H
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STRING_H
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h>
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlmemory.h>
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/tree.h>
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/parser.h>
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/parserInternals.h>
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/valid.h>
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/debugXML.h>
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/HTMLtree.h>
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/HTMLparser.h>
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlerror.h>
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/globals.h>
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xpathInternals.h>
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/uri.h>
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/relaxng.h>
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DUMP_TEXT_TYPE 1
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlDebugCtxt xmlDebugCtxt;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlDebugCtxt *xmlDebugCtxtPtr;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlDebugCtxt {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FILE *output;               /* the output file */
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char shift[101];            /* used for indenting */
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int depth;                  /* current depth */
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr doc;              /* current document */
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr node;		/* current node */
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDictPtr dict;		/* the doc dictionnary */
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int check;                  /* do just checkings */
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int errors;                 /* number of errors found */
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nodict;			/* if the document has no dictionnary */
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int options;		/* options */
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void xmlCtxtDumpNodeList(xmlDebugCtxtPtr ctxt, xmlNodePtr node);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtDumpInitCtxt(xmlDebugCtxtPtr ctxt)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->depth = 0;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->check = 0;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->errors = 0;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->output = stdout;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->doc = NULL;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->node = NULL;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->dict = NULL;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->nodict = 0;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->options = 0;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < 100; i++)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt->shift[i] = ' ';
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->shift[100] = 0;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtDumpCleanCtxt(xmlDebugCtxtPtr ctxt ATTRIBUTE_UNUSED)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* remove the ATTRIBUTE_UNUSED when this is added */
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNsCheckScope:
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns: the namespace node
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check that a given namespace is in scope on a node.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if in scope, -1 in case of argument error,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         -2 if the namespace is not in scope, and -3 if not on
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         an ancestor node.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNsCheckScope(xmlNodePtr node, xmlNsPtr ns)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr cur;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node == NULL) || (ns == NULL))
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node->type != XML_ELEMENT_NODE) &&
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(node->type != XML_ATTRIBUTE_NODE) &&
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(node->type != XML_DOCUMENT_NODE) &&
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(node->type != XML_TEXT_NODE) &&
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(node->type != XML_HTML_DOCUMENT_NODE) &&
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(node->type != XML_XINCLUDE_START))
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-2);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((node != NULL) &&
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           ((node->type == XML_ELEMENT_NODE) ||
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (node->type == XML_ATTRIBUTE_NODE) ||
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (node->type == XML_TEXT_NODE) ||
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (node->type == XML_XINCLUDE_START))) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((node->type == XML_ELEMENT_NODE) ||
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (node->type == XML_XINCLUDE_START)) {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = node->nsDef;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (cur != NULL) {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (cur == ns)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(1);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlStrEqual(cur->prefix, ns->prefix))
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(-2);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur = cur->next;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	node = node->parent;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* the xml namespace may be declared on the document node */
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node != NULL) &&
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ((node->type == XML_DOCUMENT_NODE) ||
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 (node->type == XML_HTML_DOCUMENT_NODE))) {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 xmlNsPtr oldNs = ((xmlDocPtr) node)->oldNs;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 if (oldNs == ns)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     return(1);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(-3);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtDumpSpaces(xmlDebugCtxtPtr ctxt)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->check)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt->output != NULL) && (ctxt->depth > 0)) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ctxt->depth < 50)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "%s", &ctxt->shift[100 - 2 * ctxt->depth]);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "%s", ctxt->shift);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDebugErr:
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  a debug context
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @error:  the error code
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle a debug error.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDebugErr(xmlDebugCtxtPtr ctxt, int error, const char *msg)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->errors++;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __xmlRaiseError(NULL, NULL, NULL,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, ctxt->node, XML_FROM_CHECK,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    error, XML_ERR_ERROR, NULL, 0,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, NULL, NULL, 0, 0,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "%s", msg);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDebugErr2(xmlDebugCtxtPtr ctxt, int error, const char *msg, int extra)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->errors++;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __xmlRaiseError(NULL, NULL, NULL,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, ctxt->node, XML_FROM_CHECK,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    error, XML_ERR_ERROR, NULL, 0,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, NULL, NULL, 0, 0,
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    msg, extra);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDebugErr3(xmlDebugCtxtPtr ctxt, int error, const char *msg, const char *extra)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->errors++;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __xmlRaiseError(NULL, NULL, NULL,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, ctxt->node, XML_FROM_CHECK,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    error, XML_ERR_ERROR, NULL, 0,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    NULL, NULL, NULL, 0, 0,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    msg, extra);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCtxtNsCheckScope:
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the debugging context
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns: the namespace node
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Report if a given namespace is is not in scope.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtNsCheckScope(xmlDebugCtxtPtr ctxt, xmlNodePtr node, xmlNsPtr ns)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlNsCheckScope(node, ns);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == -2) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ns->prefix == NULL)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr(ctxt, XML_CHECK_NS_SCOPE,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Reference to default namespace not in scope\n");
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr3(ctxt, XML_CHECK_NS_SCOPE,
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 "Reference to namespace '%s' not in scope\n",
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 (char *) ns->prefix);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == -3) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ns->prefix == NULL)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr(ctxt, XML_CHECK_NS_ANCESTOR,
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Reference to default namespace not on ancestor\n");
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr3(ctxt, XML_CHECK_NS_ANCESTOR,
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 "Reference to namespace '%s' not on ancestor\n",
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 (char *) ns->prefix);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCtxtCheckString:
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the debug context
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str: the string
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do debugging on the string, currently it just checks the UTF-8 content
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtCheckString(xmlDebugCtxtPtr ctxt, const xmlChar * str)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (str == NULL) return;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->check) {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!xmlCheckUTF8(str)) {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr3(ctxt, XML_CHECK_NOT_UTF8,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 "String is not UTF-8 %s", (const char *) str);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCtxtCheckName:
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the debug context
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: the name
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do debugging on the name, for example the dictionnary status and
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * conformance to the Name production.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtCheckName(xmlDebugCtxtPtr ctxt, const xmlChar * name)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->check) {
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (name == NULL) {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr(ctxt, XML_CHECK_NO_NAME, "Name is NULL");
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (xmlValidateName(name, 0)) {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr3(ctxt, XML_CHECK_NOT_NCNAME,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 "Name is not an NCName '%s'", (const char *) name);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((ctxt->dict != NULL) &&
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (!xmlDictOwns(ctxt->dict, name)) &&
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ((ctxt->doc == NULL) ||
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             ((ctxt->doc->parseFlags & (XML_PARSE_SAX1 | XML_PARSE_NODICT)) == 0))) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr3(ctxt, XML_CHECK_OUTSIDE_DICT,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 "Name is not from the document dictionnary '%s'",
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 (const char *) name);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtGenericNodeCheck(xmlDebugCtxtPtr ctxt, xmlNodePtr node) {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr doc;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDictPtr dict;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    doc = node->doc;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node->parent == NULL)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlDebugErr(ctxt, XML_CHECK_NO_PARENT,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	            "Node has no parent\n");
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node->doc == NULL) {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlDebugErr(ctxt, XML_CHECK_NO_DOC,
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	            "Node has no doc\n");
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dict = NULL;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	dict = doc->dict;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((dict == NULL) && (ctxt->nodict == 0)) {
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* desactivated right now as it raises too many errors */
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (doc->type == XML_DOCUMENT_NODE)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlDebugErr(ctxt, XML_CHECK_NO_DICT,
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "Document has no dictionnary\n");
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ctxt->nodict = 1;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ctxt->doc == NULL)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ctxt->doc = doc;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ctxt->dict == NULL) {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ctxt->dict = dict;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node->parent != NULL) && (node->doc != node->parent->doc) &&
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (!xmlStrEqual(node->name, BAD_CAST "pseudoroot")))
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlDebugErr(ctxt, XML_CHECK_WRONG_DOC,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	            "Node doc differs from parent's one\n");
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node->prev == NULL) {
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (node->type == XML_ATTRIBUTE_NODE) {
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((node->parent != NULL) &&
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        (node != (xmlNodePtr) node->parent->properties))
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlDebugErr(ctxt, XML_CHECK_NO_PREV,
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "Attr has no prev and not first of attr list\n");
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if ((node->parent != NULL) && (node->parent->children != node))
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr(ctxt, XML_CHECK_NO_PREV,
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "Node has no prev and not first of parent list\n");
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (node->prev->next != node)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr(ctxt, XML_CHECK_WRONG_PREV,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        "Node prev->next : back link wrong\n");
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node->next == NULL) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((node->parent != NULL) && (node->type != XML_ATTRIBUTE_NODE) &&
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (node->parent->last != node) &&
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (node->parent->type == XML_ELEMENT_NODE))
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr(ctxt, XML_CHECK_NO_NEXT,
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "Node has no next and not last of parent list\n");
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (node->next->prev != node)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr(ctxt, XML_CHECK_WRONG_NEXT,
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "Node next->prev : forward link wrong\n");
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (node->next->parent != node->parent)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr(ctxt, XML_CHECK_WRONG_PARENT,
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "Node next->prev : forward link wrong\n");
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node->type == XML_ELEMENT_NODE) {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlNsPtr ns;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ns = node->nsDef;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (ns != NULL) {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlCtxtNsCheckScope(ctxt, node, ns);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ns = ns->next;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (node->ns != NULL)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlCtxtNsCheckScope(ctxt, node, node->ns);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (node->type == XML_ATTRIBUTE_NODE) {
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (node->ns != NULL)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlCtxtNsCheckScope(ctxt, node, node->ns);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node->type != XML_ELEMENT_NODE) &&
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(node->type != XML_ATTRIBUTE_NODE) &&
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(node->type != XML_ELEMENT_DECL) &&
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(node->type != XML_ATTRIBUTE_DECL) &&
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(node->type != XML_DTD_NODE) &&
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(node->type != XML_HTML_DOCUMENT_NODE) &&
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(node->type != XML_DOCUMENT_NODE)) {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (node->content != NULL)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlCtxtCheckString(ctxt, (const xmlChar *) node->content);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (node->type) {
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_NODE:
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_NODE:
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlCtxtCheckName(ctxt, node->name);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_TEXT_NODE:
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((node->name == xmlStringText) ||
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        (node->name == xmlStringTextNoenc))
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* some case of entity substitution can lead to this */
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((ctxt->dict != NULL) &&
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        (node->name == xmlDictLookup(ctxt->dict, BAD_CAST "nbktext",
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		                             7)))
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr3(ctxt, XML_CHECK_WRONG_NAME,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 "Text node has wrong name '%s'",
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 (const char *) node->name);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_COMMENT_NODE:
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (node->name == xmlStringComment)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr3(ctxt, XML_CHECK_WRONG_NAME,
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 "Comment node has wrong name '%s'",
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 (const char *) node->name);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_PI_NODE:
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlCtxtCheckName(ctxt, node->name);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CDATA_SECTION_NODE:
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (node->name == NULL)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr3(ctxt, XML_CHECK_NAME_NOT_NULL,
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 "CData section has non NULL name '%s'",
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 (const char *) node->name);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_REF_NODE:
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_NODE:
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_TYPE_NODE:
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_FRAG_NODE:
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_NOTATION_NODE:
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DTD_NODE:
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_DECL:
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_DECL:
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_DECL:
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_NAMESPACE_DECL:
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_XINCLUDE_START:
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_XINCLUDE_END:
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DOCB_ENABLED
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCB_DOCUMENT_NODE:
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_NODE:
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_HTML_DOCUMENT_NODE:
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtDumpString(xmlDebugCtxtPtr ctxt, const xmlChar * str)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->check) {
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* TODO: check UTF8 content of the string */
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (str == NULL) {
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(ctxt->output, "(NULL)");
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < 40; i++)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (str[i] == 0)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (IS_BLANK_CH(str[i]))
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fputc(' ', ctxt->output);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (str[i] >= 0x80)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "#%X", str[i]);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fputc(str[i], ctxt->output);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(ctxt->output, "...");
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtDumpDtdNode(xmlDebugCtxtPtr ctxt, xmlDtdPtr dtd)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpSpaces(ctxt);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (dtd == NULL) {
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!ctxt->check)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "DTD node is NULL\n");
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (dtd->type != XML_DTD_NODE) {
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDebugErr(ctxt, XML_CHECK_NOT_DTD,
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	            "Node is not a DTD");
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ctxt->check) {
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (dtd->name != NULL)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "DTD(%s)", (char *) dtd->name);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "DTD");
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (dtd->ExternalID != NULL)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, ", PUBLIC %s", (char *) dtd->ExternalID);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (dtd->SystemID != NULL)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, ", SYSTEM %s", (char *) dtd->SystemID);
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(ctxt->output, "\n");
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Do a bit of checking
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) dtd);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtDumpAttrDecl(xmlDebugCtxtPtr ctxt, xmlAttributePtr attr)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpSpaces(ctxt);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr == NULL) {
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!ctxt->check)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "Attribute declaration is NULL\n");
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr->type != XML_ATTRIBUTE_DECL) {
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDebugErr(ctxt, XML_CHECK_NOT_ATTR_DECL,
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	            "Node is not an attribute declaration");
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr->name != NULL) {
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!ctxt->check)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "ATTRDECL(%s)", (char *) attr->name);
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDebugErr(ctxt, XML_CHECK_NO_NAME,
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	            "Node attribute declaration has no name");
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr->elem != NULL) {
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!ctxt->check)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, " for %s", (char *) attr->elem);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDebugErr(ctxt, XML_CHECK_NO_ELEM,
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	            "Node attribute declaration has no element name");
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ctxt->check) {
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switch (attr->atype) {
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_ATTRIBUTE_CDATA:
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, " CDATA");
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_ATTRIBUTE_ID:
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, " ID");
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_ATTRIBUTE_IDREF:
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, " IDREF");
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_ATTRIBUTE_IDREFS:
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, " IDREFS");
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_ATTRIBUTE_ENTITY:
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, " ENTITY");
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_ATTRIBUTE_ENTITIES:
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, " ENTITIES");
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_ATTRIBUTE_NMTOKEN:
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, " NMTOKEN");
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_ATTRIBUTE_NMTOKENS:
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, " NMTOKENS");
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_ATTRIBUTE_ENUMERATION:
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, " ENUMERATION");
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_ATTRIBUTE_NOTATION:
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, " NOTATION ");
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (attr->tree != NULL) {
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int indx;
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlEnumerationPtr cur = attr->tree;
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            for (indx = 0; indx < 5; indx++) {
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (indx != 0)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    fprintf(ctxt->output, "|%s", (char *) cur->name);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                else
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    fprintf(ctxt->output, " (%s", (char *) cur->name);
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                cur = cur->next;
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (cur == NULL)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    break;
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (cur == NULL)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, ")");
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "...)");
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switch (attr->def) {
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_ATTRIBUTE_NONE:
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_ATTRIBUTE_REQUIRED:
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, " REQUIRED");
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_ATTRIBUTE_IMPLIED:
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, " IMPLIED");
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_ATTRIBUTE_FIXED:
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, " FIXED");
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (attr->defaultValue != NULL) {
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "\"");
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpString(ctxt, attr->defaultValue);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "\"");
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(ctxt->output, "\n");
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Do a bit of checking
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) attr);
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtDumpElemDecl(xmlDebugCtxtPtr ctxt, xmlElementPtr elem)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpSpaces(ctxt);
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elem == NULL) {
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!ctxt->check)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "Element declaration is NULL\n");
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elem->type != XML_ELEMENT_DECL) {
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDebugErr(ctxt, XML_CHECK_NOT_ELEM_DECL,
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	            "Node is not an element declaration");
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elem->name != NULL) {
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!ctxt->check) {
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "ELEMDECL(");
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpString(ctxt, elem->name);
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, ")");
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDebugErr(ctxt, XML_CHECK_NO_NAME,
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	            "Element declaration has no name");
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ctxt->check) {
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switch (elem->etype) {
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_ELEMENT_TYPE_UNDEFINED:
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, ", UNDEFINED");
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_ELEMENT_TYPE_EMPTY:
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, ", EMPTY");
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_ELEMENT_TYPE_ANY:
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, ", ANY");
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_ELEMENT_TYPE_MIXED:
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, ", MIXED ");
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_ELEMENT_TYPE_ELEMENT:
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, ", MIXED ");
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((elem->type != XML_ELEMENT_NODE) && (elem->content != NULL)) {
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            char buf[5001];
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            buf[0] = 0;
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlSnprintfElementContent(buf, 5000, elem->content, 1);
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            buf[5000] = 0;
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "%s", buf);
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(ctxt->output, "\n");
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Do a bit of checking
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) elem);
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtDumpEntityDecl(xmlDebugCtxtPtr ctxt, xmlEntityPtr ent)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpSpaces(ctxt);
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ent == NULL) {
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!ctxt->check)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "Entity declaration is NULL\n");
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ent->type != XML_ENTITY_DECL) {
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDebugErr(ctxt, XML_CHECK_NOT_ENTITY_DECL,
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	            "Node is not an entity declaration");
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ent->name != NULL) {
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!ctxt->check) {
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "ENTITYDECL(");
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpString(ctxt, ent->name);
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, ")");
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDebugErr(ctxt, XML_CHECK_NO_NAME,
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	            "Entity declaration has no name");
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ctxt->check) {
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switch (ent->etype) {
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_INTERNAL_GENERAL_ENTITY:
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, ", internal\n");
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, ", external parsed\n");
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, ", unparsed\n");
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_INTERNAL_PARAMETER_ENTITY:
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, ", parameter\n");
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_EXTERNAL_PARAMETER_ENTITY:
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, ", external parameter\n");
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_INTERNAL_PREDEFINED_ENTITY:
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, ", predefined\n");
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ent->ExternalID) {
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpSpaces(ctxt);
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, " ExternalID=%s\n",
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    (char *) ent->ExternalID);
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ent->SystemID) {
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpSpaces(ctxt);
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, " SystemID=%s\n",
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    (char *) ent->SystemID);
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ent->URI != NULL) {
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpSpaces(ctxt);
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, " URI=%s\n", (char *) ent->URI);
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ent->content) {
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpSpaces(ctxt);
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, " content=");
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpString(ctxt, ent->content);
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "\n");
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Do a bit of checking
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) ent);
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtDumpNamespace(xmlDebugCtxtPtr ctxt, xmlNsPtr ns)
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpSpaces(ctxt);
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ns == NULL) {
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!ctxt->check)
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "namespace node is NULL\n");
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ns->type != XML_NAMESPACE_DECL) {
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDebugErr(ctxt, XML_CHECK_NOT_NS_DECL,
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	            "Node is not a namespace declaration");
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ns->href == NULL) {
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ns->prefix != NULL)
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr3(ctxt, XML_CHECK_NO_HREF,
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "Incomplete namespace %s href=NULL\n",
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    (char *) ns->prefix);
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr(ctxt, XML_CHECK_NO_HREF,
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "Incomplete default namespace href=NULL\n");
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!ctxt->check) {
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (ns->prefix != NULL)
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "namespace %s href=",
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        (char *) ns->prefix);
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "default namespace href=");
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpString(ctxt, ns->href);
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "\n");
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtDumpNamespaceList(xmlDebugCtxtPtr ctxt, xmlNsPtr ns)
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (ns != NULL) {
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlCtxtDumpNamespace(ctxt, ns);
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ns = ns->next;
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtDumpEntity(xmlDebugCtxtPtr ctxt, xmlEntityPtr ent)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpSpaces(ctxt);
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ent == NULL) {
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!ctxt->check)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "Entity is NULL\n");
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ctxt->check) {
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switch (ent->etype) {
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_INTERNAL_GENERAL_ENTITY:
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "INTERNAL_GENERAL_ENTITY ");
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "EXTERNAL_GENERAL_PARSED_ENTITY ");
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "EXTERNAL_GENERAL_UNPARSED_ENTITY ");
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_INTERNAL_PARAMETER_ENTITY:
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "INTERNAL_PARAMETER_ENTITY ");
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_EXTERNAL_PARAMETER_ENTITY:
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "EXTERNAL_PARAMETER_ENTITY ");
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            default:
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "ENTITY_%d ! ", (int) ent->etype);
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(ctxt->output, "%s\n", ent->name);
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ent->ExternalID) {
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpSpaces(ctxt);
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "ExternalID=%s\n",
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    (char *) ent->ExternalID);
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ent->SystemID) {
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpSpaces(ctxt);
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "SystemID=%s\n", (char *) ent->SystemID);
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ent->URI) {
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpSpaces(ctxt);
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "URI=%s\n", (char *) ent->URI);
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ent->content) {
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpSpaces(ctxt);
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "content=");
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpString(ctxt, ent->content);
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "\n");
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCtxtDumpAttr:
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the FILE * for the output
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @attr:  the attribute
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @depth:  the indentation level.
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dumps debug information for the attribute
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtDumpAttr(xmlDebugCtxtPtr ctxt, xmlAttrPtr attr)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpSpaces(ctxt);
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr == NULL) {
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!ctxt->check)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "Attr is NULL");
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ctxt->check) {
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(ctxt->output, "ATTRIBUTE ");
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlCtxtDumpString(ctxt, attr->name);
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(ctxt->output, "\n");
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (attr->children != NULL) {
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ctxt->depth++;
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpNodeList(ctxt, attr->children);
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ctxt->depth--;
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr->name == NULL)
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDebugErr(ctxt, XML_CHECK_NO_NAME,
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	            "Attribute has no name");
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Do a bit of checking
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) attr);
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCtxtDumpAttrList:
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the FILE * for the output
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @attr:  the attribute list
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @depth:  the indentation level.
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dumps debug information for the attribute list
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtDumpAttrList(xmlDebugCtxtPtr ctxt, xmlAttrPtr attr)
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (attr != NULL) {
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlCtxtDumpAttr(ctxt, attr);
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        attr = attr->next;
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCtxtDumpOneNode:
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the FILE * for the output
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the node
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @depth:  the indentation level.
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dumps debug information for the element node, it is not recursive
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtDumpOneNode(xmlDebugCtxtPtr ctxt, xmlNodePtr node)
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node == NULL) {
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!ctxt->check) {
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpSpaces(ctxt);
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "node is NULL\n");
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->node = node;
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (node->type) {
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_NODE:
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!ctxt->check) {
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlCtxtDumpSpaces(ctxt);
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "ELEMENT ");
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if ((node->ns != NULL) && (node->ns->prefix != NULL)) {
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlCtxtDumpString(ctxt, node->ns->prefix);
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    fprintf(ctxt->output, ":");
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlCtxtDumpString(ctxt, node->name);
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "\n");
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_NODE:
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!ctxt->check)
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlCtxtDumpSpaces(ctxt);
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "Error, ATTRIBUTE found here\n");
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtGenericNodeCheck(ctxt, node);
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return;
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_TEXT_NODE:
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!ctxt->check) {
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlCtxtDumpSpaces(ctxt);
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (node->name == (const xmlChar *) xmlStringTextNoenc)
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    fprintf(ctxt->output, "TEXT no enc");
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                else
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    fprintf(ctxt->output, "TEXT");
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ctxt->options & DUMP_TEXT_TYPE) {
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (node->content == (xmlChar *) &(node->properties))
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			fprintf(ctxt->output, " compact\n");
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else if (xmlDictOwns(ctxt->dict, node->content) == 1)
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			fprintf(ctxt->output, " interned\n");
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			fprintf(ctxt->output, "\n");
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    fprintf(ctxt->output, "\n");
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CDATA_SECTION_NODE:
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!ctxt->check) {
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlCtxtDumpSpaces(ctxt);
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "CDATA_SECTION\n");
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_REF_NODE:
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!ctxt->check) {
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlCtxtDumpSpaces(ctxt);
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "ENTITY_REF(%s)\n",
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        (char *) node->name);
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_NODE:
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!ctxt->check) {
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlCtxtDumpSpaces(ctxt);
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "ENTITY\n");
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_PI_NODE:
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!ctxt->check) {
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlCtxtDumpSpaces(ctxt);
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "PI %s\n", (char *) node->name);
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_COMMENT_NODE:
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!ctxt->check) {
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlCtxtDumpSpaces(ctxt);
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "COMMENT\n");
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_NODE:
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_HTML_DOCUMENT_NODE:
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!ctxt->check) {
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlCtxtDumpSpaces(ctxt);
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "Error, DOCUMENT found here\n");
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtGenericNodeCheck(ctxt, node);
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return;
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_TYPE_NODE:
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!ctxt->check) {
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlCtxtDumpSpaces(ctxt);
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "DOCUMENT_TYPE\n");
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_FRAG_NODE:
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!ctxt->check) {
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlCtxtDumpSpaces(ctxt);
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "DOCUMENT_FRAG\n");
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_NOTATION_NODE:
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!ctxt->check) {
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlCtxtDumpSpaces(ctxt);
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "NOTATION\n");
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DTD_NODE:
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpDtdNode(ctxt, (xmlDtdPtr) node);
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return;
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_DECL:
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpElemDecl(ctxt, (xmlElementPtr) node);
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return;
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_DECL:
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpAttrDecl(ctxt, (xmlAttributePtr) node);
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return;
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_DECL:
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpEntityDecl(ctxt, (xmlEntityPtr) node);
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return;
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_NAMESPACE_DECL:
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpNamespace(ctxt, (xmlNsPtr) node);
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return;
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_XINCLUDE_START:
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!ctxt->check) {
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlCtxtDumpSpaces(ctxt);
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "INCLUDE START\n");
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return;
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_XINCLUDE_END:
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!ctxt->check) {
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlCtxtDumpSpaces(ctxt);
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "INCLUDE END\n");
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return;
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!ctxt->check)
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlCtxtDumpSpaces(ctxt);
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr2(ctxt, XML_CHECK_UNKNOWN_NODE,
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                "Unknown node type %d\n", node->type);
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return;
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node->doc == NULL) {
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!ctxt->check) {
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpSpaces(ctxt);
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(ctxt->output, "PBM: doc == NULL !!!\n");
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->depth++;
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node->type == XML_ELEMENT_NODE) && (node->nsDef != NULL))
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlCtxtDumpNamespaceList(ctxt, node->nsDef);
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node->type == XML_ELEMENT_NODE) && (node->properties != NULL))
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlCtxtDumpAttrList(ctxt, node->properties);
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node->type != XML_ENTITY_REF_NODE) {
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((node->type != XML_ELEMENT_NODE) && (node->content != NULL)) {
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!ctxt->check) {
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlCtxtDumpSpaces(ctxt);
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "content=");
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlCtxtDumpString(ctxt, node->content);
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "\n");
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlEntityPtr ent;
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ent = xmlGetDocEntity(node->doc, node->name);
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ent != NULL)
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpEntity(ctxt, ent);
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->depth--;
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Do a bit of checking
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtGenericNodeCheck(ctxt, node);
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCtxtDumpNode:
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the FILE * for the output
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the node
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @depth:  the indentation level.
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dumps debug information for the element node, it is recursive
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtDumpNode(xmlDebugCtxtPtr ctxt, xmlNodePtr node)
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node == NULL) {
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!ctxt->check) {
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpSpaces(ctxt);
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "node is NULL\n");
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpOneNode(ctxt, node);
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node->type != XML_NAMESPACE_DECL) &&
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (node->children != NULL) && (node->type != XML_ENTITY_REF_NODE)) {
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt->depth++;
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlCtxtDumpNodeList(ctxt, node->children);
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt->depth--;
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCtxtDumpNodeList:
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the FILE * for the output
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the node list
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @depth:  the indentation level.
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dumps debug information for the list of element node, it is recursive
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtDumpNodeList(xmlDebugCtxtPtr ctxt, xmlNodePtr node)
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (node != NULL) {
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlCtxtDumpNode(ctxt, node);
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        node = node->next;
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtDumpDocHead(xmlDebugCtxtPtr ctxt, xmlDocPtr doc)
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc == NULL) {
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!ctxt->check)
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "DOCUMENT == NULL !\n");
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->node = (xmlNodePtr) doc;
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (doc->type) {
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_NODE:
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr(ctxt, XML_CHECK_FOUND_ELEMENT,
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                "Misplaced ELEMENT node\n");
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_NODE:
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr(ctxt, XML_CHECK_FOUND_ATTRIBUTE,
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                "Misplaced ATTRIBUTE node\n");
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_TEXT_NODE:
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr(ctxt, XML_CHECK_FOUND_TEXT,
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                "Misplaced TEXT node\n");
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CDATA_SECTION_NODE:
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr(ctxt, XML_CHECK_FOUND_CDATA,
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                "Misplaced CDATA node\n");
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_REF_NODE:
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr(ctxt, XML_CHECK_FOUND_ENTITYREF,
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                "Misplaced ENTITYREF node\n");
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_NODE:
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr(ctxt, XML_CHECK_FOUND_ENTITY,
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                "Misplaced ENTITY node\n");
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_PI_NODE:
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr(ctxt, XML_CHECK_FOUND_PI,
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                "Misplaced PI node\n");
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_COMMENT_NODE:
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr(ctxt, XML_CHECK_FOUND_COMMENT,
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                "Misplaced COMMENT node\n");
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_NODE:
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (!ctxt->check)
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(ctxt->output, "DOCUMENT\n");
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_HTML_DOCUMENT_NODE:
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (!ctxt->check)
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(ctxt->output, "HTML DOCUMENT\n");
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_TYPE_NODE:
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr(ctxt, XML_CHECK_FOUND_DOCTYPE,
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                "Misplaced DOCTYPE node\n");
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_FRAG_NODE:
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr(ctxt, XML_CHECK_FOUND_FRAGMENT,
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                "Misplaced FRAGMENT node\n");
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_NOTATION_NODE:
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr(ctxt, XML_CHECK_FOUND_NOTATION,
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                "Misplaced NOTATION node\n");
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDebugErr2(ctxt, XML_CHECK_UNKNOWN_NODE,
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                "Unknown node type %d\n", doc->type);
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCtxtDumpDocumentHead:
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the FILE * for the output
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dumps debug information cncerning the document, not recursive
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtDumpDocumentHead(xmlDebugCtxtPtr ctxt, xmlDocPtr doc)
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc == NULL) return;
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpDocHead(ctxt, doc);
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ctxt->check) {
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (doc->name != NULL) {
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "name=");
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpString(ctxt, BAD_CAST doc->name);
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "\n");
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (doc->version != NULL) {
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "version=");
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpString(ctxt, doc->version);
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "\n");
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (doc->encoding != NULL) {
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "encoding=");
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpString(ctxt, doc->encoding);
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "\n");
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (doc->URL != NULL) {
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "URL=");
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlCtxtDumpString(ctxt, doc->URL);
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "\n");
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (doc->standalone)
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "standalone=true\n");
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc->oldNs != NULL)
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlCtxtDumpNamespaceList(ctxt, doc->oldNs);
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCtxtDumpDocument:
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the FILE * for the output
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dumps debug information for the document, it's recursive
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtDumpDocument(xmlDebugCtxtPtr ctxt, xmlDocPtr doc)
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc == NULL) {
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!ctxt->check)
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "DOCUMENT == NULL !\n");
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpDocumentHead(ctxt, doc);
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (((doc->type == XML_DOCUMENT_NODE) ||
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (doc->type == XML_HTML_DOCUMENT_NODE))
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        && (doc->children != NULL)) {
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt->depth++;
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlCtxtDumpNodeList(ctxt, doc->children);
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt->depth--;
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtDumpEntityCallback(xmlEntityPtr cur, xmlDebugCtxtPtr ctxt)
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!ctxt->check)
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "Entity is NULL");
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ctxt->check) {
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(ctxt->output, "%s : ", (char *) cur->name);
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switch (cur->etype) {
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_INTERNAL_GENERAL_ENTITY:
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "INTERNAL GENERAL, ");
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "EXTERNAL PARSED, ");
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "EXTERNAL UNPARSED, ");
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_INTERNAL_PARAMETER_ENTITY:
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "INTERNAL PARAMETER, ");
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XML_EXTERNAL_PARAMETER_ENTITY:
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "EXTERNAL PARAMETER, ");
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            default:
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlDebugErr2(ctxt, XML_CHECK_ENTITY_TYPE,
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     "Unknown entity type %d\n", cur->etype);
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (cur->ExternalID != NULL)
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "ID \"%s\"", (char *) cur->ExternalID);
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (cur->SystemID != NULL)
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "SYSTEM \"%s\"", (char *) cur->SystemID);
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (cur->orig != NULL)
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "\n orig \"%s\"", (char *) cur->orig);
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((cur->type != XML_ELEMENT_NODE) && (cur->content != NULL))
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "\n content \"%s\"",
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    (char *) cur->content);
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(ctxt->output, "\n");
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCtxtDumpEntities:
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the FILE * for the output
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dumps debug information for all the entities in use by the document
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtDumpEntities(xmlDebugCtxtPtr ctxt, xmlDocPtr doc)
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc == NULL) return;
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpDocHead(ctxt, doc);
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((doc->intSubset != NULL) && (doc->intSubset->entities != NULL)) {
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlEntitiesTablePtr table = (xmlEntitiesTablePtr)
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            doc->intSubset->entities;
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!ctxt->check)
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "Entities in internal subset\n");
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlHashScan(table, (xmlHashScanner) xmlCtxtDumpEntityCallback,
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ctxt);
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(ctxt->output, "No entities in internal subset\n");
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((doc->extSubset != NULL) && (doc->extSubset->entities != NULL)) {
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlEntitiesTablePtr table = (xmlEntitiesTablePtr)
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            doc->extSubset->entities;
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!ctxt->check)
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "Entities in external subset\n");
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlHashScan(table, (xmlHashScanner) xmlCtxtDumpEntityCallback,
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ctxt);
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (!ctxt->check)
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(ctxt->output, "No entities in external subset\n");
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCtxtDumpDTD:
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the FILE * for the output
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @dtd:  the DTD
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dumps debug information for the DTD
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtDumpDTD(xmlDebugCtxtPtr ctxt, xmlDtdPtr dtd)
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (dtd == NULL) {
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!ctxt->check)
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "DTD is NULL\n");
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpDtdNode(ctxt, dtd);
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (dtd->children == NULL)
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(ctxt->output, "    DTD is empty\n");
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else {
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt->depth++;
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlCtxtDumpNodeList(ctxt, dtd->children);
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt->depth--;
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			Public entry points for dump			*
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDebugDumpString:
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the FILE * for the output
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str:  the string
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dumps informations about the string, shorten it if necessary
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDebugDumpString(FILE * output, const xmlChar * str)
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (output == NULL)
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	output = stdout;
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (str == NULL) {
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(output, "(NULL)");
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i < 40; i++)
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (str[i] == 0)
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return;
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (IS_BLANK_CH(str[i]))
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fputc(' ', output);
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (str[i] >= 0x80)
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(output, "#%X", str[i]);
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fputc(str[i], output);
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(output, "...");
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDebugDumpAttr:
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the FILE * for the output
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @attr:  the attribute
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @depth:  the indentation level.
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dumps debug information for the attribute
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDebugDumpAttr(FILE *output, xmlAttrPtr attr, int depth) {
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDebugCtxt ctxt;
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (output == NULL) return;
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpInitCtxt(&ctxt);
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt.output = output;
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt.depth = depth;
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpAttr(&ctxt, attr);
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpCleanCtxt(&ctxt);
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDebugDumpEntities:
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the FILE * for the output
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dumps debug information for all the entities in use by the document
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDebugDumpEntities(FILE * output, xmlDocPtr doc)
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDebugCtxt ctxt;
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (output == NULL) return;
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpInitCtxt(&ctxt);
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt.output = output;
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpEntities(&ctxt, doc);
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpCleanCtxt(&ctxt);
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDebugDumpAttrList:
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the FILE * for the output
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @attr:  the attribute list
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @depth:  the indentation level.
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dumps debug information for the attribute list
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDebugDumpAttrList(FILE * output, xmlAttrPtr attr, int depth)
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDebugCtxt ctxt;
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (output == NULL) return;
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpInitCtxt(&ctxt);
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt.output = output;
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt.depth = depth;
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpAttrList(&ctxt, attr);
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpCleanCtxt(&ctxt);
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDebugDumpOneNode:
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the FILE * for the output
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the node
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @depth:  the indentation level.
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dumps debug information for the element node, it is not recursive
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDebugDumpOneNode(FILE * output, xmlNodePtr node, int depth)
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDebugCtxt ctxt;
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (output == NULL) return;
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpInitCtxt(&ctxt);
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt.output = output;
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt.depth = depth;
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpOneNode(&ctxt, node);
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpCleanCtxt(&ctxt);
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDebugDumpNode:
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the FILE * for the output
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the node
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @depth:  the indentation level.
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dumps debug information for the element node, it is recursive
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDebugDumpNode(FILE * output, xmlNodePtr node, int depth)
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDebugCtxt ctxt;
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (output == NULL)
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	output = stdout;
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpInitCtxt(&ctxt);
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt.output = output;
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt.depth = depth;
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpNode(&ctxt, node);
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpCleanCtxt(&ctxt);
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDebugDumpNodeList:
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the FILE * for the output
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the node list
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @depth:  the indentation level.
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dumps debug information for the list of element node, it is recursive
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDebugDumpNodeList(FILE * output, xmlNodePtr node, int depth)
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDebugCtxt ctxt;
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (output == NULL)
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	output = stdout;
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpInitCtxt(&ctxt);
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt.output = output;
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt.depth = depth;
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpNodeList(&ctxt, node);
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpCleanCtxt(&ctxt);
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDebugDumpDocumentHead:
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the FILE * for the output
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dumps debug information cncerning the document, not recursive
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDebugDumpDocumentHead(FILE * output, xmlDocPtr doc)
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDebugCtxt ctxt;
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (output == NULL)
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	output = stdout;
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpInitCtxt(&ctxt);
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt.options |= DUMP_TEXT_TYPE;
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt.output = output;
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpDocumentHead(&ctxt, doc);
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpCleanCtxt(&ctxt);
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDebugDumpDocument:
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the FILE * for the output
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dumps debug information for the document, it's recursive
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDebugDumpDocument(FILE * output, xmlDocPtr doc)
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDebugCtxt ctxt;
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (output == NULL)
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	output = stdout;
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpInitCtxt(&ctxt);
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt.options |= DUMP_TEXT_TYPE;
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt.output = output;
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpDocument(&ctxt, doc);
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpCleanCtxt(&ctxt);
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDebugDumpDTD:
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the FILE * for the output
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @dtd:  the DTD
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dumps debug information for the DTD
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDebugDumpDTD(FILE * output, xmlDtdPtr dtd)
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDebugCtxt ctxt;
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (output == NULL)
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	output = stdout;
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpInitCtxt(&ctxt);
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt.options |= DUMP_TEXT_TYPE;
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt.output = output;
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpDTD(&ctxt, dtd);
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpCleanCtxt(&ctxt);
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			Public entry points for checkings		*
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDebugCheckDocument:
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the FILE * for the output
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check the document for potential content problems, and output
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the errors to @output
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of errors found
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDebugCheckDocument(FILE * output, xmlDocPtr doc)
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDebugCtxt ctxt;
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (output == NULL)
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	output = stdout;
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpInitCtxt(&ctxt);
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt.output = output;
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt.check = 1;
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpDocument(&ctxt, doc);
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCtxtDumpCleanCtxt(&ctxt);
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ctxt.errors);
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			Helpers for Shell				*
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlLsCountNode:
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the node to count
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Count the children of @node.
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of children of @node.
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlLsCountNode(xmlNodePtr node) {
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr list = NULL;
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node == NULL)
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (node->type) {
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_ELEMENT_NODE:
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    list = node->children;
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_DOCUMENT_NODE:
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_HTML_DOCUMENT_NODE:
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DOCB_ENABLED
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_DOCB_DOCUMENT_NODE:
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    list = ((xmlDocPtr) node)->children;
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_ATTRIBUTE_NODE:
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    list = ((xmlAttrPtr) node)->children;
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_TEXT_NODE:
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_CDATA_SECTION_NODE:
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_PI_NODE:
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_COMMENT_NODE:
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (node->content != NULL) {
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlStrlen(node->content);
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_ENTITY_REF_NODE:
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_DOCUMENT_TYPE_NODE:
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_ENTITY_NODE:
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_DOCUMENT_FRAG_NODE:
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_NOTATION_NODE:
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_DTD_NODE:
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_DECL:
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_DECL:
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_DECL:
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_NAMESPACE_DECL:
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_XINCLUDE_START:
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_XINCLUDE_END:
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = 1;
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (;list != NULL;ret++)
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        list = list->next;
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlLsOneNode:
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the FILE * for the output
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the node to dump
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dump to @output the type and name of @node.
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlLsOneNode(FILE *output, xmlNodePtr node) {
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (output == NULL) return;
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node == NULL) {
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(output, "NULL\n");
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (node->type) {
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_ELEMENT_NODE:
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "-");
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_ATTRIBUTE_NODE:
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "a");
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_TEXT_NODE:
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "t");
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_CDATA_SECTION_NODE:
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "C");
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_ENTITY_REF_NODE:
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "e");
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_ENTITY_NODE:
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "E");
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_PI_NODE:
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "p");
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_COMMENT_NODE:
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "c");
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_DOCUMENT_NODE:
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "d");
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_HTML_DOCUMENT_NODE:
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "h");
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_DOCUMENT_TYPE_NODE:
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "T");
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_DOCUMENT_FRAG_NODE:
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "F");
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_NOTATION_NODE:
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "N");
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_NAMESPACE_DECL:
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "n");
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "?");
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node->type != XML_NAMESPACE_DECL) {
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (node->properties != NULL)
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "a");
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "-");
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (node->nsDef != NULL)
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "n");
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(output, "-");
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(output, " %8d ", xmlLsCountNode(node));
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (node->type) {
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_ELEMENT_NODE:
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (node->name != NULL)
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(output, "%s", (const char *) node->name);
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_ATTRIBUTE_NODE:
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (node->name != NULL)
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(output, "%s", (const char *) node->name);
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_TEXT_NODE:
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (node->content != NULL) {
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlDebugDumpString(output, node->content);
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_CDATA_SECTION_NODE:
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_ENTITY_REF_NODE:
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (node->name != NULL)
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(output, "%s", (const char *) node->name);
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_ENTITY_NODE:
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (node->name != NULL)
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(output, "%s", (const char *) node->name);
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_PI_NODE:
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (node->name != NULL)
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(output, "%s", (const char *) node->name);
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_COMMENT_NODE:
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_DOCUMENT_NODE:
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_HTML_DOCUMENT_NODE:
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_DOCUMENT_TYPE_NODE:
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_DOCUMENT_FRAG_NODE:
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_NOTATION_NODE:
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_NAMESPACE_DECL: {
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNsPtr ns = (xmlNsPtr) node;
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ns->prefix == NULL)
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(output, "default -> %s", (char *)ns->href);
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(output, "%s -> %s", (char *)ns->prefix,
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(char *)ns->href);
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (node->name != NULL)
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(output, "%s", (const char *) node->name);
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(output, "\n");
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlBoolToText:
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @boolval: a bool to turn into text
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Convenient way to turn bool into text
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to either "True" or "False"
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char *
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBoolToText(int boolval)
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (boolval)
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return("True");
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return("False");
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPATH_ENABLED
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/****************************************************************
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *								*
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *	 	The XML shell related functions			*
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *								*
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ****************************************************************/
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: Improvement/cleanups for the XML shell
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     - allow to shell out an editor on a subpart
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     - cleanup function registrations (with help) and calling
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     - provide registration routines
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlShellPrintXPathError:
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @errorType: valid xpath error id
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @arg: the argument that cause xpath to fail
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Print the xpath error to libxml default error channel
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlShellPrintXPathError(int errorType, const char *arg)
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *default_arg = "Result";
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!arg)
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        arg = default_arg;
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (errorType) {
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XPATH_UNDEFINED:
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlGenericError(xmlGenericErrorContext,
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            "%s: no such node\n", arg);
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XPATH_BOOLEAN:
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlGenericError(xmlGenericErrorContext,
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            "%s is a Boolean\n", arg);
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XPATH_NUMBER:
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlGenericError(xmlGenericErrorContext,
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            "%s is a number\n", arg);
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XPATH_STRING:
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlGenericError(xmlGenericErrorContext,
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            "%s is a string\n", arg);
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XPATH_POINT:
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlGenericError(xmlGenericErrorContext,
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            "%s is a point\n", arg);
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XPATH_RANGE:
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlGenericError(xmlGenericErrorContext,
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            "%s is a range\n", arg);
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XPATH_LOCATIONSET:
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlGenericError(xmlGenericErrorContext,
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            "%s is a range\n", arg);
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XPATH_USERS:
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlGenericError(xmlGenericErrorContext,
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            "%s is user-defined\n", arg);
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XPATH_XSLT_TREE:
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlGenericError(xmlGenericErrorContext,
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            "%s is an XSLT value tree\n", arg);
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext,
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "Try casting the result string function (xpath builtin)\n",
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    arg);
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlShellPrintNodeCtxt:
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt : a non-null shell context
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node : a non-null node to print to the output FILE
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Print node to the output FILE
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlShellPrintNodeCtxt(xmlShellCtxtPtr ctxt,xmlNodePtr node)
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FILE *fp;
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!node)
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fp = stdout;
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fp = ctxt->output;
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node->type == XML_DOCUMENT_NODE)
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlDocDump(fp, (xmlDocPtr) node);
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (node->type == XML_ATTRIBUTE_NODE)
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlDebugDumpAttrList(fp, (xmlAttrPtr) node, 0);
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlElemDump(fp, node->doc, node);
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(fp, "\n");
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlShellPrintNode:
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node : a non-null node to print to the output FILE
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Print node to the output FILE
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlShellPrintNode(xmlNodePtr node)
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlShellPrintNodeCtxt(NULL, node);
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlShellPrintXPathResultCtxt:
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a valid shell context
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @list: a valid result generated by an xpath evaluation
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Prints result to the output FILE
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlShellPrintXPathResultCtxt(xmlShellCtxtPtr ctxt,xmlXPathObjectPtr list)
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ctxt)
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       return;
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (list != NULL) {
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switch (list->type) {
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XPATH_NODESET:{
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    int indx;
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if (list->nodesetval) {
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        for (indx = 0; indx < list->nodesetval->nodeNr;
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             indx++) {
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlShellPrintNodeCtxt(ctxt,
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    list->nodesetval->nodeTab[indx]);
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        }
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    } else {
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        xmlGenericError(xmlGenericErrorContext,
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        "Empty node set\n");
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    }
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    break;
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlGenericError(xmlGenericErrorContext,
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    "Node set\n");
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XPATH_BOOLEAN:
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlGenericError(xmlGenericErrorContext,
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                "Is a Boolean:%s\n",
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                xmlBoolToText(list->boolval));
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XPATH_NUMBER:
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlGenericError(xmlGenericErrorContext,
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                "Is a number:%0g\n", list->floatval);
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case XPATH_STRING:
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlGenericError(xmlGenericErrorContext,
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                "Is a string:%s\n", list->stringval);
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            default:
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlShellPrintXPathError(list->type, NULL);
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlShellPrintXPathResult:
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @list: a valid result generated by an xpath evaluation
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Prints result to the output FILE
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlShellPrintXPathResult(xmlXPathObjectPtr list)
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlShellPrintXPathResultCtxt(NULL, list);
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlShellList:
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the shell context
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @arg:  unused
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a node
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node2:  unused
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implements the XML shell function "ls"
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Does an Unix like listing of the given node (like a directory)
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlShellList(xmlShellCtxtPtr ctxt,
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             char *arg ATTRIBUTE_UNUSED, xmlNodePtr node,
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             xmlNodePtr node2 ATTRIBUTE_UNUSED)
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ctxt)
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (0);
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node == NULL) {
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(ctxt->output, "NULL\n");
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node->type == XML_DOCUMENT_NODE) ||
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (node->type == XML_HTML_DOCUMENT_NODE)) {
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur = ((xmlDocPtr) node)->children;
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (node->type == XML_NAMESPACE_DECL) {
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlLsOneNode(ctxt->output, node);
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (0);
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (node->children != NULL) {
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur = node->children;
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlLsOneNode(ctxt->output, node);
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (0);
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlLsOneNode(ctxt->output, cur);
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur = cur->next;
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlShellBase:
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the shell context
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @arg:  unused
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a node
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node2:  unused
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implements the XML shell function "base"
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * dumps the current XML base of the node
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlShellBase(xmlShellCtxtPtr ctxt,
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             char *arg ATTRIBUTE_UNUSED, xmlNodePtr node,
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             xmlNodePtr node2 ATTRIBUTE_UNUSED)
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *base;
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ctxt)
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node == NULL) {
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(ctxt->output, "NULL\n");
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base = xmlNodeGetBase(node->doc, node);
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (base == NULL) {
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(ctxt->output, " No base found !!!\n");
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(ctxt->output, "%s\n", base);
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(base);
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_TREE_ENABLED
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlShellSetBase:
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the shell context
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @arg:  the new base
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a node
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node2:  unused
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implements the XML shell function "setbase"
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * change the current XML base of the node
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlShellSetBase(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED,
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             char *arg ATTRIBUTE_UNUSED, xmlNodePtr node,
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             xmlNodePtr node2 ATTRIBUTE_UNUSED)
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodeSetBase(node, (xmlChar*) arg);
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPATH_ENABLED
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlShellRegisterNamespace:
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the shell context
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @arg:  a string in prefix=nsuri format
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  unused
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node2:  unused
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implements the XML shell function "setns"
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * register/unregister a prefix=namespace pair
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * on the XPath context
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 on success and a negative value otherwise.
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlShellRegisterNamespace(xmlShellCtxtPtr ctxt, char *arg,
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      xmlNodePtr node ATTRIBUTE_UNUSED, xmlNodePtr node2 ATTRIBUTE_UNUSED)
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar* nsListDup;
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar* prefix;
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar* href;
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar* next;
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nsListDup = xmlStrdup((xmlChar *) arg);
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    next = nsListDup;
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while(next != NULL) {
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* skip spaces */
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*while((*next) == ' ') next++;*/
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if((*next) == '\0') break;
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* find prefix */
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prefix = next;
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	next = (xmlChar*)xmlStrchr(next, '=');
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if(next == NULL) {
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(ctxt->output, "setns: prefix=[nsuri] required\n");
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(nsListDup);
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*(next++) = '\0';
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* find href */
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	href = next;
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	next = (xmlChar*)xmlStrchr(next, ' ');
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if(next != NULL) {
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *(next++) = '\0';
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* do register namespace */
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if(xmlXPathRegisterNs(ctxt->pctxt, prefix, href) != 0) {
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(ctxt->output,"Error: unable to register NS with prefix=\"%s\" and href=\"%s\"\n", prefix, href);
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(nsListDup);
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(nsListDup);
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlShellRegisterRootNamespaces:
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the shell context
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @arg:  unused
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the root element
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node2:  unused
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implements the XML shell function "setrootns"
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * which registers all namespaces declarations found on the root element.
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 on success and a negative value otherwise.
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlShellRegisterRootNamespaces(xmlShellCtxtPtr ctxt, char *arg ATTRIBUTE_UNUSED,
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      xmlNodePtr root, xmlNodePtr node2 ATTRIBUTE_UNUSED)
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr ns;
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((root == NULL) || (root->type != XML_ELEMENT_NODE) ||
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (root->nsDef == NULL) || (ctxt == NULL) || (ctxt->pctxt == NULL))
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ns = root->nsDef;
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (ns != NULL) {
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ns->prefix == NULL)
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlXPathRegisterNs(ctxt->pctxt, BAD_CAST "defaultns", ns->href);
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlXPathRegisterNs(ctxt->pctxt, ns->prefix, ns->href);
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ns = ns->next;
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlShellGrep:
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the shell context
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @arg:  the string or regular expression to find
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a node
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node2:  unused
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implements the XML shell function "grep"
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * dumps informations about the node (namespace, attributes, content).
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlShellGrep(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED,
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            char *arg, xmlNodePtr node, xmlNodePtr node2 ATTRIBUTE_UNUSED)
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ctxt)
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (0);
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node == NULL)
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (arg == NULL)
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_REGEXP_ENABLED
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((xmlStrchr((xmlChar *) arg, '?')) ||
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(xmlStrchr((xmlChar *) arg, '*')) ||
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(xmlStrchr((xmlChar *) arg, '.')) ||
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(xmlStrchr((xmlChar *) arg, '['))) {
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (node != NULL) {
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (node->type == XML_COMMENT_NODE) {
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlStrstr(node->content, (xmlChar *) arg)) {
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(ctxt->output, "%s : ", xmlGetNodePath(node));
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlShellList(ctxt, NULL, node, NULL);
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (node->type == XML_TEXT_NODE) {
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlStrstr(node->content, (xmlChar *) arg)) {
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(ctxt->output, "%s : ", xmlGetNodePath(node->parent));
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlShellList(ctxt, NULL, node->parent, NULL);
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * Browse the full subtree, deep first
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         */
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((node->type == XML_DOCUMENT_NODE) ||
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (node->type == XML_HTML_DOCUMENT_NODE)) {
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node = ((xmlDocPtr) node)->children;
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if ((node->children != NULL)
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   && (node->type != XML_ENTITY_REF_NODE)) {
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* deep first */
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node = node->children;
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (node->next != NULL) {
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* then siblings */
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node = node->next;
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* go up to parents->next if needed */
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            while (node != NULL) {
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (node->parent != NULL) {
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    node = node->parent;
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (node->next != NULL) {
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    node = node->next;
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    break;
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (node->parent == NULL) {
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    node = NULL;
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    break;
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlShellDir:
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the shell context
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @arg:  unused
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a node
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node2:  unused
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implements the XML shell function "dir"
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * dumps informations about the node (namespace, attributes, content).
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlShellDir(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED,
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            char *arg ATTRIBUTE_UNUSED, xmlNodePtr node,
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlNodePtr node2 ATTRIBUTE_UNUSED)
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ctxt)
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (0);
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node == NULL) {
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(ctxt->output, "NULL\n");
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node->type == XML_DOCUMENT_NODE) ||
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (node->type == XML_HTML_DOCUMENT_NODE)) {
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlDebugDumpDocumentHead(ctxt->output, (xmlDocPtr) node);
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (node->type == XML_ATTRIBUTE_NODE) {
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlDebugDumpAttr(ctxt->output, (xmlAttrPtr) node, 0);
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlDebugDumpOneNode(ctxt->output, node, 0);
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlShellSetContent:
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the shell context
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value:  the content as a string
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a node
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node2:  unused
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implements the XML shell function "dir"
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * dumps informations about the node (namespace, attributes, content).
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlShellSetContent(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED,
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            char *value, xmlNodePtr node,
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlNodePtr node2 ATTRIBUTE_UNUSED)
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr results;
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserErrors ret;
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ctxt)
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (0);
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node == NULL) {
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(ctxt->output, "NULL\n");
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value == NULL) {
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(ctxt->output, "NULL\n");
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlParseInNodeContext(node, value, strlen(value), 0, &results);
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == XML_ERR_OK) {
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (node->children != NULL) {
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFreeNodeList(node->children);
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    node->children = NULL;
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    node->last = NULL;
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlAddChildList(node, results);
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(ctxt->output, "failed to parse content\n");
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlShellRNGValidate:
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the shell context
23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schemas:  the path to the Relax-NG schemas
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a node
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node2:  unused
23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implements the XML shell function "relaxng"
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * validating the instance against a Relax-NG schemas
23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlShellRNGValidate(xmlShellCtxtPtr sctxt, char *schemas,
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlNodePtr node ATTRIBUTE_UNUSED,
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNodePtr node2 ATTRIBUTE_UNUSED)
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRelaxNGPtr relaxngschemas;
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRelaxNGParserCtxtPtr ctxt;
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRelaxNGValidCtxtPtr vctxt;
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt = xmlRelaxNGNewParserCtxt(schemas);
23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRelaxNGSetParserErrors(ctxt,
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (xmlRelaxNGValidityErrorFunc) fprintf,
23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (xmlRelaxNGValidityWarningFunc) fprintf,
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    stderr);
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    relaxngschemas = xmlRelaxNGParse(ctxt);
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRelaxNGFreeParserCtxt(ctxt);
23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (relaxngschemas == NULL) {
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext,
23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Relax-NG schema %s failed to compile\n", schemas);
23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt = xmlRelaxNGNewValidCtxt(relaxngschemas);
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRelaxNGSetValidErrors(vctxt,
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (xmlRelaxNGValidityErrorFunc) fprintf,
23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (xmlRelaxNGValidityWarningFunc) fprintf,
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    stderr);
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlRelaxNGValidateDoc(vctxt, sctxt->doc);
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == 0) {
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stderr, "%s validates\n", sctxt->filename);
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (ret > 0) {
23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stderr, "%s fails to validate\n", sctxt->filename);
23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stderr, "%s validation generated an internal error\n",
23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       sctxt->filename);
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRelaxNGFreeValidCtxt(vctxt);
23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (relaxngschemas != NULL)
23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRelaxNGFree(relaxngschemas);
23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlShellCat:
23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the shell context
23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @arg:  unused
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a node
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node2:  unused
23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implements the XML shell function "cat"
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * dumps the serialization node content (XML or HTML).
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0
24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlShellCat(xmlShellCtxtPtr ctxt, char *arg ATTRIBUTE_UNUSED,
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlNodePtr node, xmlNodePtr node2 ATTRIBUTE_UNUSED)
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ctxt)
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (0);
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node == NULL) {
24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(ctxt->output, "NULL\n");
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->doc->type == XML_HTML_DOCUMENT_NODE) {
24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_HTML_ENABLED
24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (node->type == XML_HTML_DOCUMENT_NODE)
24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            htmlDocDump(ctxt->output, (htmlDocPtr) node);
24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            htmlNodeDumpFile(ctxt->output, ctxt->doc, node);
24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (node->type == XML_DOCUMENT_NODE)
24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlDocDump(ctxt->output, (xmlDocPtr) node);
24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlElemDump(ctxt->output, ctxt->doc, node);
24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_HTML_ENABLED */
24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (node->type == XML_DOCUMENT_NODE)
24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlDocDump(ctxt->output, (xmlDocPtr) node);
24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlElemDump(ctxt->output, ctxt->doc, node);
24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(ctxt->output, "\n");
24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlShellLoad:
24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the shell context
24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename:  the file name
24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  unused
24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node2:  unused
24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implements the XML shell function "load"
24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * loads a new document specified by the filename
24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 or -1 if loading failed
24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlShellLoad(xmlShellCtxtPtr ctxt, char *filename,
24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             xmlNodePtr node ATTRIBUTE_UNUSED,
24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             xmlNodePtr node2 ATTRIBUTE_UNUSED)
24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr doc;
24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int html = 0;
24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (filename == NULL)) return(-1);
24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->doc != NULL)
24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        html = (ctxt->doc->type == XML_HTML_DOCUMENT_NODE);
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (html) {
24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_HTML_ENABLED
24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        doc = htmlParseFile(filename, NULL);
24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(ctxt->output, "HTML support not compiled in\n");
24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        doc = NULL;
24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_HTML_ENABLED */
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        doc = xmlReadFile(filename,NULL,0);
24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc != NULL) {
24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ctxt->loaded == 1) {
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlFreeDoc(ctxt->doc);
24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt->loaded = 1;
24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPATH_ENABLED
24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlXPathFreeContext(ctxt->pctxt);
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_XPATH_ENABLED */
24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(ctxt->filename);
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt->doc = doc;
24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt->node = (xmlNodePtr) doc;
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPATH_ENABLED
24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt->pctxt = xmlXPathNewContext(doc);
24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_XPATH_ENABLED */
24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt->filename = (char *) xmlCanonicPath((xmlChar *) filename);
24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlShellWrite:
24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the shell context
24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename:  the file name
24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a node in the tree
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node2:  unused
24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implements the XML shell function "write"
25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Write the current node to the filename, it saves the serialization
25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the subtree under the @node specified
25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 or -1 in case of error
25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlShellWrite(xmlShellCtxtPtr ctxt, char *filename, xmlNodePtr node,
25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              xmlNodePtr node2 ATTRIBUTE_UNUSED)
25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node == NULL)
25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((filename == NULL) || (filename[0] == 0)) {
25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef W_OK
25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (access((char *) filename, W_OK)) {
25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        "Cannot write to %s\n", filename);
25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (node->type) {
25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_NODE:
25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (xmlSaveFile((char *) filename, ctxt->doc) < -1) {
25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlGenericError(xmlGenericErrorContext,
25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                "Failed to write to %s\n", filename);
25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return (-1);
25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_HTML_DOCUMENT_NODE:
25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_HTML_ENABLED
25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (htmlSaveFile((char *) filename, ctxt->doc) < 0) {
25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlGenericError(xmlGenericErrorContext,
25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                "Failed to write to %s\n", filename);
25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return (-1);
25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (xmlSaveFile((char *) filename, ctxt->doc) < -1) {
25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlGenericError(xmlGenericErrorContext,
25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                "Failed to write to %s\n", filename);
25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return (-1);
25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_HTML_ENABLED */
25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:{
25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                FILE *f;
25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                f = fopen((char *) filename, "w");
25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (f == NULL) {
25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlGenericError(xmlGenericErrorContext,
25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    "Failed to write to %s\n", filename);
25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    return (-1);
25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlElemDump(f, ctxt->doc, node);
25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fclose(f);
25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlShellSave:
25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the shell context
25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename:  the file name (optional)
25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  unused
25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node2:  unused
25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implements the XML shell function "save"
25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Write the current document to the filename, or it's original name
25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 or -1 in case of error
25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlShellSave(xmlShellCtxtPtr ctxt, char *filename,
25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             xmlNodePtr node ATTRIBUTE_UNUSED,
25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             xmlNodePtr node2 ATTRIBUTE_UNUSED)
25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (ctxt->doc == NULL))
25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((filename == NULL) || (filename[0] == 0))
25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        filename = ctxt->filename;
25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (filename == NULL)
25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef W_OK
25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (access((char *) filename, W_OK)) {
25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        "Cannot save to %s\n", filename);
25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (ctxt->doc->type) {
25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_NODE:
25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (xmlSaveFile((char *) filename, ctxt->doc) < 0) {
25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlGenericError(xmlGenericErrorContext,
25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                "Failed to save to %s\n", filename);
25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_HTML_DOCUMENT_NODE:
25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_HTML_ENABLED
26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (htmlSaveFile((char *) filename, ctxt->doc) < 0) {
26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlGenericError(xmlGenericErrorContext,
26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                "Failed to save to %s\n", filename);
26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (xmlSaveFile((char *) filename, ctxt->doc) < 0) {
26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlGenericError(xmlGenericErrorContext,
26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                "Failed to save to %s\n", filename);
26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_HTML_ENABLED */
26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlGenericError(xmlGenericErrorContext,
26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "To save to subparts of a document use the 'write' command\n");
26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (-1);
26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_VALID_ENABLED
26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlShellValidate:
26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the shell context
26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @dtd:  the DTD URI (optional)
26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  unused
26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node2:  unused
26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implements the XML shell function "validate"
26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validate the document, if a DTD path is provided, then the validation
26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is done against the given DTD.
26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 or -1 in case of error
26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlShellValidate(xmlShellCtxtPtr ctxt, char *dtd,
26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 xmlNodePtr node ATTRIBUTE_UNUSED,
26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 xmlNodePtr node2 ATTRIBUTE_UNUSED)
26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlValidCtxt vctxt;
26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int res = -1;
26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt == NULL) || (ctxt->doc == NULL)) return(-1);
26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt.userData = stderr;
26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt.error = (xmlValidityErrorFunc) fprintf;
26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vctxt.warning = (xmlValidityWarningFunc) fprintf;
26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((dtd == NULL) || (dtd[0] == 0)) {
26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        res = xmlValidateDocument(&vctxt, ctxt->doc);
26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlDtdPtr subset;
26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        subset = xmlParseDTD(NULL, (xmlChar *) dtd);
26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (subset != NULL) {
26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            res = xmlValidateDtd(&vctxt, ctxt->doc, subset);
26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlFreeDtd(subset);
26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (res);
26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_VALID_ENABLED */
26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlShellDu:
26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the shell context
26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @arg:  unused
26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @tree:  a node defining a subtree
26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node2:  unused
26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implements the XML shell function "du"
26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * show the structure of the subtree under node @tree
26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If @tree is null, the command works on the current node.
26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 or -1 in case of error
26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlShellDu(xmlShellCtxtPtr ctxt,
26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           char *arg ATTRIBUTE_UNUSED, xmlNodePtr tree,
26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           xmlNodePtr node2 ATTRIBUTE_UNUSED)
26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr node;
26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int indent = 0, i;
26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ctxt)
26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (tree == NULL)
26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    node = tree;
26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (node != NULL) {
26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((node->type == XML_DOCUMENT_NODE) ||
26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (node->type == XML_HTML_DOCUMENT_NODE)) {
26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "/\n");
26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (node->type == XML_ELEMENT_NODE) {
26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            for (i = 0; i < indent; i++)
26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "  ");
26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(ctxt->output, "%s\n", node->name);
26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * Browse the full subtree, deep first
27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         */
27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((node->type == XML_DOCUMENT_NODE) ||
27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (node->type == XML_HTML_DOCUMENT_NODE)) {
27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node = ((xmlDocPtr) node)->children;
27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if ((node->children != NULL)
27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   && (node->type != XML_ENTITY_REF_NODE)) {
27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* deep first */
27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node = node->children;
27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            indent++;
27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if ((node != tree) && (node->next != NULL)) {
27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* then siblings */
27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node = node->next;
27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (node != tree) {
27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* go up to parents->next if needed */
27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            while (node != tree) {
27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (node->parent != NULL) {
27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    node = node->parent;
27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    indent--;
27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if ((node != tree) && (node->next != NULL)) {
27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    node = node->next;
27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    break;
27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (node->parent == NULL) {
27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    node = NULL;
27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    break;
27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (node == tree) {
27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    node = NULL;
27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    break;
27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* exit condition */
27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (node == tree)
27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                node = NULL;
27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else
27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node = NULL;
27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlShellPwd:
27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  the shell context
27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buffer:  the output buffer
27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a node
27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node2:  unused
27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implements the XML shell function "pwd"
27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Show the full path from the root to the node, if needed building
27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * thumblers when similar elements exists at a given ancestor level.
27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The output is compatible with XPath commands.
27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 or -1 in case of error
27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlShellPwd(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED, char *buffer,
27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlNodePtr node, xmlNodePtr node2 ATTRIBUTE_UNUSED)
27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *path;
27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node == NULL) || (buffer == NULL))
27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path = xmlGetNodePath(node);
27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (path == NULL)
27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * This test prevents buffer overflow, because this routine
27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * is only called by xmlShell, in which the second argument is
27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * 500 chars long.
27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * It is a dirty hack before a cleaner solution is found.
27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Documentation should mention that the second argument must
27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * be at least 500 chars long, and could be stripped if too long.
27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    snprintf(buffer, 499, "%s", path);
27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buffer[499] = '0';
27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(path);
27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlShell:
27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the initial document
27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename:  the output buffer
27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @input:  the line reading function
27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output:  the output FILE*, defaults to stdout if NULL
27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implements the XML shell
27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This allow to load, validate, view, modify and save a document
27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * using a environment similar to a UNIX commandline.
27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlShell(xmlDocPtr doc, char *filename, xmlShellReadlineFunc input,
28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         FILE * output)
28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char prompt[500] = "/ > ";
28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *cmdline = NULL, *cur;
28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char command[100];
28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char arg[400];
28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlShellCtxtPtr ctxt;
28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathObjectPtr list;
28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc == NULL)
28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (filename == NULL)
28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (input == NULL)
28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (output == NULL)
28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output = stdout;
28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt = (xmlShellCtxtPtr) xmlMalloc(sizeof(xmlShellCtxt));
28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->loaded = 0;
28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->doc = doc;
28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->input = input;
28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->output = output;
28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->filename = (char *) xmlStrdup((xmlChar *) filename);
28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->node = (xmlNodePtr) ctxt->doc;
28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPATH_ENABLED
28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->pctxt = xmlXPathNewContext(ctxt->doc);
28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->pctxt == NULL) {
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(ctxt);
28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_XPATH_ENABLED */
28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (1) {
28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ctxt->node == (xmlNodePtr) ctxt->doc)
28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            snprintf(prompt, sizeof(prompt), "%s > ", "/");
28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if ((ctxt->node != NULL) && (ctxt->node->name))
28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            snprintf(prompt, sizeof(prompt), "%s > ", ctxt->node->name);
28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            snprintf(prompt, sizeof(prompt), "? > ");
28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prompt[sizeof(prompt) - 1] = 0;
28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * Get a new command line
28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         */
28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cmdline = ctxt->input(prompt);
28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (cmdline == NULL)
28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * Parse the command itself
28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         */
28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur = cmdline;
28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        while ((*cur == ' ') || (*cur == '\t'))
28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cur++;
28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        i = 0;
28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        while ((*cur != ' ') && (*cur != '\t') &&
28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (*cur != '\n') && (*cur != '\r')) {
28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (*cur == 0)
28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            command[i++] = *cur++;
28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        command[i] = 0;
28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (i == 0)
28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            continue;
28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * Parse the argument
28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         */
28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        while ((*cur == ' ') || (*cur == '\t'))
28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cur++;
28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        i = 0;
28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        while ((*cur != '\n') && (*cur != '\r') && (*cur != 0)) {
28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (*cur == 0)
28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            arg[i++] = *cur++;
28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        arg[i] = 0;
28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * start interpreting the command
28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         */
28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!strcmp(command, "exit"))
28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!strcmp(command, "quit"))
28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!strcmp(command, "bye"))
28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (!strcmp(command, "help")) {
28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\tbase         display XML base of the node\n");
28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\tsetbase URI  change the XML base of the node\n");
28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\tbye          leave shell\n");
28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\tcat [node]   display node or current node\n");
28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\tcd [path]    change directory to path or to root\n");
28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\tdir [path]   dumps informations about the node (namespace, attributes, content)\n");
28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\tdu [path]    show the structure of the subtree under path or the current node\n");
28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\texit         leave shell\n");
29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\thelp         display this help\n");
29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\tfree         display memory usage\n");
29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\tload [name]  load a new document with name\n");
29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\tls [path]    list contents of path or the current directory\n");
29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\tset xml_fragment replace the current node content with the fragment parsed in context\n");
29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPATH_ENABLED
29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\txpath expr   evaluate the XPath expression in that context and print the result\n");
29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\tsetns nsreg  register a namespace to a prefix in the XPath evaluation context\n");
29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\t             format for nsreg is: prefix=[nsuri] (i.e. prefix= unsets a prefix)\n");
29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\tsetrootns    register all namespace found on the root element\n");
29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\t             the default namespace if any uses 'defaultns' prefix\n");
29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_XPATH_ENABLED */
29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\tpwd          display current working directory\n");
29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\tquit         leave shell\n");
29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\tsave [name]  save this document to name or the original name\n");
29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\twrite [name] write the current node to the filename\n");
29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_VALID_ENABLED
29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\tvalidate     check the document for errors\n");
29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_VALID_ENABLED */
29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED
29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\trelaxng rng  validate the document agaisnt the Relax-NG schemas\n");
29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  fprintf(ctxt->output, "\tgrep string  search for a string in the subtree\n");
29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_VALID_ENABLED
29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (!strcmp(command, "validate")) {
29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlShellValidate(ctxt, arg, NULL, NULL);
29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_VALID_ENABLED */
29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (!strcmp(command, "load")) {
29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlShellLoad(ctxt, arg, NULL, NULL);
29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED
29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (!strcmp(command, "relaxng")) {
29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlShellRNGValidate(ctxt, arg, NULL, NULL);
29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (!strcmp(command, "save")) {
29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlShellSave(ctxt, arg, NULL, NULL);
29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (!strcmp(command, "write")) {
29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((arg == NULL) || (arg[0] == 0))
29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        "Write command requires a filename argument\n");
29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlShellWrite(ctxt, arg, NULL, NULL);
29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (!strcmp(command, "grep")) {
29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlShellGrep(ctxt, arg, ctxt->node, NULL);
29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (!strcmp(command, "free")) {
29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (arg[0] == 0) {
29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlMemShow(ctxt->output, 0);
29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else {
29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                int len = 0;
29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                sscanf(arg, "%d", &len);
29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlMemShow(ctxt->output, len);
29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (!strcmp(command, "pwd")) {
29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            char dir[500];
29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!xmlShellPwd(ctxt, dir, ctxt->node, NULL))
29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(ctxt->output, "%s\n", dir);
29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (!strcmp(command, "du")) {
29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlShellDu(ctxt, NULL, ctxt->node, NULL);
29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (!strcmp(command, "base")) {
29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlShellBase(ctxt, NULL, ctxt->node, NULL);
29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (!strcmp(command, "set")) {
29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlShellSetContent(ctxt, arg, ctxt->node, NULL);
29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPATH_ENABLED
29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (!strcmp(command, "setns")) {
29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (arg[0] == 0) {
29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				"setns: prefix=[nsuri] required\n");
29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else {
29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlShellRegisterNamespace(ctxt, arg, NULL, NULL);
29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (!strcmp(command, "setrootns")) {
29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNodePtr root;
29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    root = xmlDocGetRootElement(ctxt->doc);
29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlShellRegisterRootNamespaces(ctxt, NULL, root, NULL);
29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (!strcmp(command, "xpath")) {
29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (arg[0] == 0) {
29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				"xpath: expression required\n");
29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ctxt->pctxt->node = ctxt->node;
29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt);
29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlXPathDebugDumpObject(ctxt->output, list, 0);
29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlXPathFreeObject(list);
29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_XPATH_ENABLED */
29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_TREE_ENABLED
29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (!strcmp(command, "setbase")) {
29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlShellSetBase(ctxt, arg, ctxt->node, NULL);
29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if ((!strcmp(command, "ls")) || (!strcmp(command, "dir"))) {
29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int dir = (!strcmp(command, "dir"));
29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (arg[0] == 0) {
29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (dir)
30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlShellDir(ctxt, NULL, ctxt->node, NULL);
30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                else
30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlShellList(ctxt, NULL, ctxt->node, NULL);
30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else {
30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ctxt->pctxt->node = ctxt->node;
30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPATH_ENABLED
30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ctxt->pctxt->node = ctxt->node;
30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt);
30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                list = NULL;
30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_XPATH_ENABLED */
30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (list != NULL) {
30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    switch (list->type) {
30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_UNDEFINED:
30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s: no such node\n", arg);
30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_NODESET:{
30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                int indx;
30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				if (list->nodesetval == NULL)
30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    break;
30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                for (indx = 0;
30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     indx < list->nodesetval->nodeNr;
30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     indx++) {
30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    if (dir)
30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        xmlShellDir(ctxt, NULL,
30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    list->nodesetval->
30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    nodeTab[indx], NULL);
30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    else
30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        xmlShellList(ctxt, NULL,
30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     list->nodesetval->
30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     nodeTab[indx], NULL);
30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                }
30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                break;
30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            }
30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_BOOLEAN:
30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s is a Boolean\n", arg);
30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_NUMBER:
30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s is a number\n", arg);
30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_STRING:
30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s is a string\n", arg);
30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_POINT:
30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s is a point\n", arg);
30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_RANGE:
30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s is a range\n", arg);
30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_LOCATIONSET:
30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s is a range\n", arg);
30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_USERS:
30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s is user-defined\n", arg);
30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_XSLT_TREE:
30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s is an XSLT value tree\n",
30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            arg);
30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    }
30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPATH_ENABLED
30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlXPathFreeObject(list);
30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                } else {
30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlGenericError(xmlGenericErrorContext,
30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    "%s: no such node\n", arg);
30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ctxt->pctxt->node = NULL;
30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (!strcmp(command, "cd")) {
30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (arg[0] == 0) {
30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ctxt->node = (xmlNodePtr) ctxt->doc;
30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else {
30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPATH_ENABLED
30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ctxt->pctxt->node = ctxt->node;
30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt);
30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                list = NULL;
30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_XPATH_ENABLED */
30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (list != NULL) {
30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    switch (list->type) {
30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_UNDEFINED:
30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s: no such node\n", arg);
30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_NODESET:
30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            if (list->nodesetval != NULL) {
30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				if (list->nodesetval->nodeNr == 1) {
30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    ctxt->node = list->nodesetval->nodeTab[0];
31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    if ((ctxt->node != NULL) &&
31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				        (ctxt->node->type ==
31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 XML_NAMESPACE_DECL)) {
31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					xmlGenericError(xmlGenericErrorContext,
31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						    "cannot cd to namespace\n");
31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					ctxt->node = NULL;
31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    }
31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				} else
31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    xmlGenericError(xmlGenericErrorContext,
31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						    "%s is a %d Node Set\n",
31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						    arg,
31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						    list->nodesetval->nodeNr);
31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            } else
31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                xmlGenericError(xmlGenericErrorContext,
31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                "%s is an empty Node Set\n",
31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                arg);
31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_BOOLEAN:
31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s is a Boolean\n", arg);
31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_NUMBER:
31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s is a number\n", arg);
31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_STRING:
31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s is a string\n", arg);
31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_POINT:
31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s is a point\n", arg);
31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_RANGE:
31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s is a range\n", arg);
31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_LOCATIONSET:
31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s is a range\n", arg);
31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_USERS:
31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s is user-defined\n", arg);
31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_XSLT_TREE:
31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s is an XSLT value tree\n",
31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            arg);
31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    }
31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPATH_ENABLED
31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlXPathFreeObject(list);
31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                } else {
31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlGenericError(xmlGenericErrorContext,
31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    "%s: no such node\n", arg);
31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ctxt->pctxt->node = NULL;
31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (!strcmp(command, "cat")) {
31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (arg[0] == 0) {
31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlShellCat(ctxt, NULL, ctxt->node, NULL);
31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else {
31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ctxt->pctxt->node = ctxt->node;
31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPATH_ENABLED
31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ctxt->pctxt->node = ctxt->node;
31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt);
31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                list = NULL;
31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_XPATH_ENABLED */
31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (list != NULL) {
31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    switch (list->type) {
31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_UNDEFINED:
31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s: no such node\n", arg);
31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_NODESET:{
31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                int indx;
31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				if (list->nodesetval == NULL)
31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    break;
31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                for (indx = 0;
31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     indx < list->nodesetval->nodeNr;
31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     indx++) {
31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    if (i > 0)
31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        fprintf(ctxt->output, " -------\n");
31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    xmlShellCat(ctxt, NULL,
31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                list->nodesetval->
31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                nodeTab[indx], NULL);
31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                }
31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                break;
31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            }
31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_BOOLEAN:
31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s is a Boolean\n", arg);
31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_NUMBER:
32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s is a number\n", arg);
32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_STRING:
32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s is a string\n", arg);
32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_POINT:
32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s is a point\n", arg);
32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_RANGE:
32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s is a range\n", arg);
32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_LOCATIONSET:
32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s is a range\n", arg);
32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_USERS:
32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s is user-defined\n", arg);
32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XPATH_XSLT_TREE:
32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlGenericError(xmlGenericErrorContext,
32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            "%s is an XSLT value tree\n",
32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            arg);
32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    }
32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPATH_ENABLED
32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlXPathFreeObject(list);
32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                } else {
32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlGenericError(xmlGenericErrorContext,
32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    "%s: no such node\n", arg);
32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ctxt->pctxt->node = NULL;
32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlGenericError(xmlGenericErrorContext,
32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            "Unknown command %s\n", command);
32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        free(cmdline);          /* not xmlFree here ! */
32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cmdline = NULL;
32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPATH_ENABLED
32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathFreeContext(ctxt->pctxt);
32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_XPATH_ENABLED */
32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->loaded) {
32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFreeDoc(ctxt->doc);
32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->filename != NULL)
32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(ctxt->filename);
32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(ctxt);
32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cmdline != NULL)
32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        free(cmdline);          /* not xmlFree here ! */
32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_XPATH_ENABLED */
32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define bottom_debugXML
32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "elfgcchack.h"
32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_DEBUG_ENABLED */
3263