xref: /aosp_15_r20/external/libxml2/debugXML.c (revision 7c5688314b92172186c154356a6374bf7684c3ca)
1*7c568831SAndroid Build Coastguard Worker /*
2*7c568831SAndroid Build Coastguard Worker  * debugXML.c : This is a set of routines used for debugging the tree
3*7c568831SAndroid Build Coastguard Worker  *              produced by the XML parser.
4*7c568831SAndroid Build Coastguard Worker  *
5*7c568831SAndroid Build Coastguard Worker  * See Copyright for the status of this software.
6*7c568831SAndroid Build Coastguard Worker  *
7*7c568831SAndroid Build Coastguard Worker  * Daniel Veillard <[email protected]>
8*7c568831SAndroid Build Coastguard Worker  */
9*7c568831SAndroid Build Coastguard Worker 
10*7c568831SAndroid Build Coastguard Worker #define IN_LIBXML
11*7c568831SAndroid Build Coastguard Worker #include "libxml.h"
12*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_DEBUG_ENABLED
13*7c568831SAndroid Build Coastguard Worker 
14*7c568831SAndroid Build Coastguard Worker #include <string.h>
15*7c568831SAndroid Build Coastguard Worker #include <stdlib.h>
16*7c568831SAndroid Build Coastguard Worker 
17*7c568831SAndroid Build Coastguard Worker #include <libxml/debugXML.h>
18*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlmemory.h>
19*7c568831SAndroid Build Coastguard Worker #include <libxml/tree.h>
20*7c568831SAndroid Build Coastguard Worker #include <libxml/parser.h>
21*7c568831SAndroid Build Coastguard Worker #include <libxml/parserInternals.h>
22*7c568831SAndroid Build Coastguard Worker #include <libxml/HTMLtree.h>
23*7c568831SAndroid Build Coastguard Worker #include <libxml/HTMLparser.h>
24*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlerror.h>
25*7c568831SAndroid Build Coastguard Worker 
26*7c568831SAndroid Build Coastguard Worker #include "private/error.h"
27*7c568831SAndroid Build Coastguard Worker 
28*7c568831SAndroid Build Coastguard Worker #define DUMP_TEXT_TYPE 1
29*7c568831SAndroid Build Coastguard Worker 
30*7c568831SAndroid Build Coastguard Worker typedef struct _xmlDebugCtxt xmlDebugCtxt;
31*7c568831SAndroid Build Coastguard Worker typedef xmlDebugCtxt *xmlDebugCtxtPtr;
32*7c568831SAndroid Build Coastguard Worker struct _xmlDebugCtxt {
33*7c568831SAndroid Build Coastguard Worker     FILE *output;               /* the output file */
34*7c568831SAndroid Build Coastguard Worker     char shift[101];            /* used for indenting */
35*7c568831SAndroid Build Coastguard Worker     int depth;                  /* current depth */
36*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;              /* current document */
37*7c568831SAndroid Build Coastguard Worker     xmlNodePtr node;		/* current node */
38*7c568831SAndroid Build Coastguard Worker     xmlDictPtr dict;		/* the doc dictionary */
39*7c568831SAndroid Build Coastguard Worker     int check;                  /* do just checkings */
40*7c568831SAndroid Build Coastguard Worker     int errors;                 /* number of errors found */
41*7c568831SAndroid Build Coastguard Worker     int nodict;			/* if the document has no dictionary */
42*7c568831SAndroid Build Coastguard Worker     int options;		/* options */
43*7c568831SAndroid Build Coastguard Worker };
44*7c568831SAndroid Build Coastguard Worker 
45*7c568831SAndroid Build Coastguard Worker static void xmlCtxtDumpNodeList(xmlDebugCtxtPtr ctxt, xmlNodePtr node);
46*7c568831SAndroid Build Coastguard Worker 
47*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtDumpInitCtxt(xmlDebugCtxtPtr ctxt)48*7c568831SAndroid Build Coastguard Worker xmlCtxtDumpInitCtxt(xmlDebugCtxtPtr ctxt)
49*7c568831SAndroid Build Coastguard Worker {
50*7c568831SAndroid Build Coastguard Worker     int i;
51*7c568831SAndroid Build Coastguard Worker 
52*7c568831SAndroid Build Coastguard Worker     ctxt->depth = 0;
53*7c568831SAndroid Build Coastguard Worker     ctxt->check = 0;
54*7c568831SAndroid Build Coastguard Worker     ctxt->errors = 0;
55*7c568831SAndroid Build Coastguard Worker     ctxt->output = stdout;
56*7c568831SAndroid Build Coastguard Worker     ctxt->doc = NULL;
57*7c568831SAndroid Build Coastguard Worker     ctxt->node = NULL;
58*7c568831SAndroid Build Coastguard Worker     ctxt->dict = NULL;
59*7c568831SAndroid Build Coastguard Worker     ctxt->nodict = 0;
60*7c568831SAndroid Build Coastguard Worker     ctxt->options = 0;
61*7c568831SAndroid Build Coastguard Worker     for (i = 0; i < 100; i++)
62*7c568831SAndroid Build Coastguard Worker         ctxt->shift[i] = ' ';
63*7c568831SAndroid Build Coastguard Worker     ctxt->shift[100] = 0;
64*7c568831SAndroid Build Coastguard Worker }
65*7c568831SAndroid Build Coastguard Worker 
66*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtDumpCleanCtxt(xmlDebugCtxtPtr ctxt ATTRIBUTE_UNUSED)67*7c568831SAndroid Build Coastguard Worker xmlCtxtDumpCleanCtxt(xmlDebugCtxtPtr ctxt ATTRIBUTE_UNUSED)
68*7c568831SAndroid Build Coastguard Worker {
69*7c568831SAndroid Build Coastguard Worker  /* remove the ATTRIBUTE_UNUSED when this is added */
70*7c568831SAndroid Build Coastguard Worker }
71*7c568831SAndroid Build Coastguard Worker 
72*7c568831SAndroid Build Coastguard Worker /**
73*7c568831SAndroid Build Coastguard Worker  * xmlNsCheckScope:
74*7c568831SAndroid Build Coastguard Worker  * @node: the node
75*7c568831SAndroid Build Coastguard Worker  * @ns: the namespace node
76*7c568831SAndroid Build Coastguard Worker  *
77*7c568831SAndroid Build Coastguard Worker  * Check that a given namespace is in scope on a node.
78*7c568831SAndroid Build Coastguard Worker  *
79*7c568831SAndroid Build Coastguard Worker  * Returns 1 if in scope, -1 in case of argument error,
80*7c568831SAndroid Build Coastguard Worker  *         -2 if the namespace is not in scope, and -3 if not on
81*7c568831SAndroid Build Coastguard Worker  *         an ancestor node.
82*7c568831SAndroid Build Coastguard Worker  */
83*7c568831SAndroid Build Coastguard Worker static int
xmlNsCheckScope(xmlNodePtr node,xmlNsPtr ns)84*7c568831SAndroid Build Coastguard Worker xmlNsCheckScope(xmlNodePtr node, xmlNsPtr ns)
85*7c568831SAndroid Build Coastguard Worker {
86*7c568831SAndroid Build Coastguard Worker     xmlNsPtr cur;
87*7c568831SAndroid Build Coastguard Worker 
88*7c568831SAndroid Build Coastguard Worker     if ((node == NULL) || (ns == NULL))
89*7c568831SAndroid Build Coastguard Worker         return(-1);
90*7c568831SAndroid Build Coastguard Worker 
91*7c568831SAndroid Build Coastguard Worker     if ((node->type != XML_ELEMENT_NODE) &&
92*7c568831SAndroid Build Coastguard Worker 	(node->type != XML_ATTRIBUTE_NODE) &&
93*7c568831SAndroid Build Coastguard Worker 	(node->type != XML_DOCUMENT_NODE) &&
94*7c568831SAndroid Build Coastguard Worker 	(node->type != XML_TEXT_NODE) &&
95*7c568831SAndroid Build Coastguard Worker 	(node->type != XML_HTML_DOCUMENT_NODE) &&
96*7c568831SAndroid Build Coastguard Worker 	(node->type != XML_XINCLUDE_START))
97*7c568831SAndroid Build Coastguard Worker 	return(-2);
98*7c568831SAndroid Build Coastguard Worker 
99*7c568831SAndroid Build Coastguard Worker     while ((node != NULL) &&
100*7c568831SAndroid Build Coastguard Worker            ((node->type == XML_ELEMENT_NODE) ||
101*7c568831SAndroid Build Coastguard Worker             (node->type == XML_ATTRIBUTE_NODE) ||
102*7c568831SAndroid Build Coastguard Worker             (node->type == XML_TEXT_NODE) ||
103*7c568831SAndroid Build Coastguard Worker 	    (node->type == XML_XINCLUDE_START))) {
104*7c568831SAndroid Build Coastguard Worker 	if ((node->type == XML_ELEMENT_NODE) ||
105*7c568831SAndroid Build Coastguard Worker 	    (node->type == XML_XINCLUDE_START)) {
106*7c568831SAndroid Build Coastguard Worker 	    cur = node->nsDef;
107*7c568831SAndroid Build Coastguard Worker 	    while (cur != NULL) {
108*7c568831SAndroid Build Coastguard Worker 	        if (cur == ns)
109*7c568831SAndroid Build Coastguard Worker 		    return(1);
110*7c568831SAndroid Build Coastguard Worker 		if (xmlStrEqual(cur->prefix, ns->prefix))
111*7c568831SAndroid Build Coastguard Worker 		    return(-2);
112*7c568831SAndroid Build Coastguard Worker 		cur = cur->next;
113*7c568831SAndroid Build Coastguard Worker 	    }
114*7c568831SAndroid Build Coastguard Worker 	}
115*7c568831SAndroid Build Coastguard Worker 	node = node->parent;
116*7c568831SAndroid Build Coastguard Worker     }
117*7c568831SAndroid Build Coastguard Worker     /* the xml namespace may be declared on the document node */
118*7c568831SAndroid Build Coastguard Worker     if ((node != NULL) &&
119*7c568831SAndroid Build Coastguard Worker         ((node->type == XML_DOCUMENT_NODE) ||
120*7c568831SAndroid Build Coastguard Worker 	 (node->type == XML_HTML_DOCUMENT_NODE))) {
121*7c568831SAndroid Build Coastguard Worker 	 xmlNsPtr oldNs = ((xmlDocPtr) node)->oldNs;
122*7c568831SAndroid Build Coastguard Worker 	 if (oldNs == ns)
123*7c568831SAndroid Build Coastguard Worker 	     return(1);
124*7c568831SAndroid Build Coastguard Worker     }
125*7c568831SAndroid Build Coastguard Worker     return(-3);
126*7c568831SAndroid Build Coastguard Worker }
127*7c568831SAndroid Build Coastguard Worker 
128*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtDumpSpaces(xmlDebugCtxtPtr ctxt)129*7c568831SAndroid Build Coastguard Worker xmlCtxtDumpSpaces(xmlDebugCtxtPtr ctxt)
130*7c568831SAndroid Build Coastguard Worker {
131*7c568831SAndroid Build Coastguard Worker     if (ctxt->check)
132*7c568831SAndroid Build Coastguard Worker         return;
133*7c568831SAndroid Build Coastguard Worker     if ((ctxt->output != NULL) && (ctxt->depth > 0)) {
134*7c568831SAndroid Build Coastguard Worker         if (ctxt->depth < 50)
135*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "%s", &ctxt->shift[100 - 2 * ctxt->depth]);
136*7c568831SAndroid Build Coastguard Worker         else
137*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "%s", ctxt->shift);
138*7c568831SAndroid Build Coastguard Worker     }
139*7c568831SAndroid Build Coastguard Worker }
140*7c568831SAndroid Build Coastguard Worker 
141*7c568831SAndroid Build Coastguard Worker /**
142*7c568831SAndroid Build Coastguard Worker  * xmlDebugErr:
143*7c568831SAndroid Build Coastguard Worker  * @ctxt:  a debug context
144*7c568831SAndroid Build Coastguard Worker  * @error:  the error code
145*7c568831SAndroid Build Coastguard Worker  *
146*7c568831SAndroid Build Coastguard Worker  * Handle a debug error.
147*7c568831SAndroid Build Coastguard Worker  */
148*7c568831SAndroid Build Coastguard Worker static void
xmlDebugErr(xmlDebugCtxtPtr ctxt,int error,const char * msg)149*7c568831SAndroid Build Coastguard Worker xmlDebugErr(xmlDebugCtxtPtr ctxt, int error, const char *msg)
150*7c568831SAndroid Build Coastguard Worker {
151*7c568831SAndroid Build Coastguard Worker     ctxt->errors++;
152*7c568831SAndroid Build Coastguard Worker     fprintf(ctxt->output, "ERROR %d: %s", error, msg);
153*7c568831SAndroid Build Coastguard Worker }
154*7c568831SAndroid Build Coastguard Worker static void LIBXML_ATTR_FORMAT(3,0)
xmlDebugErr2(xmlDebugCtxtPtr ctxt,int error,const char * msg,int extra)155*7c568831SAndroid Build Coastguard Worker xmlDebugErr2(xmlDebugCtxtPtr ctxt, int error, const char *msg, int extra)
156*7c568831SAndroid Build Coastguard Worker {
157*7c568831SAndroid Build Coastguard Worker     ctxt->errors++;
158*7c568831SAndroid Build Coastguard Worker     fprintf(ctxt->output, "ERROR %d: ", error);
159*7c568831SAndroid Build Coastguard Worker     fprintf(ctxt->output, msg, extra);
160*7c568831SAndroid Build Coastguard Worker }
161*7c568831SAndroid Build Coastguard Worker static void LIBXML_ATTR_FORMAT(3,0)
xmlDebugErr3(xmlDebugCtxtPtr ctxt,int error,const char * msg,const char * extra)162*7c568831SAndroid Build Coastguard Worker xmlDebugErr3(xmlDebugCtxtPtr ctxt, int error, const char *msg, const char *extra)
163*7c568831SAndroid Build Coastguard Worker {
164*7c568831SAndroid Build Coastguard Worker     ctxt->errors++;
165*7c568831SAndroid Build Coastguard Worker     fprintf(ctxt->output, "ERROR %d: ", error);
166*7c568831SAndroid Build Coastguard Worker     fprintf(ctxt->output, msg, extra);
167*7c568831SAndroid Build Coastguard Worker }
168*7c568831SAndroid Build Coastguard Worker 
169*7c568831SAndroid Build Coastguard Worker /**
170*7c568831SAndroid Build Coastguard Worker  * xmlCtxtNsCheckScope:
171*7c568831SAndroid Build Coastguard Worker  * @ctxt: the debugging context
172*7c568831SAndroid Build Coastguard Worker  * @node: the node
173*7c568831SAndroid Build Coastguard Worker  * @ns: the namespace node
174*7c568831SAndroid Build Coastguard Worker  *
175*7c568831SAndroid Build Coastguard Worker  * Report if a given namespace is is not in scope.
176*7c568831SAndroid Build Coastguard Worker  */
177*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtNsCheckScope(xmlDebugCtxtPtr ctxt,xmlNodePtr node,xmlNsPtr ns)178*7c568831SAndroid Build Coastguard Worker xmlCtxtNsCheckScope(xmlDebugCtxtPtr ctxt, xmlNodePtr node, xmlNsPtr ns)
179*7c568831SAndroid Build Coastguard Worker {
180*7c568831SAndroid Build Coastguard Worker     int ret;
181*7c568831SAndroid Build Coastguard Worker 
182*7c568831SAndroid Build Coastguard Worker     ret = xmlNsCheckScope(node, ns);
183*7c568831SAndroid Build Coastguard Worker     if (ret == -2) {
184*7c568831SAndroid Build Coastguard Worker         if (ns->prefix == NULL)
185*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr(ctxt, XML_CHECK_NS_SCOPE,
186*7c568831SAndroid Build Coastguard Worker 			"Reference to default namespace not in scope\n");
187*7c568831SAndroid Build Coastguard Worker 	else
188*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr3(ctxt, XML_CHECK_NS_SCOPE,
189*7c568831SAndroid Build Coastguard Worker 			 "Reference to namespace '%s' not in scope\n",
190*7c568831SAndroid Build Coastguard Worker 			 (char *) ns->prefix);
191*7c568831SAndroid Build Coastguard Worker     }
192*7c568831SAndroid Build Coastguard Worker     if (ret == -3) {
193*7c568831SAndroid Build Coastguard Worker         if (ns->prefix == NULL)
194*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr(ctxt, XML_CHECK_NS_ANCESTOR,
195*7c568831SAndroid Build Coastguard Worker 			"Reference to default namespace not on ancestor\n");
196*7c568831SAndroid Build Coastguard Worker 	else
197*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr3(ctxt, XML_CHECK_NS_ANCESTOR,
198*7c568831SAndroid Build Coastguard Worker 			 "Reference to namespace '%s' not on ancestor\n",
199*7c568831SAndroid Build Coastguard Worker 			 (char *) ns->prefix);
200*7c568831SAndroid Build Coastguard Worker     }
201*7c568831SAndroid Build Coastguard Worker }
202*7c568831SAndroid Build Coastguard Worker 
203*7c568831SAndroid Build Coastguard Worker /**
204*7c568831SAndroid Build Coastguard Worker  * xmlCtxtCheckString:
205*7c568831SAndroid Build Coastguard Worker  * @ctxt: the debug context
206*7c568831SAndroid Build Coastguard Worker  * @str: the string
207*7c568831SAndroid Build Coastguard Worker  *
208*7c568831SAndroid Build Coastguard Worker  * Do debugging on the string, currently it just checks the UTF-8 content
209*7c568831SAndroid Build Coastguard Worker  */
210*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtCheckString(xmlDebugCtxtPtr ctxt,const xmlChar * str)211*7c568831SAndroid Build Coastguard Worker xmlCtxtCheckString(xmlDebugCtxtPtr ctxt, const xmlChar * str)
212*7c568831SAndroid Build Coastguard Worker {
213*7c568831SAndroid Build Coastguard Worker     if (str == NULL) return;
214*7c568831SAndroid Build Coastguard Worker     if (ctxt->check) {
215*7c568831SAndroid Build Coastguard Worker         if (!xmlCheckUTF8(str)) {
216*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr3(ctxt, XML_CHECK_NOT_UTF8,
217*7c568831SAndroid Build Coastguard Worker 			 "String is not UTF-8 %s", (const char *) str);
218*7c568831SAndroid Build Coastguard Worker 	}
219*7c568831SAndroid Build Coastguard Worker     }
220*7c568831SAndroid Build Coastguard Worker }
221*7c568831SAndroid Build Coastguard Worker 
222*7c568831SAndroid Build Coastguard Worker /**
223*7c568831SAndroid Build Coastguard Worker  * xmlCtxtCheckName:
224*7c568831SAndroid Build Coastguard Worker  * @ctxt: the debug context
225*7c568831SAndroid Build Coastguard Worker  * @name: the name
226*7c568831SAndroid Build Coastguard Worker  *
227*7c568831SAndroid Build Coastguard Worker  * Do debugging on the name, for example the dictionary status and
228*7c568831SAndroid Build Coastguard Worker  * conformance to the Name production.
229*7c568831SAndroid Build Coastguard Worker  */
230*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtCheckName(xmlDebugCtxtPtr ctxt,const xmlChar * name)231*7c568831SAndroid Build Coastguard Worker xmlCtxtCheckName(xmlDebugCtxtPtr ctxt, const xmlChar * name)
232*7c568831SAndroid Build Coastguard Worker {
233*7c568831SAndroid Build Coastguard Worker     if (ctxt->check) {
234*7c568831SAndroid Build Coastguard Worker 	if (name == NULL) {
235*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr(ctxt, XML_CHECK_NO_NAME, "Name is NULL");
236*7c568831SAndroid Build Coastguard Worker 	    return;
237*7c568831SAndroid Build Coastguard Worker 	}
238*7c568831SAndroid Build Coastguard Worker         if (xmlValidateName(name, 0)) {
239*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr3(ctxt, XML_CHECK_NOT_NCNAME,
240*7c568831SAndroid Build Coastguard Worker 			 "Name is not an NCName '%s'", (const char *) name);
241*7c568831SAndroid Build Coastguard Worker 	}
242*7c568831SAndroid Build Coastguard Worker 	if ((ctxt->dict != NULL) &&
243*7c568831SAndroid Build Coastguard Worker 	    (!xmlDictOwns(ctxt->dict, name)) &&
244*7c568831SAndroid Build Coastguard Worker             ((ctxt->doc == NULL) ||
245*7c568831SAndroid Build Coastguard Worker              ((ctxt->doc->parseFlags & (XML_PARSE_SAX1 | XML_PARSE_NODICT)) == 0))) {
246*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr3(ctxt, XML_CHECK_OUTSIDE_DICT,
247*7c568831SAndroid Build Coastguard Worker 			 "Name is not from the document dictionary '%s'",
248*7c568831SAndroid Build Coastguard Worker 			 (const char *) name);
249*7c568831SAndroid Build Coastguard Worker 	}
250*7c568831SAndroid Build Coastguard Worker     }
251*7c568831SAndroid Build Coastguard Worker }
252*7c568831SAndroid Build Coastguard Worker 
253*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtGenericNodeCheck(xmlDebugCtxtPtr ctxt,xmlNodePtr node)254*7c568831SAndroid Build Coastguard Worker xmlCtxtGenericNodeCheck(xmlDebugCtxtPtr ctxt, xmlNodePtr node) {
255*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
256*7c568831SAndroid Build Coastguard Worker     xmlDictPtr dict;
257*7c568831SAndroid Build Coastguard Worker 
258*7c568831SAndroid Build Coastguard Worker     doc = node->doc;
259*7c568831SAndroid Build Coastguard Worker 
260*7c568831SAndroid Build Coastguard Worker     if (node->parent == NULL)
261*7c568831SAndroid Build Coastguard Worker         xmlDebugErr(ctxt, XML_CHECK_NO_PARENT,
262*7c568831SAndroid Build Coastguard Worker 	            "Node has no parent\n");
263*7c568831SAndroid Build Coastguard Worker     if (node->doc == NULL) {
264*7c568831SAndroid Build Coastguard Worker         xmlDebugErr(ctxt, XML_CHECK_NO_DOC,
265*7c568831SAndroid Build Coastguard Worker 	            "Node has no doc\n");
266*7c568831SAndroid Build Coastguard Worker         dict = NULL;
267*7c568831SAndroid Build Coastguard Worker     } else {
268*7c568831SAndroid Build Coastguard Worker 	dict = doc->dict;
269*7c568831SAndroid Build Coastguard Worker 	if ((dict == NULL) && (ctxt->nodict == 0)) {
270*7c568831SAndroid Build Coastguard Worker 	    ctxt->nodict = 1;
271*7c568831SAndroid Build Coastguard Worker 	}
272*7c568831SAndroid Build Coastguard Worker 	if (ctxt->doc == NULL)
273*7c568831SAndroid Build Coastguard Worker 	    ctxt->doc = doc;
274*7c568831SAndroid Build Coastguard Worker 
275*7c568831SAndroid Build Coastguard Worker 	if (ctxt->dict == NULL) {
276*7c568831SAndroid Build Coastguard Worker 	    ctxt->dict = dict;
277*7c568831SAndroid Build Coastguard Worker 	}
278*7c568831SAndroid Build Coastguard Worker     }
279*7c568831SAndroid Build Coastguard Worker     if ((node->parent != NULL) && (node->doc != node->parent->doc) &&
280*7c568831SAndroid Build Coastguard Worker         (!xmlStrEqual(node->name, BAD_CAST "pseudoroot")))
281*7c568831SAndroid Build Coastguard Worker         xmlDebugErr(ctxt, XML_CHECK_WRONG_DOC,
282*7c568831SAndroid Build Coastguard Worker 	            "Node doc differs from parent's one\n");
283*7c568831SAndroid Build Coastguard Worker     if (node->prev == NULL) {
284*7c568831SAndroid Build Coastguard Worker         if (node->type == XML_ATTRIBUTE_NODE) {
285*7c568831SAndroid Build Coastguard Worker 	    if ((node->parent != NULL) &&
286*7c568831SAndroid Build Coastguard Worker 	        (node != (xmlNodePtr) node->parent->properties))
287*7c568831SAndroid Build Coastguard Worker 		xmlDebugErr(ctxt, XML_CHECK_NO_PREV,
288*7c568831SAndroid Build Coastguard Worker                     "Attr has no prev and not first of attr list\n");
289*7c568831SAndroid Build Coastguard Worker 
290*7c568831SAndroid Build Coastguard Worker         } else if ((node->parent != NULL) && (node->parent->children != node))
291*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr(ctxt, XML_CHECK_NO_PREV,
292*7c568831SAndroid Build Coastguard Worker                     "Node has no prev and not first of parent list\n");
293*7c568831SAndroid Build Coastguard Worker     } else {
294*7c568831SAndroid Build Coastguard Worker         if (node->prev->next != node)
295*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr(ctxt, XML_CHECK_WRONG_PREV,
296*7c568831SAndroid Build Coastguard Worker                         "Node prev->next : back link wrong\n");
297*7c568831SAndroid Build Coastguard Worker     }
298*7c568831SAndroid Build Coastguard Worker     if (node->next == NULL) {
299*7c568831SAndroid Build Coastguard Worker 	if ((node->parent != NULL) && (node->type != XML_ATTRIBUTE_NODE) &&
300*7c568831SAndroid Build Coastguard Worker 	    (node->parent->last != node) &&
301*7c568831SAndroid Build Coastguard Worker 	    (node->parent->type == XML_ELEMENT_NODE))
302*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr(ctxt, XML_CHECK_NO_NEXT,
303*7c568831SAndroid Build Coastguard Worker                     "Node has no next and not last of parent list\n");
304*7c568831SAndroid Build Coastguard Worker     } else {
305*7c568831SAndroid Build Coastguard Worker         if (node->next->prev != node)
306*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr(ctxt, XML_CHECK_WRONG_NEXT,
307*7c568831SAndroid Build Coastguard Worker                     "Node next->prev : forward link wrong\n");
308*7c568831SAndroid Build Coastguard Worker         if (node->next->parent != node->parent)
309*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr(ctxt, XML_CHECK_WRONG_PARENT,
310*7c568831SAndroid Build Coastguard Worker                     "Node next->prev : forward link wrong\n");
311*7c568831SAndroid Build Coastguard Worker     }
312*7c568831SAndroid Build Coastguard Worker     if (node->type == XML_ELEMENT_NODE) {
313*7c568831SAndroid Build Coastguard Worker         xmlNsPtr ns;
314*7c568831SAndroid Build Coastguard Worker 
315*7c568831SAndroid Build Coastguard Worker 	ns = node->nsDef;
316*7c568831SAndroid Build Coastguard Worker 	while (ns != NULL) {
317*7c568831SAndroid Build Coastguard Worker 	    xmlCtxtNsCheckScope(ctxt, node, ns);
318*7c568831SAndroid Build Coastguard Worker 	    ns = ns->next;
319*7c568831SAndroid Build Coastguard Worker 	}
320*7c568831SAndroid Build Coastguard Worker 	if (node->ns != NULL)
321*7c568831SAndroid Build Coastguard Worker 	    xmlCtxtNsCheckScope(ctxt, node, node->ns);
322*7c568831SAndroid Build Coastguard Worker     } else if (node->type == XML_ATTRIBUTE_NODE) {
323*7c568831SAndroid Build Coastguard Worker 	if (node->ns != NULL)
324*7c568831SAndroid Build Coastguard Worker 	    xmlCtxtNsCheckScope(ctxt, node, node->ns);
325*7c568831SAndroid Build Coastguard Worker     }
326*7c568831SAndroid Build Coastguard Worker 
327*7c568831SAndroid Build Coastguard Worker     if ((node->type != XML_ELEMENT_NODE) &&
328*7c568831SAndroid Build Coastguard Worker 	(node->type != XML_ATTRIBUTE_NODE) &&
329*7c568831SAndroid Build Coastguard Worker 	(node->type != XML_ELEMENT_DECL) &&
330*7c568831SAndroid Build Coastguard Worker 	(node->type != XML_ATTRIBUTE_DECL) &&
331*7c568831SAndroid Build Coastguard Worker 	(node->type != XML_DTD_NODE) &&
332*7c568831SAndroid Build Coastguard Worker 	(node->type != XML_HTML_DOCUMENT_NODE) &&
333*7c568831SAndroid Build Coastguard Worker 	(node->type != XML_DOCUMENT_NODE)) {
334*7c568831SAndroid Build Coastguard Worker 	if (node->content != NULL)
335*7c568831SAndroid Build Coastguard Worker 	    xmlCtxtCheckString(ctxt, (const xmlChar *) node->content);
336*7c568831SAndroid Build Coastguard Worker     }
337*7c568831SAndroid Build Coastguard Worker     switch (node->type) {
338*7c568831SAndroid Build Coastguard Worker         case XML_ELEMENT_NODE:
339*7c568831SAndroid Build Coastguard Worker         case XML_ATTRIBUTE_NODE:
340*7c568831SAndroid Build Coastguard Worker 	    xmlCtxtCheckName(ctxt, node->name);
341*7c568831SAndroid Build Coastguard Worker 	    break;
342*7c568831SAndroid Build Coastguard Worker         case XML_TEXT_NODE:
343*7c568831SAndroid Build Coastguard Worker 	    if ((node->name == xmlStringText) ||
344*7c568831SAndroid Build Coastguard Worker 	        (node->name == xmlStringTextNoenc))
345*7c568831SAndroid Build Coastguard Worker 		break;
346*7c568831SAndroid Build Coastguard Worker 	    /* some case of entity substitution can lead to this */
347*7c568831SAndroid Build Coastguard Worker 	    if ((ctxt->dict != NULL) &&
348*7c568831SAndroid Build Coastguard Worker 	        (node->name == xmlDictLookup(ctxt->dict, BAD_CAST "nbktext",
349*7c568831SAndroid Build Coastguard Worker 		                             7)))
350*7c568831SAndroid Build Coastguard Worker 		break;
351*7c568831SAndroid Build Coastguard Worker 
352*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr3(ctxt, XML_CHECK_WRONG_NAME,
353*7c568831SAndroid Build Coastguard Worker 			 "Text node has wrong name '%s'",
354*7c568831SAndroid Build Coastguard Worker 			 (const char *) node->name);
355*7c568831SAndroid Build Coastguard Worker 	    break;
356*7c568831SAndroid Build Coastguard Worker         case XML_COMMENT_NODE:
357*7c568831SAndroid Build Coastguard Worker 	    if (node->name == xmlStringComment)
358*7c568831SAndroid Build Coastguard Worker 		break;
359*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr3(ctxt, XML_CHECK_WRONG_NAME,
360*7c568831SAndroid Build Coastguard Worker 			 "Comment node has wrong name '%s'",
361*7c568831SAndroid Build Coastguard Worker 			 (const char *) node->name);
362*7c568831SAndroid Build Coastguard Worker 	    break;
363*7c568831SAndroid Build Coastguard Worker         case XML_PI_NODE:
364*7c568831SAndroid Build Coastguard Worker 	    xmlCtxtCheckName(ctxt, node->name);
365*7c568831SAndroid Build Coastguard Worker 	    break;
366*7c568831SAndroid Build Coastguard Worker         case XML_CDATA_SECTION_NODE:
367*7c568831SAndroid Build Coastguard Worker 	    if (node->name == NULL)
368*7c568831SAndroid Build Coastguard Worker 		break;
369*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr3(ctxt, XML_CHECK_NAME_NOT_NULL,
370*7c568831SAndroid Build Coastguard Worker 			 "CData section has non NULL name '%s'",
371*7c568831SAndroid Build Coastguard Worker 			 (const char *) node->name);
372*7c568831SAndroid Build Coastguard Worker 	    break;
373*7c568831SAndroid Build Coastguard Worker         case XML_ENTITY_REF_NODE:
374*7c568831SAndroid Build Coastguard Worker         case XML_ENTITY_NODE:
375*7c568831SAndroid Build Coastguard Worker         case XML_DOCUMENT_TYPE_NODE:
376*7c568831SAndroid Build Coastguard Worker         case XML_DOCUMENT_FRAG_NODE:
377*7c568831SAndroid Build Coastguard Worker         case XML_NOTATION_NODE:
378*7c568831SAndroid Build Coastguard Worker         case XML_DTD_NODE:
379*7c568831SAndroid Build Coastguard Worker         case XML_ELEMENT_DECL:
380*7c568831SAndroid Build Coastguard Worker         case XML_ATTRIBUTE_DECL:
381*7c568831SAndroid Build Coastguard Worker         case XML_ENTITY_DECL:
382*7c568831SAndroid Build Coastguard Worker         case XML_NAMESPACE_DECL:
383*7c568831SAndroid Build Coastguard Worker         case XML_XINCLUDE_START:
384*7c568831SAndroid Build Coastguard Worker         case XML_XINCLUDE_END:
385*7c568831SAndroid Build Coastguard Worker         case XML_DOCUMENT_NODE:
386*7c568831SAndroid Build Coastguard Worker         case XML_HTML_DOCUMENT_NODE:
387*7c568831SAndroid Build Coastguard Worker 	    break;
388*7c568831SAndroid Build Coastguard Worker     }
389*7c568831SAndroid Build Coastguard Worker }
390*7c568831SAndroid Build Coastguard Worker 
391*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtDumpString(xmlDebugCtxtPtr ctxt,const xmlChar * str)392*7c568831SAndroid Build Coastguard Worker xmlCtxtDumpString(xmlDebugCtxtPtr ctxt, const xmlChar * str)
393*7c568831SAndroid Build Coastguard Worker {
394*7c568831SAndroid Build Coastguard Worker     int i;
395*7c568831SAndroid Build Coastguard Worker 
396*7c568831SAndroid Build Coastguard Worker     if (ctxt->check) {
397*7c568831SAndroid Build Coastguard Worker         return;
398*7c568831SAndroid Build Coastguard Worker     }
399*7c568831SAndroid Build Coastguard Worker     /* TODO: check UTF8 content of the string */
400*7c568831SAndroid Build Coastguard Worker     if (str == NULL) {
401*7c568831SAndroid Build Coastguard Worker         fprintf(ctxt->output, "(NULL)");
402*7c568831SAndroid Build Coastguard Worker         return;
403*7c568831SAndroid Build Coastguard Worker     }
404*7c568831SAndroid Build Coastguard Worker     for (i = 0; i < 40; i++)
405*7c568831SAndroid Build Coastguard Worker         if (str[i] == 0)
406*7c568831SAndroid Build Coastguard Worker             return;
407*7c568831SAndroid Build Coastguard Worker         else if (IS_BLANK_CH(str[i]))
408*7c568831SAndroid Build Coastguard Worker             fputc(' ', ctxt->output);
409*7c568831SAndroid Build Coastguard Worker         else if (str[i] >= 0x80)
410*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "#%X", str[i]);
411*7c568831SAndroid Build Coastguard Worker         else
412*7c568831SAndroid Build Coastguard Worker             fputc(str[i], ctxt->output);
413*7c568831SAndroid Build Coastguard Worker     fprintf(ctxt->output, "...");
414*7c568831SAndroid Build Coastguard Worker }
415*7c568831SAndroid Build Coastguard Worker 
416*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtDumpDtdNode(xmlDebugCtxtPtr ctxt,xmlDtdPtr dtd)417*7c568831SAndroid Build Coastguard Worker xmlCtxtDumpDtdNode(xmlDebugCtxtPtr ctxt, xmlDtdPtr dtd)
418*7c568831SAndroid Build Coastguard Worker {
419*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpSpaces(ctxt);
420*7c568831SAndroid Build Coastguard Worker 
421*7c568831SAndroid Build Coastguard Worker     if (dtd == NULL) {
422*7c568831SAndroid Build Coastguard Worker         if (!ctxt->check)
423*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "DTD node is NULL\n");
424*7c568831SAndroid Build Coastguard Worker         return;
425*7c568831SAndroid Build Coastguard Worker     }
426*7c568831SAndroid Build Coastguard Worker 
427*7c568831SAndroid Build Coastguard Worker     if (dtd->type != XML_DTD_NODE) {
428*7c568831SAndroid Build Coastguard Worker 	xmlDebugErr(ctxt, XML_CHECK_NOT_DTD,
429*7c568831SAndroid Build Coastguard Worker 	            "Node is not a DTD");
430*7c568831SAndroid Build Coastguard Worker         return;
431*7c568831SAndroid Build Coastguard Worker     }
432*7c568831SAndroid Build Coastguard Worker     if (!ctxt->check) {
433*7c568831SAndroid Build Coastguard Worker         if (dtd->name != NULL)
434*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "DTD(%s)", (char *) dtd->name);
435*7c568831SAndroid Build Coastguard Worker         else
436*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "DTD");
437*7c568831SAndroid Build Coastguard Worker         if (dtd->ExternalID != NULL)
438*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, ", PUBLIC %s", (char *) dtd->ExternalID);
439*7c568831SAndroid Build Coastguard Worker         if (dtd->SystemID != NULL)
440*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, ", SYSTEM %s", (char *) dtd->SystemID);
441*7c568831SAndroid Build Coastguard Worker         fprintf(ctxt->output, "\n");
442*7c568831SAndroid Build Coastguard Worker     }
443*7c568831SAndroid Build Coastguard Worker     /*
444*7c568831SAndroid Build Coastguard Worker      * Do a bit of checking
445*7c568831SAndroid Build Coastguard Worker      */
446*7c568831SAndroid Build Coastguard Worker     xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) dtd);
447*7c568831SAndroid Build Coastguard Worker }
448*7c568831SAndroid Build Coastguard Worker 
449*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtDumpAttrDecl(xmlDebugCtxtPtr ctxt,xmlAttributePtr attr)450*7c568831SAndroid Build Coastguard Worker xmlCtxtDumpAttrDecl(xmlDebugCtxtPtr ctxt, xmlAttributePtr attr)
451*7c568831SAndroid Build Coastguard Worker {
452*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpSpaces(ctxt);
453*7c568831SAndroid Build Coastguard Worker 
454*7c568831SAndroid Build Coastguard Worker     if (attr == NULL) {
455*7c568831SAndroid Build Coastguard Worker         if (!ctxt->check)
456*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "Attribute declaration is NULL\n");
457*7c568831SAndroid Build Coastguard Worker         return;
458*7c568831SAndroid Build Coastguard Worker     }
459*7c568831SAndroid Build Coastguard Worker     if (attr->type != XML_ATTRIBUTE_DECL) {
460*7c568831SAndroid Build Coastguard Worker 	xmlDebugErr(ctxt, XML_CHECK_NOT_ATTR_DECL,
461*7c568831SAndroid Build Coastguard Worker 	            "Node is not an attribute declaration");
462*7c568831SAndroid Build Coastguard Worker         return;
463*7c568831SAndroid Build Coastguard Worker     }
464*7c568831SAndroid Build Coastguard Worker     if (attr->name != NULL) {
465*7c568831SAndroid Build Coastguard Worker         if (!ctxt->check)
466*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "ATTRDECL(%s)", (char *) attr->name);
467*7c568831SAndroid Build Coastguard Worker     } else
468*7c568831SAndroid Build Coastguard Worker 	xmlDebugErr(ctxt, XML_CHECK_NO_NAME,
469*7c568831SAndroid Build Coastguard Worker 	            "Node attribute declaration has no name");
470*7c568831SAndroid Build Coastguard Worker     if (attr->elem != NULL) {
471*7c568831SAndroid Build Coastguard Worker         if (!ctxt->check)
472*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, " for %s", (char *) attr->elem);
473*7c568831SAndroid Build Coastguard Worker     } else
474*7c568831SAndroid Build Coastguard Worker 	xmlDebugErr(ctxt, XML_CHECK_NO_ELEM,
475*7c568831SAndroid Build Coastguard Worker 	            "Node attribute declaration has no element name");
476*7c568831SAndroid Build Coastguard Worker     if (!ctxt->check) {
477*7c568831SAndroid Build Coastguard Worker         switch (attr->atype) {
478*7c568831SAndroid Build Coastguard Worker             case XML_ATTRIBUTE_CDATA:
479*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, " CDATA");
480*7c568831SAndroid Build Coastguard Worker                 break;
481*7c568831SAndroid Build Coastguard Worker             case XML_ATTRIBUTE_ID:
482*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, " ID");
483*7c568831SAndroid Build Coastguard Worker                 break;
484*7c568831SAndroid Build Coastguard Worker             case XML_ATTRIBUTE_IDREF:
485*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, " IDREF");
486*7c568831SAndroid Build Coastguard Worker                 break;
487*7c568831SAndroid Build Coastguard Worker             case XML_ATTRIBUTE_IDREFS:
488*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, " IDREFS");
489*7c568831SAndroid Build Coastguard Worker                 break;
490*7c568831SAndroid Build Coastguard Worker             case XML_ATTRIBUTE_ENTITY:
491*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, " ENTITY");
492*7c568831SAndroid Build Coastguard Worker                 break;
493*7c568831SAndroid Build Coastguard Worker             case XML_ATTRIBUTE_ENTITIES:
494*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, " ENTITIES");
495*7c568831SAndroid Build Coastguard Worker                 break;
496*7c568831SAndroid Build Coastguard Worker             case XML_ATTRIBUTE_NMTOKEN:
497*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, " NMTOKEN");
498*7c568831SAndroid Build Coastguard Worker                 break;
499*7c568831SAndroid Build Coastguard Worker             case XML_ATTRIBUTE_NMTOKENS:
500*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, " NMTOKENS");
501*7c568831SAndroid Build Coastguard Worker                 break;
502*7c568831SAndroid Build Coastguard Worker             case XML_ATTRIBUTE_ENUMERATION:
503*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, " ENUMERATION");
504*7c568831SAndroid Build Coastguard Worker                 break;
505*7c568831SAndroid Build Coastguard Worker             case XML_ATTRIBUTE_NOTATION:
506*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, " NOTATION ");
507*7c568831SAndroid Build Coastguard Worker                 break;
508*7c568831SAndroid Build Coastguard Worker         }
509*7c568831SAndroid Build Coastguard Worker         if (attr->tree != NULL) {
510*7c568831SAndroid Build Coastguard Worker             int indx;
511*7c568831SAndroid Build Coastguard Worker             xmlEnumerationPtr cur = attr->tree;
512*7c568831SAndroid Build Coastguard Worker 
513*7c568831SAndroid Build Coastguard Worker             for (indx = 0; indx < 5; indx++) {
514*7c568831SAndroid Build Coastguard Worker                 if (indx != 0)
515*7c568831SAndroid Build Coastguard Worker                     fprintf(ctxt->output, "|%s", (char *) cur->name);
516*7c568831SAndroid Build Coastguard Worker                 else
517*7c568831SAndroid Build Coastguard Worker                     fprintf(ctxt->output, " (%s", (char *) cur->name);
518*7c568831SAndroid Build Coastguard Worker                 cur = cur->next;
519*7c568831SAndroid Build Coastguard Worker                 if (cur == NULL)
520*7c568831SAndroid Build Coastguard Worker                     break;
521*7c568831SAndroid Build Coastguard Worker             }
522*7c568831SAndroid Build Coastguard Worker             if (cur == NULL)
523*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, ")");
524*7c568831SAndroid Build Coastguard Worker             else
525*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "...)");
526*7c568831SAndroid Build Coastguard Worker         }
527*7c568831SAndroid Build Coastguard Worker         switch (attr->def) {
528*7c568831SAndroid Build Coastguard Worker             case XML_ATTRIBUTE_NONE:
529*7c568831SAndroid Build Coastguard Worker                 break;
530*7c568831SAndroid Build Coastguard Worker             case XML_ATTRIBUTE_REQUIRED:
531*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, " REQUIRED");
532*7c568831SAndroid Build Coastguard Worker                 break;
533*7c568831SAndroid Build Coastguard Worker             case XML_ATTRIBUTE_IMPLIED:
534*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, " IMPLIED");
535*7c568831SAndroid Build Coastguard Worker                 break;
536*7c568831SAndroid Build Coastguard Worker             case XML_ATTRIBUTE_FIXED:
537*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, " FIXED");
538*7c568831SAndroid Build Coastguard Worker                 break;
539*7c568831SAndroid Build Coastguard Worker         }
540*7c568831SAndroid Build Coastguard Worker         if (attr->defaultValue != NULL) {
541*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "\"");
542*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpString(ctxt, attr->defaultValue);
543*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "\"");
544*7c568831SAndroid Build Coastguard Worker         }
545*7c568831SAndroid Build Coastguard Worker         fprintf(ctxt->output, "\n");
546*7c568831SAndroid Build Coastguard Worker     }
547*7c568831SAndroid Build Coastguard Worker 
548*7c568831SAndroid Build Coastguard Worker     /*
549*7c568831SAndroid Build Coastguard Worker      * Do a bit of checking
550*7c568831SAndroid Build Coastguard Worker      */
551*7c568831SAndroid Build Coastguard Worker     xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) attr);
552*7c568831SAndroid Build Coastguard Worker }
553*7c568831SAndroid Build Coastguard Worker 
554*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtDumpElemDecl(xmlDebugCtxtPtr ctxt,xmlElementPtr elem)555*7c568831SAndroid Build Coastguard Worker xmlCtxtDumpElemDecl(xmlDebugCtxtPtr ctxt, xmlElementPtr elem)
556*7c568831SAndroid Build Coastguard Worker {
557*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpSpaces(ctxt);
558*7c568831SAndroid Build Coastguard Worker 
559*7c568831SAndroid Build Coastguard Worker     if (elem == NULL) {
560*7c568831SAndroid Build Coastguard Worker         if (!ctxt->check)
561*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "Element declaration is NULL\n");
562*7c568831SAndroid Build Coastguard Worker         return;
563*7c568831SAndroid Build Coastguard Worker     }
564*7c568831SAndroid Build Coastguard Worker     if (elem->type != XML_ELEMENT_DECL) {
565*7c568831SAndroid Build Coastguard Worker 	xmlDebugErr(ctxt, XML_CHECK_NOT_ELEM_DECL,
566*7c568831SAndroid Build Coastguard Worker 	            "Node is not an element declaration");
567*7c568831SAndroid Build Coastguard Worker         return;
568*7c568831SAndroid Build Coastguard Worker     }
569*7c568831SAndroid Build Coastguard Worker     if (elem->name != NULL) {
570*7c568831SAndroid Build Coastguard Worker         if (!ctxt->check) {
571*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "ELEMDECL(");
572*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpString(ctxt, elem->name);
573*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, ")");
574*7c568831SAndroid Build Coastguard Worker         }
575*7c568831SAndroid Build Coastguard Worker     } else
576*7c568831SAndroid Build Coastguard Worker 	xmlDebugErr(ctxt, XML_CHECK_NO_NAME,
577*7c568831SAndroid Build Coastguard Worker 	            "Element declaration has no name");
578*7c568831SAndroid Build Coastguard Worker     if (!ctxt->check) {
579*7c568831SAndroid Build Coastguard Worker         switch (elem->etype) {
580*7c568831SAndroid Build Coastguard Worker             case XML_ELEMENT_TYPE_UNDEFINED:
581*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, ", UNDEFINED");
582*7c568831SAndroid Build Coastguard Worker                 break;
583*7c568831SAndroid Build Coastguard Worker             case XML_ELEMENT_TYPE_EMPTY:
584*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, ", EMPTY");
585*7c568831SAndroid Build Coastguard Worker                 break;
586*7c568831SAndroid Build Coastguard Worker             case XML_ELEMENT_TYPE_ANY:
587*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, ", ANY");
588*7c568831SAndroid Build Coastguard Worker                 break;
589*7c568831SAndroid Build Coastguard Worker             case XML_ELEMENT_TYPE_MIXED:
590*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, ", MIXED ");
591*7c568831SAndroid Build Coastguard Worker                 break;
592*7c568831SAndroid Build Coastguard Worker             case XML_ELEMENT_TYPE_ELEMENT:
593*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, ", MIXED ");
594*7c568831SAndroid Build Coastguard Worker                 break;
595*7c568831SAndroid Build Coastguard Worker         }
596*7c568831SAndroid Build Coastguard Worker         if ((elem->type != XML_ELEMENT_NODE) && (elem->content != NULL)) {
597*7c568831SAndroid Build Coastguard Worker             char buf[5001];
598*7c568831SAndroid Build Coastguard Worker 
599*7c568831SAndroid Build Coastguard Worker             buf[0] = 0;
600*7c568831SAndroid Build Coastguard Worker             xmlSnprintfElementContent(buf, 5000, elem->content, 1);
601*7c568831SAndroid Build Coastguard Worker             buf[5000] = 0;
602*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "%s", buf);
603*7c568831SAndroid Build Coastguard Worker         }
604*7c568831SAndroid Build Coastguard Worker         fprintf(ctxt->output, "\n");
605*7c568831SAndroid Build Coastguard Worker     }
606*7c568831SAndroid Build Coastguard Worker 
607*7c568831SAndroid Build Coastguard Worker     /*
608*7c568831SAndroid Build Coastguard Worker      * Do a bit of checking
609*7c568831SAndroid Build Coastguard Worker      */
610*7c568831SAndroid Build Coastguard Worker     xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) elem);
611*7c568831SAndroid Build Coastguard Worker }
612*7c568831SAndroid Build Coastguard Worker 
613*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtDumpEntityDecl(xmlDebugCtxtPtr ctxt,xmlEntityPtr ent)614*7c568831SAndroid Build Coastguard Worker xmlCtxtDumpEntityDecl(xmlDebugCtxtPtr ctxt, xmlEntityPtr ent)
615*7c568831SAndroid Build Coastguard Worker {
616*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpSpaces(ctxt);
617*7c568831SAndroid Build Coastguard Worker 
618*7c568831SAndroid Build Coastguard Worker     if (ent == NULL) {
619*7c568831SAndroid Build Coastguard Worker         if (!ctxt->check)
620*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "Entity declaration is NULL\n");
621*7c568831SAndroid Build Coastguard Worker         return;
622*7c568831SAndroid Build Coastguard Worker     }
623*7c568831SAndroid Build Coastguard Worker     if (ent->type != XML_ENTITY_DECL) {
624*7c568831SAndroid Build Coastguard Worker 	xmlDebugErr(ctxt, XML_CHECK_NOT_ENTITY_DECL,
625*7c568831SAndroid Build Coastguard Worker 	            "Node is not an entity declaration");
626*7c568831SAndroid Build Coastguard Worker         return;
627*7c568831SAndroid Build Coastguard Worker     }
628*7c568831SAndroid Build Coastguard Worker     if (ent->name != NULL) {
629*7c568831SAndroid Build Coastguard Worker         if (!ctxt->check) {
630*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "ENTITYDECL(");
631*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpString(ctxt, ent->name);
632*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, ")");
633*7c568831SAndroid Build Coastguard Worker         }
634*7c568831SAndroid Build Coastguard Worker     } else
635*7c568831SAndroid Build Coastguard Worker 	xmlDebugErr(ctxt, XML_CHECK_NO_NAME,
636*7c568831SAndroid Build Coastguard Worker 	            "Entity declaration has no name");
637*7c568831SAndroid Build Coastguard Worker     if (!ctxt->check) {
638*7c568831SAndroid Build Coastguard Worker         switch (ent->etype) {
639*7c568831SAndroid Build Coastguard Worker             case XML_INTERNAL_GENERAL_ENTITY:
640*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, ", internal\n");
641*7c568831SAndroid Build Coastguard Worker                 break;
642*7c568831SAndroid Build Coastguard Worker             case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
643*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, ", external parsed\n");
644*7c568831SAndroid Build Coastguard Worker                 break;
645*7c568831SAndroid Build Coastguard Worker             case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
646*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, ", unparsed\n");
647*7c568831SAndroid Build Coastguard Worker                 break;
648*7c568831SAndroid Build Coastguard Worker             case XML_INTERNAL_PARAMETER_ENTITY:
649*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, ", parameter\n");
650*7c568831SAndroid Build Coastguard Worker                 break;
651*7c568831SAndroid Build Coastguard Worker             case XML_EXTERNAL_PARAMETER_ENTITY:
652*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, ", external parameter\n");
653*7c568831SAndroid Build Coastguard Worker                 break;
654*7c568831SAndroid Build Coastguard Worker             case XML_INTERNAL_PREDEFINED_ENTITY:
655*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, ", predefined\n");
656*7c568831SAndroid Build Coastguard Worker                 break;
657*7c568831SAndroid Build Coastguard Worker         }
658*7c568831SAndroid Build Coastguard Worker         if (ent->ExternalID) {
659*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpSpaces(ctxt);
660*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, " ExternalID=%s\n",
661*7c568831SAndroid Build Coastguard Worker                     (char *) ent->ExternalID);
662*7c568831SAndroid Build Coastguard Worker         }
663*7c568831SAndroid Build Coastguard Worker         if (ent->SystemID) {
664*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpSpaces(ctxt);
665*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, " SystemID=%s\n",
666*7c568831SAndroid Build Coastguard Worker                     (char *) ent->SystemID);
667*7c568831SAndroid Build Coastguard Worker         }
668*7c568831SAndroid Build Coastguard Worker         if (ent->URI != NULL) {
669*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpSpaces(ctxt);
670*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, " URI=%s\n", (char *) ent->URI);
671*7c568831SAndroid Build Coastguard Worker         }
672*7c568831SAndroid Build Coastguard Worker         if (ent->content) {
673*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpSpaces(ctxt);
674*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, " content=");
675*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpString(ctxt, ent->content);
676*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "\n");
677*7c568831SAndroid Build Coastguard Worker         }
678*7c568831SAndroid Build Coastguard Worker     }
679*7c568831SAndroid Build Coastguard Worker 
680*7c568831SAndroid Build Coastguard Worker     /*
681*7c568831SAndroid Build Coastguard Worker      * Do a bit of checking
682*7c568831SAndroid Build Coastguard Worker      */
683*7c568831SAndroid Build Coastguard Worker     xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) ent);
684*7c568831SAndroid Build Coastguard Worker }
685*7c568831SAndroid Build Coastguard Worker 
686*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtDumpNamespace(xmlDebugCtxtPtr ctxt,xmlNsPtr ns)687*7c568831SAndroid Build Coastguard Worker xmlCtxtDumpNamespace(xmlDebugCtxtPtr ctxt, xmlNsPtr ns)
688*7c568831SAndroid Build Coastguard Worker {
689*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpSpaces(ctxt);
690*7c568831SAndroid Build Coastguard Worker 
691*7c568831SAndroid Build Coastguard Worker     if (ns == NULL) {
692*7c568831SAndroid Build Coastguard Worker         if (!ctxt->check)
693*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "namespace node is NULL\n");
694*7c568831SAndroid Build Coastguard Worker         return;
695*7c568831SAndroid Build Coastguard Worker     }
696*7c568831SAndroid Build Coastguard Worker     if (ns->type != XML_NAMESPACE_DECL) {
697*7c568831SAndroid Build Coastguard Worker 	xmlDebugErr(ctxt, XML_CHECK_NOT_NS_DECL,
698*7c568831SAndroid Build Coastguard Worker 	            "Node is not a namespace declaration");
699*7c568831SAndroid Build Coastguard Worker         return;
700*7c568831SAndroid Build Coastguard Worker     }
701*7c568831SAndroid Build Coastguard Worker     if (ns->href == NULL) {
702*7c568831SAndroid Build Coastguard Worker         if (ns->prefix != NULL)
703*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr3(ctxt, XML_CHECK_NO_HREF,
704*7c568831SAndroid Build Coastguard Worker                     "Incomplete namespace %s href=NULL\n",
705*7c568831SAndroid Build Coastguard Worker                     (char *) ns->prefix);
706*7c568831SAndroid Build Coastguard Worker         else
707*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr(ctxt, XML_CHECK_NO_HREF,
708*7c568831SAndroid Build Coastguard Worker                     "Incomplete default namespace href=NULL\n");
709*7c568831SAndroid Build Coastguard Worker     } else {
710*7c568831SAndroid Build Coastguard Worker         if (!ctxt->check) {
711*7c568831SAndroid Build Coastguard Worker             if (ns->prefix != NULL)
712*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "namespace %s href=",
713*7c568831SAndroid Build Coastguard Worker                         (char *) ns->prefix);
714*7c568831SAndroid Build Coastguard Worker             else
715*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "default namespace href=");
716*7c568831SAndroid Build Coastguard Worker 
717*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpString(ctxt, ns->href);
718*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "\n");
719*7c568831SAndroid Build Coastguard Worker         }
720*7c568831SAndroid Build Coastguard Worker     }
721*7c568831SAndroid Build Coastguard Worker }
722*7c568831SAndroid Build Coastguard Worker 
723*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtDumpNamespaceList(xmlDebugCtxtPtr ctxt,xmlNsPtr ns)724*7c568831SAndroid Build Coastguard Worker xmlCtxtDumpNamespaceList(xmlDebugCtxtPtr ctxt, xmlNsPtr ns)
725*7c568831SAndroid Build Coastguard Worker {
726*7c568831SAndroid Build Coastguard Worker     while (ns != NULL) {
727*7c568831SAndroid Build Coastguard Worker         xmlCtxtDumpNamespace(ctxt, ns);
728*7c568831SAndroid Build Coastguard Worker         ns = ns->next;
729*7c568831SAndroid Build Coastguard Worker     }
730*7c568831SAndroid Build Coastguard Worker }
731*7c568831SAndroid Build Coastguard Worker 
732*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtDumpEntity(xmlDebugCtxtPtr ctxt,xmlEntityPtr ent)733*7c568831SAndroid Build Coastguard Worker xmlCtxtDumpEntity(xmlDebugCtxtPtr ctxt, xmlEntityPtr ent)
734*7c568831SAndroid Build Coastguard Worker {
735*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpSpaces(ctxt);
736*7c568831SAndroid Build Coastguard Worker 
737*7c568831SAndroid Build Coastguard Worker     if (ent == NULL) {
738*7c568831SAndroid Build Coastguard Worker         if (!ctxt->check)
739*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "Entity is NULL\n");
740*7c568831SAndroid Build Coastguard Worker         return;
741*7c568831SAndroid Build Coastguard Worker     }
742*7c568831SAndroid Build Coastguard Worker     if (!ctxt->check) {
743*7c568831SAndroid Build Coastguard Worker         switch (ent->etype) {
744*7c568831SAndroid Build Coastguard Worker             case XML_INTERNAL_GENERAL_ENTITY:
745*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "INTERNAL_GENERAL_ENTITY ");
746*7c568831SAndroid Build Coastguard Worker                 break;
747*7c568831SAndroid Build Coastguard Worker             case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
748*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "EXTERNAL_GENERAL_PARSED_ENTITY ");
749*7c568831SAndroid Build Coastguard Worker                 break;
750*7c568831SAndroid Build Coastguard Worker             case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
751*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "EXTERNAL_GENERAL_UNPARSED_ENTITY ");
752*7c568831SAndroid Build Coastguard Worker                 break;
753*7c568831SAndroid Build Coastguard Worker             case XML_INTERNAL_PARAMETER_ENTITY:
754*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "INTERNAL_PARAMETER_ENTITY ");
755*7c568831SAndroid Build Coastguard Worker                 break;
756*7c568831SAndroid Build Coastguard Worker             case XML_EXTERNAL_PARAMETER_ENTITY:
757*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "EXTERNAL_PARAMETER_ENTITY ");
758*7c568831SAndroid Build Coastguard Worker                 break;
759*7c568831SAndroid Build Coastguard Worker             default:
760*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "ENTITY_%d ! ", (int) ent->etype);
761*7c568831SAndroid Build Coastguard Worker         }
762*7c568831SAndroid Build Coastguard Worker         fprintf(ctxt->output, "%s\n", ent->name);
763*7c568831SAndroid Build Coastguard Worker         if (ent->ExternalID) {
764*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpSpaces(ctxt);
765*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "ExternalID=%s\n",
766*7c568831SAndroid Build Coastguard Worker                     (char *) ent->ExternalID);
767*7c568831SAndroid Build Coastguard Worker         }
768*7c568831SAndroid Build Coastguard Worker         if (ent->SystemID) {
769*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpSpaces(ctxt);
770*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "SystemID=%s\n", (char *) ent->SystemID);
771*7c568831SAndroid Build Coastguard Worker         }
772*7c568831SAndroid Build Coastguard Worker         if (ent->URI) {
773*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpSpaces(ctxt);
774*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "URI=%s\n", (char *) ent->URI);
775*7c568831SAndroid Build Coastguard Worker         }
776*7c568831SAndroid Build Coastguard Worker         if (ent->content) {
777*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpSpaces(ctxt);
778*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "content=");
779*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpString(ctxt, ent->content);
780*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "\n");
781*7c568831SAndroid Build Coastguard Worker         }
782*7c568831SAndroid Build Coastguard Worker     }
783*7c568831SAndroid Build Coastguard Worker }
784*7c568831SAndroid Build Coastguard Worker 
785*7c568831SAndroid Build Coastguard Worker /**
786*7c568831SAndroid Build Coastguard Worker  * xmlCtxtDumpAttr:
787*7c568831SAndroid Build Coastguard Worker  * @output:  the FILE * for the output
788*7c568831SAndroid Build Coastguard Worker  * @attr:  the attribute
789*7c568831SAndroid Build Coastguard Worker  * @depth:  the indentation level.
790*7c568831SAndroid Build Coastguard Worker  *
791*7c568831SAndroid Build Coastguard Worker  * Dumps debug information for the attribute
792*7c568831SAndroid Build Coastguard Worker  */
793*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtDumpAttr(xmlDebugCtxtPtr ctxt,xmlAttrPtr attr)794*7c568831SAndroid Build Coastguard Worker xmlCtxtDumpAttr(xmlDebugCtxtPtr ctxt, xmlAttrPtr attr)
795*7c568831SAndroid Build Coastguard Worker {
796*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpSpaces(ctxt);
797*7c568831SAndroid Build Coastguard Worker 
798*7c568831SAndroid Build Coastguard Worker     if (attr == NULL) {
799*7c568831SAndroid Build Coastguard Worker         if (!ctxt->check)
800*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "Attr is NULL");
801*7c568831SAndroid Build Coastguard Worker         return;
802*7c568831SAndroid Build Coastguard Worker     }
803*7c568831SAndroid Build Coastguard Worker     if (!ctxt->check) {
804*7c568831SAndroid Build Coastguard Worker         fprintf(ctxt->output, "ATTRIBUTE ");
805*7c568831SAndroid Build Coastguard Worker 	xmlCtxtDumpString(ctxt, attr->name);
806*7c568831SAndroid Build Coastguard Worker         fprintf(ctxt->output, "\n");
807*7c568831SAndroid Build Coastguard Worker         if (attr->children != NULL) {
808*7c568831SAndroid Build Coastguard Worker             ctxt->depth++;
809*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpNodeList(ctxt, attr->children);
810*7c568831SAndroid Build Coastguard Worker             ctxt->depth--;
811*7c568831SAndroid Build Coastguard Worker         }
812*7c568831SAndroid Build Coastguard Worker     }
813*7c568831SAndroid Build Coastguard Worker     if (attr->name == NULL)
814*7c568831SAndroid Build Coastguard Worker 	xmlDebugErr(ctxt, XML_CHECK_NO_NAME,
815*7c568831SAndroid Build Coastguard Worker 	            "Attribute has no name");
816*7c568831SAndroid Build Coastguard Worker 
817*7c568831SAndroid Build Coastguard Worker     /*
818*7c568831SAndroid Build Coastguard Worker      * Do a bit of checking
819*7c568831SAndroid Build Coastguard Worker      */
820*7c568831SAndroid Build Coastguard Worker     xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) attr);
821*7c568831SAndroid Build Coastguard Worker }
822*7c568831SAndroid Build Coastguard Worker 
823*7c568831SAndroid Build Coastguard Worker /**
824*7c568831SAndroid Build Coastguard Worker  * xmlCtxtDumpAttrList:
825*7c568831SAndroid Build Coastguard Worker  * @output:  the FILE * for the output
826*7c568831SAndroid Build Coastguard Worker  * @attr:  the attribute list
827*7c568831SAndroid Build Coastguard Worker  * @depth:  the indentation level.
828*7c568831SAndroid Build Coastguard Worker  *
829*7c568831SAndroid Build Coastguard Worker  * Dumps debug information for the attribute list
830*7c568831SAndroid Build Coastguard Worker  */
831*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtDumpAttrList(xmlDebugCtxtPtr ctxt,xmlAttrPtr attr)832*7c568831SAndroid Build Coastguard Worker xmlCtxtDumpAttrList(xmlDebugCtxtPtr ctxt, xmlAttrPtr attr)
833*7c568831SAndroid Build Coastguard Worker {
834*7c568831SAndroid Build Coastguard Worker     while (attr != NULL) {
835*7c568831SAndroid Build Coastguard Worker         xmlCtxtDumpAttr(ctxt, attr);
836*7c568831SAndroid Build Coastguard Worker         attr = attr->next;
837*7c568831SAndroid Build Coastguard Worker     }
838*7c568831SAndroid Build Coastguard Worker }
839*7c568831SAndroid Build Coastguard Worker 
840*7c568831SAndroid Build Coastguard Worker /**
841*7c568831SAndroid Build Coastguard Worker  * xmlCtxtDumpOneNode:
842*7c568831SAndroid Build Coastguard Worker  * @output:  the FILE * for the output
843*7c568831SAndroid Build Coastguard Worker  * @node:  the node
844*7c568831SAndroid Build Coastguard Worker  * @depth:  the indentation level.
845*7c568831SAndroid Build Coastguard Worker  *
846*7c568831SAndroid Build Coastguard Worker  * Dumps debug information for the element node, it is not recursive
847*7c568831SAndroid Build Coastguard Worker  */
848*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtDumpOneNode(xmlDebugCtxtPtr ctxt,xmlNodePtr node)849*7c568831SAndroid Build Coastguard Worker xmlCtxtDumpOneNode(xmlDebugCtxtPtr ctxt, xmlNodePtr node)
850*7c568831SAndroid Build Coastguard Worker {
851*7c568831SAndroid Build Coastguard Worker     if (node == NULL) {
852*7c568831SAndroid Build Coastguard Worker         if (!ctxt->check) {
853*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpSpaces(ctxt);
854*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "node is NULL\n");
855*7c568831SAndroid Build Coastguard Worker         }
856*7c568831SAndroid Build Coastguard Worker         return;
857*7c568831SAndroid Build Coastguard Worker     }
858*7c568831SAndroid Build Coastguard Worker     ctxt->node = node;
859*7c568831SAndroid Build Coastguard Worker 
860*7c568831SAndroid Build Coastguard Worker     switch (node->type) {
861*7c568831SAndroid Build Coastguard Worker         case XML_ELEMENT_NODE:
862*7c568831SAndroid Build Coastguard Worker             if (!ctxt->check) {
863*7c568831SAndroid Build Coastguard Worker                 xmlCtxtDumpSpaces(ctxt);
864*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "ELEMENT ");
865*7c568831SAndroid Build Coastguard Worker                 if ((node->ns != NULL) && (node->ns->prefix != NULL)) {
866*7c568831SAndroid Build Coastguard Worker                     xmlCtxtDumpString(ctxt, node->ns->prefix);
867*7c568831SAndroid Build Coastguard Worker                     fprintf(ctxt->output, ":");
868*7c568831SAndroid Build Coastguard Worker                 }
869*7c568831SAndroid Build Coastguard Worker                 xmlCtxtDumpString(ctxt, node->name);
870*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "\n");
871*7c568831SAndroid Build Coastguard Worker             }
872*7c568831SAndroid Build Coastguard Worker             break;
873*7c568831SAndroid Build Coastguard Worker         case XML_ATTRIBUTE_NODE:
874*7c568831SAndroid Build Coastguard Worker             if (!ctxt->check)
875*7c568831SAndroid Build Coastguard Worker                 xmlCtxtDumpSpaces(ctxt);
876*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "Error, ATTRIBUTE found here\n");
877*7c568831SAndroid Build Coastguard Worker             xmlCtxtGenericNodeCheck(ctxt, node);
878*7c568831SAndroid Build Coastguard Worker             return;
879*7c568831SAndroid Build Coastguard Worker         case XML_TEXT_NODE:
880*7c568831SAndroid Build Coastguard Worker             if (!ctxt->check) {
881*7c568831SAndroid Build Coastguard Worker                 xmlCtxtDumpSpaces(ctxt);
882*7c568831SAndroid Build Coastguard Worker                 if (node->name == (const xmlChar *) xmlStringTextNoenc)
883*7c568831SAndroid Build Coastguard Worker                     fprintf(ctxt->output, "TEXT no enc");
884*7c568831SAndroid Build Coastguard Worker                 else
885*7c568831SAndroid Build Coastguard Worker                     fprintf(ctxt->output, "TEXT");
886*7c568831SAndroid Build Coastguard Worker 		if (ctxt->options & DUMP_TEXT_TYPE) {
887*7c568831SAndroid Build Coastguard Worker 		    if (node->content == (xmlChar *) &(node->properties))
888*7c568831SAndroid Build Coastguard Worker 			fprintf(ctxt->output, " compact\n");
889*7c568831SAndroid Build Coastguard Worker 		    else if (xmlDictOwns(ctxt->dict, node->content) == 1)
890*7c568831SAndroid Build Coastguard Worker 			fprintf(ctxt->output, " interned\n");
891*7c568831SAndroid Build Coastguard Worker 		    else
892*7c568831SAndroid Build Coastguard Worker 			fprintf(ctxt->output, "\n");
893*7c568831SAndroid Build Coastguard Worker 		} else
894*7c568831SAndroid Build Coastguard Worker 		    fprintf(ctxt->output, "\n");
895*7c568831SAndroid Build Coastguard Worker             }
896*7c568831SAndroid Build Coastguard Worker             break;
897*7c568831SAndroid Build Coastguard Worker         case XML_CDATA_SECTION_NODE:
898*7c568831SAndroid Build Coastguard Worker             if (!ctxt->check) {
899*7c568831SAndroid Build Coastguard Worker                 xmlCtxtDumpSpaces(ctxt);
900*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "CDATA_SECTION\n");
901*7c568831SAndroid Build Coastguard Worker             }
902*7c568831SAndroid Build Coastguard Worker             break;
903*7c568831SAndroid Build Coastguard Worker         case XML_ENTITY_REF_NODE:
904*7c568831SAndroid Build Coastguard Worker             if (!ctxt->check) {
905*7c568831SAndroid Build Coastguard Worker                 xmlCtxtDumpSpaces(ctxt);
906*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "ENTITY_REF(%s)\n",
907*7c568831SAndroid Build Coastguard Worker                         (char *) node->name);
908*7c568831SAndroid Build Coastguard Worker             }
909*7c568831SAndroid Build Coastguard Worker             break;
910*7c568831SAndroid Build Coastguard Worker         case XML_ENTITY_NODE:
911*7c568831SAndroid Build Coastguard Worker             if (!ctxt->check) {
912*7c568831SAndroid Build Coastguard Worker                 xmlCtxtDumpSpaces(ctxt);
913*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "ENTITY\n");
914*7c568831SAndroid Build Coastguard Worker             }
915*7c568831SAndroid Build Coastguard Worker             break;
916*7c568831SAndroid Build Coastguard Worker         case XML_PI_NODE:
917*7c568831SAndroid Build Coastguard Worker             if (!ctxt->check) {
918*7c568831SAndroid Build Coastguard Worker                 xmlCtxtDumpSpaces(ctxt);
919*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "PI %s\n", (char *) node->name);
920*7c568831SAndroid Build Coastguard Worker             }
921*7c568831SAndroid Build Coastguard Worker             break;
922*7c568831SAndroid Build Coastguard Worker         case XML_COMMENT_NODE:
923*7c568831SAndroid Build Coastguard Worker             if (!ctxt->check) {
924*7c568831SAndroid Build Coastguard Worker                 xmlCtxtDumpSpaces(ctxt);
925*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "COMMENT\n");
926*7c568831SAndroid Build Coastguard Worker             }
927*7c568831SAndroid Build Coastguard Worker             break;
928*7c568831SAndroid Build Coastguard Worker         case XML_DOCUMENT_NODE:
929*7c568831SAndroid Build Coastguard Worker         case XML_HTML_DOCUMENT_NODE:
930*7c568831SAndroid Build Coastguard Worker             if (!ctxt->check) {
931*7c568831SAndroid Build Coastguard Worker                 xmlCtxtDumpSpaces(ctxt);
932*7c568831SAndroid Build Coastguard Worker             }
933*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "Error, DOCUMENT found here\n");
934*7c568831SAndroid Build Coastguard Worker             xmlCtxtGenericNodeCheck(ctxt, node);
935*7c568831SAndroid Build Coastguard Worker             return;
936*7c568831SAndroid Build Coastguard Worker         case XML_DOCUMENT_TYPE_NODE:
937*7c568831SAndroid Build Coastguard Worker             if (!ctxt->check) {
938*7c568831SAndroid Build Coastguard Worker                 xmlCtxtDumpSpaces(ctxt);
939*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "DOCUMENT_TYPE\n");
940*7c568831SAndroid Build Coastguard Worker             }
941*7c568831SAndroid Build Coastguard Worker             break;
942*7c568831SAndroid Build Coastguard Worker         case XML_DOCUMENT_FRAG_NODE:
943*7c568831SAndroid Build Coastguard Worker             if (!ctxt->check) {
944*7c568831SAndroid Build Coastguard Worker                 xmlCtxtDumpSpaces(ctxt);
945*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "DOCUMENT_FRAG\n");
946*7c568831SAndroid Build Coastguard Worker             }
947*7c568831SAndroid Build Coastguard Worker             break;
948*7c568831SAndroid Build Coastguard Worker         case XML_NOTATION_NODE:
949*7c568831SAndroid Build Coastguard Worker             if (!ctxt->check) {
950*7c568831SAndroid Build Coastguard Worker                 xmlCtxtDumpSpaces(ctxt);
951*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "NOTATION\n");
952*7c568831SAndroid Build Coastguard Worker             }
953*7c568831SAndroid Build Coastguard Worker             break;
954*7c568831SAndroid Build Coastguard Worker         case XML_DTD_NODE:
955*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpDtdNode(ctxt, (xmlDtdPtr) node);
956*7c568831SAndroid Build Coastguard Worker             return;
957*7c568831SAndroid Build Coastguard Worker         case XML_ELEMENT_DECL:
958*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpElemDecl(ctxt, (xmlElementPtr) node);
959*7c568831SAndroid Build Coastguard Worker             return;
960*7c568831SAndroid Build Coastguard Worker         case XML_ATTRIBUTE_DECL:
961*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpAttrDecl(ctxt, (xmlAttributePtr) node);
962*7c568831SAndroid Build Coastguard Worker             return;
963*7c568831SAndroid Build Coastguard Worker         case XML_ENTITY_DECL:
964*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpEntityDecl(ctxt, (xmlEntityPtr) node);
965*7c568831SAndroid Build Coastguard Worker             return;
966*7c568831SAndroid Build Coastguard Worker         case XML_NAMESPACE_DECL:
967*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpNamespace(ctxt, (xmlNsPtr) node);
968*7c568831SAndroid Build Coastguard Worker             return;
969*7c568831SAndroid Build Coastguard Worker         case XML_XINCLUDE_START:
970*7c568831SAndroid Build Coastguard Worker             if (!ctxt->check) {
971*7c568831SAndroid Build Coastguard Worker                 xmlCtxtDumpSpaces(ctxt);
972*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "INCLUDE START\n");
973*7c568831SAndroid Build Coastguard Worker             }
974*7c568831SAndroid Build Coastguard Worker             return;
975*7c568831SAndroid Build Coastguard Worker         case XML_XINCLUDE_END:
976*7c568831SAndroid Build Coastguard Worker             if (!ctxt->check) {
977*7c568831SAndroid Build Coastguard Worker                 xmlCtxtDumpSpaces(ctxt);
978*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "INCLUDE END\n");
979*7c568831SAndroid Build Coastguard Worker             }
980*7c568831SAndroid Build Coastguard Worker             return;
981*7c568831SAndroid Build Coastguard Worker         default:
982*7c568831SAndroid Build Coastguard Worker             if (!ctxt->check)
983*7c568831SAndroid Build Coastguard Worker                 xmlCtxtDumpSpaces(ctxt);
984*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr2(ctxt, XML_CHECK_UNKNOWN_NODE,
985*7c568831SAndroid Build Coastguard Worker 	                "Unknown node type %d\n", node->type);
986*7c568831SAndroid Build Coastguard Worker             return;
987*7c568831SAndroid Build Coastguard Worker     }
988*7c568831SAndroid Build Coastguard Worker     if (node->doc == NULL) {
989*7c568831SAndroid Build Coastguard Worker         if (!ctxt->check) {
990*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpSpaces(ctxt);
991*7c568831SAndroid Build Coastguard Worker         }
992*7c568831SAndroid Build Coastguard Worker         fprintf(ctxt->output, "PBM: doc == NULL !!!\n");
993*7c568831SAndroid Build Coastguard Worker     }
994*7c568831SAndroid Build Coastguard Worker     ctxt->depth++;
995*7c568831SAndroid Build Coastguard Worker     if ((node->type == XML_ELEMENT_NODE) && (node->nsDef != NULL))
996*7c568831SAndroid Build Coastguard Worker         xmlCtxtDumpNamespaceList(ctxt, node->nsDef);
997*7c568831SAndroid Build Coastguard Worker     if ((node->type == XML_ELEMENT_NODE) && (node->properties != NULL))
998*7c568831SAndroid Build Coastguard Worker         xmlCtxtDumpAttrList(ctxt, node->properties);
999*7c568831SAndroid Build Coastguard Worker     if (node->type != XML_ENTITY_REF_NODE) {
1000*7c568831SAndroid Build Coastguard Worker         if ((node->type != XML_ELEMENT_NODE) && (node->content != NULL)) {
1001*7c568831SAndroid Build Coastguard Worker             if (!ctxt->check) {
1002*7c568831SAndroid Build Coastguard Worker                 xmlCtxtDumpSpaces(ctxt);
1003*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "content=");
1004*7c568831SAndroid Build Coastguard Worker                 xmlCtxtDumpString(ctxt, node->content);
1005*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "\n");
1006*7c568831SAndroid Build Coastguard Worker             }
1007*7c568831SAndroid Build Coastguard Worker         }
1008*7c568831SAndroid Build Coastguard Worker     } else {
1009*7c568831SAndroid Build Coastguard Worker         xmlEntityPtr ent;
1010*7c568831SAndroid Build Coastguard Worker 
1011*7c568831SAndroid Build Coastguard Worker         ent = xmlGetDocEntity(node->doc, node->name);
1012*7c568831SAndroid Build Coastguard Worker         if (ent != NULL)
1013*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpEntity(ctxt, ent);
1014*7c568831SAndroid Build Coastguard Worker     }
1015*7c568831SAndroid Build Coastguard Worker     ctxt->depth--;
1016*7c568831SAndroid Build Coastguard Worker 
1017*7c568831SAndroid Build Coastguard Worker     /*
1018*7c568831SAndroid Build Coastguard Worker      * Do a bit of checking
1019*7c568831SAndroid Build Coastguard Worker      */
1020*7c568831SAndroid Build Coastguard Worker     xmlCtxtGenericNodeCheck(ctxt, node);
1021*7c568831SAndroid Build Coastguard Worker }
1022*7c568831SAndroid Build Coastguard Worker 
1023*7c568831SAndroid Build Coastguard Worker /**
1024*7c568831SAndroid Build Coastguard Worker  * xmlCtxtDumpNode:
1025*7c568831SAndroid Build Coastguard Worker  * @output:  the FILE * for the output
1026*7c568831SAndroid Build Coastguard Worker  * @node:  the node
1027*7c568831SAndroid Build Coastguard Worker  * @depth:  the indentation level.
1028*7c568831SAndroid Build Coastguard Worker  *
1029*7c568831SAndroid Build Coastguard Worker  * Dumps debug information for the element node, it is recursive
1030*7c568831SAndroid Build Coastguard Worker  */
1031*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtDumpNode(xmlDebugCtxtPtr ctxt,xmlNodePtr node)1032*7c568831SAndroid Build Coastguard Worker xmlCtxtDumpNode(xmlDebugCtxtPtr ctxt, xmlNodePtr node)
1033*7c568831SAndroid Build Coastguard Worker {
1034*7c568831SAndroid Build Coastguard Worker     if (node == NULL) {
1035*7c568831SAndroid Build Coastguard Worker         if (!ctxt->check) {
1036*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpSpaces(ctxt);
1037*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "node is NULL\n");
1038*7c568831SAndroid Build Coastguard Worker         }
1039*7c568831SAndroid Build Coastguard Worker         return;
1040*7c568831SAndroid Build Coastguard Worker     }
1041*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpOneNode(ctxt, node);
1042*7c568831SAndroid Build Coastguard Worker     if ((node->type != XML_NAMESPACE_DECL) &&
1043*7c568831SAndroid Build Coastguard Worker         (node->children != NULL) && (node->type != XML_ENTITY_REF_NODE)) {
1044*7c568831SAndroid Build Coastguard Worker         ctxt->depth++;
1045*7c568831SAndroid Build Coastguard Worker         xmlCtxtDumpNodeList(ctxt, node->children);
1046*7c568831SAndroid Build Coastguard Worker         ctxt->depth--;
1047*7c568831SAndroid Build Coastguard Worker     }
1048*7c568831SAndroid Build Coastguard Worker }
1049*7c568831SAndroid Build Coastguard Worker 
1050*7c568831SAndroid Build Coastguard Worker /**
1051*7c568831SAndroid Build Coastguard Worker  * xmlCtxtDumpNodeList:
1052*7c568831SAndroid Build Coastguard Worker  * @output:  the FILE * for the output
1053*7c568831SAndroid Build Coastguard Worker  * @node:  the node list
1054*7c568831SAndroid Build Coastguard Worker  * @depth:  the indentation level.
1055*7c568831SAndroid Build Coastguard Worker  *
1056*7c568831SAndroid Build Coastguard Worker  * Dumps debug information for the list of element node, it is recursive
1057*7c568831SAndroid Build Coastguard Worker  */
1058*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtDumpNodeList(xmlDebugCtxtPtr ctxt,xmlNodePtr node)1059*7c568831SAndroid Build Coastguard Worker xmlCtxtDumpNodeList(xmlDebugCtxtPtr ctxt, xmlNodePtr node)
1060*7c568831SAndroid Build Coastguard Worker {
1061*7c568831SAndroid Build Coastguard Worker     while (node != NULL) {
1062*7c568831SAndroid Build Coastguard Worker         xmlCtxtDumpNode(ctxt, node);
1063*7c568831SAndroid Build Coastguard Worker         node = node->next;
1064*7c568831SAndroid Build Coastguard Worker     }
1065*7c568831SAndroid Build Coastguard Worker }
1066*7c568831SAndroid Build Coastguard Worker 
1067*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtDumpDocHead(xmlDebugCtxtPtr ctxt,xmlDocPtr doc)1068*7c568831SAndroid Build Coastguard Worker xmlCtxtDumpDocHead(xmlDebugCtxtPtr ctxt, xmlDocPtr doc)
1069*7c568831SAndroid Build Coastguard Worker {
1070*7c568831SAndroid Build Coastguard Worker     if (doc == NULL) {
1071*7c568831SAndroid Build Coastguard Worker         if (!ctxt->check)
1072*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "DOCUMENT == NULL !\n");
1073*7c568831SAndroid Build Coastguard Worker         return;
1074*7c568831SAndroid Build Coastguard Worker     }
1075*7c568831SAndroid Build Coastguard Worker     ctxt->node = (xmlNodePtr) doc;
1076*7c568831SAndroid Build Coastguard Worker 
1077*7c568831SAndroid Build Coastguard Worker     switch (doc->type) {
1078*7c568831SAndroid Build Coastguard Worker         case XML_ELEMENT_NODE:
1079*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr(ctxt, XML_CHECK_FOUND_ELEMENT,
1080*7c568831SAndroid Build Coastguard Worker 	                "Misplaced ELEMENT node\n");
1081*7c568831SAndroid Build Coastguard Worker             break;
1082*7c568831SAndroid Build Coastguard Worker         case XML_ATTRIBUTE_NODE:
1083*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr(ctxt, XML_CHECK_FOUND_ATTRIBUTE,
1084*7c568831SAndroid Build Coastguard Worker 	                "Misplaced ATTRIBUTE node\n");
1085*7c568831SAndroid Build Coastguard Worker             break;
1086*7c568831SAndroid Build Coastguard Worker         case XML_TEXT_NODE:
1087*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr(ctxt, XML_CHECK_FOUND_TEXT,
1088*7c568831SAndroid Build Coastguard Worker 	                "Misplaced TEXT node\n");
1089*7c568831SAndroid Build Coastguard Worker             break;
1090*7c568831SAndroid Build Coastguard Worker         case XML_CDATA_SECTION_NODE:
1091*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr(ctxt, XML_CHECK_FOUND_CDATA,
1092*7c568831SAndroid Build Coastguard Worker 	                "Misplaced CDATA node\n");
1093*7c568831SAndroid Build Coastguard Worker             break;
1094*7c568831SAndroid Build Coastguard Worker         case XML_ENTITY_REF_NODE:
1095*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr(ctxt, XML_CHECK_FOUND_ENTITYREF,
1096*7c568831SAndroid Build Coastguard Worker 	                "Misplaced ENTITYREF node\n");
1097*7c568831SAndroid Build Coastguard Worker             break;
1098*7c568831SAndroid Build Coastguard Worker         case XML_ENTITY_NODE:
1099*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr(ctxt, XML_CHECK_FOUND_ENTITY,
1100*7c568831SAndroid Build Coastguard Worker 	                "Misplaced ENTITY node\n");
1101*7c568831SAndroid Build Coastguard Worker             break;
1102*7c568831SAndroid Build Coastguard Worker         case XML_PI_NODE:
1103*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr(ctxt, XML_CHECK_FOUND_PI,
1104*7c568831SAndroid Build Coastguard Worker 	                "Misplaced PI node\n");
1105*7c568831SAndroid Build Coastguard Worker             break;
1106*7c568831SAndroid Build Coastguard Worker         case XML_COMMENT_NODE:
1107*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr(ctxt, XML_CHECK_FOUND_COMMENT,
1108*7c568831SAndroid Build Coastguard Worker 	                "Misplaced COMMENT node\n");
1109*7c568831SAndroid Build Coastguard Worker             break;
1110*7c568831SAndroid Build Coastguard Worker         case XML_DOCUMENT_NODE:
1111*7c568831SAndroid Build Coastguard Worker 	    if (!ctxt->check)
1112*7c568831SAndroid Build Coastguard Worker 		fprintf(ctxt->output, "DOCUMENT\n");
1113*7c568831SAndroid Build Coastguard Worker             break;
1114*7c568831SAndroid Build Coastguard Worker         case XML_HTML_DOCUMENT_NODE:
1115*7c568831SAndroid Build Coastguard Worker 	    if (!ctxt->check)
1116*7c568831SAndroid Build Coastguard Worker 		fprintf(ctxt->output, "HTML DOCUMENT\n");
1117*7c568831SAndroid Build Coastguard Worker             break;
1118*7c568831SAndroid Build Coastguard Worker         case XML_DOCUMENT_TYPE_NODE:
1119*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr(ctxt, XML_CHECK_FOUND_DOCTYPE,
1120*7c568831SAndroid Build Coastguard Worker 	                "Misplaced DOCTYPE node\n");
1121*7c568831SAndroid Build Coastguard Worker             break;
1122*7c568831SAndroid Build Coastguard Worker         case XML_DOCUMENT_FRAG_NODE:
1123*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr(ctxt, XML_CHECK_FOUND_FRAGMENT,
1124*7c568831SAndroid Build Coastguard Worker 	                "Misplaced FRAGMENT node\n");
1125*7c568831SAndroid Build Coastguard Worker             break;
1126*7c568831SAndroid Build Coastguard Worker         case XML_NOTATION_NODE:
1127*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr(ctxt, XML_CHECK_FOUND_NOTATION,
1128*7c568831SAndroid Build Coastguard Worker 	                "Misplaced NOTATION node\n");
1129*7c568831SAndroid Build Coastguard Worker             break;
1130*7c568831SAndroid Build Coastguard Worker         default:
1131*7c568831SAndroid Build Coastguard Worker 	    xmlDebugErr2(ctxt, XML_CHECK_UNKNOWN_NODE,
1132*7c568831SAndroid Build Coastguard Worker 	                "Unknown node type %d\n", doc->type);
1133*7c568831SAndroid Build Coastguard Worker     }
1134*7c568831SAndroid Build Coastguard Worker }
1135*7c568831SAndroid Build Coastguard Worker 
1136*7c568831SAndroid Build Coastguard Worker /**
1137*7c568831SAndroid Build Coastguard Worker  * xmlCtxtDumpDocumentHead:
1138*7c568831SAndroid Build Coastguard Worker  * @output:  the FILE * for the output
1139*7c568831SAndroid Build Coastguard Worker  * @doc:  the document
1140*7c568831SAndroid Build Coastguard Worker  *
1141*7c568831SAndroid Build Coastguard Worker  * Dumps debug information concerning the document, not recursive
1142*7c568831SAndroid Build Coastguard Worker  */
1143*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtDumpDocumentHead(xmlDebugCtxtPtr ctxt,xmlDocPtr doc)1144*7c568831SAndroid Build Coastguard Worker xmlCtxtDumpDocumentHead(xmlDebugCtxtPtr ctxt, xmlDocPtr doc)
1145*7c568831SAndroid Build Coastguard Worker {
1146*7c568831SAndroid Build Coastguard Worker     if (doc == NULL) return;
1147*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpDocHead(ctxt, doc);
1148*7c568831SAndroid Build Coastguard Worker     if (!ctxt->check) {
1149*7c568831SAndroid Build Coastguard Worker         if (doc->name != NULL) {
1150*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "name=");
1151*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpString(ctxt, BAD_CAST doc->name);
1152*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "\n");
1153*7c568831SAndroid Build Coastguard Worker         }
1154*7c568831SAndroid Build Coastguard Worker         if (doc->version != NULL) {
1155*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "version=");
1156*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpString(ctxt, doc->version);
1157*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "\n");
1158*7c568831SAndroid Build Coastguard Worker         }
1159*7c568831SAndroid Build Coastguard Worker         if (doc->encoding != NULL) {
1160*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "encoding=");
1161*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpString(ctxt, doc->encoding);
1162*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "\n");
1163*7c568831SAndroid Build Coastguard Worker         }
1164*7c568831SAndroid Build Coastguard Worker         if (doc->URL != NULL) {
1165*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "URL=");
1166*7c568831SAndroid Build Coastguard Worker             xmlCtxtDumpString(ctxt, doc->URL);
1167*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "\n");
1168*7c568831SAndroid Build Coastguard Worker         }
1169*7c568831SAndroid Build Coastguard Worker         if (doc->standalone)
1170*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "standalone=true\n");
1171*7c568831SAndroid Build Coastguard Worker     }
1172*7c568831SAndroid Build Coastguard Worker     if (doc->oldNs != NULL)
1173*7c568831SAndroid Build Coastguard Worker         xmlCtxtDumpNamespaceList(ctxt, doc->oldNs);
1174*7c568831SAndroid Build Coastguard Worker }
1175*7c568831SAndroid Build Coastguard Worker 
1176*7c568831SAndroid Build Coastguard Worker /**
1177*7c568831SAndroid Build Coastguard Worker  * xmlCtxtDumpDocument:
1178*7c568831SAndroid Build Coastguard Worker  * @output:  the FILE * for the output
1179*7c568831SAndroid Build Coastguard Worker  * @doc:  the document
1180*7c568831SAndroid Build Coastguard Worker  *
1181*7c568831SAndroid Build Coastguard Worker  * Dumps debug information for the document, it's recursive
1182*7c568831SAndroid Build Coastguard Worker  */
1183*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtDumpDocument(xmlDebugCtxtPtr ctxt,xmlDocPtr doc)1184*7c568831SAndroid Build Coastguard Worker xmlCtxtDumpDocument(xmlDebugCtxtPtr ctxt, xmlDocPtr doc)
1185*7c568831SAndroid Build Coastguard Worker {
1186*7c568831SAndroid Build Coastguard Worker     if (doc == NULL) {
1187*7c568831SAndroid Build Coastguard Worker         if (!ctxt->check)
1188*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "DOCUMENT == NULL !\n");
1189*7c568831SAndroid Build Coastguard Worker         return;
1190*7c568831SAndroid Build Coastguard Worker     }
1191*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpDocumentHead(ctxt, doc);
1192*7c568831SAndroid Build Coastguard Worker     if (((doc->type == XML_DOCUMENT_NODE) ||
1193*7c568831SAndroid Build Coastguard Worker          (doc->type == XML_HTML_DOCUMENT_NODE))
1194*7c568831SAndroid Build Coastguard Worker         && (doc->children != NULL)) {
1195*7c568831SAndroid Build Coastguard Worker         ctxt->depth++;
1196*7c568831SAndroid Build Coastguard Worker         xmlCtxtDumpNodeList(ctxt, doc->children);
1197*7c568831SAndroid Build Coastguard Worker         ctxt->depth--;
1198*7c568831SAndroid Build Coastguard Worker     }
1199*7c568831SAndroid Build Coastguard Worker }
1200*7c568831SAndroid Build Coastguard Worker 
1201*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtDumpEntityCallback(void * payload,void * data,const xmlChar * name ATTRIBUTE_UNUSED)1202*7c568831SAndroid Build Coastguard Worker xmlCtxtDumpEntityCallback(void *payload, void *data,
1203*7c568831SAndroid Build Coastguard Worker                           const xmlChar *name ATTRIBUTE_UNUSED)
1204*7c568831SAndroid Build Coastguard Worker {
1205*7c568831SAndroid Build Coastguard Worker     xmlEntityPtr cur = (xmlEntityPtr) payload;
1206*7c568831SAndroid Build Coastguard Worker     xmlDebugCtxtPtr ctxt = (xmlDebugCtxtPtr) data;
1207*7c568831SAndroid Build Coastguard Worker     if (cur == NULL) {
1208*7c568831SAndroid Build Coastguard Worker         if (!ctxt->check)
1209*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "Entity is NULL");
1210*7c568831SAndroid Build Coastguard Worker         return;
1211*7c568831SAndroid Build Coastguard Worker     }
1212*7c568831SAndroid Build Coastguard Worker     if (!ctxt->check) {
1213*7c568831SAndroid Build Coastguard Worker         fprintf(ctxt->output, "%s : ", (char *) cur->name);
1214*7c568831SAndroid Build Coastguard Worker         switch (cur->etype) {
1215*7c568831SAndroid Build Coastguard Worker             case XML_INTERNAL_GENERAL_ENTITY:
1216*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "INTERNAL GENERAL, ");
1217*7c568831SAndroid Build Coastguard Worker                 break;
1218*7c568831SAndroid Build Coastguard Worker             case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
1219*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "EXTERNAL PARSED, ");
1220*7c568831SAndroid Build Coastguard Worker                 break;
1221*7c568831SAndroid Build Coastguard Worker             case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
1222*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "EXTERNAL UNPARSED, ");
1223*7c568831SAndroid Build Coastguard Worker                 break;
1224*7c568831SAndroid Build Coastguard Worker             case XML_INTERNAL_PARAMETER_ENTITY:
1225*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "INTERNAL PARAMETER, ");
1226*7c568831SAndroid Build Coastguard Worker                 break;
1227*7c568831SAndroid Build Coastguard Worker             case XML_EXTERNAL_PARAMETER_ENTITY:
1228*7c568831SAndroid Build Coastguard Worker                 fprintf(ctxt->output, "EXTERNAL PARAMETER, ");
1229*7c568831SAndroid Build Coastguard Worker                 break;
1230*7c568831SAndroid Build Coastguard Worker             default:
1231*7c568831SAndroid Build Coastguard Worker 		xmlDebugErr2(ctxt, XML_CHECK_ENTITY_TYPE,
1232*7c568831SAndroid Build Coastguard Worker 			     "Unknown entity type %d\n", cur->etype);
1233*7c568831SAndroid Build Coastguard Worker         }
1234*7c568831SAndroid Build Coastguard Worker         if (cur->ExternalID != NULL)
1235*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "ID \"%s\"", (char *) cur->ExternalID);
1236*7c568831SAndroid Build Coastguard Worker         if (cur->SystemID != NULL)
1237*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "SYSTEM \"%s\"", (char *) cur->SystemID);
1238*7c568831SAndroid Build Coastguard Worker         if (cur->orig != NULL)
1239*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "\n orig \"%s\"", (char *) cur->orig);
1240*7c568831SAndroid Build Coastguard Worker         if ((cur->type != XML_ELEMENT_NODE) && (cur->content != NULL))
1241*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "\n content \"%s\"",
1242*7c568831SAndroid Build Coastguard Worker                     (char *) cur->content);
1243*7c568831SAndroid Build Coastguard Worker         fprintf(ctxt->output, "\n");
1244*7c568831SAndroid Build Coastguard Worker     }
1245*7c568831SAndroid Build Coastguard Worker }
1246*7c568831SAndroid Build Coastguard Worker 
1247*7c568831SAndroid Build Coastguard Worker /**
1248*7c568831SAndroid Build Coastguard Worker  * xmlCtxtDumpEntities:
1249*7c568831SAndroid Build Coastguard Worker  * @output:  the FILE * for the output
1250*7c568831SAndroid Build Coastguard Worker  * @doc:  the document
1251*7c568831SAndroid Build Coastguard Worker  *
1252*7c568831SAndroid Build Coastguard Worker  * Dumps debug information for all the entities in use by the document
1253*7c568831SAndroid Build Coastguard Worker  */
1254*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtDumpEntities(xmlDebugCtxtPtr ctxt,xmlDocPtr doc)1255*7c568831SAndroid Build Coastguard Worker xmlCtxtDumpEntities(xmlDebugCtxtPtr ctxt, xmlDocPtr doc)
1256*7c568831SAndroid Build Coastguard Worker {
1257*7c568831SAndroid Build Coastguard Worker     if (doc == NULL) return;
1258*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpDocHead(ctxt, doc);
1259*7c568831SAndroid Build Coastguard Worker     if ((doc->intSubset != NULL) && (doc->intSubset->entities != NULL)) {
1260*7c568831SAndroid Build Coastguard Worker         xmlEntitiesTablePtr table = (xmlEntitiesTablePtr)
1261*7c568831SAndroid Build Coastguard Worker             doc->intSubset->entities;
1262*7c568831SAndroid Build Coastguard Worker 
1263*7c568831SAndroid Build Coastguard Worker         if (!ctxt->check)
1264*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "Entities in internal subset\n");
1265*7c568831SAndroid Build Coastguard Worker         xmlHashScan(table, xmlCtxtDumpEntityCallback, ctxt);
1266*7c568831SAndroid Build Coastguard Worker     } else
1267*7c568831SAndroid Build Coastguard Worker         fprintf(ctxt->output, "No entities in internal subset\n");
1268*7c568831SAndroid Build Coastguard Worker     if ((doc->extSubset != NULL) && (doc->extSubset->entities != NULL)) {
1269*7c568831SAndroid Build Coastguard Worker         xmlEntitiesTablePtr table = (xmlEntitiesTablePtr)
1270*7c568831SAndroid Build Coastguard Worker             doc->extSubset->entities;
1271*7c568831SAndroid Build Coastguard Worker 
1272*7c568831SAndroid Build Coastguard Worker         if (!ctxt->check)
1273*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "Entities in external subset\n");
1274*7c568831SAndroid Build Coastguard Worker         xmlHashScan(table, xmlCtxtDumpEntityCallback, ctxt);
1275*7c568831SAndroid Build Coastguard Worker     } else if (!ctxt->check)
1276*7c568831SAndroid Build Coastguard Worker         fprintf(ctxt->output, "No entities in external subset\n");
1277*7c568831SAndroid Build Coastguard Worker }
1278*7c568831SAndroid Build Coastguard Worker 
1279*7c568831SAndroid Build Coastguard Worker /**
1280*7c568831SAndroid Build Coastguard Worker  * xmlCtxtDumpDTD:
1281*7c568831SAndroid Build Coastguard Worker  * @output:  the FILE * for the output
1282*7c568831SAndroid Build Coastguard Worker  * @dtd:  the DTD
1283*7c568831SAndroid Build Coastguard Worker  *
1284*7c568831SAndroid Build Coastguard Worker  * Dumps debug information for the DTD
1285*7c568831SAndroid Build Coastguard Worker  */
1286*7c568831SAndroid Build Coastguard Worker static void
xmlCtxtDumpDTD(xmlDebugCtxtPtr ctxt,xmlDtdPtr dtd)1287*7c568831SAndroid Build Coastguard Worker xmlCtxtDumpDTD(xmlDebugCtxtPtr ctxt, xmlDtdPtr dtd)
1288*7c568831SAndroid Build Coastguard Worker {
1289*7c568831SAndroid Build Coastguard Worker     if (dtd == NULL) {
1290*7c568831SAndroid Build Coastguard Worker         if (!ctxt->check)
1291*7c568831SAndroid Build Coastguard Worker             fprintf(ctxt->output, "DTD is NULL\n");
1292*7c568831SAndroid Build Coastguard Worker         return;
1293*7c568831SAndroid Build Coastguard Worker     }
1294*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpDtdNode(ctxt, dtd);
1295*7c568831SAndroid Build Coastguard Worker     if (dtd->children == NULL)
1296*7c568831SAndroid Build Coastguard Worker         fprintf(ctxt->output, "    DTD is empty\n");
1297*7c568831SAndroid Build Coastguard Worker     else {
1298*7c568831SAndroid Build Coastguard Worker         ctxt->depth++;
1299*7c568831SAndroid Build Coastguard Worker         xmlCtxtDumpNodeList(ctxt, dtd->children);
1300*7c568831SAndroid Build Coastguard Worker         ctxt->depth--;
1301*7c568831SAndroid Build Coastguard Worker     }
1302*7c568831SAndroid Build Coastguard Worker }
1303*7c568831SAndroid Build Coastguard Worker 
1304*7c568831SAndroid Build Coastguard Worker /************************************************************************
1305*7c568831SAndroid Build Coastguard Worker  *									*
1306*7c568831SAndroid Build Coastguard Worker  *			Public entry points for dump			*
1307*7c568831SAndroid Build Coastguard Worker  *									*
1308*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
1309*7c568831SAndroid Build Coastguard Worker 
1310*7c568831SAndroid Build Coastguard Worker /**
1311*7c568831SAndroid Build Coastguard Worker  * xmlDebugDumpString:
1312*7c568831SAndroid Build Coastguard Worker  * @output:  the FILE * for the output
1313*7c568831SAndroid Build Coastguard Worker  * @str:  the string
1314*7c568831SAndroid Build Coastguard Worker  *
1315*7c568831SAndroid Build Coastguard Worker  * Dumps information about the string, shorten it if necessary
1316*7c568831SAndroid Build Coastguard Worker  */
1317*7c568831SAndroid Build Coastguard Worker void
xmlDebugDumpString(FILE * output,const xmlChar * str)1318*7c568831SAndroid Build Coastguard Worker xmlDebugDumpString(FILE * output, const xmlChar * str)
1319*7c568831SAndroid Build Coastguard Worker {
1320*7c568831SAndroid Build Coastguard Worker     int i;
1321*7c568831SAndroid Build Coastguard Worker 
1322*7c568831SAndroid Build Coastguard Worker     if (output == NULL)
1323*7c568831SAndroid Build Coastguard Worker 	output = stdout;
1324*7c568831SAndroid Build Coastguard Worker     if (str == NULL) {
1325*7c568831SAndroid Build Coastguard Worker         fprintf(output, "(NULL)");
1326*7c568831SAndroid Build Coastguard Worker         return;
1327*7c568831SAndroid Build Coastguard Worker     }
1328*7c568831SAndroid Build Coastguard Worker     for (i = 0; i < 40; i++)
1329*7c568831SAndroid Build Coastguard Worker         if (str[i] == 0)
1330*7c568831SAndroid Build Coastguard Worker             return;
1331*7c568831SAndroid Build Coastguard Worker         else if (IS_BLANK_CH(str[i]))
1332*7c568831SAndroid Build Coastguard Worker             fputc(' ', output);
1333*7c568831SAndroid Build Coastguard Worker         else if (str[i] >= 0x80)
1334*7c568831SAndroid Build Coastguard Worker             fprintf(output, "#%X", str[i]);
1335*7c568831SAndroid Build Coastguard Worker         else
1336*7c568831SAndroid Build Coastguard Worker             fputc(str[i], output);
1337*7c568831SAndroid Build Coastguard Worker     fprintf(output, "...");
1338*7c568831SAndroid Build Coastguard Worker }
1339*7c568831SAndroid Build Coastguard Worker 
1340*7c568831SAndroid Build Coastguard Worker /**
1341*7c568831SAndroid Build Coastguard Worker  * xmlDebugDumpAttr:
1342*7c568831SAndroid Build Coastguard Worker  * @output:  the FILE * for the output
1343*7c568831SAndroid Build Coastguard Worker  * @attr:  the attribute
1344*7c568831SAndroid Build Coastguard Worker  * @depth:  the indentation level.
1345*7c568831SAndroid Build Coastguard Worker  *
1346*7c568831SAndroid Build Coastguard Worker  * Dumps debug information for the attribute
1347*7c568831SAndroid Build Coastguard Worker  */
1348*7c568831SAndroid Build Coastguard Worker void
xmlDebugDumpAttr(FILE * output,xmlAttrPtr attr,int depth)1349*7c568831SAndroid Build Coastguard Worker xmlDebugDumpAttr(FILE *output, xmlAttrPtr attr, int depth) {
1350*7c568831SAndroid Build Coastguard Worker     xmlDebugCtxt ctxt;
1351*7c568831SAndroid Build Coastguard Worker 
1352*7c568831SAndroid Build Coastguard Worker     if (output == NULL) return;
1353*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpInitCtxt(&ctxt);
1354*7c568831SAndroid Build Coastguard Worker     ctxt.output = output;
1355*7c568831SAndroid Build Coastguard Worker     ctxt.depth = depth;
1356*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpAttr(&ctxt, attr);
1357*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpCleanCtxt(&ctxt);
1358*7c568831SAndroid Build Coastguard Worker }
1359*7c568831SAndroid Build Coastguard Worker 
1360*7c568831SAndroid Build Coastguard Worker 
1361*7c568831SAndroid Build Coastguard Worker /**
1362*7c568831SAndroid Build Coastguard Worker  * xmlDebugDumpEntities:
1363*7c568831SAndroid Build Coastguard Worker  * @output:  the FILE * for the output
1364*7c568831SAndroid Build Coastguard Worker  * @doc:  the document
1365*7c568831SAndroid Build Coastguard Worker  *
1366*7c568831SAndroid Build Coastguard Worker  * Dumps debug information for all the entities in use by the document
1367*7c568831SAndroid Build Coastguard Worker  */
1368*7c568831SAndroid Build Coastguard Worker void
xmlDebugDumpEntities(FILE * output,xmlDocPtr doc)1369*7c568831SAndroid Build Coastguard Worker xmlDebugDumpEntities(FILE * output, xmlDocPtr doc)
1370*7c568831SAndroid Build Coastguard Worker {
1371*7c568831SAndroid Build Coastguard Worker     xmlDebugCtxt ctxt;
1372*7c568831SAndroid Build Coastguard Worker 
1373*7c568831SAndroid Build Coastguard Worker     if (output == NULL) return;
1374*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpInitCtxt(&ctxt);
1375*7c568831SAndroid Build Coastguard Worker     ctxt.output = output;
1376*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpEntities(&ctxt, doc);
1377*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpCleanCtxt(&ctxt);
1378*7c568831SAndroid Build Coastguard Worker }
1379*7c568831SAndroid Build Coastguard Worker 
1380*7c568831SAndroid Build Coastguard Worker /**
1381*7c568831SAndroid Build Coastguard Worker  * xmlDebugDumpAttrList:
1382*7c568831SAndroid Build Coastguard Worker  * @output:  the FILE * for the output
1383*7c568831SAndroid Build Coastguard Worker  * @attr:  the attribute list
1384*7c568831SAndroid Build Coastguard Worker  * @depth:  the indentation level.
1385*7c568831SAndroid Build Coastguard Worker  *
1386*7c568831SAndroid Build Coastguard Worker  * Dumps debug information for the attribute list
1387*7c568831SAndroid Build Coastguard Worker  */
1388*7c568831SAndroid Build Coastguard Worker void
xmlDebugDumpAttrList(FILE * output,xmlAttrPtr attr,int depth)1389*7c568831SAndroid Build Coastguard Worker xmlDebugDumpAttrList(FILE * output, xmlAttrPtr attr, int depth)
1390*7c568831SAndroid Build Coastguard Worker {
1391*7c568831SAndroid Build Coastguard Worker     xmlDebugCtxt ctxt;
1392*7c568831SAndroid Build Coastguard Worker 
1393*7c568831SAndroid Build Coastguard Worker     if (output == NULL) return;
1394*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpInitCtxt(&ctxt);
1395*7c568831SAndroid Build Coastguard Worker     ctxt.output = output;
1396*7c568831SAndroid Build Coastguard Worker     ctxt.depth = depth;
1397*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpAttrList(&ctxt, attr);
1398*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpCleanCtxt(&ctxt);
1399*7c568831SAndroid Build Coastguard Worker }
1400*7c568831SAndroid Build Coastguard Worker 
1401*7c568831SAndroid Build Coastguard Worker /**
1402*7c568831SAndroid Build Coastguard Worker  * xmlDebugDumpOneNode:
1403*7c568831SAndroid Build Coastguard Worker  * @output:  the FILE * for the output
1404*7c568831SAndroid Build Coastguard Worker  * @node:  the node
1405*7c568831SAndroid Build Coastguard Worker  * @depth:  the indentation level.
1406*7c568831SAndroid Build Coastguard Worker  *
1407*7c568831SAndroid Build Coastguard Worker  * Dumps debug information for the element node, it is not recursive
1408*7c568831SAndroid Build Coastguard Worker  */
1409*7c568831SAndroid Build Coastguard Worker void
xmlDebugDumpOneNode(FILE * output,xmlNodePtr node,int depth)1410*7c568831SAndroid Build Coastguard Worker xmlDebugDumpOneNode(FILE * output, xmlNodePtr node, int depth)
1411*7c568831SAndroid Build Coastguard Worker {
1412*7c568831SAndroid Build Coastguard Worker     xmlDebugCtxt ctxt;
1413*7c568831SAndroid Build Coastguard Worker 
1414*7c568831SAndroid Build Coastguard Worker     if (output == NULL) return;
1415*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpInitCtxt(&ctxt);
1416*7c568831SAndroid Build Coastguard Worker     ctxt.output = output;
1417*7c568831SAndroid Build Coastguard Worker     ctxt.depth = depth;
1418*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpOneNode(&ctxt, node);
1419*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpCleanCtxt(&ctxt);
1420*7c568831SAndroid Build Coastguard Worker }
1421*7c568831SAndroid Build Coastguard Worker 
1422*7c568831SAndroid Build Coastguard Worker /**
1423*7c568831SAndroid Build Coastguard Worker  * xmlDebugDumpNode:
1424*7c568831SAndroid Build Coastguard Worker  * @output:  the FILE * for the output
1425*7c568831SAndroid Build Coastguard Worker  * @node:  the node
1426*7c568831SAndroid Build Coastguard Worker  * @depth:  the indentation level.
1427*7c568831SAndroid Build Coastguard Worker  *
1428*7c568831SAndroid Build Coastguard Worker  * Dumps debug information for the element node, it is recursive
1429*7c568831SAndroid Build Coastguard Worker  */
1430*7c568831SAndroid Build Coastguard Worker void
xmlDebugDumpNode(FILE * output,xmlNodePtr node,int depth)1431*7c568831SAndroid Build Coastguard Worker xmlDebugDumpNode(FILE * output, xmlNodePtr node, int depth)
1432*7c568831SAndroid Build Coastguard Worker {
1433*7c568831SAndroid Build Coastguard Worker     xmlDebugCtxt ctxt;
1434*7c568831SAndroid Build Coastguard Worker 
1435*7c568831SAndroid Build Coastguard Worker     if (output == NULL)
1436*7c568831SAndroid Build Coastguard Worker 	output = stdout;
1437*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpInitCtxt(&ctxt);
1438*7c568831SAndroid Build Coastguard Worker     ctxt.output = output;
1439*7c568831SAndroid Build Coastguard Worker     ctxt.depth = depth;
1440*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpNode(&ctxt, node);
1441*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpCleanCtxt(&ctxt);
1442*7c568831SAndroid Build Coastguard Worker }
1443*7c568831SAndroid Build Coastguard Worker 
1444*7c568831SAndroid Build Coastguard Worker /**
1445*7c568831SAndroid Build Coastguard Worker  * xmlDebugDumpNodeList:
1446*7c568831SAndroid Build Coastguard Worker  * @output:  the FILE * for the output
1447*7c568831SAndroid Build Coastguard Worker  * @node:  the node list
1448*7c568831SAndroid Build Coastguard Worker  * @depth:  the indentation level.
1449*7c568831SAndroid Build Coastguard Worker  *
1450*7c568831SAndroid Build Coastguard Worker  * Dumps debug information for the list of element node, it is recursive
1451*7c568831SAndroid Build Coastguard Worker  */
1452*7c568831SAndroid Build Coastguard Worker void
xmlDebugDumpNodeList(FILE * output,xmlNodePtr node,int depth)1453*7c568831SAndroid Build Coastguard Worker xmlDebugDumpNodeList(FILE * output, xmlNodePtr node, int depth)
1454*7c568831SAndroid Build Coastguard Worker {
1455*7c568831SAndroid Build Coastguard Worker     xmlDebugCtxt ctxt;
1456*7c568831SAndroid Build Coastguard Worker 
1457*7c568831SAndroid Build Coastguard Worker     if (output == NULL)
1458*7c568831SAndroid Build Coastguard Worker 	output = stdout;
1459*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpInitCtxt(&ctxt);
1460*7c568831SAndroid Build Coastguard Worker     ctxt.output = output;
1461*7c568831SAndroid Build Coastguard Worker     ctxt.depth = depth;
1462*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpNodeList(&ctxt, node);
1463*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpCleanCtxt(&ctxt);
1464*7c568831SAndroid Build Coastguard Worker }
1465*7c568831SAndroid Build Coastguard Worker 
1466*7c568831SAndroid Build Coastguard Worker /**
1467*7c568831SAndroid Build Coastguard Worker  * xmlDebugDumpDocumentHead:
1468*7c568831SAndroid Build Coastguard Worker  * @output:  the FILE * for the output
1469*7c568831SAndroid Build Coastguard Worker  * @doc:  the document
1470*7c568831SAndroid Build Coastguard Worker  *
1471*7c568831SAndroid Build Coastguard Worker  * Dumps debug information concerning the document, not recursive
1472*7c568831SAndroid Build Coastguard Worker  */
1473*7c568831SAndroid Build Coastguard Worker void
xmlDebugDumpDocumentHead(FILE * output,xmlDocPtr doc)1474*7c568831SAndroid Build Coastguard Worker xmlDebugDumpDocumentHead(FILE * output, xmlDocPtr doc)
1475*7c568831SAndroid Build Coastguard Worker {
1476*7c568831SAndroid Build Coastguard Worker     xmlDebugCtxt ctxt;
1477*7c568831SAndroid Build Coastguard Worker 
1478*7c568831SAndroid Build Coastguard Worker     if (output == NULL)
1479*7c568831SAndroid Build Coastguard Worker 	output = stdout;
1480*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpInitCtxt(&ctxt);
1481*7c568831SAndroid Build Coastguard Worker     ctxt.options |= DUMP_TEXT_TYPE;
1482*7c568831SAndroid Build Coastguard Worker     ctxt.output = output;
1483*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpDocumentHead(&ctxt, doc);
1484*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpCleanCtxt(&ctxt);
1485*7c568831SAndroid Build Coastguard Worker }
1486*7c568831SAndroid Build Coastguard Worker 
1487*7c568831SAndroid Build Coastguard Worker /**
1488*7c568831SAndroid Build Coastguard Worker  * xmlDebugDumpDocument:
1489*7c568831SAndroid Build Coastguard Worker  * @output:  the FILE * for the output
1490*7c568831SAndroid Build Coastguard Worker  * @doc:  the document
1491*7c568831SAndroid Build Coastguard Worker  *
1492*7c568831SAndroid Build Coastguard Worker  * Dumps debug information for the document, it's recursive
1493*7c568831SAndroid Build Coastguard Worker  */
1494*7c568831SAndroid Build Coastguard Worker void
xmlDebugDumpDocument(FILE * output,xmlDocPtr doc)1495*7c568831SAndroid Build Coastguard Worker xmlDebugDumpDocument(FILE * output, xmlDocPtr doc)
1496*7c568831SAndroid Build Coastguard Worker {
1497*7c568831SAndroid Build Coastguard Worker     xmlDebugCtxt ctxt;
1498*7c568831SAndroid Build Coastguard Worker 
1499*7c568831SAndroid Build Coastguard Worker     if (output == NULL)
1500*7c568831SAndroid Build Coastguard Worker 	output = stdout;
1501*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpInitCtxt(&ctxt);
1502*7c568831SAndroid Build Coastguard Worker     ctxt.options |= DUMP_TEXT_TYPE;
1503*7c568831SAndroid Build Coastguard Worker     ctxt.output = output;
1504*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpDocument(&ctxt, doc);
1505*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpCleanCtxt(&ctxt);
1506*7c568831SAndroid Build Coastguard Worker }
1507*7c568831SAndroid Build Coastguard Worker 
1508*7c568831SAndroid Build Coastguard Worker /**
1509*7c568831SAndroid Build Coastguard Worker  * xmlDebugDumpDTD:
1510*7c568831SAndroid Build Coastguard Worker  * @output:  the FILE * for the output
1511*7c568831SAndroid Build Coastguard Worker  * @dtd:  the DTD
1512*7c568831SAndroid Build Coastguard Worker  *
1513*7c568831SAndroid Build Coastguard Worker  * Dumps debug information for the DTD
1514*7c568831SAndroid Build Coastguard Worker  */
1515*7c568831SAndroid Build Coastguard Worker void
xmlDebugDumpDTD(FILE * output,xmlDtdPtr dtd)1516*7c568831SAndroid Build Coastguard Worker xmlDebugDumpDTD(FILE * output, xmlDtdPtr dtd)
1517*7c568831SAndroid Build Coastguard Worker {
1518*7c568831SAndroid Build Coastguard Worker     xmlDebugCtxt ctxt;
1519*7c568831SAndroid Build Coastguard Worker 
1520*7c568831SAndroid Build Coastguard Worker     if (output == NULL)
1521*7c568831SAndroid Build Coastguard Worker 	output = stdout;
1522*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpInitCtxt(&ctxt);
1523*7c568831SAndroid Build Coastguard Worker     ctxt.options |= DUMP_TEXT_TYPE;
1524*7c568831SAndroid Build Coastguard Worker     ctxt.output = output;
1525*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpDTD(&ctxt, dtd);
1526*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpCleanCtxt(&ctxt);
1527*7c568831SAndroid Build Coastguard Worker }
1528*7c568831SAndroid Build Coastguard Worker 
1529*7c568831SAndroid Build Coastguard Worker /************************************************************************
1530*7c568831SAndroid Build Coastguard Worker  *									*
1531*7c568831SAndroid Build Coastguard Worker  *			Public entry points for checkings		*
1532*7c568831SAndroid Build Coastguard Worker  *									*
1533*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
1534*7c568831SAndroid Build Coastguard Worker 
1535*7c568831SAndroid Build Coastguard Worker /**
1536*7c568831SAndroid Build Coastguard Worker  * xmlDebugCheckDocument:
1537*7c568831SAndroid Build Coastguard Worker  * @output:  the FILE * for the output
1538*7c568831SAndroid Build Coastguard Worker  * @doc:  the document
1539*7c568831SAndroid Build Coastguard Worker  *
1540*7c568831SAndroid Build Coastguard Worker  * Check the document for potential content problems, and output
1541*7c568831SAndroid Build Coastguard Worker  * the errors to @output
1542*7c568831SAndroid Build Coastguard Worker  *
1543*7c568831SAndroid Build Coastguard Worker  * Returns the number of errors found
1544*7c568831SAndroid Build Coastguard Worker  */
1545*7c568831SAndroid Build Coastguard Worker int
xmlDebugCheckDocument(FILE * output,xmlDocPtr doc)1546*7c568831SAndroid Build Coastguard Worker xmlDebugCheckDocument(FILE * output, xmlDocPtr doc)
1547*7c568831SAndroid Build Coastguard Worker {
1548*7c568831SAndroid Build Coastguard Worker     xmlDebugCtxt ctxt;
1549*7c568831SAndroid Build Coastguard Worker 
1550*7c568831SAndroid Build Coastguard Worker     if (output == NULL)
1551*7c568831SAndroid Build Coastguard Worker 	output = stdout;
1552*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpInitCtxt(&ctxt);
1553*7c568831SAndroid Build Coastguard Worker     ctxt.output = output;
1554*7c568831SAndroid Build Coastguard Worker     ctxt.check = 1;
1555*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpDocument(&ctxt, doc);
1556*7c568831SAndroid Build Coastguard Worker     xmlCtxtDumpCleanCtxt(&ctxt);
1557*7c568831SAndroid Build Coastguard Worker     return(ctxt.errors);
1558*7c568831SAndroid Build Coastguard Worker }
1559*7c568831SAndroid Build Coastguard Worker 
1560*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_DEBUG_ENABLED */
1561