Index: third_party/libxml/src/debugXML.c |
diff --git a/third_party/libxml/src/debugXML.c b/third_party/libxml/src/debugXML.c |
index 49b9a13ba5cf0d214d4192023ea76d63b6969e0c..b05fdff527a40eefc9e91d1c548a1a83e4ba9527 100644 |
--- a/third_party/libxml/src/debugXML.c |
+++ b/third_party/libxml/src/debugXML.c |
@@ -85,7 +85,7 @@ xmlCtxtDumpCleanCtxt(xmlDebugCtxtPtr ctxt ATTRIBUTE_UNUSED) |
* |
* Check that a given namespace is in scope on a node. |
* |
- * Returns 1 if in scope, -1 in case of argument error, |
+ * 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. |
*/ |
@@ -254,10 +254,12 @@ xmlCtxtCheckName(xmlDebugCtxtPtr ctxt, const xmlChar * name) |
xmlDebugErr(ctxt, XML_CHECK_NO_NAME, "Name is NULL"); |
return; |
} |
+#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) |
if (xmlValidateName(name, 0)) { |
xmlDebugErr3(ctxt, XML_CHECK_NOT_NCNAME, |
"Name is not an NCName '%s'", (const char *) name); |
} |
+#endif |
if ((ctxt->dict != NULL) && |
(!xmlDictOwns(ctxt->dict, name)) && |
((ctxt->doc == NULL) || |
@@ -311,7 +313,7 @@ xmlCtxtGenericNodeCheck(xmlDebugCtxtPtr ctxt, xmlNodePtr node) { |
(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"); |
@@ -1067,7 +1069,7 @@ xmlCtxtDumpNode(xmlDebugCtxtPtr ctxt, xmlNodePtr node) |
return; |
} |
xmlCtxtDumpOneNode(ctxt, node); |
- if ((node->type != XML_NAMESPACE_DECL) && |
+ if ((node->type != XML_NAMESPACE_DECL) && |
(node->children != NULL) && (node->type != XML_ENTITY_REF_NODE)) { |
ctxt->depth++; |
xmlCtxtDumpNodeList(ctxt, node->children); |
@@ -1602,7 +1604,7 @@ int |
xmlLsCountNode(xmlNodePtr node) { |
int ret = 0; |
xmlNodePtr list = NULL; |
- |
+ |
if (node == NULL) |
return(0); |
@@ -1643,7 +1645,7 @@ xmlLsCountNode(xmlNodePtr node) { |
ret = 1; |
break; |
} |
- for (;list != NULL;ret++) |
+ for (;list != NULL;ret++) |
list = list->next; |
return(ret); |
} |
@@ -1711,11 +1713,11 @@ xmlLsOneNode(FILE *output, xmlNodePtr node) { |
if (node->type != XML_NAMESPACE_DECL) { |
if (node->properties != NULL) |
fprintf(output, "a"); |
- else |
+ else |
fprintf(output, "-"); |
- if (node->nsDef != NULL) |
+ if (node->nsDef != NULL) |
fprintf(output, "n"); |
- else |
+ else |
fprintf(output, "-"); |
} |
@@ -1723,8 +1725,11 @@ xmlLsOneNode(FILE *output, xmlNodePtr node) { |
switch (node->type) { |
case XML_ELEMENT_NODE: |
- if (node->name != NULL) |
+ if (node->name != NULL) { |
+ if ((node->ns != NULL) && (node->ns->prefix != NULL)) |
+ fprintf(output, "%s:", node->ns->prefix); |
fprintf(output, "%s", (const char *) node->name); |
+ } |
break; |
case XML_ATTRIBUTE_NODE: |
if (node->name != NULL) |
@@ -1782,7 +1787,7 @@ xmlLsOneNode(FILE *output, xmlNodePtr node) { |
* xmlBoolToText: |
* @boolval: a bool to turn into text |
* |
- * Convenient way to turn bool into text |
+ * Convenient way to turn bool into text |
* |
* Returns a pointer to either "True" or "False" |
*/ |
@@ -1798,7 +1803,7 @@ xmlBoolToText(int boolval) |
#ifdef LIBXML_XPATH_ENABLED |
/**************************************************************** |
* * |
- * The XML shell related functions * |
+ * The XML shell related functions * |
* * |
****************************************************************/ |
@@ -2049,7 +2054,7 @@ xmlShellBase(xmlShellCtxtPtr ctxt, |
if (node == NULL) { |
fprintf(ctxt->output, "NULL\n"); |
return (0); |
- } |
+ } |
base = xmlNodeGetBase(node->doc, node); |
@@ -2276,7 +2281,7 @@ xmlShellDir(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED, |
if (node == NULL) { |
fprintf(ctxt->output, "NULL\n"); |
return (0); |
- } |
+ } |
if ((node->type == XML_DOCUMENT_NODE) || |
(node->type == XML_HTML_DOCUMENT_NODE)) { |
xmlDebugDumpDocumentHead(ctxt->output, (xmlDocPtr) node); |
@@ -2411,7 +2416,7 @@ xmlShellCat(xmlShellCtxtPtr ctxt, char *arg ATTRIBUTE_UNUSED, |
if (node == NULL) { |
fprintf(ctxt->output, "NULL\n"); |
return (0); |
- } |
+ } |
if (ctxt->doc->type == XML_HTML_DOCUMENT_NODE) { |
#ifdef LIBXML_HTML_ENABLED |
if (node->type == XML_HTML_DOCUMENT_NODE) |
@@ -2695,6 +2700,8 @@ xmlShellDu(xmlShellCtxtPtr ctxt, |
} else if (node->type == XML_ELEMENT_NODE) { |
for (i = 0; i < indent; i++) |
fprintf(ctxt->output, " "); |
+ if ((node->ns) && (node->ns->prefix)) |
+ fprintf(ctxt->output, "%s:", node->ns->prefix); |
fprintf(ctxt->output, "%s\n", node->name); |
} else { |
} |
@@ -2747,7 +2754,7 @@ xmlShellDu(xmlShellCtxtPtr ctxt, |
* xmlShellPwd: |
* @ctxt: the shell context |
* @buffer: the output buffer |
- * @node: a node |
+ * @node: a node |
* @node2: unused |
* |
* Implements the XML shell function "pwd" |
@@ -2792,7 +2799,7 @@ xmlShellPwd(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED, char *buffer, |
* @input: the line reading function |
* @output: the output FILE*, defaults to stdout if NULL |
* |
- * Implements the XML shell |
+ * Implements the XML shell |
* This allow to load, validate, view, modify and save a document |
* using a environment similar to a UNIX commandline. |
*/ |
@@ -2836,6 +2843,10 @@ xmlShell(xmlDocPtr doc, char *filename, xmlShellReadlineFunc input, |
while (1) { |
if (ctxt->node == (xmlNodePtr) ctxt->doc) |
snprintf(prompt, sizeof(prompt), "%s > ", "/"); |
+ else if ((ctxt->node != NULL) && (ctxt->node->name) && |
+ (ctxt->node->ns) && (ctxt->node->ns->prefix)) |
+ snprintf(prompt, sizeof(prompt), "%s:%s > ", |
+ (ctxt->node->ns->prefix), ctxt->node->name); |
else if ((ctxt->node != NULL) && (ctxt->node->name)) |
snprintf(prompt, sizeof(prompt), "%s > ", ctxt->node->name); |
else |
@@ -2910,6 +2921,7 @@ xmlShell(xmlDocPtr doc, char *filename, xmlShellReadlineFunc input, |
fprintf(ctxt->output, "\t the default namespace if any uses 'defaultns' prefix\n"); |
#endif /* LIBXML_XPATH_ENABLED */ |
fprintf(ctxt->output, "\tpwd display current working directory\n"); |
+ fprintf(ctxt->output, "\twhereis display absolute path of [path] or current working directory\n"); |
fprintf(ctxt->output, "\tquit leave shell\n"); |
#ifdef LIBXML_OUTPUT_ENABLED |
fprintf(ctxt->output, "\tsave [name] save this document to name or the original name\n"); |
@@ -2936,11 +2948,11 @@ xmlShell(xmlDocPtr doc, char *filename, xmlShellReadlineFunc input, |
} else if (!strcmp(command, "save")) { |
xmlShellSave(ctxt, arg, NULL, NULL); |
} else if (!strcmp(command, "write")) { |
- if ((arg == NULL) || (arg[0] == 0)) |
+ if (arg[0] == 0) |
xmlGenericError(xmlGenericErrorContext, |
"Write command requires a filename argument\n"); |
else |
- xmlShellWrite(ctxt, arg, NULL, NULL); |
+ xmlShellWrite(ctxt, arg, ctxt->node, NULL); |
#endif /* LIBXML_OUTPUT_ENABLED */ |
} else if (!strcmp(command, "grep")) { |
xmlShellGrep(ctxt, arg, ctxt->node, NULL); |
@@ -2959,7 +2971,79 @@ xmlShell(xmlDocPtr doc, char *filename, xmlShellReadlineFunc input, |
if (!xmlShellPwd(ctxt, dir, ctxt->node, NULL)) |
fprintf(ctxt->output, "%s\n", dir); |
} else if (!strcmp(command, "du")) { |
- xmlShellDu(ctxt, NULL, ctxt->node, NULL); |
+ if (arg[0] == 0) { |
+ xmlShellDu(ctxt, NULL, ctxt->node, NULL); |
+ } else { |
+ ctxt->pctxt->node = ctxt->node; |
+#ifdef LIBXML_XPATH_ENABLED |
+ ctxt->pctxt->node = ctxt->node; |
+ list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt); |
+#else |
+ list = NULL; |
+#endif /* LIBXML_XPATH_ENABLED */ |
+ if (list != NULL) { |
+ switch (list->type) { |
+ case XPATH_UNDEFINED: |
+ xmlGenericError(xmlGenericErrorContext, |
+ "%s: no such node\n", arg); |
+ break; |
+ case XPATH_NODESET:{ |
+ int indx; |
+ |
+ if (list->nodesetval == NULL) |
+ break; |
+ |
+ for (indx = 0; |
+ indx < list->nodesetval->nodeNr; |
+ indx++) |
+ xmlShellDu(ctxt, NULL, |
+ list->nodesetval-> |
+ nodeTab[indx], NULL); |
+ break; |
+ } |
+ case XPATH_BOOLEAN: |
+ xmlGenericError(xmlGenericErrorContext, |
+ "%s is a Boolean\n", arg); |
+ break; |
+ case XPATH_NUMBER: |
+ xmlGenericError(xmlGenericErrorContext, |
+ "%s is a number\n", arg); |
+ break; |
+ case XPATH_STRING: |
+ xmlGenericError(xmlGenericErrorContext, |
+ "%s is a string\n", arg); |
+ break; |
+ case XPATH_POINT: |
+ xmlGenericError(xmlGenericErrorContext, |
+ "%s is a point\n", arg); |
+ break; |
+ case XPATH_RANGE: |
+ xmlGenericError(xmlGenericErrorContext, |
+ "%s is a range\n", arg); |
+ break; |
+ case XPATH_LOCATIONSET: |
+ xmlGenericError(xmlGenericErrorContext, |
+ "%s is a range\n", arg); |
+ break; |
+ case XPATH_USERS: |
+ xmlGenericError(xmlGenericErrorContext, |
+ "%s is user-defined\n", arg); |
+ break; |
+ case XPATH_XSLT_TREE: |
+ xmlGenericError(xmlGenericErrorContext, |
+ "%s is an XSLT value tree\n", |
+ arg); |
+ break; |
+ } |
+#ifdef LIBXML_XPATH_ENABLED |
+ xmlXPathFreeObject(list); |
+#endif |
+ } else { |
+ xmlGenericError(xmlGenericErrorContext, |
+ "%s: no such node\n", arg); |
+ } |
+ ctxt->pctxt->node = NULL; |
+ } |
} else if (!strcmp(command, "base")) { |
xmlShellBase(ctxt, NULL, ctxt->node, NULL); |
} else if (!strcmp(command, "set")) { |
@@ -3077,12 +3161,94 @@ xmlShell(xmlDocPtr doc, char *filename, xmlShellReadlineFunc input, |
} |
ctxt->pctxt->node = NULL; |
} |
+ } else if (!strcmp(command, "whereis")) { |
+ char dir[500]; |
+ |
+ if (arg[0] == 0) { |
+ if (!xmlShellPwd(ctxt, dir, ctxt->node, NULL)) |
+ fprintf(ctxt->output, "%s\n", dir); |
+ } else { |
+ ctxt->pctxt->node = ctxt->node; |
+#ifdef LIBXML_XPATH_ENABLED |
+ list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt); |
+#else |
+ list = NULL; |
+#endif /* LIBXML_XPATH_ENABLED */ |
+ if (list != NULL) { |
+ switch (list->type) { |
+ case XPATH_UNDEFINED: |
+ xmlGenericError(xmlGenericErrorContext, |
+ "%s: no such node\n", arg); |
+ break; |
+ case XPATH_NODESET:{ |
+ int indx; |
+ |
+ if (list->nodesetval == NULL) |
+ break; |
+ |
+ for (indx = 0; |
+ indx < list->nodesetval->nodeNr; |
+ indx++) { |
+ if (!xmlShellPwd(ctxt, dir, list->nodesetval-> |
+ nodeTab[indx], NULL)) |
+ fprintf(ctxt->output, "%s\n", dir); |
+ } |
+ break; |
+ } |
+ case XPATH_BOOLEAN: |
+ xmlGenericError(xmlGenericErrorContext, |
+ "%s is a Boolean\n", arg); |
+ break; |
+ case XPATH_NUMBER: |
+ xmlGenericError(xmlGenericErrorContext, |
+ "%s is a number\n", arg); |
+ break; |
+ case XPATH_STRING: |
+ xmlGenericError(xmlGenericErrorContext, |
+ "%s is a string\n", arg); |
+ break; |
+ case XPATH_POINT: |
+ xmlGenericError(xmlGenericErrorContext, |
+ "%s is a point\n", arg); |
+ break; |
+ case XPATH_RANGE: |
+ xmlGenericError(xmlGenericErrorContext, |
+ "%s is a range\n", arg); |
+ break; |
+ case XPATH_LOCATIONSET: |
+ xmlGenericError(xmlGenericErrorContext, |
+ "%s is a range\n", arg); |
+ break; |
+ case XPATH_USERS: |
+ xmlGenericError(xmlGenericErrorContext, |
+ "%s is user-defined\n", arg); |
+ break; |
+ case XPATH_XSLT_TREE: |
+ xmlGenericError(xmlGenericErrorContext, |
+ "%s is an XSLT value tree\n", |
+ arg); |
+ break; |
+ } |
+#ifdef LIBXML_XPATH_ENABLED |
+ xmlXPathFreeObject(list); |
+#endif |
+ } else { |
+ xmlGenericError(xmlGenericErrorContext, |
+ "%s: no such node\n", arg); |
+ } |
+ ctxt->pctxt->node = NULL; |
+ } |
} else if (!strcmp(command, "cd")) { |
if (arg[0] == 0) { |
ctxt->node = (xmlNodePtr) ctxt->doc; |
} else { |
#ifdef LIBXML_XPATH_ENABLED |
+ int l; |
+ |
ctxt->pctxt->node = ctxt->node; |
+ l = strlen(arg); |
+ if ((l >= 2) && (arg[l - 1] == '/')) |
+ arg[l - 1] = 0; |
list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt); |
#else |
list = NULL; |