summaryrefslogtreecommitdiff
path: root/debugXML.c
diff options
context:
space:
mode:
Diffstat (limited to 'debugXML.c')
-rw-r--r--debugXML.c1959
1 files changed, 1224 insertions, 735 deletions
diff --git a/debugXML.c b/debugXML.c
index bb6560a..94be70d 100644
--- a/debugXML.c
+++ b/debugXML.c
@@ -34,964 +34,1334 @@
#include <libxml/relaxng.h>
#endif
+typedef struct _xmlDebugCtxt xmlDebugCtxt;
+typedef xmlDebugCtxt *xmlDebugCtxtPtr;
+struct _xmlDebugCtxt {
+ FILE *output; /* the output file */
+ char shift[101]; /* used for indenting */
+ int depth; /* current depth */
+ xmlDocPtr doc; /* current document */
+ xmlNodePtr node; /* current node */
+ xmlDictPtr dict; /* the doc dictionnary */
+ int check; /* do just checkings */
+ int errors; /* number of errors found */
+ int nodict; /* if the document has no dictionnary */
+};
+
+static void xmlCtxtDumpNodeList(xmlDebugCtxtPtr ctxt, xmlNodePtr node);
+
+static void
+xmlCtxtDumpInitCtxt(xmlDebugCtxtPtr ctxt)
+{
+ int i;
+
+ ctxt->depth = 0;
+ ctxt->check = 0;
+ ctxt->errors = 0;
+ ctxt->output = stdout;
+ ctxt->doc = NULL;
+ ctxt->node = NULL;
+ ctxt->dict = NULL;
+ ctxt->nodict = 0;
+ for (i = 0; i < 100; i++)
+ ctxt->shift[i] = ' ';
+ ctxt->shift[100] = 0;
+}
+
+static void
+xmlCtxtDumpCleanCtxt(xmlDebugCtxtPtr ctxt ATTRIBUTE_UNUSED)
+{
+ /* remove the ATTRIBUTE_UNUSED when this is added */
+}
+
/**
- * xmlDebugDumpString:
- * @output: the FILE * for the output
- * @str: the string
+ * xmlNsCheckScope:
+ * @node: the node
+ * @ns: the namespace node
*
- * Dumps informations about the string, shorten it if necessary
+ * Check that a given namespace is in scope on a node.
+ *
+ * Returns 1 if in scope, -1 in case of argument error,
+ * -2 if the namespace is not in scope, and -3 if not on
+ * an ancestor node.
*/
-void
-xmlDebugDumpString(FILE * output, const xmlChar * str)
+static int
+xmlNsCheckScope(xmlNodePtr node, xmlNsPtr ns)
{
- int i;
+ xmlNsPtr cur;
+
+ if ((node == NULL) || (ns == NULL))
+ return(-1);
+
+ if ((node->type != XML_ELEMENT_NODE) &&
+ (node->type != XML_ATTRIBUTE_NODE) &&
+ (node->type != XML_DOCUMENT_NODE) &&
+ (node->type != XML_TEXT_NODE) &&
+ (node->type != XML_HTML_DOCUMENT_NODE) &&
+ (node->type != XML_XINCLUDE_START))
+ return(-2);
+
+ while ((node != NULL) &&
+ ((node->type == XML_ELEMENT_NODE) ||
+ (node->type == XML_ATTRIBUTE_NODE) ||
+ (node->type == XML_TEXT_NODE) ||
+ (node->type == XML_XINCLUDE_START))) {
+ if ((node->type == XML_ELEMENT_NODE) ||
+ (node->type == XML_XINCLUDE_START)) {
+ cur = node->nsDef;
+ while (cur != NULL) {
+ if (cur == ns)
+ return(1);
+ if (xmlStrEqual(cur->prefix, ns->prefix))
+ return(-2);
+ cur = cur->next;
+ }
+ }
+ node = node->parent;
+ }
+ /* the xml namespace may be declared on the document node */
+ if ((node != NULL) &&
+ ((node->type == XML_DOCUMENT_NODE) ||
+ (node->type == XML_HTML_DOCUMENT_NODE))) {
+ xmlNsPtr oldNs = ((xmlDocPtr) node)->oldNs;
+ if (oldNs == ns)
+ return(1);
+ }
+ return(-3);
+}
- if (output == NULL)
- output = stdout;
- if (str == NULL) {
- fprintf(output, "(NULL)");
+static void
+xmlCtxtDumpSpaces(xmlDebugCtxtPtr ctxt)
+{
+ if (ctxt->check)
return;
- }
- for (i = 0; i < 40; i++)
- if (str[i] == 0)
- return;
- else if (IS_BLANK_CH(str[i]))
- fputc(' ', output);
- else if (str[i] >= 0x80)
- fprintf(output, "#%X", str[i]);
+ if ((ctxt->output != NULL) && (ctxt->depth > 0)) {
+ if (ctxt->depth < 50)
+ fprintf(ctxt->output, &ctxt->shift[100 - 2 * ctxt->depth]);
else
- fputc(str[i], output);
- fprintf(output, "...");
+ fprintf(ctxt->output, ctxt->shift);
+ }
}
+/**
+ * xmlDebugErr:
+ * @ctxt: a debug context
+ * @error: the error code
+ *
+ * Handle a debug error.
+ */
static void
-xmlDebugDumpDtdNode(FILE *output, xmlDtdPtr dtd, int depth) {
- int i;
- char shift[100];
-
- for (i = 0;((i < depth) && (i < 25));i++)
- shift[2 * i] = shift[2 * i + 1] = ' ';
- shift[2 * i] = shift[2 * i + 1] = 0;
+xmlDebugErr(xmlDebugCtxtPtr ctxt, int error, const char *msg)
+{
+ ctxt->errors++;
+ __xmlRaiseError(NULL, NULL, NULL,
+ NULL, ctxt->node, XML_FROM_CHECK,
+ error, XML_ERR_ERROR, NULL, 0,
+ NULL, NULL, NULL, 0, 0,
+ msg);
+}
+static void
+xmlDebugErr2(xmlDebugCtxtPtr ctxt, int error, const char *msg, int extra)
+{
+ ctxt->errors++;
+ __xmlRaiseError(NULL, NULL, NULL,
+ NULL, ctxt->node, XML_FROM_CHECK,
+ error, XML_ERR_ERROR, NULL, 0,
+ NULL, NULL, NULL, 0, 0,
+ msg, extra);
+}
+static void
+xmlDebugErr3(xmlDebugCtxtPtr ctxt, int error, const char *msg, const char *extra)
+{
+ ctxt->errors++;
+ __xmlRaiseError(NULL, NULL, NULL,
+ NULL, ctxt->node, XML_FROM_CHECK,
+ error, XML_ERR_ERROR, NULL, 0,
+ NULL, NULL, NULL, 0, 0,
+ msg, extra);
+}
- fprintf(output, shift);
+/**
+ * xmlCtxtNsCheckScope:
+ * @ctxt: the debugging context
+ * @node: the node
+ * @ns: the namespace node
+ *
+ * Report if a given namespace is is not in scope.
+ */
+static void
+xmlCtxtNsCheckScope(xmlDebugCtxtPtr ctxt, xmlNodePtr node, xmlNsPtr ns)
+{
+ int ret;
- if (dtd == NULL) {
- fprintf(output, "DTD node is NULL\n");
- return;
+ ret = xmlNsCheckScope(node, ns);
+ if (ret == -2) {
+ if (ns->prefix == NULL)
+ xmlDebugErr(ctxt, XML_CHECK_NS_SCOPE,
+ "Reference to default namespace not in scope\n");
+ else
+ xmlDebugErr3(ctxt, XML_CHECK_NS_SCOPE,
+ "Reference to namespace '%s' not in scope\n",
+ (char *) ns->prefix);
+ }
+ if (ret == -3) {
+ if (ns->prefix == NULL)
+ xmlDebugErr(ctxt, XML_CHECK_NS_ANCESTOR,
+ "Reference to default namespace not on ancestor\n");
+ else
+ xmlDebugErr3(ctxt, XML_CHECK_NS_ANCESTOR,
+ "Reference to namespace '%s' not on ancestor\n",
+ (char *) ns->prefix);
}
+}
- if (dtd->type != XML_DTD_NODE) {
- fprintf(output, "PBM: not a DTD\n");
- return;
- }
- if (dtd->name != NULL)
- fprintf(output, "DTD(%s)", (char *)dtd->name);
- else
- fprintf(output, "DTD");
- if (dtd->ExternalID != NULL)
- fprintf(output, ", PUBLIC %s", (char *)dtd->ExternalID);
- if (dtd->SystemID != NULL)
- fprintf(output, ", SYSTEM %s", (char *)dtd->SystemID);
- fprintf(output, "\n");
- /*
- * Do a bit of checking
- */
- if (dtd->parent == NULL)
- fprintf(output, "PBM: DTD has no parent\n");
- if (dtd->doc == NULL)
- fprintf(output, "PBM: DTD has no doc\n");
- if ((dtd->parent != NULL) && (dtd->doc != dtd->parent->doc))
- fprintf(output, "PBM: DTD doc differs from parent's one\n");
- if (dtd->prev == NULL) {
- if ((dtd->parent != NULL) && (dtd->parent->children != (xmlNodePtr)dtd))
- fprintf(output, "PBM: DTD has no prev and not first of list\n");
- } else {
- if (dtd->prev->next != (xmlNodePtr) dtd)
- fprintf(output, "PBM: DTD prev->next : back link wrong\n");
+/**
+ * xmlCtxtCheckString:
+ * @ctxt: the debug context
+ * @str: the string
+ *
+ * Do debugging on the string, currently it just checks the UTF-8 content
+ */
+static void
+xmlCtxtCheckString(xmlDebugCtxtPtr ctxt, const xmlChar * str)
+{
+ if (str == NULL) return;
+ if (ctxt->check) {
+ if (!xmlCheckUTF8(str)) {
+ xmlDebugErr3(ctxt, XML_CHECK_NOT_UTF8,
+ "String is not UTF-8 %s", (const char *) str);
+ }
}
- if (dtd->next == NULL) {
- if ((dtd->parent != NULL) && (dtd->parent->last != (xmlNodePtr) dtd))
- fprintf(output, "PBM: DTD has no next and not last of list\n");
- } else {
- if (dtd->next->prev != (xmlNodePtr) dtd)
- fprintf(output, "PBM: DTD next->prev : forward link wrong\n");
+}
+
+/**
+ * xmlCtxtCheckName:
+ * @ctxt: the debug context
+ * @name: the name
+ *
+ * Do debugging on the name, for example the dictionnary status and
+ * conformance to the Name production.
+ */
+static void
+xmlCtxtCheckName(xmlDebugCtxtPtr ctxt, const xmlChar * name)
+{
+ if (ctxt->check) {
+ if (name == NULL) {
+ xmlDebugErr(ctxt, XML_CHECK_NO_NAME, "Name is NULL");
+ return;
+ }
+ if (xmlValidateName(name, 0)) {
+ xmlDebugErr3(ctxt, XML_CHECK_NOT_NCNAME,
+ "Name is not an NCName '%s'", (const char *) name);
+ }
+ if ((ctxt->dict != NULL) &&
+ (!xmlDictOwns(ctxt->dict, name))) {
+ xmlDebugErr3(ctxt, XML_CHECK_OUTSIDE_DICT,
+ "Name is not from the document dictionnary '%s'",
+ (const char *) name);
+ }
}
}
static void
-xmlDebugDumpAttrDecl(FILE *output, xmlAttributePtr attr, int depth) {
- int i;
- char shift[100];
+xmlCtxtGenericNodeCheck(xmlDebugCtxtPtr ctxt, xmlNodePtr node) {
+ xmlDocPtr doc;
+ xmlDictPtr dict;
- for (i = 0;((i < depth) && (i < 25));i++)
- shift[2 * i] = shift[2 * i + 1] = ' ';
- shift[2 * i] = shift[2 * i + 1] = 0;
+ doc = node->doc;
- fprintf(output, shift);
+ if (node->parent == NULL)
+ xmlDebugErr(ctxt, XML_CHECK_NO_PARENT,
+ "Node has no parent\n");
+ if (node->doc == NULL) {
+ xmlDebugErr(ctxt, XML_CHECK_NO_DOC,
+ "Node has no doc\n");
+ dict = NULL;
+ } else {
+ dict = doc->dict;
+ if ((dict == NULL) && (ctxt->nodict == 0)) {
+#if 0
+ /* desactivated right now as it raises too many errors */
+ if (doc->type == XML_DOCUMENT_NODE)
+ xmlDebugErr(ctxt, XML_CHECK_NO_DICT,
+ "Document has no dictionnary\n");
+#endif
+ ctxt->nodict = 1;
+ }
+ if (ctxt->doc == NULL)
+ ctxt->doc = doc;
- if (attr == NULL) {
- fprintf(output, "Attribute declaration is NULL\n");
- return;
+ if (ctxt->dict == NULL) {
+ ctxt->dict = dict;
+ }
}
- if (attr->type != XML_ATTRIBUTE_DECL) {
- fprintf(output, "PBM: not a Attr\n");
- return;
+ if ((node->parent != NULL) && (node->doc != node->parent->doc) &&
+ (!xmlStrEqual(node->name, BAD_CAST "pseudoroot")))
+ xmlDebugErr(ctxt, XML_CHECK_WRONG_DOC,
+ "Node doc differs from parent's one\n");
+ if (node->prev == NULL) {
+ if (node->type == XML_ATTRIBUTE_NODE) {
+ if ((node->parent != NULL) &&
+ (node != (xmlNodePtr) node->parent->properties))
+ xmlDebugErr(ctxt, XML_CHECK_NO_PREV,
+ "Attr has no prev and not first of attr list\n");
+
+ } else if ((node->parent != NULL) && (node->parent->children != node))
+ xmlDebugErr(ctxt, XML_CHECK_NO_PREV,
+ "Node has no prev and not first of parent list\n");
+ } else {
+ if (node->prev->next != node)
+ xmlDebugErr(ctxt, XML_CHECK_WRONG_PREV,
+ "Node prev->next : back link wrong\n");
}
- if (attr->name != NULL)
- fprintf(output, "ATTRDECL(%s)", (char *)attr->name);
- else
- fprintf(output, "PBM ATTRDECL noname!!!");
- if (attr->elem != NULL)
- fprintf(output, " for %s", (char *)attr->elem);
- else
- fprintf(output, " PBM noelem!!!");
- switch (attr->atype) {
- case XML_ATTRIBUTE_CDATA:
- fprintf(output, " CDATA");
- break;
- case XML_ATTRIBUTE_ID:
- fprintf(output, " ID");
- break;
- case XML_ATTRIBUTE_IDREF:
- fprintf(output, " IDREF");
- break;
- case XML_ATTRIBUTE_IDREFS:
- fprintf(output, " IDREFS");
- break;
- case XML_ATTRIBUTE_ENTITY:
- fprintf(output, " ENTITY");
+ if (node->next == NULL) {
+ if ((node->parent != NULL) && (node->type != XML_ATTRIBUTE_NODE) &&
+ (node->parent->last != node))
+ xmlDebugErr(ctxt, XML_CHECK_NO_NEXT,
+ "Node has no next and not last of parent list\n");
+ } else {
+ if (node->next->prev != node)
+ xmlDebugErr(ctxt, XML_CHECK_WRONG_NEXT,
+ "Node next->prev : forward link wrong\n");
+ if (node->next->parent != node->parent)
+ xmlDebugErr(ctxt, XML_CHECK_WRONG_PARENT,
+ "Node next->prev : forward link wrong\n");
+ }
+ if (node->type == XML_ELEMENT_NODE) {
+ xmlNsPtr ns;
+
+ ns = node->nsDef;
+ while (ns != NULL) {
+ xmlCtxtNsCheckScope(ctxt, node, ns);
+ ns = ns->next;
+ }
+ if (node->ns != NULL)
+ xmlCtxtNsCheckScope(ctxt, node, node->ns);
+ } else if (node->type == XML_ATTRIBUTE_NODE) {
+ if (node->ns != NULL)
+ xmlCtxtNsCheckScope(ctxt, node, node->ns);
+ }
+
+ if ((node->type != XML_ELEMENT_NODE) &&
+ (node->type != XML_ATTRIBUTE_NODE) &&
+ (node->type != XML_ATTRIBUTE_DECL) &&
+ (node->type != XML_DTD_NODE) &&
+ (node->type != XML_HTML_DOCUMENT_NODE) &&
+ (node->type != XML_DOCUMENT_NODE)) {
+ if (node->content != NULL)
+ xmlCtxtCheckString(ctxt, (const xmlChar *) node->content);
+ }
+ switch (node->type) {
+ case XML_ELEMENT_NODE:
+ case XML_ATTRIBUTE_NODE:
+ xmlCtxtCheckName(ctxt, node->name);
break;
- case XML_ATTRIBUTE_ENTITIES:
- fprintf(output, " ENTITIES");
+ case XML_TEXT_NODE:
+ if ((node->name == xmlStringText) ||
+ (node->name == xmlStringTextNoenc))
+ break;
+ /* some case of entity substitution can lead to this */
+ if ((ctxt->dict != NULL) &&
+ (node->name == xmlDictLookup(ctxt->dict, BAD_CAST "nbktext",
+ 7)))
+ break;
+
+ xmlDebugErr3(ctxt, XML_CHECK_WRONG_NAME,
+ "Text node has wrong name '%s'",
+ (const char *) node->name);
break;
- case XML_ATTRIBUTE_NMTOKEN:
- fprintf(output, " NMTOKEN");
+ case XML_COMMENT_NODE:
+ if (node->name == xmlStringComment)
+ break;
+ xmlDebugErr3(ctxt, XML_CHECK_WRONG_NAME,
+ "Comment node has wrong name '%s'",
+ (const char *) node->name);
break;
- case XML_ATTRIBUTE_NMTOKENS:
- fprintf(output, " NMTOKENS");
+ case XML_PI_NODE:
+ xmlCtxtCheckName(ctxt, node->name);
break;
- case XML_ATTRIBUTE_ENUMERATION:
- fprintf(output, " ENUMERATION");
+ case XML_CDATA_SECTION_NODE:
+ if (node->name == NULL)
+ break;
+ xmlDebugErr3(ctxt, XML_CHECK_NAME_NOT_NULL,
+ "CData section has non NULL name '%s'",
+ (const char *) node->name);
break;
- case XML_ATTRIBUTE_NOTATION:
- fprintf(output, " NOTATION ");
+ case XML_ENTITY_REF_NODE:
+ case XML_ENTITY_NODE:
+ case XML_DOCUMENT_TYPE_NODE:
+ case XML_DOCUMENT_FRAG_NODE:
+ case XML_NOTATION_NODE:
+ case XML_DTD_NODE:
+ case XML_ELEMENT_DECL:
+ case XML_ATTRIBUTE_DECL:
+ case XML_ENTITY_DECL:
+ case XML_NAMESPACE_DECL:
+ case XML_XINCLUDE_START:
+ case XML_XINCLUDE_END:
+#ifdef LIBXML_DOCB_ENABLED
+ case XML_DOCB_DOCUMENT_NODE:
+#endif
+ case XML_DOCUMENT_NODE:
+ case XML_HTML_DOCUMENT_NODE:
break;
}
- if (attr->tree != NULL) {
- int indx;
- xmlEnumerationPtr cur = attr->tree;
+}
- for (indx = 0;indx < 5; indx++) {
- if (indx != 0)
- fprintf(output, "|%s", (char *)cur->name);
- else
- fprintf(output, " (%s", (char *)cur->name);
- cur = cur->next;
- if (cur == NULL) break;
- }
- if (cur == NULL)
- fprintf(output, ")");
- else
- fprintf(output, "...)");
+static void
+xmlCtxtDumpString(xmlDebugCtxtPtr ctxt, const xmlChar * str)
+{
+ int i;
+
+ if (ctxt->check) {
+ return;
}
- switch (attr->def) {
- case XML_ATTRIBUTE_NONE:
- break;
- case XML_ATTRIBUTE_REQUIRED:
- fprintf(output, " REQUIRED");
- break;
- case XML_ATTRIBUTE_IMPLIED:
- fprintf(output, " IMPLIED");
- break;
- case XML_ATTRIBUTE_FIXED:
- fprintf(output, " FIXED");
- break;
+ /* TODO: check UTF8 content of the string */
+ if (str == NULL) {
+ fprintf(ctxt->output, "(NULL)");
+ return;
}
- if (attr->defaultValue != NULL) {
- fprintf(output, "\"");
- xmlDebugDumpString(output, attr->defaultValue);
- fprintf(output, "\"");
+ for (i = 0; i < 40; i++)
+ if (str[i] == 0)
+ return;
+ else if (IS_BLANK_CH(str[i]))
+ fputc(' ', ctxt->output);
+ else if (str[i] >= 0x80)
+ fprintf(ctxt->output, "#%X", str[i]);
+ else
+ fputc(str[i], ctxt->output);
+ fprintf(ctxt->output, "...");
+}
+
+static void
+xmlCtxtDumpDtdNode(xmlDebugCtxtPtr ctxt, xmlDtdPtr dtd)
+{
+ xmlCtxtDumpSpaces(ctxt);
+
+ if (dtd == NULL) {
+ if (!ctxt->check)
+ fprintf(ctxt->output, "DTD node is NULL\n");
+ return;
}
- fprintf(output, "\n");
+ if (dtd->type != XML_DTD_NODE) {
+ xmlDebugErr(ctxt, XML_CHECK_NOT_DTD,
+ "Node is not a DTD");
+ return;
+ }
+ if (!ctxt->check) {
+ if (dtd->name != NULL)
+ fprintf(ctxt->output, "DTD(%s)", (char *) dtd->name);
+ else
+ fprintf(ctxt->output, "DTD");
+ if (dtd->ExternalID != NULL)
+ fprintf(ctxt->output, ", PUBLIC %s", (char *) dtd->ExternalID);
+ if (dtd->SystemID != NULL)
+ fprintf(ctxt->output, ", SYSTEM %s", (char *) dtd->SystemID);
+ fprintf(ctxt->output, "\n");
+ }
/*
* Do a bit of checking
*/
- if (attr->parent == NULL)
- fprintf(output, "PBM: Attr has no parent\n");
- if (attr->doc == NULL)
- fprintf(output, "PBM: Attr has no doc\n");
- if ((attr->parent != NULL) && (attr->doc != attr->parent->doc))
- fprintf(output, "PBM: Attr doc differs from parent's one\n");
- if (attr->prev == NULL) {
- if ((attr->parent != NULL) && (attr->parent->children != (xmlNodePtr)attr))
- fprintf(output, "PBM: Attr has no prev and not first of list\n");
- } else {
- if (attr->prev->next != (xmlNodePtr) attr)
- fprintf(output, "PBM: Attr prev->next : back link wrong\n");
- }
- if (attr->next == NULL) {
- if ((attr->parent != NULL) && (attr->parent->last != (xmlNodePtr) attr))
- fprintf(output, "PBM: Attr has no next and not last of list\n");
- } else {
- if (attr->next->prev != (xmlNodePtr) attr)
- fprintf(output, "PBM: Attr next->prev : forward link wrong\n");
- }
+ xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) dtd);
}
static void
-xmlDebugDumpElemDecl(FILE *output, xmlElementPtr elem, int depth) {
- int i;
- char shift[100];
+xmlCtxtDumpAttrDecl(xmlDebugCtxtPtr ctxt, xmlAttributePtr attr)
+{
+ xmlCtxtDumpSpaces(ctxt);
+
+ if (attr == NULL) {
+ if (!ctxt->check)
+ fprintf(ctxt->output, "Attribute declaration is NULL\n");
+ return;
+ }
+ if (attr->type != XML_ATTRIBUTE_DECL) {
+ xmlDebugErr(ctxt, XML_CHECK_NOT_ATTR_DECL,
+ "Node is not an attribute declaration");
+ return;
+ }
+ if (attr->name != NULL) {
+ if (!ctxt->check)
+ fprintf(ctxt->output, "ATTRDECL(%s)", (char *) attr->name);
+ } else
+ xmlDebugErr(ctxt, XML_CHECK_NO_NAME,
+ "Node attribute declaration has no name");
+ if (attr->elem != NULL) {
+ if (!ctxt->check)
+ fprintf(ctxt->output, " for %s", (char *) attr->elem);
+ } else
+ xmlDebugErr(ctxt, XML_CHECK_NO_ELEM,
+ "Node attribute declaration has no element name");
+ if (!ctxt->check) {
+ switch (attr->atype) {
+ case XML_ATTRIBUTE_CDATA:
+ fprintf(ctxt->output, " CDATA");
+ break;
+ case XML_ATTRIBUTE_ID:
+ fprintf(ctxt->output, " ID");
+ break;
+ case XML_ATTRIBUTE_IDREF:
+ fprintf(ctxt->output, " IDREF");
+ break;
+ case XML_ATTRIBUTE_IDREFS:
+ fprintf(ctxt->output, " IDREFS");
+ break;
+ case XML_ATTRIBUTE_ENTITY:
+ fprintf(ctxt->output, " ENTITY");
+ break;
+ case XML_ATTRIBUTE_ENTITIES:
+ fprintf(ctxt->output, " ENTITIES");
+ break;
+ case XML_ATTRIBUTE_NMTOKEN:
+ fprintf(ctxt->output, " NMTOKEN");
+ break;
+ case XML_ATTRIBUTE_NMTOKENS:
+ fprintf(ctxt->output, " NMTOKENS");
+ break;
+ case XML_ATTRIBUTE_ENUMERATION:
+ fprintf(ctxt->output, " ENUMERATION");
+ break;
+ case XML_ATTRIBUTE_NOTATION:
+ fprintf(ctxt->output, " NOTATION ");
+ break;
+ }
+ if (attr->tree != NULL) {
+ int indx;
+ xmlEnumerationPtr cur = attr->tree;
+
+ for (indx = 0; indx < 5; indx++) {
+ if (indx != 0)
+ fprintf(ctxt->output, "|%s", (char *) cur->name);
+ else
+ fprintf(ctxt->output, " (%s", (char *) cur->name);
+ cur = cur->next;
+ if (cur == NULL)
+ break;
+ }
+ if (cur == NULL)
+ fprintf(ctxt->output, ")");
+ else
+ fprintf(ctxt->output, "...)");
+ }
+ switch (attr->def) {
+ case XML_ATTRIBUTE_NONE:
+ break;
+ case XML_ATTRIBUTE_REQUIRED:
+ fprintf(ctxt->output, " REQUIRED");
+ break;
+ case XML_ATTRIBUTE_IMPLIED:
+ fprintf(ctxt->output, " IMPLIED");
+ break;
+ case XML_ATTRIBUTE_FIXED:
+ fprintf(ctxt->output, " FIXED");
+ break;
+ }
+ if (attr->defaultValue != NULL) {
+ fprintf(ctxt->output, "\"");
+ xmlCtxtDumpString(ctxt, attr->defaultValue);
+ fprintf(ctxt->output, "\"");
+ }
+ fprintf(ctxt->output, "\n");
+ }
- for (i = 0;((i < depth) && (i < 25));i++)
- shift[2 * i] = shift[2 * i + 1] = ' ';
- shift[2 * i] = shift[2 * i + 1] = 0;
+ /*
+ * Do a bit of checking
+ */
+ xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) attr);
+}
- fprintf(output, shift);
+static void
+xmlCtxtDumpElemDecl(xmlDebugCtxtPtr ctxt, xmlElementPtr elem)
+{
+ xmlCtxtDumpSpaces(ctxt);
if (elem == NULL) {
- fprintf(output, "Element declaration is NULL\n");
- return;
+ if (!ctxt->check)
+ fprintf(ctxt->output, "Element declaration is NULL\n");
+ return;
}
if (elem->type != XML_ELEMENT_DECL) {
- fprintf(output, "PBM: not a Elem\n");
- return;
+ xmlDebugErr(ctxt, XML_CHECK_NOT_ELEM_DECL,
+ "Node is not an element declaration");
+ return;
}
if (elem->name != NULL) {
- fprintf(output, "ELEMDECL(");
- xmlDebugDumpString(output, elem->name);
- fprintf(output, ")");
+ if (!ctxt->check) {
+ fprintf(ctxt->output, "ELEMDECL(");
+ xmlCtxtDumpString(ctxt, elem->name);
+ fprintf(ctxt->output, ")");
+ }
} else
- fprintf(output, "PBM ELEMDECL noname!!!");
- switch (elem->etype) {
- case XML_ELEMENT_TYPE_UNDEFINED:
- fprintf(output, ", UNDEFINED");
- break;
- case XML_ELEMENT_TYPE_EMPTY:
- fprintf(output, ", EMPTY");
- break;
- case XML_ELEMENT_TYPE_ANY:
- fprintf(output, ", ANY");
- break;
- case XML_ELEMENT_TYPE_MIXED:
- fprintf(output, ", MIXED ");
- break;
- case XML_ELEMENT_TYPE_ELEMENT:
- fprintf(output, ", MIXED ");
- break;
- }
- if ((elem->type != XML_ELEMENT_NODE) &&
- (elem->content != NULL)) {
- char buf[5001];
+ xmlDebugErr(ctxt, XML_CHECK_NO_NAME,
+ "Element declaration has no name");
+ if (!ctxt->check) {
+ switch (elem->etype) {
+ case XML_ELEMENT_TYPE_UNDEFINED:
+ fprintf(ctxt->output, ", UNDEFINED");
+ break;
+ case XML_ELEMENT_TYPE_EMPTY:
+ fprintf(ctxt->output, ", EMPTY");
+ break;
+ case XML_ELEMENT_TYPE_ANY:
+ fprintf(ctxt->output, ", ANY");
+ break;
+ case XML_ELEMENT_TYPE_MIXED:
+ fprintf(ctxt->output, ", MIXED ");
+ break;
+ case XML_ELEMENT_TYPE_ELEMENT:
+ fprintf(ctxt->output, ", MIXED ");
+ break;
+ }
+ if ((elem->type != XML_ELEMENT_NODE) && (elem->content != NULL)) {
+ char buf[5001];
- buf[0] = 0;
- xmlSnprintfElementContent(buf, 5000, elem->content, 1);
- buf[5000] = 0;
- fprintf(output, "%s", buf);
+ buf[0] = 0;
+ xmlSnprintfElementContent(buf, 5000, elem->content, 1);
+ buf[5000] = 0;
+ fprintf(ctxt->output, "%s", buf);
+ }
+ fprintf(ctxt->output, "\n");
}
- fprintf(output, "\n");
/*
* Do a bit of checking
*/
- if (elem->parent == NULL)
- fprintf(output, "PBM: Elem has no parent\n");
- if (elem->doc == NULL)
- fprintf(output, "PBM: Elem has no doc\n");
- if ((elem->parent != NULL) && (elem->doc != elem->parent->doc))
- fprintf(output, "PBM: Elem doc differs from parent's one\n");
- if (elem->prev == NULL) {
- if ((elem->parent != NULL) && (elem->parent->children != (xmlNodePtr)elem))
- fprintf(output, "PBM: Elem has no prev and not first of list\n");
- } else {
- if (elem->prev->next != (xmlNodePtr) elem)
- fprintf(output, "PBM: Elem prev->next : back link wrong\n");
- }
- if (elem->next == NULL) {
- if ((elem->parent != NULL) && (elem->parent->last != (xmlNodePtr) elem))
- fprintf(output, "PBM: Elem has no next and not last of list\n");
- } else {
- if (elem->next->prev != (xmlNodePtr) elem)
- fprintf(output, "PBM: Elem next->prev : forward link wrong\n");
- }
+ xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) elem);
}
static void
-xmlDebugDumpEntityDecl(FILE *output, xmlEntityPtr ent, int depth) {
- int i;
- char shift[100];
-
- for (i = 0;((i < depth) && (i < 25));i++)
- shift[2 * i] = shift[2 * i + 1] = ' ';
- shift[2 * i] = shift[2 * i + 1] = 0;
-
- fprintf(output, shift);
+xmlCtxtDumpEntityDecl(xmlDebugCtxtPtr ctxt, xmlEntityPtr ent)
+{
+ xmlCtxtDumpSpaces(ctxt);
if (ent == NULL) {
- fprintf(output, "Entity declaration is NULL\n");
- return;
+ if (!ctxt->check)
+ fprintf(ctxt->output, "Entity declaration is NULL\n");
+ return;
}
if (ent->type != XML_ENTITY_DECL) {
- fprintf(output, "PBM: not a Entity decl\n");
- return;
+ xmlDebugErr(ctxt, XML_CHECK_NOT_ENTITY_DECL,
+ "Node is not an entity declaration");
+ return;
}
if (ent->name != NULL) {
- fprintf(output, "ENTITYDECL(");
- xmlDebugDumpString(output, ent->name);
- fprintf(output, ")");
+ if (!ctxt->check) {
+ fprintf(ctxt->output, "ENTITYDECL(");
+ xmlCtxtDumpString(ctxt, ent->name);
+ fprintf(ctxt->output, ")");
+ }
} else
- fprintf(output, "PBM ENTITYDECL noname!!!");
- switch (ent->etype) {
- case XML_INTERNAL_GENERAL_ENTITY:
- fprintf(output, ", internal\n");
- break;
- case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
- fprintf(output, ", external parsed\n");
- break;
- case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
- fprintf(output, ", unparsed\n");
- break;
- case XML_INTERNAL_PARAMETER_ENTITY:
- fprintf(output, ", parameter\n");
- break;
- case XML_EXTERNAL_PARAMETER_ENTITY:
- fprintf(output, ", external parameter\n");
- break;
- case XML_INTERNAL_PREDEFINED_ENTITY:
- fprintf(output, ", predefined\n");
- break;
- }
- if (ent->ExternalID) {
- fprintf(output, shift);
- fprintf(output, " ExternalID=%s\n", (char *)ent->ExternalID);
- }
- if (ent->SystemID) {
- fprintf(output, shift);
- fprintf(output, " SystemID=%s\n", (char *)ent->SystemID);
- }
- if (ent->URI != NULL) {
- fprintf(output, shift);
- fprintf(output, " URI=%s\n", (char *)ent->URI);
- }
- if (ent->content) {
- fprintf(output, shift);
- fprintf(output, " content=");
- xmlDebugDumpString(output, ent->content);
- fprintf(output, "\n");
+ xmlDebugErr(ctxt, XML_CHECK_NO_NAME,
+ "Entity declaration has no name");
+ if (!ctxt->check) {
+ switch (ent->etype) {
+ case XML_INTERNAL_GENERAL_ENTITY:
+ fprintf(ctxt->output, ", internal\n");
+ break;
+ case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
+ fprintf(ctxt->output, ", external parsed\n");
+ break;
+ case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
+ fprintf(ctxt->output, ", unparsed\n");
+ break;
+ case XML_INTERNAL_PARAMETER_ENTITY:
+ fprintf(ctxt->output, ", parameter\n");
+ break;
+ case XML_EXTERNAL_PARAMETER_ENTITY:
+ fprintf(ctxt->output, ", external parameter\n");
+ break;
+ case XML_INTERNAL_PREDEFINED_ENTITY:
+ fprintf(ctxt->output, ", predefined\n");
+ break;
+ }
+ if (ent->ExternalID) {
+ xmlCtxtDumpSpaces(ctxt);
+ fprintf(ctxt->output, " ExternalID=%s\n",
+ (char *) ent->ExternalID);
+ }
+ if (ent->SystemID) {
+ xmlCtxtDumpSpaces(ctxt);
+ fprintf(ctxt->output, " SystemID=%s\n",
+ (char *) ent->SystemID);
+ }
+ if (ent->URI != NULL) {
+ xmlCtxtDumpSpaces(ctxt);
+ fprintf(ctxt->output, " URI=%s\n", (char *) ent->URI);
+ }
+ if (ent->content) {
+ xmlCtxtDumpSpaces(ctxt);
+ fprintf(ctxt->output, " content=");
+ xmlCtxtDumpString(ctxt, ent->content);
+ fprintf(ctxt->output, "\n");
+ }
}
/*
* Do a bit of checking
*/
- if (ent->parent == NULL)
- fprintf(output, "PBM: Ent has no parent\n");
- if (ent->doc == NULL)
- fprintf(output, "PBM: Ent has no doc\n");
- if ((ent->parent != NULL) && (ent->doc != ent->parent->doc))
- fprintf(output, "PBM: Ent doc differs from parent's one\n");
- if (ent->prev == NULL) {
- if ((ent->parent != NULL) && (ent->parent->children != (xmlNodePtr)ent))
- fprintf(output, "PBM: Ent has no prev and not first of list\n");
- } else {
- if (ent->prev->next != (xmlNodePtr) ent)
- fprintf(output, "PBM: Ent prev->next : back link wrong\n");
- }
- if (ent->next == NULL) {
- if ((ent->parent != NULL) && (ent->parent->last != (xmlNodePtr) ent))
- fprintf(output, "PBM: Ent has no next and not last of list\n");
- } else {
- if (ent->next->prev != (xmlNodePtr) ent)
- fprintf(output, "PBM: Ent next->prev : forward link wrong\n");
- }
+ xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) ent);
}
static void
-xmlDebugDumpNamespace(FILE *output, xmlNsPtr ns, int depth) {
- int i;
- char shift[100];
-
- for (i = 0;((i < depth) && (i < 25));i++)
- shift[2 * i] = shift[2 * i + 1] = ' ';
- shift[2 * i] = shift[2 * i + 1] = 0;
-
- fprintf(output, shift);
+xmlCtxtDumpNamespace(xmlDebugCtxtPtr ctxt, xmlNsPtr ns)
+{
+ xmlCtxtDumpSpaces(ctxt);
if (ns == NULL) {
- fprintf(output, "namespace node is NULL\n");
- return;
+ if (!ctxt->check)
+ fprintf(ctxt->output, "namespace node is NULL\n");
+ return;
}
if (ns->type != XML_NAMESPACE_DECL) {
- fprintf(output, "invalid namespace node %d\n", (char *)ns->type);
- return;
+ xmlDebugErr(ctxt, XML_CHECK_NOT_NS_DECL,
+ "Node is not a namespace declaration");
+ return;
}
if (ns->href == NULL) {
- if (ns->prefix != NULL)
- fprintf(output, "incomplete namespace %s href=NULL\n",
- (char *)ns->prefix);
- else
- fprintf(output, "incomplete default namespace href=NULL\n");
+ if (ns->prefix != NULL)
+ xmlDebugErr3(ctxt, XML_CHECK_NO_HREF,
+ "Incomplete namespace %s href=NULL\n",
+ (char *) ns->prefix);
+ else
+ xmlDebugErr(ctxt, XML_CHECK_NO_HREF,
+ "Incomplete default namespace href=NULL\n");
} else {
- if (ns->prefix != NULL)
- fprintf(output, "namespace %s href=", (char *)ns->prefix);
- else
- fprintf(output, "default namespace href=");
-
- xmlDebugDumpString(output, ns->href);
- fprintf(output, "\n");
+ if (!ctxt->check) {
+ if (ns->prefix != NULL)
+ fprintf(ctxt->output, "namespace %s href=",
+ (char *) ns->prefix);
+ else
+ fprintf(ctxt->output, "default namespace href=");
+
+ xmlCtxtDumpString(ctxt, ns->href);
+ fprintf(ctxt->output, "\n");
+ }
}
}
static void
-xmlDebugDumpNamespaceList(FILE *output, xmlNsPtr ns, int depth) {
+xmlCtxtDumpNamespaceList(xmlDebugCtxtPtr ctxt, xmlNsPtr ns)
+{
while (ns != NULL) {
- xmlDebugDumpNamespace(output, ns, depth);
- ns = ns->next;
+ xmlCtxtDumpNamespace(ctxt, ns);
+ ns = ns->next;
}
}
static void
-xmlDebugDumpEntity(FILE *output, xmlEntityPtr ent, int depth) {
- int i;
- char shift[100];
-
- for (i = 0;((i < depth) && (i < 25));i++)
- shift[2 * i] = shift[2 * i + 1] = ' ';
- shift[2 * i] = shift[2 * i + 1] = 0;
+xmlCtxtDumpEntity(xmlDebugCtxtPtr ctxt, xmlEntityPtr ent)
+{
+ xmlCtxtDumpSpaces(ctxt);
- fprintf(output, shift);
-
if (ent == NULL) {
- fprintf(output, "Entity is NULL\n");
- return;
- }
- switch (ent->etype) {
- case XML_INTERNAL_GENERAL_ENTITY:
- fprintf(output, "INTERNAL_GENERAL_ENTITY ");
- break;
- case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
- fprintf(output, "EXTERNAL_GENERAL_PARSED_ENTITY ");
- break;
- case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
- fprintf(output, "EXTERNAL_GENERAL_UNPARSED_ENTITY ");
- break;
- case XML_INTERNAL_PARAMETER_ENTITY:
- fprintf(output, "INTERNAL_PARAMETER_ENTITY ");
- break;
- case XML_EXTERNAL_PARAMETER_ENTITY:
- fprintf(output, "EXTERNAL_PARAMETER_ENTITY ");
- break;
- default:
- fprintf(output, "ENTITY_%d ! ", (char *)ent->etype);
- }
- fprintf(output, "%s\n", ent->name);
- if (ent->ExternalID) {
- fprintf(output, shift);
- fprintf(output, "ExternalID=%s\n", (char *)ent->ExternalID);
- }
- if (ent->SystemID) {
- fprintf(output, shift);
- fprintf(output, "SystemID=%s\n", (char *)ent->SystemID);
- }
- if (ent->URI) {
- fprintf(output, shift);
- fprintf(output, "URI=%s\n", (char *)ent->URI);
+ if (!ctxt->check)
+ fprintf(ctxt->output, "Entity is NULL\n");
+ return;
}
- if (ent->content) {
- fprintf(output, shift);
- fprintf(output, "content=");
- xmlDebugDumpString(output, ent->content);
- fprintf(output, "\n");
+ if (!ctxt->check) {
+ switch (ent->etype) {
+ case XML_INTERNAL_GENERAL_ENTITY:
+ fprintf(ctxt->output, "INTERNAL_GENERAL_ENTITY ");
+ break;
+ case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
+ fprintf(ctxt->output, "EXTERNAL_GENERAL_PARSED_ENTITY ");
+ break;
+ case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
+ fprintf(ctxt->output, "EXTERNAL_GENERAL_UNPARSED_ENTITY ");
+ break;
+ case XML_INTERNAL_PARAMETER_ENTITY:
+ fprintf(ctxt->output, "INTERNAL_PARAMETER_ENTITY ");
+ break;
+ case XML_EXTERNAL_PARAMETER_ENTITY:
+ fprintf(ctxt->output, "EXTERNAL_PARAMETER_ENTITY ");
+ break;
+ default:
+ fprintf(ctxt->output, "ENTITY_%d ! ", (int) ent->etype);
+ }
+ fprintf(ctxt->output, "%s\n", ent->name);
+ if (ent->ExternalID) {
+ xmlCtxtDumpSpaces(ctxt);
+ fprintf(ctxt->output, "ExternalID=%s\n",
+ (char *) ent->ExternalID);
+ }
+ if (ent->SystemID) {
+ xmlCtxtDumpSpaces(ctxt);
+ fprintf(ctxt->output, "SystemID=%s\n", (char *) ent->SystemID);
+ }
+ if (ent->URI) {
+ xmlCtxtDumpSpaces(ctxt);
+ fprintf(ctxt->output, "URI=%s\n", (char *) ent->URI);
+ }
+ if (ent->content) {
+ xmlCtxtDumpSpaces(ctxt);
+ fprintf(ctxt->output, "content=");
+ xmlCtxtDumpString(ctxt, ent->content);
+ fprintf(ctxt->output, "\n");
+ }
}
}
/**
- * xmlDebugDumpAttr:
+ * xmlCtxtDumpAttr:
* @output: the FILE * for the output
* @attr: the attribute
* @depth: the indentation level.
*
* Dumps debug information for the attribute
*/
-void
-xmlDebugDumpAttr(FILE *output, xmlAttrPtr attr, int depth) {
- int i;
- char shift[100];
-
- for (i = 0;((i < depth) && (i < 25));i++)
- shift[2 * i] = shift[2 * i + 1] = ' ';
- shift[2 * i] = shift[2 * i + 1] = 0;
+static void
+xmlCtxtDumpAttr(xmlDebugCtxtPtr ctxt, xmlAttrPtr attr)
+{
+ xmlCtxtDumpSpaces(ctxt);
- fprintf(output, shift);
-
if (attr == NULL) {
- fprintf(output, "Attr is NULL");
- return;
+ if (!ctxt->check)
+ fprintf(ctxt->output, "Attr is NULL");
+ return;
}
- fprintf(output, "ATTRIBUTE ");
- xmlDebugDumpString(output, attr->name);
- fprintf(output, "\n");
- if (attr->children != NULL)
- xmlDebugDumpNodeList(output, attr->children, depth + 1);
+ if (!ctxt->check) {
+ fprintf(ctxt->output, "ATTRIBUTE ");
+ xmlCtxtDumpString(ctxt, attr->name);
+ fprintf(ctxt->output, "\n");
+ if (attr->children != NULL) {
+ ctxt->depth++;
+ xmlCtxtDumpNodeList(ctxt, attr->children);
+ ctxt->depth--;
+ }
+ }
+ if (attr->name == NULL)
+ xmlDebugErr(ctxt, XML_CHECK_NO_NAME,
+ "Attribute has no name");
/*
* Do a bit of checking
*/
- if (attr->parent == NULL)
- fprintf(output, "PBM: Attr has no parent\n");
- if (attr->doc == NULL)
- fprintf(output, "PBM: Attr has no doc\n");
- if ((attr->parent != NULL) && (attr->doc != attr->parent->doc))
- fprintf(output, "PBM: Attr doc differs from parent's one\n");
- if (attr->prev == NULL) {
- if ((attr->parent != NULL) && (attr->parent->properties != attr))
- fprintf(output, "PBM: Attr has no prev and not first of list\n");
- } else {
- if (attr->prev->next != attr)
- fprintf(output, "PBM: Attr prev->next : back link wrong\n");
- }
- if (attr->next != NULL) {
- if (attr->next->prev != attr)
- fprintf(output, "PBM: Attr next->prev : forward link wrong\n");
- }
+ xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) attr);
}
/**
- * xmlDebugDumpAttrList:
+ * xmlCtxtDumpAttrList:
* @output: the FILE * for the output
* @attr: the attribute list
* @depth: the indentation level.
*
* Dumps debug information for the attribute list
*/
-void
-xmlDebugDumpAttrList(FILE * output, xmlAttrPtr attr, int depth)
+static void
+xmlCtxtDumpAttrList(xmlDebugCtxtPtr ctxt, xmlAttrPtr attr)
{
- if (output == NULL)
- output = stdout;
while (attr != NULL) {
- xmlDebugDumpAttr(output, attr, depth);
+ xmlCtxtDumpAttr(ctxt, attr);
attr = attr->next;
}
}
/**
- * xmlDebugDumpOneNode:
+ * xmlCtxtDumpOneNode:
* @output: the FILE * for the output
* @node: the node
* @depth: the indentation level.
*
* Dumps debug information for the element node, it is not recursive
*/
-void
-xmlDebugDumpOneNode(FILE * output, xmlNodePtr node, int depth)
+static void
+xmlCtxtDumpOneNode(xmlDebugCtxtPtr ctxt, xmlNodePtr node)
{
- int i;
- char shift[100];
-
- if (output == NULL)
- output = stdout;
- for (i = 0; ((i < depth) && (i < 25)); i++)
- shift[2 * i] = shift[2 * i + 1] = ' ';
- shift[2 * i] = shift[2 * i + 1] = 0;
-
if (node == NULL) {
- fprintf(output, shift);
- fprintf(output, "node is NULL\n");
- return;
+ if (!ctxt->check) {
+ xmlCtxtDumpSpaces(ctxt);
+ fprintf(ctxt->output, "node is NULL\n");
+ }
+ return;
}
+ ctxt->node = node;
+
switch (node->type) {
case XML_ELEMENT_NODE:
- fprintf(output, shift);
- fprintf(output, "ELEMENT ");
- if ((node->ns != NULL) && (node->ns->prefix != NULL)) {
- xmlDebugDumpString(output, node->ns->prefix);
- fprintf(output, ":");
+ if (!ctxt->check) {
+ xmlCtxtDumpSpaces(ctxt);
+ fprintf(ctxt->output, "ELEMENT ");
+ if ((node->ns != NULL) && (node->ns->prefix != NULL)) {
+ xmlCtxtDumpString(ctxt, node->ns->prefix);
+ fprintf(ctxt->output, ":");
+ }
+ xmlCtxtDumpString(ctxt, node->name);
+ fprintf(ctxt->output, "\n");
}
- xmlDebugDumpString(output, node->name);
- fprintf(output, "\n");
break;
case XML_ATTRIBUTE_NODE:
- fprintf(output, shift);
- fprintf(output, "Error, ATTRIBUTE found here\n");
+ if (!ctxt->check)
+ xmlCtxtDumpSpaces(ctxt);
+ fprintf(ctxt->output, "Error, ATTRIBUTE found here\n");
break;
case XML_TEXT_NODE:
- fprintf(output, shift);
- if (node->name == (const xmlChar *) xmlStringTextNoenc)
- fprintf(output, "TEXT no enc\n");
- else
- fprintf(output, "TEXT\n");
+ if (!ctxt->check) {
+ xmlCtxtDumpSpaces(ctxt);
+ if (node->name == (const xmlChar *) xmlStringTextNoenc)
+ fprintf(ctxt->output, "TEXT no enc\n");
+ else
+ fprintf(ctxt->output, "TEXT\n");
+ }
break;
case XML_CDATA_SECTION_NODE:
- fprintf(output, shift);
- fprintf(output, "CDATA_SECTION\n");
+ if (!ctxt->check) {
+ xmlCtxtDumpSpaces(ctxt);
+ fprintf(ctxt->output, "CDATA_SECTION\n");
+ }
break;
case XML_ENTITY_REF_NODE:
- fprintf(output, shift);
- fprintf(output, "ENTITY_REF(%s)\n", (char *)node->name);
+ if (!ctxt->check) {
+ xmlCtxtDumpSpaces(ctxt);
+ fprintf(ctxt->output, "ENTITY_REF(%s)\n",
+ (char *) node->name);
+ }
break;
case XML_ENTITY_NODE:
- fprintf(output, shift);
- fprintf(output, "ENTITY\n");
+ if (!ctxt->check) {
+ xmlCtxtDumpSpaces(ctxt);
+ fprintf(ctxt->output, "ENTITY\n");
+ }
break;
case XML_PI_NODE:
- fprintf(output, shift);
- fprintf(output, "PI %s\n", (char *)node->name);
+ if (!ctxt->check) {
+ xmlCtxtDumpSpaces(ctxt);
+ fprintf(ctxt->output, "PI %s\n", (char *) node->name);
+ }
break;
case XML_COMMENT_NODE:
- fprintf(output, shift);
- fprintf(output, "COMMENT\n");
+ if (!ctxt->check) {
+ xmlCtxtDumpSpaces(ctxt);
+ fprintf(ctxt->output, "COMMENT\n");
+ }
break;
case XML_DOCUMENT_NODE:
case XML_HTML_DOCUMENT_NODE:
- fprintf(output, shift);
- fprintf(output, "Error, DOCUMENT found here\n");
+ if (!ctxt->check) {
+ xmlCtxtDumpSpaces(ctxt);
+ }
+ fprintf(ctxt->output, "PBM: DOCUMENT found here\n");
break;
case XML_DOCUMENT_TYPE_NODE:
- fprintf(output, shift);
- fprintf(output, "DOCUMENT_TYPE\n");
+ if (!ctxt->check) {
+ xmlCtxtDumpSpaces(ctxt);
+ fprintf(ctxt->output, "DOCUMENT_TYPE\n");
+ }
break;
case XML_DOCUMENT_FRAG_NODE:
- fprintf(output, shift);
- fprintf(output, "DOCUMENT_FRAG\n");
+ if (!ctxt->check) {
+ xmlCtxtDumpSpaces(ctxt);
+ fprintf(ctxt->output, "DOCUMENT_FRAG\n");
+ }
break;
case XML_NOTATION_NODE:
- fprintf(output, shift);
- fprintf(output, "NOTATION\n");
+ if (!ctxt->check) {
+ xmlCtxtDumpSpaces(ctxt);
+ fprintf(ctxt->output, "NOTATION\n");
+ }
break;
case XML_DTD_NODE:
- xmlDebugDumpDtdNode(output, (xmlDtdPtr) node, depth);
+ xmlCtxtDumpDtdNode(ctxt, (xmlDtdPtr) node);
return;
case XML_ELEMENT_DECL:
- xmlDebugDumpElemDecl(output, (xmlElementPtr) node, depth);
+ xmlCtxtDumpElemDecl(ctxt, (xmlElementPtr) node);
return;
case XML_ATTRIBUTE_DECL:
- xmlDebugDumpAttrDecl(output, (xmlAttributePtr) node, depth);
+ xmlCtxtDumpAttrDecl(ctxt, (xmlAttributePtr) node);
return;
case XML_ENTITY_DECL:
- xmlDebugDumpEntityDecl(output, (xmlEntityPtr) node, depth);
+ xmlCtxtDumpEntityDecl(ctxt, (xmlEntityPtr) node);
return;
case XML_NAMESPACE_DECL:
- xmlDebugDumpNamespace(output, (xmlNsPtr) node, depth);
+ xmlCtxtDumpNamespace(ctxt, (xmlNsPtr) node);
return;
case XML_XINCLUDE_START:
- fprintf(output, shift);
- fprintf(output, "INCLUDE START\n");
+ if (!ctxt->check) {
+ xmlCtxtDumpSpaces(ctxt);
+ fprintf(ctxt->output, "INCLUDE START\n");
+ }
return;
case XML_XINCLUDE_END:
- fprintf(output, shift);
- fprintf(output, "INCLUDE END\n");
+ if (!ctxt->check) {
+ xmlCtxtDumpSpaces(ctxt);
+ fprintf(ctxt->output, "INCLUDE END\n");
+ }
return;
default:
- fprintf(output, shift);
- fprintf(output, "NODE_%d !!!\n", (char *)node->type);
+ if (!ctxt->check)
+ xmlCtxtDumpSpaces(ctxt);
+ xmlDebugErr2(ctxt, XML_CHECK_UNKNOWN_NODE,
+ "Unknown node type %d\n", node->type);
return;
}
if (node->doc == NULL) {
- fprintf(output, shift);
- fprintf(output, "doc == NULL !!!\n");
+ if (!ctxt->check) {
+ xmlCtxtDumpSpaces(ctxt);
+ }
+ fprintf(ctxt->output, "PBM: doc == NULL !!!\n");
}
+ ctxt->depth++;
if (node->nsDef != NULL)
- xmlDebugDumpNamespaceList(output, node->nsDef, depth + 1);
+ xmlCtxtDumpNamespaceList(ctxt, node->nsDef);
if (node->properties != NULL)
- xmlDebugDumpAttrList(output, node->properties, depth + 1);
+ xmlCtxtDumpAttrList(ctxt, node->properties);
if (node->type != XML_ENTITY_REF_NODE) {
if ((node->type != XML_ELEMENT_NODE) && (node->content != NULL)) {
- shift[2 * i] = shift[2 * i + 1] = ' ';
- shift[2 * i + 2] = shift[2 * i + 3] = 0;
- fprintf(output, shift);
- fprintf(output, "content=");
- xmlDebugDumpString(output, node->content);
- fprintf(output, "\n");
+ if (!ctxt->check) {
+ xmlCtxtDumpSpaces(ctxt);
+ fprintf(ctxt->output, "content=");
+ xmlCtxtDumpString(ctxt, node->content);
+ fprintf(ctxt->output, "\n");
+ }
}
} else {
xmlEntityPtr ent;
ent = xmlGetDocEntity(node->doc, node->name);
if (ent != NULL)
- xmlDebugDumpEntity(output, ent, depth + 1);
+ xmlCtxtDumpEntity(ctxt, ent);
}
+ ctxt->depth--;
+
/*
* Do a bit of checking
*/
- if (node->parent == NULL)
- fprintf(output, "PBM: Node has no parent\n");
- if (node->doc == NULL)
- fprintf(output, "PBM: Node has no doc\n");
- if ((node->parent != NULL) && (node->doc != node->parent->doc))
- fprintf(output, "PBM: Node doc differs from parent's one\n");
- if (node->prev == NULL) {
- if ((node->parent != NULL) && (node->parent->children != node))
- fprintf(output,
- "PBM: Node has no prev and not first of list\n");
- } else {
- if (node->prev->next != node)
- fprintf(output, "PBM: Node prev->next : back link wrong\n");
- }
- if (node->next == NULL) {
- if ((node->parent != NULL) && (node->parent->last != node))
- fprintf(output,
- "PBM: Node has no next and not last of list\n");
- } else {
- if (node->next->prev != node)
- fprintf(output, "PBM: Node next->prev : forward link wrong\n");
- }
+ xmlCtxtGenericNodeCheck(ctxt, node);
}
/**
- * xmlDebugDumpNode:
+ * xmlCtxtDumpNode:
* @output: the FILE * for the output
* @node: the node
* @depth: the indentation level.
*
* Dumps debug information for the element node, it is recursive
*/
-void
-xmlDebugDumpNode(FILE * output, xmlNodePtr node, int depth)
+static void
+xmlCtxtDumpNode(xmlDebugCtxtPtr ctxt, xmlNodePtr node)
{
- if (output == NULL)
- output = stdout;
if (node == NULL) {
- int i;
- char shift[100];
-
- for (i = 0; ((i < depth) && (i < 25)); i++)
- shift[2 * i] = shift[2 * i + 1] = ' ';
- shift[2 * i] = shift[2 * i + 1] = 0;
-
- fprintf(output, shift);
- fprintf(output, "node is NULL\n");
- return;
- }
- xmlDebugDumpOneNode(output, node, depth);
- if ((node->children != NULL) && (node->type != XML_ENTITY_REF_NODE))
- xmlDebugDumpNodeList(output, node->children, depth + 1);
+ if (!ctxt->check) {
+ xmlCtxtDumpSpaces(ctxt);
+ fprintf(ctxt->output, "node is NULL\n");
+ }
+ return;
+ }
+ xmlCtxtDumpOneNode(ctxt, node);
+ if ((node->children != NULL) && (node->type != XML_ENTITY_REF_NODE)) {
+ ctxt->depth++;
+ xmlCtxtDumpNodeList(ctxt, node->children);
+ ctxt->depth--;
+ }
}
/**
- * xmlDebugDumpNodeList:
+ * xmlCtxtDumpNodeList:
* @output: the FILE * for the output
* @node: the node list
* @depth: the indentation level.
*
* Dumps debug information for the list of element node, it is recursive
*/
-void
-xmlDebugDumpNodeList(FILE * output, xmlNodePtr node, int depth)
+static void
+xmlCtxtDumpNodeList(xmlDebugCtxtPtr ctxt, xmlNodePtr node)
{
- if (output == NULL)
- output = stdout;
while (node != NULL) {
- xmlDebugDumpNode(output, node, depth);
+ xmlCtxtDumpNode(ctxt, node);
node = node->next;
}
}
-
-/**
- * xmlDebugDumpDocumentHead:
- * @output: the FILE * for the output
- * @doc: the document
- *
- * Dumps debug information cncerning the document, not recursive
- */
-void
-xmlDebugDumpDocumentHead(FILE * output, xmlDocPtr doc)
+static void
+xmlCtxtDumpDocHead(xmlDebugCtxtPtr ctxt, xmlDocPtr doc)
{
- if (output == NULL)
- output = stdout;
if (doc == NULL) {
- fprintf(output, "DOCUMENT == NULL !\n");
+ if (!ctxt->check)
+ fprintf(ctxt->output, "DOCUMENT == NULL !\n");
return;
}
+ ctxt->node = (xmlNodePtr) doc;
switch (doc->type) {
case XML_ELEMENT_NODE:
- fprintf(output, "Error, ELEMENT found here ");
+ xmlDebugErr(ctxt, XML_CHECK_FOUND_ELEMENT,
+ "Misplaced ELEMENT node\n");
break;
case XML_ATTRIBUTE_NODE:
- fprintf(output, "Error, ATTRIBUTE found here\n");
+ xmlDebugErr(ctxt, XML_CHECK_FOUND_ATTRIBUTE,
+ "Misplaced ATTRIBUTE node\n");
break;
case XML_TEXT_NODE:
- fprintf(output, "Error, TEXT\n");
+ xmlDebugErr(ctxt, XML_CHECK_FOUND_TEXT,
+ "Misplaced TEXT node\n");
break;
case XML_CDATA_SECTION_NODE:
- fprintf(output, "Error, CDATA_SECTION\n");
+ xmlDebugErr(ctxt, XML_CHECK_FOUND_CDATA,
+ "Misplaced CDATA node\n");
break;
case XML_ENTITY_REF_NODE:
- fprintf(output, "Error, ENTITY_REF\n");
+ xmlDebugErr(ctxt, XML_CHECK_FOUND_ENTITYREF,
+ "Misplaced ENTITYREF node\n");
break;
case XML_ENTITY_NODE:
- fprintf(output, "Error, ENTITY\n");
+ xmlDebugErr(ctxt, XML_CHECK_FOUND_ENTITY,
+ "Misplaced ENTITY node\n");
break;
case XML_PI_NODE:
- fprintf(output, "Error, PI\n");
+ xmlDebugErr(ctxt, XML_CHECK_FOUND_PI,
+ "Misplaced PI node\n");
break;
case XML_COMMENT_NODE:
- fprintf(output, "Error, COMMENT\n");
+ xmlDebugErr(ctxt, XML_CHECK_FOUND_COMMENT,
+ "Misplaced COMMENT node\n");
break;
case XML_DOCUMENT_NODE:
- fprintf(output, "DOCUMENT\n");
+ if (!ctxt->check)
+ fprintf(ctxt->output, "DOCUMENT\n");
break;
case XML_HTML_DOCUMENT_NODE:
- fprintf(output, "HTML DOCUMENT\n");
+ if (!ctxt->check)
+ fprintf(ctxt->output, "HTML DOCUMENT\n");
break;
case XML_DOCUMENT_TYPE_NODE:
- fprintf(output, "Error, DOCUMENT_TYPE\n");
+ xmlDebugErr(ctxt, XML_CHECK_FOUND_DOCTYPE,
+ "Misplaced DOCTYPE node\n");
break;
case XML_DOCUMENT_FRAG_NODE:
- fprintf(output, "Error, DOCUMENT_FRAG\n");
+ xmlDebugErr(ctxt, XML_CHECK_FOUND_FRAGMENT,
+ "Misplaced FRAGMENT node\n");
break;
case XML_NOTATION_NODE:
- fprintf(output, "Error, NOTATION\n");
+ xmlDebugErr(ctxt, XML_CHECK_FOUND_NOTATION,
+ "Misplaced NOTATION node\n");
break;
default:
- fprintf(output, "NODE_%d\n", (char *)doc->type);
- }
- if (doc->name != NULL) {
- fprintf(output, "name=");
- xmlDebugDumpString(output, BAD_CAST doc->name);
- fprintf(output, "\n");
- }
- if (doc->version != NULL) {
- fprintf(output, "version=");
- xmlDebugDumpString(output, doc->version);
- fprintf(output, "\n");
- }
- if (doc->encoding != NULL) {
- fprintf(output, "encoding=");
- xmlDebugDumpString(output, doc->encoding);
- fprintf(output, "\n");
- }
- if (doc->URL != NULL) {
- fprintf(output, "URL=");
- xmlDebugDumpString(output, doc->URL);
- fprintf(output, "\n");
- }
- if (doc->standalone)
- fprintf(output, "standalone=true\n");
+ xmlDebugErr2(ctxt, XML_CHECK_UNKNOWN_NODE,
+ "Unknown node type %d\n", doc->type);
+ }
+}
+
+/**
+ * xmlCtxtDumpDocumentHead:
+ * @output: the FILE * for the output
+ * @doc: the document
+ *
+ * Dumps debug information cncerning the document, not recursive
+ */
+static void
+xmlCtxtDumpDocumentHead(xmlDebugCtxtPtr ctxt, xmlDocPtr doc)
+{
+ xmlCtxtDumpDocHead(ctxt, doc);
+ if (!ctxt->check) {
+ if (doc->name != NULL) {
+ fprintf(ctxt->output, "name=");
+ xmlCtxtDumpString(ctxt, BAD_CAST doc->name);
+ fprintf(ctxt->output, "\n");
+ }
+ if (doc->version != NULL) {
+ fprintf(ctxt->output, "version=");
+ xmlCtxtDumpString(ctxt, doc->version);
+ fprintf(ctxt->output, "\n");
+ }
+ if (doc->encoding != NULL) {
+ fprintf(ctxt->output, "encoding=");
+ xmlCtxtDumpString(ctxt, doc->encoding);
+ fprintf(ctxt->output, "\n");
+ }
+ if (doc->URL != NULL) {
+ fprintf(ctxt->output, "URL=");
+ xmlCtxtDumpString(ctxt, doc->URL);
+ fprintf(ctxt->output, "\n");
+ }
+ if (doc->standalone)
+ fprintf(ctxt->output, "standalone=true\n");
+ }
if (doc->oldNs != NULL)
- xmlDebugDumpNamespaceList(output, doc->oldNs, 0);
+ xmlCtxtDumpNamespaceList(ctxt, doc->oldNs);
}
/**
- * xmlDebugDumpDocument:
+ * xmlCtxtDumpDocument:
* @output: the FILE * for the output
* @doc: the document
*
* Dumps debug information for the document, it's recursive
*/
-void
-xmlDebugDumpDocument(FILE * output, xmlDocPtr doc)
+static void
+xmlCtxtDumpDocument(xmlDebugCtxtPtr ctxt, xmlDocPtr doc)
{
- if (output == NULL)
- output = stdout;
if (doc == NULL) {
- fprintf(output, "DOCUMENT == NULL !\n");
+ if (!ctxt->check)
+ fprintf(ctxt->output, "DOCUMENT == NULL !\n");
return;
}
- xmlDebugDumpDocumentHead(output, doc);
+ xmlCtxtDumpDocumentHead(ctxt, doc);
if (((doc->type == XML_DOCUMENT_NODE) ||
- (doc->type == XML_HTML_DOCUMENT_NODE)) && (doc->children != NULL))
- xmlDebugDumpNodeList(output, doc->children, 1);
+ (doc->type == XML_HTML_DOCUMENT_NODE))
+ && (doc->children != NULL)) {
+ ctxt->depth++;
+ xmlCtxtDumpNodeList(ctxt, doc->children);
+ ctxt->depth--;
+ }
+}
+
+static void
+xmlCtxtDumpEntityCallback(xmlEntityPtr cur, xmlDebugCtxtPtr ctxt)
+{
+ if (cur == NULL) {
+ if (!ctxt->check)
+ fprintf(ctxt->output, "Entity is NULL");
+ return;
+ }
+ if (!ctxt->check) {
+ fprintf(ctxt->output, "%s : ", (char *) cur->name);
+ switch (cur->etype) {
+ case XML_INTERNAL_GENERAL_ENTITY:
+ fprintf(ctxt->output, "INTERNAL GENERAL, ");
+ break;
+ case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
+ fprintf(ctxt->output, "EXTERNAL PARSED, ");
+ break;
+ case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
+ fprintf(ctxt->output, "EXTERNAL UNPARSED, ");
+ break;
+ case XML_INTERNAL_PARAMETER_ENTITY:
+ fprintf(ctxt->output, "INTERNAL PARAMETER, ");
+ break;
+ case XML_EXTERNAL_PARAMETER_ENTITY:
+ fprintf(ctxt->output, "EXTERNAL PARAMETER, ");
+ break;
+ default:
+ xmlDebugErr2(ctxt, XML_CHECK_ENTITY_TYPE,
+ "Unknown entity type %d\n", cur->etype);
+ }
+ if (cur->ExternalID != NULL)
+ fprintf(ctxt->output, "ID \"%s\"", (char *) cur->ExternalID);
+ if (cur->SystemID != NULL)
+ fprintf(ctxt->output, "SYSTEM \"%s\"", (char *) cur->SystemID);
+ if (cur->orig != NULL)
+ fprintf(ctxt->output, "\n orig \"%s\"", (char *) cur->orig);
+ if ((cur->type != XML_ELEMENT_NODE) && (cur->content != NULL))
+ fprintf(ctxt->output, "\n content \"%s\"",
+ (char *) cur->content);
+ fprintf(ctxt->output, "\n");
+ }
}
/**
- * xmlDebugDumpDTD:
+ * xmlCtxtDumpEntities:
+ * @output: the FILE * for the output
+ * @doc: the document
+ *
+ * Dumps debug information for all the entities in use by the document
+ */
+static void
+xmlCtxtDumpEntities(xmlDebugCtxtPtr ctxt, xmlDocPtr doc)
+{
+ xmlCtxtDumpDocHead(ctxt, doc);
+ if ((doc->intSubset != NULL) && (doc->intSubset->entities != NULL)) {
+ xmlEntitiesTablePtr table = (xmlEntitiesTablePtr)
+ doc->intSubset->entities;
+
+ if (!ctxt->check)
+ fprintf(ctxt->output, "Entities in internal subset\n");
+ xmlHashScan(table, (xmlHashScanner) xmlCtxtDumpEntityCallback,
+ ctxt);
+ } else
+ fprintf(ctxt->output, "No entities in internal subset\n");
+ if ((doc->extSubset != NULL) && (doc->extSubset->entities != NULL)) {
+ xmlEntitiesTablePtr table = (xmlEntitiesTablePtr)
+ doc->extSubset->entities;
+
+ if (!ctxt->check)
+ fprintf(ctxt->output, "Entities in external subset\n");
+ xmlHashScan(table, (xmlHashScanner) xmlCtxtDumpEntityCallback,
+ ctxt);
+ } else if (!ctxt->check)
+ fprintf(ctxt->output, "No entities in external subset\n");
+}
+
+/**
+ * xmlCtxtDumpDTD:
* @output: the FILE * for the output
* @dtd: the DTD
*
* Dumps debug information for the DTD
*/
-void
-xmlDebugDumpDTD(FILE * output, xmlDtdPtr dtd)
+static void
+xmlCtxtDumpDTD(xmlDebugCtxtPtr ctxt, xmlDtdPtr dtd)
{
- if (output == NULL)
- output = stdout;
if (dtd == NULL) {
- fprintf(output, "DTD is NULL\n");
+ if (!ctxt->check)
+ fprintf(ctxt->output, "DTD is NULL\n");
return;
}
- if (dtd->type != XML_DTD_NODE) {
- fprintf(output, "PBM: not a DTD\n");
- return;
- }
- if (dtd->name != NULL)
- fprintf(output, "DTD(%s)", (char *)dtd->name);
- else
- fprintf(output, "DTD");
- if (dtd->ExternalID != NULL)
- fprintf(output, ", PUBLIC %s", (char *)dtd->ExternalID);
- if (dtd->SystemID != NULL)
- fprintf(output, ", SYSTEM %s", (char *)dtd->SystemID);
- fprintf(output, "\n");
- /*
- * Do a bit of checking
- */
- if ((dtd->parent != NULL) && (dtd->doc != dtd->parent->doc))
- fprintf(output, "PBM: DTD doc differs from parent's one\n");
- if (dtd->prev == NULL) {
- if ((dtd->parent != NULL)
- && (dtd->parent->children != (xmlNodePtr) dtd))
- fprintf(output,
- "PBM: DTD has no prev and not first of list\n");
- } else {
- if (dtd->prev->next != (xmlNodePtr) dtd)
- fprintf(output, "PBM: DTD prev->next : back link wrong\n");
- }
- if (dtd->next == NULL) {
- if ((dtd->parent != NULL)
- && (dtd->parent->last != (xmlNodePtr) dtd))
- fprintf(output, "PBM: DTD has no next and not last of list\n");
- } else {
- if (dtd->next->prev != (xmlNodePtr) dtd)
- fprintf(output, "PBM: DTD next->prev : forward link wrong\n");
- }
+ xmlCtxtDumpDtdNode(ctxt, dtd);
if (dtd->children == NULL)
- fprintf(output, " DTD is empty\n");
- else
- xmlDebugDumpNodeList(output, dtd->children, 1);
+ fprintf(ctxt->output, " DTD is empty\n");
+ else {
+ ctxt->depth++;
+ xmlCtxtDumpNodeList(ctxt, dtd->children);
+ ctxt->depth--;
+ }
}
-static void
-xmlDebugDumpEntityCallback(xmlEntityPtr cur, FILE *output) {
- if (cur == NULL) {
- fprintf(output, "Entity is NULL");
- return;
- }
- fprintf(output, "%s : ", (char *)cur->name);
- switch (cur->etype) {
- case XML_INTERNAL_GENERAL_ENTITY:
- fprintf(output, "INTERNAL GENERAL, ");
- break;
- case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
- fprintf(output, "EXTERNAL PARSED, ");
- break;
- case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
- fprintf(output, "EXTERNAL UNPARSED, ");
- break;
- case XML_INTERNAL_PARAMETER_ENTITY:
- fprintf(output, "INTERNAL PARAMETER, ");
- break;
- case XML_EXTERNAL_PARAMETER_ENTITY:
- fprintf(output, "EXTERNAL PARAMETER, ");
- break;
- default:
- fprintf(output, "UNKNOWN TYPE %d",
- (char *)cur->etype);
+/************************************************************************
+ * *
+ * Public entry points for dump *
+ * *
+ ************************************************************************/
+
+/**
+ * xmlDebugDumpString:
+ * @output: the FILE * for the output
+ * @str: the string
+ *
+ * Dumps informations about the string, shorten it if necessary
+ */
+void
+xmlDebugDumpString(FILE * output, const xmlChar * str)
+{
+ int i;
+
+ if (output == NULL)
+ output = stdout;
+ if (str == NULL) {
+ fprintf(output, "(NULL)");
+ return;
}
- if (cur->ExternalID != NULL)
- fprintf(output, "ID \"%s\"", (char *)cur->ExternalID);
- if (cur->SystemID != NULL)
- fprintf(output, "SYSTEM \"%s\"", (char *)cur->SystemID);
- if (cur->orig != NULL)
- fprintf(output, "\n orig \"%s\"", (char *)cur->orig);
- if ((cur->type != XML_ELEMENT_NODE) &&
- (cur->content != NULL))
- fprintf(output, "\n content \"%s\"", (char *)cur->content);
- fprintf(output, "\n");
+ for (i = 0; i < 40; i++)
+ if (str[i] == 0)
+ return;
+ else if (IS_BLANK_CH(str[i]))
+ fputc(' ', output);
+ else if (str[i] >= 0x80)
+ fprintf(output, "#%X", str[i]);
+ else
+ fputc(str[i], output);
+ fprintf(output, "...");
+}
+
+/**
+ * xmlDebugDumpAttr:
+ * @output: the FILE * for the output
+ * @attr: the attribute
+ * @depth: the indentation level.
+ *
+ * Dumps debug information for the attribute
+ */
+void
+xmlDebugDumpAttr(FILE *output, xmlAttrPtr attr, int depth) {
+ xmlDebugCtxt ctxt;
+
+ xmlCtxtDumpInitCtxt(&ctxt);
+ ctxt.output = output;
+ ctxt.depth = depth;
+ xmlCtxtDumpAttr(&ctxt, attr);
+ xmlCtxtDumpCleanCtxt(&ctxt);
}
+
/**
* xmlDebugDumpEntities:
* @output: the FILE * for the output
@@ -1002,77 +1372,196 @@ xmlDebugDumpEntityCallback(xmlEntityPtr cur, FILE *output) {
void
xmlDebugDumpEntities(FILE * output, xmlDocPtr doc)
{
+ xmlDebugCtxt ctxt;
+
+ xmlCtxtDumpInitCtxt(&ctxt);
+ ctxt.output = output;
+ xmlCtxtDumpEntities(&ctxt, doc);
+ xmlCtxtDumpCleanCtxt(&ctxt);
+}
+
+/**
+ * xmlDebugDumpAttrList:
+ * @output: the FILE * for the output
+ * @attr: the attribute list
+ * @depth: the indentation level.
+ *
+ * Dumps debug information for the attribute list
+ */
+void
+xmlDebugDumpAttrList(FILE * output, xmlAttrPtr attr, int depth)
+{
+ xmlDebugCtxt ctxt;
+
+ xmlCtxtDumpInitCtxt(&ctxt);
+ ctxt.output = output;
+ ctxt.depth = depth;
+ xmlCtxtDumpAttrList(&ctxt, attr);
+ xmlCtxtDumpCleanCtxt(&ctxt);
+}
+
+/**
+ * xmlDebugDumpOneNode:
+ * @output: the FILE * for the output
+ * @node: the node
+ * @depth: the indentation level.
+ *
+ * Dumps debug information for the element node, it is not recursive
+ */
+void
+xmlDebugDumpOneNode(FILE * output, xmlNodePtr node, int depth)
+{
+ xmlDebugCtxt ctxt;
+
+ xmlCtxtDumpInitCtxt(&ctxt);
+ ctxt.output = output;
+ ctxt.depth = depth;
+ xmlCtxtDumpOneNode(&ctxt, node);
+ xmlCtxtDumpCleanCtxt(&ctxt);
+}
+
+/**
+ * xmlDebugDumpNode:
+ * @output: the FILE * for the output
+ * @node: the node
+ * @depth: the indentation level.
+ *
+ * Dumps debug information for the element node, it is recursive
+ */
+void
+xmlDebugDumpNode(FILE * output, xmlNodePtr node, int depth)
+{
+ xmlDebugCtxt ctxt;
+
if (output == NULL)
- output = stdout;
- if (doc == NULL) {
- fprintf(output, "DOCUMENT == NULL !\n");
- return;
- }
+ output = stdout;
+ xmlCtxtDumpInitCtxt(&ctxt);
+ ctxt.output = output;
+ ctxt.depth = depth;
+ xmlCtxtDumpNode(&ctxt, node);
+ xmlCtxtDumpCleanCtxt(&ctxt);
+}
- switch (doc->type) {
- case XML_ELEMENT_NODE:
- fprintf(output, "Error, ELEMENT found here ");
- break;
- case XML_ATTRIBUTE_NODE:
- fprintf(output, "Error, ATTRIBUTE found here\n");
- break;
- case XML_TEXT_NODE:
- fprintf(output, "Error, TEXT\n");
- break;
- case XML_CDATA_SECTION_NODE:
- fprintf(output, "Error, CDATA_SECTION\n");
- break;
- case XML_ENTITY_REF_NODE:
- fprintf(output, "Error, ENTITY_REF\n");
- break;
- case XML_ENTITY_NODE:
- fprintf(output, "Error, ENTITY\n");
- break;
- case XML_PI_NODE:
- fprintf(output, "Error, PI\n");
- break;
- case XML_COMMENT_NODE:
- fprintf(output, "Error, COMMENT\n");
- break;
- case XML_DOCUMENT_NODE:
- fprintf(output, "DOCUMENT\n");
- break;
- case XML_HTML_DOCUMENT_NODE:
- fprintf(output, "HTML DOCUMENT\n");
- break;
- case XML_DOCUMENT_TYPE_NODE:
- fprintf(output, "Error, DOCUMENT_TYPE\n");
- break;
- case XML_DOCUMENT_FRAG_NODE:
- fprintf(output, "Error, DOCUMENT_FRAG\n");
- break;
- case XML_NOTATION_NODE:
- fprintf(output, "Error, NOTATION\n");
- break;
- default:
- fprintf(output, "NODE_%d\n", (char *)doc->type);
- }
- if ((doc->intSubset != NULL) && (doc->intSubset->entities != NULL)) {
- xmlEntitiesTablePtr table = (xmlEntitiesTablePtr)
- doc->intSubset->entities;
+/**
+ * xmlDebugDumpNodeList:
+ * @output: the FILE * for the output
+ * @node: the node list
+ * @depth: the indentation level.
+ *
+ * Dumps debug information for the list of element node, it is recursive
+ */
+void
+xmlDebugDumpNodeList(FILE * output, xmlNodePtr node, int depth)
+{
+ xmlDebugCtxt ctxt;
- fprintf(output, "Entities in internal subset\n");
- xmlHashScan(table, (xmlHashScanner) xmlDebugDumpEntityCallback,
- output);
- } else
- fprintf(output, "No entities in internal subset\n");
- if ((doc->extSubset != NULL) && (doc->extSubset->entities != NULL)) {
- xmlEntitiesTablePtr table = (xmlEntitiesTablePtr)
- doc->extSubset->entities;
+ if (output == NULL)
+ output = stdout;
+ xmlCtxtDumpInitCtxt(&ctxt);
+ ctxt.output = output;
+ ctxt.depth = depth;
+ xmlCtxtDumpNodeList(&ctxt, node);
+ xmlCtxtDumpCleanCtxt(&ctxt);
+}
- fprintf(output, "Entities in external subset\n");
- xmlHashScan(table, (xmlHashScanner) xmlDebugDumpEntityCallback,
- output);
- } else
- fprintf(output, "No entities in external subset\n");
+/**
+ * xmlDebugDumpDocumentHead:
+ * @output: the FILE * for the output
+ * @doc: the document
+ *
+ * Dumps debug information cncerning the document, not recursive
+ */
+void
+xmlDebugDumpDocumentHead(FILE * output, xmlDocPtr doc)
+{
+ xmlDebugCtxt ctxt;
+
+ if (output == NULL)
+ output = stdout;
+ xmlCtxtDumpInitCtxt(&ctxt);
+ ctxt.output = output;
+ xmlCtxtDumpDocumentHead(&ctxt, doc);
+ xmlCtxtDumpCleanCtxt(&ctxt);
}
/**
+ * xmlDebugDumpDocument:
+ * @output: the FILE * for the output
+ * @doc: the document
+ *
+ * Dumps debug information for the document, it's recursive
+ */
+void
+xmlDebugDumpDocument(FILE * output, xmlDocPtr doc)
+{
+ xmlDebugCtxt ctxt;
+
+ if (output == NULL)
+ output = stdout;
+ xmlCtxtDumpInitCtxt(&ctxt);
+ ctxt.output = output;
+ xmlCtxtDumpDocument(&ctxt, doc);
+ xmlCtxtDumpCleanCtxt(&ctxt);
+}
+
+/**
+ * xmlDebugDumpDTD:
+ * @output: the FILE * for the output
+ * @dtd: the DTD
+ *
+ * Dumps debug information for the DTD
+ */
+void
+xmlDebugDumpDTD(FILE * output, xmlDtdPtr dtd)
+{
+ xmlDebugCtxt ctxt;
+
+ if (output == NULL)
+ output = stdout;
+ xmlCtxtDumpInitCtxt(&ctxt);
+ ctxt.output = output;
+ xmlCtxtDumpDTD(&ctxt, dtd);
+ xmlCtxtDumpCleanCtxt(&ctxt);
+}
+
+/************************************************************************
+ * *
+ * Public entry points for checkings *
+ * *
+ ************************************************************************/
+
+/**
+ * xmlDebugCheckDocument:
+ * @output: the FILE * for the output
+ * @doc: the document
+ *
+ * Check the document for potential content problems, and output
+ * the errors to @output
+ *
+ * Returns the number of errors found
+ */
+int
+xmlDebugCheckDocument(FILE * output, xmlDocPtr doc)
+{
+ xmlDebugCtxt ctxt;
+
+ if (output == NULL)
+ output = stdout;
+ xmlCtxtDumpInitCtxt(&ctxt);
+ ctxt.output = output;
+ ctxt.check = 1;
+ xmlCtxtDumpDocument(&ctxt, doc);
+ xmlCtxtDumpCleanCtxt(&ctxt);
+ return(ctxt.errors);
+}
+
+/************************************************************************
+ * *
+ * Helpers for Shell *
+ * *
+ ************************************************************************/
+
+/**
* xmlLsCountNode:
* @node: the node to count
*