2001-02-23 20:55:21 +03:00
/*
* debugXML . c : This is a set of routines used for debugging the tree
* produced by the XML parser .
*
* See Copyright for the status of this software .
*
2001-06-24 16:13:24 +04:00
* Daniel Veillard < daniel @ veillard . com >
2001-02-23 20:55:21 +03:00
*/
2002-03-18 22:37:11 +03:00
# define IN_LIBXML
2001-04-21 20:57:29 +04:00
# include "libxml.h"
2001-02-23 20:55:21 +03:00
# ifdef LIBXML_DEBUG_ENABLED
# include <string.h>
# ifdef HAVE_STDLIB_H
# include <stdlib.h>
# endif
# ifdef HAVE_STRING_H
# include <string.h>
# endif
# include <libxml/xmlmemory.h>
# include <libxml/tree.h>
# include <libxml/parser.h>
2001-08-01 19:53:47 +04:00
# include <libxml/parserInternals.h>
2001-02-23 20:55:21 +03:00
# include <libxml/valid.h>
# include <libxml/debugXML.h>
# include <libxml/HTMLtree.h>
# include <libxml/HTMLparser.h>
# include <libxml/xmlerror.h>
2001-10-17 19:58:35 +04:00
# include <libxml/globals.h>
2002-02-10 16:20:39 +03:00
# include <libxml/xpathInternals.h>
2001-02-23 20:55:21 +03:00
2001-07-18 23:30:27 +04:00
/**
* 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 )
{
2001-02-23 20:55:21 +03:00
int i ;
2001-07-18 23:30:27 +04:00
2002-02-07 19:39:11 +03:00
if ( output = = NULL )
output = stdout ;
2001-02-23 20:55:21 +03:00
if ( str = = NULL ) {
2001-07-18 23:30:27 +04:00
fprintf ( output , " (NULL) " ) ;
return ;
2001-02-23 20:55:21 +03:00
}
2001-07-18 23:30:27 +04:00
for ( i = 0 ; i < 40 ; i + + )
if ( str [ i ] = = 0 )
return ;
else if ( IS_BLANK ( str [ i ] ) )
fputc ( ' ' , output ) ;
else if ( str [ i ] > = 0x80 )
fprintf ( output , " #%X " , str [ i ] ) ;
else
fputc ( str [ i ] , output ) ;
2001-02-23 20:55:21 +03:00
fprintf ( output , " ... " ) ;
}
2001-03-24 20:00:36 +03:00
static void
xmlDebugDumpDtdNode ( FILE * output , xmlDtdPtr dtd , int depth ) {
2001-02-23 20:55:21 +03:00
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 ) ;
2002-01-23 00:44:25 +03:00
if ( dtd = = NULL ) {
fprintf ( output , " DTD node is NULL \n " ) ;
return ;
}
2001-02-23 20:55:21 +03:00
if ( dtd - > type ! = XML_DTD_NODE ) {
fprintf ( output , " PBM: not a DTD \n " ) ;
return ;
}
if ( dtd - > name ! = NULL )
fprintf ( output , " DTD(%s) " , dtd - > name ) ;
else
fprintf ( output , " DTD " ) ;
if ( dtd - > ExternalID ! = NULL )
fprintf ( output , " , PUBLIC %s " , dtd - > ExternalID ) ;
if ( dtd - > SystemID ! = NULL )
fprintf ( output , " , SYSTEM %s " , dtd - > SystemID ) ;
fprintf ( output , " \n " ) ;
/*
* Do a bit of checking
*/
if ( dtd - > parent = = NULL )
2001-12-31 19:16:02 +03:00
fprintf ( output , " PBM: DTD has no parent \n " ) ;
2001-02-23 20:55:21 +03:00
if ( dtd - > doc = = NULL )
2001-12-31 19:16:02 +03:00
fprintf ( output , " PBM: DTD has no doc \n " ) ;
2001-02-23 20:55:21 +03:00
if ( ( dtd - > parent ! = NULL ) & & ( dtd - > doc ! = dtd - > parent - > doc ) )
2001-12-31 19:16:02 +03:00
fprintf ( output , " PBM: DTD doc differs from parent's one \n " ) ;
2001-02-23 20:55:21 +03:00
if ( dtd - > prev = = NULL ) {
if ( ( dtd - > parent ! = NULL ) & & ( dtd - > parent - > children ! = ( xmlNodePtr ) dtd ) )
2001-12-31 19:16:02 +03:00
fprintf ( output , " PBM: DTD has no prev and not first of list \n " ) ;
2001-02-23 20:55:21 +03:00
} else {
if ( dtd - > prev - > next ! = ( xmlNodePtr ) dtd )
2001-12-31 19:16:02 +03:00
fprintf ( output , " PBM: DTD prev->next : back link wrong \n " ) ;
2001-02-23 20:55:21 +03:00
}
if ( dtd - > next = = NULL ) {
if ( ( dtd - > parent ! = NULL ) & & ( dtd - > parent - > last ! = ( xmlNodePtr ) dtd ) )
2001-12-31 19:16:02 +03:00
fprintf ( output , " PBM: DTD has no next and not last of list \n " ) ;
2001-02-23 20:55:21 +03:00
} else {
if ( dtd - > next - > prev ! = ( xmlNodePtr ) dtd )
2001-12-31 19:16:02 +03:00
fprintf ( output , " PBM: DTD next->prev : forward link wrong \n " ) ;
2001-02-23 20:55:21 +03:00
}
}
2001-03-24 20:00:36 +03:00
static void
xmlDebugDumpAttrDecl ( FILE * output , xmlAttributePtr attr , int depth ) {
2001-02-23 20:55:21 +03:00
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 ) ;
2002-01-23 00:44:25 +03:00
if ( attr = = NULL ) {
fprintf ( output , " Attribute declaration is NULL \n " ) ;
return ;
}
2001-02-23 20:55:21 +03:00
if ( attr - > type ! = XML_ATTRIBUTE_DECL ) {
fprintf ( output , " PBM: not a Attr \n " ) ;
return ;
}
if ( attr - > name ! = NULL )
fprintf ( output , " ATTRDECL(%s) " , attr - > name ) ;
else
fprintf ( output , " PBM ATTRDECL noname!!! " ) ;
if ( attr - > elem ! = NULL )
fprintf ( output , " for %s " , 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 " ) ;
break ;
case XML_ATTRIBUTE_ENTITIES :
fprintf ( output , " ENTITIES " ) ;
break ;
case XML_ATTRIBUTE_NMTOKEN :
fprintf ( output , " NMTOKEN " ) ;
break ;
case XML_ATTRIBUTE_NMTOKENS :
fprintf ( output , " NMTOKENS " ) ;
break ;
case XML_ATTRIBUTE_ENUMERATION :
fprintf ( output , " ENUMERATION " ) ;
break ;
case XML_ATTRIBUTE_NOTATION :
fprintf ( output , " NOTATION " ) ;
break ;
}
if ( attr - > tree ! = NULL ) {
2001-03-24 20:00:36 +03:00
int indx ;
2001-02-23 20:55:21 +03:00
xmlEnumerationPtr cur = attr - > tree ;
2001-03-24 20:00:36 +03:00
for ( indx = 0 ; indx < 5 ; indx + + ) {
if ( indx ! = 0 )
2001-02-23 20:55:21 +03:00
fprintf ( output , " |%s " , cur - > name ) ;
else
fprintf ( output , " (%s " , cur - > name ) ;
cur = cur - > next ;
if ( cur = = NULL ) break ;
}
if ( cur = = NULL )
fprintf ( output , " ) " ) ;
else
fprintf ( output , " ...) " ) ;
}
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 ;
}
if ( attr - > defaultValue ! = NULL ) {
fprintf ( output , " \" " ) ;
xmlDebugDumpString ( output , attr - > defaultValue ) ;
fprintf ( output , " \" " ) ;
}
2001-11-22 21:20:37 +03:00
fprintf ( output , " \n " ) ;
2001-02-23 20:55:21 +03:00
/*
* 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 " ) ;
}
}
2001-03-24 20:00:36 +03:00
static void
xmlDebugDumpElemDecl ( FILE * output , xmlElementPtr elem , int depth ) {
2001-02-23 20:55:21 +03:00
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 ) ;
2002-01-23 00:44:25 +03:00
if ( elem = = NULL ) {
fprintf ( output , " Element declaration is NULL \n " ) ;
return ;
}
2001-02-23 20:55:21 +03:00
if ( elem - > type ! = XML_ELEMENT_DECL ) {
fprintf ( output , " PBM: not a Elem \n " ) ;
return ;
}
if ( elem - > name ! = NULL ) {
fprintf ( output , " ELEMDECL( " ) ;
xmlDebugDumpString ( output , elem - > name ) ;
fprintf ( output , " ) " ) ;
} else
fprintf ( output , " PBM ELEMDECL noname!!! " ) ;
switch ( elem - > etype ) {
2001-04-18 17:09:01 +04:00
case XML_ELEMENT_TYPE_UNDEFINED :
fprintf ( output , " , UNDEFINED " ) ;
break ;
2001-02-23 20:55:21 +03:00
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 ;
}
2001-07-12 05:20:08 +04:00
if ( ( elem - > type ! = XML_ELEMENT_NODE ) & &
( elem - > content ! = NULL ) ) {
2001-02-23 20:55:21 +03:00
char buf [ 5001 ] ;
buf [ 0 ] = 0 ;
2001-08-15 16:06:36 +04:00
xmlSnprintfElementContent ( buf , 5000 , elem - > content , 1 ) ;
2001-02-23 20:55:21 +03:00
buf [ 5000 ] = 0 ;
fprintf ( output , " %s " , buf ) ;
}
2001-11-22 21:20:37 +03:00
fprintf ( output , " \n " ) ;
2001-02-23 20:55:21 +03:00
/*
* 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 " ) ;
}
}
2001-03-24 20:00:36 +03:00
static void
xmlDebugDumpEntityDecl ( FILE * output , xmlEntityPtr ent , int depth ) {
2001-02-23 20:55:21 +03:00
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 ) ;
2002-01-23 00:44:25 +03:00
if ( ent = = NULL ) {
fprintf ( output , " Entity declaration is NULL \n " ) ;
return ;
}
2001-02-23 20:55:21 +03:00
if ( ent - > type ! = XML_ENTITY_DECL ) {
fprintf ( output , " PBM: not a Entity decl \n " ) ;
return ;
}
if ( ent - > name ! = NULL ) {
fprintf ( output , " ENTITYDECL( " ) ;
xmlDebugDumpString ( output , ent - > name ) ;
fprintf ( 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 " , ent - > ExternalID ) ;
}
if ( ent - > SystemID ) {
fprintf ( output , shift ) ;
fprintf ( output , " SystemID=%s \n " , ent - > SystemID ) ;
}
if ( ent - > URI ! = NULL ) {
fprintf ( output , shift ) ;
fprintf ( output , " URI=%s \n " , ent - > URI ) ;
}
if ( ent - > content ) {
fprintf ( output , shift ) ;
fprintf ( output , " content= " ) ;
xmlDebugDumpString ( output , ent - > content ) ;
fprintf ( 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 " ) ;
}
}
2001-03-24 20:00:36 +03:00
static void
xmlDebugDumpNamespace ( FILE * output , xmlNsPtr ns , int depth ) {
2001-02-23 20:55:21 +03:00
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 ) ;
2002-01-23 00:44:25 +03:00
if ( ns = = NULL ) {
fprintf ( output , " namespace node is NULL \n " ) ;
return ;
}
2001-02-23 20:55:21 +03:00
if ( ns - > type ! = XML_NAMESPACE_DECL ) {
fprintf ( output , " invalid namespace node %d \n " , ns - > type ) ;
return ;
}
if ( ns - > href = = NULL ) {
if ( ns - > prefix ! = NULL )
fprintf ( output , " incomplete namespace %s href=NULL \n " , ns - > prefix ) ;
else
fprintf ( output , " incomplete default namespace href=NULL \n " ) ;
} else {
if ( ns - > prefix ! = NULL )
fprintf ( output , " namespace %s href= " , ns - > prefix ) ;
else
fprintf ( output , " default namespace href= " ) ;
xmlDebugDumpString ( output , ns - > href ) ;
fprintf ( output , " \n " ) ;
}
}
2001-03-24 20:00:36 +03:00
static void
xmlDebugDumpNamespaceList ( FILE * output , xmlNsPtr ns , int depth ) {
2001-02-23 20:55:21 +03:00
while ( ns ! = NULL ) {
xmlDebugDumpNamespace ( output , ns , depth ) ;
ns = ns - > next ;
}
}
2001-03-24 20:00:36 +03:00
static void
xmlDebugDumpEntity ( FILE * output , xmlEntityPtr ent , int depth ) {
2001-02-23 20:55:21 +03:00
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 ) ;
2002-01-23 00:44:25 +03:00
if ( ent = = NULL ) {
fprintf ( output , " Entity is NULL \n " ) ;
return ;
}
2001-02-23 20:55:21 +03:00
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 ! " , ent - > etype ) ;
}
fprintf ( output , " %s \n " , ent - > name ) ;
if ( ent - > ExternalID ) {
fprintf ( output , shift ) ;
fprintf ( output , " ExternalID=%s \n " , ent - > ExternalID ) ;
}
if ( ent - > SystemID ) {
fprintf ( output , shift ) ;
fprintf ( output , " SystemID=%s \n " , ent - > SystemID ) ;
}
if ( ent - > URI ) {
fprintf ( output , shift ) ;
fprintf ( output , " URI=%s \n " , ent - > URI ) ;
}
if ( ent - > content ) {
fprintf ( output , shift ) ;
fprintf ( output , " content= " ) ;
xmlDebugDumpString ( output , ent - > content ) ;
fprintf ( output , " \n " ) ;
}
}
2001-07-18 23:30:27 +04:00
/**
* 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 ) {
2001-02-23 20:55:21 +03:00
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 ) ;
2002-01-23 00:44:25 +03:00
if ( attr = = NULL ) {
fprintf ( output , " Attr is NULL " ) ;
return ;
}
2001-02-23 20:55:21 +03:00
fprintf ( output , " ATTRIBUTE " ) ;
xmlDebugDumpString ( output , attr - > name ) ;
fprintf ( output , " \n " ) ;
if ( attr - > children ! = NULL )
xmlDebugDumpNodeList ( output , attr - > children , depth + 1 ) ;
/*
* 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 " ) ;
}
}
2001-07-18 23:30:27 +04:00
/**
* 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 )
{
2002-02-07 19:39:11 +03:00
if ( output = = NULL )
output = stdout ;
2001-02-23 20:55:21 +03:00
while ( attr ! = NULL ) {
xmlDebugDumpAttr ( output , attr , depth ) ;
2001-07-18 23:30:27 +04:00
attr = attr - > next ;
2001-02-23 20:55:21 +03:00
}
}
2001-07-18 23:30:27 +04:00
/**
* 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 )
{
2001-02-23 20:55:21 +03:00
int i ;
char shift [ 100 ] ;
2002-02-07 19:39:11 +03:00
if ( output = = NULL )
output = stdout ;
2001-07-18 23:30:27 +04:00
for ( i = 0 ; ( ( i < depth ) & & ( i < 25 ) ) ; i + + )
2001-02-23 20:55:21 +03:00
shift [ 2 * i ] = shift [ 2 * i + 1 ] = ' ' ;
shift [ 2 * i ] = shift [ 2 * i + 1 ] = 0 ;
2002-01-23 00:44:25 +03:00
if ( node = = NULL ) {
fprintf ( output , shift ) ;
fprintf ( output , " node is NULL \n " ) ;
return ;
}
2001-02-23 20:55:21 +03:00
switch ( node - > type ) {
2001-07-18 23:30:27 +04:00
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 , " : " ) ;
}
xmlDebugDumpString ( output , node - > name ) ;
fprintf ( output , " \n " ) ;
break ;
case XML_ATTRIBUTE_NODE :
fprintf ( output , shift ) ;
fprintf ( output , " Error, ATTRIBUTE found here \n " ) ;
break ;
case XML_TEXT_NODE :
fprintf ( output , shift ) ;
2001-10-12 02:55:55 +04:00
if ( node - > name = = ( const xmlChar * ) xmlStringTextNoenc )
2001-08-01 19:53:47 +04:00
fprintf ( output , " TEXT no enc \n " ) ;
else
fprintf ( output , " TEXT \n " ) ;
2001-07-18 23:30:27 +04:00
break ;
case XML_CDATA_SECTION_NODE :
fprintf ( output , shift ) ;
fprintf ( output , " CDATA_SECTION \n " ) ;
break ;
case XML_ENTITY_REF_NODE :
fprintf ( output , shift ) ;
fprintf ( output , " ENTITY_REF(%s) \n " , node - > name ) ;
break ;
case XML_ENTITY_NODE :
fprintf ( output , shift ) ;
fprintf ( output , " ENTITY \n " ) ;
break ;
case XML_PI_NODE :
fprintf ( output , shift ) ;
fprintf ( output , " PI %s \n " , node - > name ) ;
break ;
case XML_COMMENT_NODE :
fprintf ( output , shift ) ;
fprintf ( output , " COMMENT \n " ) ;
break ;
case XML_DOCUMENT_NODE :
case XML_HTML_DOCUMENT_NODE :
fprintf ( output , shift ) ;
fprintf ( output , " Error, DOCUMENT found here \n " ) ;
break ;
case XML_DOCUMENT_TYPE_NODE :
fprintf ( output , shift ) ;
fprintf ( output , " DOCUMENT_TYPE \n " ) ;
break ;
case XML_DOCUMENT_FRAG_NODE :
fprintf ( output , shift ) ;
fprintf ( output , " DOCUMENT_FRAG \n " ) ;
break ;
case XML_NOTATION_NODE :
fprintf ( output , shift ) ;
fprintf ( output , " NOTATION \n " ) ;
break ;
case XML_DTD_NODE :
xmlDebugDumpDtdNode ( output , ( xmlDtdPtr ) node , depth ) ;
return ;
case XML_ELEMENT_DECL :
xmlDebugDumpElemDecl ( output , ( xmlElementPtr ) node , depth ) ;
return ;
case XML_ATTRIBUTE_DECL :
xmlDebugDumpAttrDecl ( output , ( xmlAttributePtr ) node , depth ) ;
return ;
2001-02-23 20:55:21 +03:00
case XML_ENTITY_DECL :
2001-07-18 23:30:27 +04:00
xmlDebugDumpEntityDecl ( output , ( xmlEntityPtr ) node , depth ) ;
return ;
2001-02-23 20:55:21 +03:00
case XML_NAMESPACE_DECL :
2001-07-18 23:30:27 +04:00
xmlDebugDumpNamespace ( output , ( xmlNsPtr ) node , depth ) ;
return ;
2001-02-23 20:55:21 +03:00
case XML_XINCLUDE_START :
2001-07-18 23:30:27 +04:00
fprintf ( output , shift ) ;
fprintf ( output , " INCLUDE START \n " ) ;
return ;
2001-02-23 20:55:21 +03:00
case XML_XINCLUDE_END :
2001-07-18 23:30:27 +04:00
fprintf ( output , shift ) ;
fprintf ( output , " INCLUDE END \n " ) ;
return ;
default :
fprintf ( output , shift ) ;
fprintf ( output , " NODE_%d !!! \n " , node - > type ) ;
return ;
2001-02-23 20:55:21 +03:00
}
if ( node - > doc = = NULL ) {
fprintf ( output , shift ) ;
2001-07-18 23:30:27 +04:00
fprintf ( output , " doc == NULL !!! \n " ) ;
2001-02-23 20:55:21 +03:00
}
2001-07-18 23:30:27 +04:00
if ( node - > nsDef ! = NULL )
2001-02-23 20:55:21 +03:00
xmlDebugDumpNamespaceList ( output , node - > nsDef , depth + 1 ) ;
if ( node - > properties ! = NULL )
2001-07-18 23:30:27 +04:00
xmlDebugDumpAttrList ( output , node - > properties , depth + 1 ) ;
2001-02-23 20:55:21 +03:00
if ( node - > type ! = XML_ENTITY_REF_NODE ) {
2001-07-18 23:30:27 +04:00
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 " ) ;
}
2001-02-23 20:55:21 +03:00
} else {
xmlEntityPtr ent ;
2001-07-18 23:30:27 +04:00
ent = xmlGetDocEntity ( node - > doc , node - > name ) ;
if ( ent ! = NULL )
xmlDebugDumpEntity ( output , ent , depth + 1 ) ;
2001-02-23 20:55:21 +03:00
}
/*
* Do a bit of checking
*/
if ( node - > parent = = NULL )
2001-07-18 23:30:27 +04:00
fprintf ( output , " PBM: Node has no parent \n " ) ;
2001-02-23 20:55:21 +03:00
if ( node - > doc = = NULL )
2001-07-18 23:30:27 +04:00
fprintf ( output , " PBM: Node has no doc \n " ) ;
2001-02-23 20:55:21 +03:00
if ( ( node - > parent ! = NULL ) & & ( node - > doc ! = node - > parent - > doc ) )
2001-07-18 23:30:27 +04:00
fprintf ( output , " PBM: Node doc differs from parent's one \n " ) ;
2001-02-23 20:55:21 +03:00
if ( node - > prev = = NULL ) {
2001-07-18 23:30:27 +04:00
if ( ( node - > parent ! = NULL ) & & ( node - > parent - > children ! = node ) )
fprintf ( output ,
" PBM: Node has no prev and not first of list \n " ) ;
2001-02-23 20:55:21 +03:00
} else {
2001-07-18 23:30:27 +04:00
if ( node - > prev - > next ! = node )
fprintf ( output , " PBM: Node prev->next : back link wrong \n " ) ;
2001-02-23 20:55:21 +03:00
}
if ( node - > next = = NULL ) {
2001-07-18 23:30:27 +04:00
if ( ( node - > parent ! = NULL ) & & ( node - > parent - > last ! = node ) )
fprintf ( output ,
" PBM: Node has no next and not last of list \n " ) ;
2001-02-23 20:55:21 +03:00
} else {
2001-07-18 23:30:27 +04:00
if ( node - > next - > prev ! = node )
fprintf ( output , " PBM: Node next->prev : forward link wrong \n " ) ;
2001-02-23 20:55:21 +03:00
}
}
2001-07-18 23:30:27 +04:00
/**
* 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 )
{
2002-02-07 19:39:11 +03:00
if ( output = = NULL )
output = stdout ;
2002-01-23 00:44:25 +03:00
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 ;
}
2001-02-23 20:55:21 +03:00
xmlDebugDumpOneNode ( output , node , depth ) ;
if ( ( node - > children ! = NULL ) & & ( node - > type ! = XML_ENTITY_REF_NODE ) )
2001-07-18 23:30:27 +04:00
xmlDebugDumpNodeList ( output , node - > children , depth + 1 ) ;
2001-02-23 20:55:21 +03:00
}
2001-07-18 23:30:27 +04:00
/**
* 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 )
{
2002-02-07 19:39:11 +03:00
if ( output = = NULL )
output = stdout ;
2001-02-23 20:55:21 +03:00
while ( node ! = NULL ) {
xmlDebugDumpNode ( output , node , depth ) ;
2001-07-18 23:30:27 +04:00
node = node - > next ;
2001-02-23 20:55:21 +03:00
}
}
2001-07-18 23:30:27 +04:00
/**
* xmlDebugDumpDocumentHead :
* @ output : the FILE * for the output
* @ doc : the document
*
* Dumps debug information cncerning the document , not recursive
*/
void
xmlDebugDumpDocumentHead ( FILE * output , xmlDocPtr doc )
{
if ( output = = NULL )
output = stdout ;
2001-02-23 20:55:21 +03:00
if ( doc = = NULL ) {
fprintf ( output , " DOCUMENT == NULL ! \n " ) ;
2001-07-18 23:30:27 +04:00
return ;
2001-02-23 20:55:21 +03:00
}
switch ( doc - > type ) {
2001-07-18 23:30:27 +04:00
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 " , doc - > type ) ;
2001-02-23 20:55:21 +03:00
}
if ( doc - > name ! = NULL ) {
2001-07-18 23:30:27 +04:00
fprintf ( output , " name= " ) ;
2001-02-23 20:55:21 +03:00
xmlDebugDumpString ( output , BAD_CAST doc - > name ) ;
2001-07-18 23:30:27 +04:00
fprintf ( output , " \n " ) ;
2001-02-23 20:55:21 +03:00
}
if ( doc - > version ! = NULL ) {
2001-07-18 23:30:27 +04:00
fprintf ( output , " version= " ) ;
2001-02-23 20:55:21 +03:00
xmlDebugDumpString ( output , doc - > version ) ;
2001-07-18 23:30:27 +04:00
fprintf ( output , " \n " ) ;
2001-02-23 20:55:21 +03:00
}
if ( doc - > encoding ! = NULL ) {
2001-07-18 23:30:27 +04:00
fprintf ( output , " encoding= " ) ;
2001-02-23 20:55:21 +03:00
xmlDebugDumpString ( output , doc - > encoding ) ;
2001-07-18 23:30:27 +04:00
fprintf ( output , " \n " ) ;
2001-02-23 20:55:21 +03:00
}
if ( doc - > URL ! = NULL ) {
2001-07-18 23:30:27 +04:00
fprintf ( output , " URL= " ) ;
2001-02-23 20:55:21 +03:00
xmlDebugDumpString ( output , doc - > URL ) ;
2001-07-18 23:30:27 +04:00
fprintf ( output , " \n " ) ;
2001-02-23 20:55:21 +03:00
}
if ( doc - > standalone )
fprintf ( output , " standalone=true \n " ) ;
2001-07-18 23:30:27 +04:00
if ( doc - > oldNs ! = NULL )
2001-02-23 20:55:21 +03:00
xmlDebugDumpNamespaceList ( output , doc - > oldNs , 0 ) ;
}
2001-07-18 23:30:27 +04:00
/**
* 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 )
{
if ( output = = NULL )
output = stdout ;
2001-02-23 20:55:21 +03:00
if ( doc = = NULL ) {
fprintf ( output , " DOCUMENT == NULL ! \n " ) ;
2001-07-18 23:30:27 +04:00
return ;
2001-02-23 20:55:21 +03:00
}
xmlDebugDumpDocumentHead ( output , doc ) ;
if ( ( ( doc - > type = = XML_DOCUMENT_NODE ) | |
2001-07-18 23:30:27 +04:00
( doc - > type = = XML_HTML_DOCUMENT_NODE ) ) & & ( doc - > children ! = NULL ) )
2001-02-23 20:55:21 +03:00
xmlDebugDumpNodeList ( output , doc - > children , 1 ) ;
2001-07-18 23:30:27 +04:00
}
2001-02-23 20:55:21 +03:00
2001-07-18 23:30:27 +04:00
/**
* xmlDebugDumpDTD :
* @ output : the FILE * for the output
* @ dtd : the DTD
*
* Dumps debug information for the DTD
*/
void
xmlDebugDumpDTD ( FILE * output , xmlDtdPtr dtd )
{
2002-02-07 19:39:11 +03:00
if ( output = = NULL )
output = stdout ;
2002-01-23 00:44:25 +03:00
if ( dtd = = NULL ) {
fprintf ( output , " DTD is NULL \n " ) ;
2001-07-18 23:30:27 +04:00
return ;
2002-01-23 00:44:25 +03:00
}
2001-02-23 20:55:21 +03:00
if ( dtd - > type ! = XML_DTD_NODE ) {
2001-07-18 23:30:27 +04:00
fprintf ( output , " PBM: not a DTD \n " ) ;
return ;
2001-02-23 20:55:21 +03:00
}
if ( dtd - > name ! = NULL )
2001-07-18 23:30:27 +04:00
fprintf ( output , " DTD(%s) " , dtd - > name ) ;
2001-02-23 20:55:21 +03:00
else
2001-07-18 23:30:27 +04:00
fprintf ( output , " DTD " ) ;
2001-02-23 20:55:21 +03:00
if ( dtd - > ExternalID ! = NULL )
2001-07-18 23:30:27 +04:00
fprintf ( output , " , PUBLIC %s " , dtd - > ExternalID ) ;
2001-02-23 20:55:21 +03:00
if ( dtd - > SystemID ! = NULL )
2001-07-18 23:30:27 +04:00
fprintf ( output , " , SYSTEM %s " , dtd - > SystemID ) ;
2001-02-23 20:55:21 +03:00
fprintf ( output , " \n " ) ;
/*
* Do a bit of checking
*/
if ( ( dtd - > parent ! = NULL ) & & ( dtd - > doc ! = dtd - > parent - > doc ) )
2001-12-31 19:16:02 +03:00
fprintf ( output , " PBM: DTD doc differs from parent's one \n " ) ;
2001-02-23 20:55:21 +03:00
if ( dtd - > prev = = NULL ) {
2001-07-18 23:30:27 +04:00
if ( ( dtd - > parent ! = NULL )
& & ( dtd - > parent - > children ! = ( xmlNodePtr ) dtd ) )
fprintf ( output ,
2001-12-31 19:16:02 +03:00
" PBM: DTD has no prev and not first of list \n " ) ;
2001-02-23 20:55:21 +03:00
} else {
2001-07-18 23:30:27 +04:00
if ( dtd - > prev - > next ! = ( xmlNodePtr ) dtd )
2001-12-31 19:16:02 +03:00
fprintf ( output , " PBM: DTD prev->next : back link wrong \n " ) ;
2001-02-23 20:55:21 +03:00
}
if ( dtd - > next = = NULL ) {
2001-07-18 23:30:27 +04:00
if ( ( dtd - > parent ! = NULL )
& & ( dtd - > parent - > last ! = ( xmlNodePtr ) dtd ) )
2001-12-31 19:16:02 +03:00
fprintf ( output , " PBM: DTD has no next and not last of list \n " ) ;
2001-02-23 20:55:21 +03:00
} else {
2001-07-18 23:30:27 +04:00
if ( dtd - > next - > prev ! = ( xmlNodePtr ) dtd )
2001-12-31 19:16:02 +03:00
fprintf ( output , " PBM: DTD next->prev : forward link wrong \n " ) ;
2001-02-23 20:55:21 +03:00
}
if ( dtd - > children = = NULL )
2001-07-18 23:30:27 +04:00
fprintf ( output , " DTD is empty \n " ) ;
2001-02-23 20:55:21 +03:00
else
xmlDebugDumpNodeList ( output , dtd - > children , 1 ) ;
}
2001-03-24 20:00:36 +03:00
static void
xmlDebugDumpEntityCallback ( xmlEntityPtr cur , FILE * output ) {
2002-01-23 00:44:25 +03:00
if ( cur = = NULL ) {
fprintf ( output , " Entity is NULL " ) ;
return ;
}
2001-02-23 20:55:21 +03:00
fprintf ( output , " %s : " , 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 " ,
cur - > etype ) ;
}
if ( cur - > ExternalID ! = NULL )
fprintf ( output , " ID \" %s \" " , cur - > ExternalID ) ;
if ( cur - > SystemID ! = NULL )
fprintf ( output , " SYSTEM \" %s \" " , cur - > SystemID ) ;
if ( cur - > orig ! = NULL )
fprintf ( output , " \n orig \" %s \" " , cur - > orig ) ;
2001-07-12 05:20:08 +04:00
if ( ( cur - > type ! = XML_ELEMENT_NODE ) & &
( cur - > content ! = NULL ) )
2001-02-23 20:55:21 +03:00
fprintf ( output , " \n content \" %s \" " , cur - > content ) ;
fprintf ( output , " \n " ) ;
}
2001-07-18 23:30:27 +04:00
/**
* xmlDebugDumpEntities :
* @ output : the FILE * for the output
* @ doc : the document
*
* Dumps debug information for all the entities in use by the document
*/
void
xmlDebugDumpEntities ( FILE * output , xmlDocPtr doc )
{
if ( output = = NULL )
output = stdout ;
2001-02-23 20:55:21 +03:00
if ( doc = = NULL ) {
fprintf ( output , " DOCUMENT == NULL ! \n " ) ;
2001-07-18 23:30:27 +04:00
return ;
2001-02-23 20:55:21 +03:00
}
switch ( doc - > type ) {
2001-07-18 23:30:27 +04:00
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 " , doc - > type ) ;
2001-02-23 20:55:21 +03:00
}
if ( ( doc - > intSubset ! = NULL ) & & ( doc - > intSubset - > entities ! = NULL ) ) {
2001-07-18 23:30:27 +04:00
xmlEntitiesTablePtr table = ( xmlEntitiesTablePtr )
doc - > intSubset - > entities ;
fprintf ( output , " Entities in internal subset \n " ) ;
xmlHashScan ( table , ( xmlHashScanner ) xmlDebugDumpEntityCallback ,
output ) ;
2001-02-23 20:55:21 +03:00
} else
2001-07-18 23:30:27 +04:00
fprintf ( output , " No entities in internal subset \n " ) ;
2001-02-23 20:55:21 +03:00
if ( ( doc - > extSubset ! = NULL ) & & ( doc - > extSubset - > entities ! = NULL ) ) {
2001-07-18 23:30:27 +04:00
xmlEntitiesTablePtr table = ( xmlEntitiesTablePtr )
doc - > extSubset - > entities ;
fprintf ( output , " Entities in external subset \n " ) ;
xmlHashScan ( table , ( xmlHashScanner ) xmlDebugDumpEntityCallback ,
output ) ;
2001-02-23 20:55:21 +03:00
} else
2001-07-18 23:30:27 +04:00
fprintf ( output , " No entities in external subset \n " ) ;
2001-02-23 20:55:21 +03:00
}
2001-12-31 19:16:02 +03:00
/**
* xmlLsCountNode :
* @ node : the node to count
*
* Count the children of @ node .
*
* Returns the number of children of @ node .
*/
int
xmlLsCountNode ( xmlNodePtr node ) {
2001-02-23 20:55:21 +03:00
int ret = 0 ;
xmlNodePtr list = NULL ;
2002-01-23 00:44:25 +03:00
if ( node = = NULL )
return ( 0 ) ;
2001-02-23 20:55:21 +03:00
switch ( node - > type ) {
case XML_ELEMENT_NODE :
list = node - > children ;
break ;
case XML_DOCUMENT_NODE :
case XML_HTML_DOCUMENT_NODE :
2001-04-23 17:41:34 +04:00
# ifdef LIBXML_DOCB_ENABLED
case XML_DOCB_DOCUMENT_NODE :
2001-02-23 20:55:21 +03:00
# endif
list = ( ( xmlDocPtr ) node ) - > children ;
break ;
case XML_ATTRIBUTE_NODE :
list = ( ( xmlAttrPtr ) node ) - > children ;
break ;
case XML_TEXT_NODE :
case XML_CDATA_SECTION_NODE :
case XML_PI_NODE :
case XML_COMMENT_NODE :
if ( node - > content ! = NULL ) {
ret = xmlStrlen ( node - > content ) ;
}
break ;
case XML_ENTITY_REF_NODE :
case XML_DOCUMENT_TYPE_NODE :
case XML_ENTITY_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 :
ret = 1 ;
break ;
}
for ( ; list ! = NULL ; ret + + )
list = list - > next ;
return ( ret ) ;
}
2001-12-31 19:16:02 +03:00
/**
* xmlLsOneNode :
* @ output : the FILE * for the output
* @ node : the node to dump
*
* Dump to @ output the type and name of @ node .
*/
2001-10-11 13:12:24 +04:00
void
2001-07-18 23:30:27 +04:00
xmlLsOneNode ( FILE * output , xmlNodePtr node ) {
2002-01-23 00:44:25 +03:00
if ( node = = NULL ) {
fprintf ( output , " NULL \n " ) ;
return ;
}
2001-02-23 20:55:21 +03:00
switch ( node - > type ) {
case XML_ELEMENT_NODE :
fprintf ( output , " - " ) ;
break ;
case XML_ATTRIBUTE_NODE :
fprintf ( output , " a " ) ;
break ;
case XML_TEXT_NODE :
fprintf ( output , " t " ) ;
break ;
case XML_CDATA_SECTION_NODE :
2002-03-13 13:03:35 +03:00
fprintf ( output , " C " ) ;
2001-02-23 20:55:21 +03:00
break ;
case XML_ENTITY_REF_NODE :
fprintf ( output , " e " ) ;
break ;
case XML_ENTITY_NODE :
fprintf ( output , " E " ) ;
break ;
case XML_PI_NODE :
fprintf ( output , " p " ) ;
break ;
case XML_COMMENT_NODE :
fprintf ( output , " c " ) ;
break ;
case XML_DOCUMENT_NODE :
fprintf ( output , " d " ) ;
break ;
case XML_HTML_DOCUMENT_NODE :
fprintf ( output , " h " ) ;
break ;
case XML_DOCUMENT_TYPE_NODE :
fprintf ( output , " T " ) ;
break ;
case XML_DOCUMENT_FRAG_NODE :
fprintf ( output , " F " ) ;
break ;
case XML_NOTATION_NODE :
fprintf ( output , " N " ) ;
break ;
2002-01-14 20:11:53 +03:00
case XML_NAMESPACE_DECL :
fprintf ( output , " n " ) ;
break ;
2001-02-23 20:55:21 +03:00
default :
fprintf ( output , " ? " ) ;
}
2002-01-14 20:11:53 +03:00
if ( node - > type ! = XML_NAMESPACE_DECL ) {
if ( node - > properties ! = NULL )
fprintf ( output , " a " ) ;
else
fprintf ( output , " - " ) ;
if ( node - > nsDef ! = NULL )
fprintf ( output , " n " ) ;
else
fprintf ( output , " - " ) ;
}
2001-02-23 20:55:21 +03:00
fprintf ( output , " %8d " , xmlLsCountNode ( node ) ) ;
switch ( node - > type ) {
case XML_ELEMENT_NODE :
if ( node - > name ! = NULL )
fprintf ( output , " %s " , node - > name ) ;
break ;
case XML_ATTRIBUTE_NODE :
if ( node - > name ! = NULL )
fprintf ( output , " %s " , node - > name ) ;
break ;
case XML_TEXT_NODE :
if ( node - > content ! = NULL ) {
xmlDebugDumpString ( output , node - > content ) ;
}
break ;
case XML_CDATA_SECTION_NODE :
break ;
case XML_ENTITY_REF_NODE :
if ( node - > name ! = NULL )
fprintf ( output , " %s " , node - > name ) ;
break ;
case XML_ENTITY_NODE :
if ( node - > name ! = NULL )
fprintf ( output , " %s " , node - > name ) ;
break ;
case XML_PI_NODE :
if ( node - > name ! = NULL )
fprintf ( output , " %s " , node - > name ) ;
break ;
case XML_COMMENT_NODE :
break ;
case XML_DOCUMENT_NODE :
break ;
case XML_HTML_DOCUMENT_NODE :
break ;
case XML_DOCUMENT_TYPE_NODE :
break ;
case XML_DOCUMENT_FRAG_NODE :
break ;
case XML_NOTATION_NODE :
break ;
2002-01-14 20:11:53 +03:00
case XML_NAMESPACE_DECL : {
xmlNsPtr ns = ( xmlNsPtr ) node ;
if ( ns - > prefix = = NULL )
fprintf ( output , " default -> %s " , ns - > href ) ;
else
fprintf ( output , " %s -> %s " , ns - > prefix , ns - > href ) ;
break ;
}
2001-02-23 20:55:21 +03:00
default :
if ( node - > name ! = NULL )
fprintf ( output , " %s " , node - > name ) ;
}
fprintf ( output , " \n " ) ;
}
2001-10-11 13:12:24 +04:00
/**
* xmlBoolToText :
2001-12-31 19:16:02 +03:00
* @ boolval : a bool to turn into text
2001-10-11 13:12:24 +04:00
*
* Convenient way to turn bool into text
2001-12-31 19:16:02 +03:00
*
* Returns a pointer to either " True " or " False "
*/
2001-10-11 13:12:24 +04:00
const char *
2001-11-01 11:38:12 +03:00
xmlBoolToText ( int boolval )
2001-10-11 13:12:24 +04:00
{
2001-11-01 11:38:12 +03:00
if ( boolval )
2001-10-11 13:12:24 +04:00
return ( " True " ) ;
else
return ( " False " ) ;
}
2001-02-23 20:55:21 +03:00
/****************************************************************
* *
* The XML shell related functions *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-10-11 13:12:24 +04:00
2001-02-23 20:55:21 +03:00
/*
* TODO : Improvement / cleanups for the XML shell
* - allow to shell out an editor on a subpart
* - cleanup function registrations ( with help ) and calling
* - provide registration routines
*/
2001-10-11 13:12:24 +04:00
/**
2001-12-31 19:16:02 +03:00
* xmlShellPrintXPathError :
2001-10-11 13:12:24 +04:00
* @ errorType : valid xpath error id
2001-12-31 19:16:02 +03:00
* @ arg : the argument that cause xpath to fail
2001-10-11 13:12:24 +04:00
*
* Print the xpath error to libxml default error channel
*/
void
xmlShellPrintXPathError ( int errorType , const char * arg )
{
const char * default_arg = " Result " ;
if ( ! arg )
arg = default_arg ;
switch ( errorType ) {
case XPATH_UNDEFINED :
xmlGenericError ( xmlGenericErrorContext ,
" %s: no such node \n " , arg ) ;
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 ;
}
xmlGenericError ( xmlGenericErrorContext ,
" Try casting the result string function (xpath builtin) \n " ,
arg ) ;
}
/**
2002-10-09 01:26:42 +04:00
* xmlShellPrintNodeCtxt :
* @ ctxt : a non - null shell context
* @ node : a non - null node to print to the output FILE
2001-10-11 13:12:24 +04:00
*
2002-10-09 01:26:42 +04:00
* Print node to the output FILE
2001-10-11 13:12:24 +04:00
*/
2002-10-09 01:26:42 +04:00
static void
xmlShellPrintNodeCtxt ( xmlShellCtxtPtr ctxt , xmlNodePtr node )
2001-10-11 13:12:24 +04:00
{
2002-10-09 14:20:30 +04:00
FILE * fp ;
if ( ! node )
2001-10-11 13:12:24 +04:00
return ;
2002-10-09 14:20:30 +04:00
if ( ctxt = = NULL )
fp = stdout ;
else
fp = ctxt - > output ;
2001-10-11 13:12:24 +04:00
if ( node - > type = = XML_DOCUMENT_NODE )
2002-10-09 14:20:30 +04:00
xmlDocDump ( fp , ( xmlDocPtr ) node ) ;
2001-10-11 13:12:24 +04:00
else if ( node - > type = = XML_ATTRIBUTE_NODE )
2002-10-09 14:20:30 +04:00
xmlDebugDumpAttrList ( fp , ( xmlAttrPtr ) node , 0 ) ;
2001-10-11 13:12:24 +04:00
else
2002-10-09 14:20:30 +04:00
xmlElemDump ( fp , node - > doc , node ) ;
2001-10-11 13:12:24 +04:00
2002-10-09 14:20:30 +04:00
fprintf ( fp , " \n " ) ;
2001-10-11 13:12:24 +04:00
}
2002-10-09 01:26:42 +04:00
/**
* xmlShellPrintNode :
* @ node : a non - null node to print to the output FILE
*
* Print node to the output FILE
*/
void
xmlShellPrintNode ( xmlNodePtr node )
{
xmlShellPrintNodeCtxt ( NULL , node ) ;
}
2001-10-11 13:12:24 +04:00
/**
2002-10-09 01:26:42 +04:00
* xmlShellPrintXPathResultCtxt :
* @ ctxt : a valid shell context
2002-01-22 21:15:52 +03:00
* @ list : a valid result generated by an xpath evaluation
2001-10-11 13:12:24 +04:00
*
2002-10-09 01:26:42 +04:00
* Prints result to the output FILE
2001-10-11 13:12:24 +04:00
*/
2002-10-09 01:26:42 +04:00
static void
xmlShellPrintXPathResultCtxt ( xmlShellCtxtPtr ctxt , xmlXPathObjectPtr list )
2001-10-11 13:12:24 +04:00
{
int i = 0 ;
2002-10-09 01:26:42 +04:00
if ( ! ctxt )
return ;
2001-10-11 13:12:24 +04:00
if ( list ! = NULL ) {
switch ( list - > type ) {
case XPATH_NODESET : {
int indx ;
if ( list - > nodesetval ) {
for ( indx = 0 ; indx < list - > nodesetval - > nodeNr ;
indx + + ) {
if ( i > 0 )
fprintf ( stderr , " ------- \n " ) ;
2002-10-09 01:26:42 +04:00
xmlShellPrintNodeCtxt ( ctxt ,
list - > nodesetval - > nodeTab [ indx ] ) ;
2001-10-11 13:12:24 +04:00
}
} else {
xmlGenericError ( xmlGenericErrorContext ,
" Empty node set \n " ) ;
}
break ;
}
case XPATH_BOOLEAN :
xmlGenericError ( xmlGenericErrorContext ,
" Is a Boolean:%s \n " ,
xmlBoolToText ( list - > boolval ) ) ;
break ;
case XPATH_NUMBER :
xmlGenericError ( xmlGenericErrorContext ,
" Is a number:%0g \n " , list - > floatval ) ;
break ;
case XPATH_STRING :
xmlGenericError ( xmlGenericErrorContext ,
" Is a string:%s \n " , list - > stringval ) ;
break ;
default :
xmlShellPrintXPathError ( list - > type , NULL ) ;
}
}
}
2002-10-09 01:26:42 +04:00
/**
* xmlShellPrintXPathResult :
* @ list : a valid result generated by an xpath evaluation
*
* Prints result to the output FILE
*/
void
xmlShellPrintXPathResult ( xmlXPathObjectPtr list )
{
xmlShellPrintXPathResultCtxt ( NULL , list ) ;
}
2001-02-23 20:55:21 +03:00
/**
* xmlShellList :
* @ ctxt : the shell context
* @ arg : unused
* @ node : a node
* @ node2 : unused
*
* Implements the XML shell function " ls "
* Does an Unix like listing of the given node ( like a directory )
*
* Returns 0
*/
2001-10-11 13:12:24 +04:00
int
2002-10-09 01:26:42 +04:00
xmlShellList ( xmlShellCtxtPtr ctxt ,
2001-10-11 13:12:24 +04:00
char * arg ATTRIBUTE_UNUSED , xmlNodePtr node ,
xmlNodePtr node2 ATTRIBUTE_UNUSED )
{
2001-02-23 20:55:21 +03:00
xmlNodePtr cur ;
2002-10-09 01:26:42 +04:00
if ( ! ctxt )
return ( 0 ) ;
2002-01-23 00:44:25 +03:00
if ( node = = NULL ) {
2002-10-09 01:26:42 +04:00
fprintf ( ctxt - > output , " NULL \n " ) ;
2002-01-23 00:44:25 +03:00
return ( 0 ) ;
}
2001-02-23 20:55:21 +03:00
if ( ( node - > type = = XML_DOCUMENT_NODE ) | |
( node - > type = = XML_HTML_DOCUMENT_NODE ) ) {
cur = ( ( xmlDocPtr ) node ) - > children ;
2002-01-14 20:11:53 +03:00
} else if ( node - > type = = XML_NAMESPACE_DECL ) {
2002-10-09 01:26:42 +04:00
xmlLsOneNode ( ctxt - > output , node ) ;
2002-01-14 20:11:53 +03:00
return ( 0 ) ;
2001-02-23 20:55:21 +03:00
} else if ( node - > children ! = NULL ) {
cur = node - > children ;
} else {
2002-10-09 01:26:42 +04:00
xmlLsOneNode ( ctxt - > output , node ) ;
2001-10-11 13:12:24 +04:00
return ( 0 ) ;
2001-02-23 20:55:21 +03:00
}
while ( cur ! = NULL ) {
2002-10-09 01:26:42 +04:00
xmlLsOneNode ( ctxt - > output , cur ) ;
2001-10-11 13:12:24 +04:00
cur = cur - > next ;
2001-02-23 20:55:21 +03:00
}
2001-10-11 13:12:24 +04:00
return ( 0 ) ;
2001-02-23 20:55:21 +03:00
}
2001-07-09 20:01:19 +04:00
/**
* xmlShellBase :
* @ ctxt : the shell context
* @ arg : unused
* @ node : a node
* @ node2 : unused
*
* Implements the XML shell function " base "
* dumps the current XML base of the node
*
* Returns 0
*/
2001-10-11 13:12:24 +04:00
int
2002-10-09 01:26:42 +04:00
xmlShellBase ( xmlShellCtxtPtr ctxt ,
2001-10-11 13:12:24 +04:00
char * arg ATTRIBUTE_UNUSED , xmlNodePtr node ,
xmlNodePtr node2 ATTRIBUTE_UNUSED )
{
2001-07-09 20:01:19 +04:00
xmlChar * base ;
2002-10-09 01:26:42 +04:00
if ( ! ctxt )
return 0 ;
2002-01-23 00:44:25 +03:00
if ( node = = NULL ) {
2002-10-09 01:26:42 +04:00
fprintf ( ctxt - > output , " NULL \n " ) ;
2002-01-23 00:44:25 +03:00
return ( 0 ) ;
}
2001-07-09 20:01:19 +04:00
base = xmlNodeGetBase ( node - > doc , node ) ;
if ( base = = NULL ) {
2002-10-09 01:26:42 +04:00
fprintf ( ctxt - > output , " No base found !!! \n " ) ;
2001-07-09 20:01:19 +04:00
} else {
2002-10-09 01:26:42 +04:00
fprintf ( ctxt - > output , " %s \n " , base ) ;
2001-10-11 13:12:24 +04:00
xmlFree ( base ) ;
2001-07-09 20:01:19 +04:00
}
2001-10-11 13:12:24 +04:00
return ( 0 ) ;
2001-07-09 20:01:19 +04:00
}
2002-01-17 11:46:58 +03:00
/**
* xmlShellSetBase :
* @ ctxt : the shell context
* @ arg : the new base
* @ node : a node
* @ node2 : unused
*
* Implements the XML shell function " setbase "
* change the current XML base of the node
*
* Returns 0
*/
static int
xmlShellSetBase ( xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED ,
char * arg ATTRIBUTE_UNUSED , xmlNodePtr node ,
xmlNodePtr node2 ATTRIBUTE_UNUSED )
{
xmlNodeSetBase ( node , ( xmlChar * ) arg ) ;
return ( 0 ) ;
}
2002-10-22 18:25:25 +04:00
/**
* xmlShellGrep :
* @ ctxt : the shell context
* @ arg : the string or regular expression to find
* @ node : a node
* @ node2 : unused
*
* Implements the XML shell function " grep "
* dumps informations about the node ( namespace , attributes , content ) .
*
* Returns 0
*/
2002-10-22 21:35:37 +04:00
static int
2002-10-22 18:25:25 +04:00
xmlShellGrep ( xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED ,
char * arg , xmlNodePtr node , xmlNodePtr node2 ATTRIBUTE_UNUSED )
{
if ( ! ctxt )
return ( 0 ) ;
if ( node = = NULL )
return ( 0 ) ;
if ( arg = = NULL )
return ( 0 ) ;
# ifdef LIBXML_REGEXP_ENABLED
if ( ( xmlStrchr ( ( xmlChar * ) arg , ' ? ' ) ) | |
( xmlStrchr ( ( xmlChar * ) arg , ' * ' ) ) | |
( xmlStrchr ( ( xmlChar * ) arg , ' . ' ) ) | |
( xmlStrchr ( ( xmlChar * ) arg , ' [ ' ) ) ) {
}
# endif
while ( node ! = NULL ) {
if ( node - > type = = XML_COMMENT_NODE ) {
2002-10-22 21:35:37 +04:00
if ( xmlStrstr ( node - > content , ( xmlChar * ) arg ) ) {
2002-10-22 18:25:25 +04:00
fprintf ( ctxt - > output , " %s : " , xmlGetNodePath ( node ) ) ;
xmlShellList ( ctxt , NULL , node , NULL ) ;
}
} else if ( node - > type = = XML_TEXT_NODE ) {
2002-10-22 21:35:37 +04:00
if ( xmlStrstr ( node - > content , ( xmlChar * ) arg ) ) {
2002-10-22 18:25:25 +04:00
fprintf ( ctxt - > output , " %s : " , xmlGetNodePath ( node - > parent ) ) ;
2002-10-22 21:35:37 +04:00
xmlShellList ( ctxt , NULL , node - > parent , NULL ) ;
2002-10-22 18:25:25 +04:00
}
}
/*
* Browse the full subtree , deep first
*/
if ( ( node - > type = = XML_DOCUMENT_NODE ) | |
( node - > type = = XML_HTML_DOCUMENT_NODE ) ) {
node = ( ( xmlDocPtr ) node ) - > children ;
} else if ( ( node - > children ! = NULL )
& & ( node - > type ! = XML_ENTITY_REF_NODE ) ) {
/* deep first */
node = node - > children ;
} else if ( node - > next ! = NULL ) {
/* then siblings */
node = node - > next ;
} else {
/* go up to parents->next if needed */
while ( node ! = NULL ) {
if ( node - > parent ! = NULL ) {
node = node - > parent ;
}
if ( node - > next ! = NULL ) {
node = node - > next ;
break ;
}
if ( node - > parent = = NULL ) {
node = NULL ;
break ;
}
}
}
}
return ( 0 ) ;
}
2001-02-23 20:55:21 +03:00
/**
* xmlShellDir :
* @ ctxt : the shell context
* @ arg : unused
* @ node : a node
* @ node2 : unused
*
* Implements the XML shell function " dir "
* dumps informations about the node ( namespace , attributes , content ) .
*
* Returns 0
*/
2001-10-11 13:12:24 +04:00
int
xmlShellDir ( xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED ,
char * arg ATTRIBUTE_UNUSED , xmlNodePtr node ,
xmlNodePtr node2 ATTRIBUTE_UNUSED )
{
2002-10-09 01:26:42 +04:00
if ( ! ctxt )
return ( 0 ) ;
2002-01-23 00:44:25 +03:00
if ( node = = NULL ) {
2002-10-09 01:26:42 +04:00
fprintf ( ctxt - > output , " NULL \n " ) ;
2002-01-23 00:44:25 +03:00
return ( 0 ) ;
}
2001-02-23 20:55:21 +03:00
if ( ( node - > type = = XML_DOCUMENT_NODE ) | |
( node - > type = = XML_HTML_DOCUMENT_NODE ) ) {
2002-10-09 01:26:42 +04:00
xmlDebugDumpDocumentHead ( ctxt - > output , ( xmlDocPtr ) node ) ;
2001-02-23 20:55:21 +03:00
} else if ( node - > type = = XML_ATTRIBUTE_NODE ) {
2002-10-09 01:26:42 +04:00
xmlDebugDumpAttr ( ctxt - > output , ( xmlAttrPtr ) node , 0 ) ;
2001-02-23 20:55:21 +03:00
} else {
2002-10-09 01:26:42 +04:00
xmlDebugDumpOneNode ( ctxt - > output , node , 0 ) ;
2001-02-23 20:55:21 +03:00
}
2001-10-11 13:12:24 +04:00
return ( 0 ) ;
2001-02-23 20:55:21 +03:00
}
/**
* xmlShellCat :
* @ ctxt : the shell context
* @ arg : unused
* @ node : a node
* @ node2 : unused
*
* Implements the XML shell function " cat "
* dumps the serialization node content ( XML or HTML ) .
*
* Returns 0
*/
2001-10-11 13:12:24 +04:00
int
xmlShellCat ( xmlShellCtxtPtr ctxt , char * arg ATTRIBUTE_UNUSED ,
xmlNodePtr node , xmlNodePtr node2 ATTRIBUTE_UNUSED )
{
2002-10-09 01:26:42 +04:00
if ( ! ctxt )
return ( 0 ) ;
2002-01-23 00:44:25 +03:00
if ( node = = NULL ) {
2002-10-09 01:26:42 +04:00
fprintf ( ctxt - > output , " NULL \n " ) ;
2002-01-23 00:44:25 +03:00
return ( 0 ) ;
}
2001-02-23 20:55:21 +03:00
if ( ctxt - > doc - > type = = XML_HTML_DOCUMENT_NODE ) {
# ifdef LIBXML_HTML_ENABLED
2001-10-11 13:12:24 +04:00
if ( node - > type = = XML_HTML_DOCUMENT_NODE )
2002-10-09 01:26:42 +04:00
htmlDocDump ( ctxt - > output , ( htmlDocPtr ) node ) ;
2001-10-11 13:12:24 +04:00
else
2002-10-09 01:26:42 +04:00
htmlNodeDumpFile ( ctxt - > output , ctxt - > doc , node ) ;
2001-02-23 20:55:21 +03:00
# else
2001-10-11 13:12:24 +04:00
if ( node - > type = = XML_DOCUMENT_NODE )
2002-10-09 01:26:42 +04:00
xmlDocDump ( ctxt - > output , ( xmlDocPtr ) node ) ;
2001-10-11 13:12:24 +04:00
else
2002-10-09 01:26:42 +04:00
xmlElemDump ( ctxt - > output , ctxt - > doc , node ) ;
2001-02-23 20:55:21 +03:00
# endif /* LIBXML_HTML_ENABLED */
} else {
2001-10-11 13:12:24 +04:00
if ( node - > type = = XML_DOCUMENT_NODE )
2002-10-09 01:26:42 +04:00
xmlDocDump ( ctxt - > output , ( xmlDocPtr ) node ) ;
2001-10-11 13:12:24 +04:00
else
2002-10-09 01:26:42 +04:00
xmlElemDump ( ctxt - > output , ctxt - > doc , node ) ;
2001-02-23 20:55:21 +03:00
}
2002-10-09 01:26:42 +04:00
fprintf ( ctxt - > output , " \n " ) ;
2001-10-11 13:12:24 +04:00
return ( 0 ) ;
2001-02-23 20:55:21 +03:00
}
/**
* xmlShellLoad :
* @ ctxt : the shell context
* @ filename : the file name
* @ node : unused
* @ node2 : unused
*
* Implements the XML shell function " load "
* loads a new document specified by the filename
*
* Returns 0 or - 1 if loading failed
*/
2001-10-11 13:12:24 +04:00
int
xmlShellLoad ( xmlShellCtxtPtr ctxt , char * filename ,
xmlNodePtr node ATTRIBUTE_UNUSED ,
xmlNodePtr node2 ATTRIBUTE_UNUSED )
{
2001-02-23 20:55:21 +03:00
xmlDocPtr doc ;
int html = 0 ;
if ( ctxt - > doc ! = NULL )
2001-10-11 13:12:24 +04:00
html = ( ctxt - > doc - > type = = XML_HTML_DOCUMENT_NODE ) ;
2001-02-23 20:55:21 +03:00
if ( html ) {
# ifdef LIBXML_HTML_ENABLED
2001-10-11 13:12:24 +04:00
doc = htmlParseFile ( filename , NULL ) ;
# else
2002-10-09 01:26:42 +04:00
fprintf ( ctxt - > output , " HTML support not compiled in \n " ) ;
2001-10-11 13:12:24 +04:00
doc = NULL ;
2001-02-23 20:55:21 +03:00
# endif /* LIBXML_HTML_ENABLED */
} else {
2001-10-11 13:12:24 +04:00
doc = xmlParseFile ( filename ) ;
2001-02-23 20:55:21 +03:00
}
if ( doc ! = NULL ) {
if ( ctxt - > loaded = = 1 ) {
2001-10-11 13:12:24 +04:00
xmlFreeDoc ( ctxt - > doc ) ;
}
ctxt - > loaded = 1 ;
2001-02-23 20:55:21 +03:00
# ifdef LIBXML_XPATH_ENABLED
2001-10-11 13:12:24 +04:00
xmlXPathFreeContext ( ctxt - > pctxt ) ;
2001-02-23 20:55:21 +03:00
# endif /* LIBXML_XPATH_ENABLED */
2001-10-11 13:12:24 +04:00
xmlFree ( ctxt - > filename ) ;
ctxt - > doc = doc ;
ctxt - > node = ( xmlNodePtr ) doc ;
2001-02-23 20:55:21 +03:00
# ifdef LIBXML_XPATH_ENABLED
2001-10-11 13:12:24 +04:00
ctxt - > pctxt = xmlXPathNewContext ( doc ) ;
2001-02-23 20:55:21 +03:00
# endif /* LIBXML_XPATH_ENABLED */
2001-10-11 13:12:24 +04:00
ctxt - > filename = ( char * ) xmlStrdup ( ( xmlChar * ) filename ) ;
2001-02-23 20:55:21 +03:00
} else
2001-10-11 13:12:24 +04:00
return ( - 1 ) ;
return ( 0 ) ;
2001-02-23 20:55:21 +03:00
}
/**
* xmlShellWrite :
* @ ctxt : the shell context
* @ filename : the file name
* @ node : a node in the tree
* @ node2 : unused
*
* Implements the XML shell function " write "
2001-12-31 19:16:02 +03:00
* Write the current node to the filename , it saves the serialization
2001-02-23 20:55:21 +03:00
* of the subtree under the @ node specified
*
* Returns 0 or - 1 in case of error
*/
2001-10-11 13:12:24 +04:00
int
2001-02-23 20:55:21 +03:00
xmlShellWrite ( xmlShellCtxtPtr ctxt , char * filename , xmlNodePtr node ,
2001-10-11 13:12:24 +04:00
xmlNodePtr node2 ATTRIBUTE_UNUSED )
{
2001-02-23 20:55:21 +03:00
if ( node = = NULL )
2001-10-11 13:12:24 +04:00
return ( - 1 ) ;
2001-02-23 20:55:21 +03:00
if ( ( filename = = NULL ) | | ( filename [ 0 ] = = 0 ) ) {
xmlGenericError ( xmlGenericErrorContext ,
2001-10-11 13:12:24 +04:00
" Write command requires a filename argument \n " ) ;
return ( - 1 ) ;
2001-02-23 20:55:21 +03:00
}
# ifdef W_OK
if ( access ( ( char * ) filename , W_OK ) ) {
xmlGenericError ( xmlGenericErrorContext ,
2001-10-11 13:12:24 +04:00
" Cannot write to %s \n " , filename ) ;
return ( - 1 ) ;
2001-02-23 20:55:21 +03:00
}
2001-10-11 13:12:24 +04:00
# endif
switch ( node - > type ) {
2001-02-23 20:55:21 +03:00
case XML_DOCUMENT_NODE :
2001-10-11 13:12:24 +04:00
if ( xmlSaveFile ( ( char * ) filename , ctxt - > doc ) < - 1 ) {
xmlGenericError ( xmlGenericErrorContext ,
" Failed to write to %s \n " , filename ) ;
return ( - 1 ) ;
}
break ;
2001-02-23 20:55:21 +03:00
case XML_HTML_DOCUMENT_NODE :
# ifdef LIBXML_HTML_ENABLED
2001-10-11 13:12:24 +04:00
if ( htmlSaveFile ( ( char * ) filename , ctxt - > doc ) < 0 ) {
xmlGenericError ( xmlGenericErrorContext ,
" Failed to write to %s \n " , filename ) ;
return ( - 1 ) ;
}
2001-02-23 20:55:21 +03:00
# else
2001-10-11 13:12:24 +04:00
if ( xmlSaveFile ( ( char * ) filename , ctxt - > doc ) < - 1 ) {
xmlGenericError ( xmlGenericErrorContext ,
" Failed to write to %s \n " , filename ) ;
return ( - 1 ) ;
}
2001-02-23 20:55:21 +03:00
# endif /* LIBXML_HTML_ENABLED */
2001-10-11 13:12:24 +04:00
break ;
default : {
FILE * f ;
f = fopen ( ( char * ) filename , " w " ) ;
if ( f = = NULL ) {
xmlGenericError ( xmlGenericErrorContext ,
" Failed to write to %s \n " , filename ) ;
return ( - 1 ) ;
}
xmlElemDump ( f , ctxt - > doc , node ) ;
fclose ( f ) ;
}
2001-02-23 20:55:21 +03:00
}
2001-10-11 13:12:24 +04:00
return ( 0 ) ;
2001-02-23 20:55:21 +03:00
}
/**
* xmlShellSave :
* @ ctxt : the shell context
2001-12-31 19:16:02 +03:00
* @ filename : the file name ( optional )
2001-02-23 20:55:21 +03:00
* @ node : unused
* @ node2 : unused
*
* Implements the XML shell function " save "
* Write the current document to the filename , or it ' s original name
*
* Returns 0 or - 1 in case of error
*/
2001-10-11 13:12:24 +04:00
int
xmlShellSave ( xmlShellCtxtPtr ctxt , char * filename ,
xmlNodePtr node ATTRIBUTE_UNUSED ,
xmlNodePtr node2 ATTRIBUTE_UNUSED )
{
2001-02-23 20:55:21 +03:00
if ( ctxt - > doc = = NULL )
2001-10-11 13:12:24 +04:00
return ( - 1 ) ;
2001-02-23 20:55:21 +03:00
if ( ( filename = = NULL ) | | ( filename [ 0 ] = = 0 ) )
filename = ctxt - > filename ;
# ifdef W_OK
if ( access ( ( char * ) filename , W_OK ) ) {
xmlGenericError ( xmlGenericErrorContext ,
2001-10-11 13:12:24 +04:00
" Cannot save to %s \n " , filename ) ;
return ( - 1 ) ;
2001-02-23 20:55:21 +03:00
}
# endif
2001-10-11 13:12:24 +04:00
switch ( ctxt - > doc - > type ) {
2001-02-23 20:55:21 +03:00
case XML_DOCUMENT_NODE :
2001-10-11 13:12:24 +04:00
if ( xmlSaveFile ( ( char * ) filename , ctxt - > doc ) < 0 ) {
xmlGenericError ( xmlGenericErrorContext ,
" Failed to save to %s \n " , filename ) ;
}
break ;
2001-02-23 20:55:21 +03:00
case XML_HTML_DOCUMENT_NODE :
# ifdef LIBXML_HTML_ENABLED
2001-10-11 13:12:24 +04:00
if ( htmlSaveFile ( ( char * ) filename , ctxt - > doc ) < 0 ) {
xmlGenericError ( xmlGenericErrorContext ,
" Failed to save to %s \n " , filename ) ;
}
2001-02-23 20:55:21 +03:00
# else
2001-10-11 13:12:24 +04:00
if ( xmlSaveFile ( ( char * ) filename , ctxt - > doc ) < 0 ) {
xmlGenericError ( xmlGenericErrorContext ,
" Failed to save to %s \n " , filename ) ;
}
2001-02-23 20:55:21 +03:00
# endif /* LIBXML_HTML_ENABLED */
2001-10-11 13:12:24 +04:00
break ;
default :
xmlGenericError ( xmlGenericErrorContext ,
" To save to subparts of a document use the 'write' command \n " ) ;
return ( - 1 ) ;
2001-02-23 20:55:21 +03:00
}
2001-10-11 13:12:24 +04:00
return ( 0 ) ;
2001-02-23 20:55:21 +03:00
}
/**
* xmlShellValidate :
* @ ctxt : the shell context
2001-12-31 19:16:02 +03:00
* @ dtd : the DTD URI ( optional )
2001-02-23 20:55:21 +03:00
* @ node : unused
* @ node2 : unused
*
* Implements the XML shell function " validate "
* Validate the document , if a DTD path is provided , then the validation
* is done against the given DTD .
*
* Returns 0 or - 1 in case of error
*/
2001-10-11 13:12:24 +04:00
int
xmlShellValidate ( xmlShellCtxtPtr ctxt , char * dtd ,
xmlNodePtr node ATTRIBUTE_UNUSED ,
xmlNodePtr node2 ATTRIBUTE_UNUSED )
{
2001-02-23 20:55:21 +03:00
xmlValidCtxt vctxt ;
int res = - 1 ;
vctxt . userData = stderr ;
vctxt . error = ( xmlValidityErrorFunc ) fprintf ;
vctxt . warning = ( xmlValidityWarningFunc ) fprintf ;
if ( ( dtd = = NULL ) | | ( dtd [ 0 ] = = 0 ) ) {
res = xmlValidateDocument ( & vctxt , ctxt - > doc ) ;
} else {
xmlDtdPtr subset ;
2001-10-11 13:12:24 +04:00
subset = xmlParseDTD ( NULL , ( xmlChar * ) dtd ) ;
if ( subset ! = NULL ) {
2001-02-23 20:55:21 +03:00
res = xmlValidateDtd ( & vctxt , ctxt - > doc , subset ) ;
2001-10-11 13:12:24 +04:00
xmlFreeDtd ( subset ) ;
}
2001-02-23 20:55:21 +03:00
}
2001-10-11 13:12:24 +04:00
return ( res ) ;
2001-02-23 20:55:21 +03:00
}
/**
* xmlShellDu :
* @ ctxt : the shell context
* @ arg : unused
* @ tree : a node defining a subtree
* @ node2 : unused
*
* Implements the XML shell function " du "
* show the structure of the subtree under node @ tree
* If @ tree is null , the command works on the current node .
*
* Returns 0 or - 1 in case of error
*/
2001-10-11 13:12:24 +04:00
int
2002-10-09 01:26:42 +04:00
xmlShellDu ( xmlShellCtxtPtr ctxt ,
2001-10-11 13:12:24 +04:00
char * arg ATTRIBUTE_UNUSED , xmlNodePtr tree ,
xmlNodePtr node2 ATTRIBUTE_UNUSED )
{
2001-02-23 20:55:21 +03:00
xmlNodePtr node ;
2001-10-11 13:12:24 +04:00
int indent = 0 , i ;
2001-02-23 20:55:21 +03:00
2002-10-09 01:26:42 +04:00
if ( ! ctxt )
return ( - 1 ) ;
2001-10-11 13:12:24 +04:00
if ( tree = = NULL )
return ( - 1 ) ;
2001-02-23 20:55:21 +03:00
node = tree ;
while ( node ! = NULL ) {
if ( ( node - > type = = XML_DOCUMENT_NODE ) | |
( node - > type = = XML_HTML_DOCUMENT_NODE ) ) {
2002-10-09 01:26:42 +04:00
fprintf ( ctxt - > output , " / \n " ) ;
2001-10-11 13:12:24 +04:00
} else if ( node - > type = = XML_ELEMENT_NODE ) {
for ( i = 0 ; i < indent ; i + + )
2002-10-09 01:26:42 +04:00
fprintf ( ctxt - > output , " " ) ;
fprintf ( ctxt - > output , " %s \n " , node - > name ) ;
2001-10-11 13:12:24 +04:00
} else {
}
2001-02-23 20:55:21 +03:00
2001-10-11 13:12:24 +04:00
/*
* Browse the full subtree , deep first
*/
2001-02-23 20:55:21 +03:00
if ( ( node - > type = = XML_DOCUMENT_NODE ) | |
( node - > type = = XML_HTML_DOCUMENT_NODE ) ) {
2001-10-11 13:12:24 +04:00
node = ( ( xmlDocPtr ) node ) - > children ;
} else if ( ( node - > children ! = NULL )
& & ( node - > type ! = XML_ENTITY_REF_NODE ) ) {
/* deep first */
node = node - > children ;
indent + + ;
} else if ( ( node ! = tree ) & & ( node - > next ! = NULL ) ) {
/* then siblings */
node = node - > next ;
} else if ( node ! = tree ) {
/* go up to parents->next if needed */
while ( node ! = tree ) {
if ( node - > parent ! = NULL ) {
node = node - > parent ;
indent - - ;
}
if ( ( node ! = tree ) & & ( node - > next ! = NULL ) ) {
node = node - > next ;
break ;
}
if ( node - > parent = = NULL ) {
node = NULL ;
break ;
}
if ( node = = tree ) {
node = NULL ;
break ;
}
}
/* exit condition */
if ( node = = tree )
node = NULL ;
} else
node = NULL ;
}
return ( 0 ) ;
2001-02-23 20:55:21 +03:00
}
/**
* xmlShellPwd :
* @ ctxt : the shell context
* @ buffer : the output buffer
2002-01-22 21:15:52 +03:00
* @ node : a node
2001-02-23 20:55:21 +03:00
* @ node2 : unused
*
* Implements the XML shell function " pwd "
* Show the full path from the root to the node , if needed building
* thumblers when similar elements exists at a given ancestor level .
* The output is compatible with XPath commands .
*
* Returns 0 or - 1 in case of error
*/
2001-10-11 13:12:24 +04:00
int
xmlShellPwd ( xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED , char * buffer ,
xmlNodePtr node , xmlNodePtr node2 ATTRIBUTE_UNUSED )
{
2001-11-10 13:08:57 +03:00
xmlChar * path ;
2001-02-23 20:55:21 +03:00
2001-10-11 13:12:24 +04:00
if ( node = = NULL )
return ( - 1 ) ;
2001-11-10 13:08:57 +03:00
path = xmlGetNodePath ( node ) ;
if ( path = = NULL )
return ( - 1 ) ;
/*
* This test prevents buffer overflow , because this routine
* is only called by xmlShell , in which the second argument is
* 500 chars long .
* It is a dirty hack before a cleaner solution is found .
* Documentation should mention that the second argument must
* be at least 500 chars long , and could be stripped if too long .
*/
snprintf ( buffer , 499 , " %s " , path ) ;
buffer [ 499 ] = ' 0 ' ;
xmlFree ( path ) ;
2001-10-11 13:12:24 +04:00
return ( 0 ) ;
2001-02-23 20:55:21 +03:00
}
/**
2002-12-10 18:19:08 +03:00
* xmlShell :
2001-02-23 20:55:21 +03:00
* @ doc : the initial document
* @ filename : the output buffer
* @ input : the line reading function
2002-10-09 01:26:42 +04:00
* @ output : the output FILE * , defaults to stdout if NULL
2001-02-23 20:55:21 +03:00
*
* Implements the XML shell
* This allow to load , validate , view , modify and save a document
* using a environment similar to a UNIX commandline .
*/
void
xmlShell ( xmlDocPtr doc , char * filename , xmlShellReadlineFunc input ,
2001-10-11 13:12:24 +04:00
FILE * output )
{
2001-02-23 20:55:21 +03:00
char prompt [ 500 ] = " / > " ;
char * cmdline = NULL , * cur ;
int nbargs ;
char command [ 100 ] ;
char arg [ 400 ] ;
int i ;
xmlShellCtxtPtr ctxt ;
xmlXPathObjectPtr list ;
if ( doc = = NULL )
return ;
if ( filename = = NULL )
return ;
if ( input = = NULL )
return ;
if ( output = = NULL )
2002-10-09 01:26:42 +04:00
output = stdout ;
2001-02-23 20:55:21 +03:00
ctxt = ( xmlShellCtxtPtr ) xmlMalloc ( sizeof ( xmlShellCtxt ) ) ;
2001-10-11 13:12:24 +04:00
if ( ctxt = = NULL )
2001-02-23 20:55:21 +03:00
return ;
ctxt - > loaded = 0 ;
ctxt - > doc = doc ;
ctxt - > input = input ;
ctxt - > output = output ;
ctxt - > filename = ( char * ) xmlStrdup ( ( xmlChar * ) filename ) ;
2001-10-11 13:12:24 +04:00
ctxt - > node = ( xmlNodePtr ) ctxt - > doc ;
2001-02-23 20:55:21 +03:00
# ifdef LIBXML_XPATH_ENABLED
ctxt - > pctxt = xmlXPathNewContext ( ctxt - > doc ) ;
if ( ctxt - > pctxt = = NULL ) {
2001-10-11 13:12:24 +04:00
xmlFree ( ctxt ) ;
return ;
2001-02-23 20:55:21 +03:00
}
# endif /* LIBXML_XPATH_ENABLED */
while ( 1 ) {
if ( ctxt - > node = = ( xmlNodePtr ) ctxt - > doc )
2002-06-14 21:07:10 +04:00
snprintf ( prompt , sizeof ( prompt ) , " %s > " , " / " ) ;
2001-10-11 13:12:24 +04:00
else if ( ctxt - > node - > name )
snprintf ( prompt , sizeof ( prompt ) , " %s > " , ctxt - > node - > name ) ;
2001-02-23 20:55:21 +03:00
else
2002-06-14 21:07:10 +04:00
snprintf ( prompt , sizeof ( prompt ) , " ? > " ) ;
2001-02-23 20:55:21 +03:00
prompt [ sizeof ( prompt ) - 1 ] = 0 ;
2001-10-11 13:12:24 +04:00
/*
* Get a new command line
*/
2001-02-23 20:55:21 +03:00
cmdline = ctxt - > input ( prompt ) ;
2001-10-11 13:12:24 +04:00
if ( cmdline = = NULL )
break ;
/*
* Parse the command itself
*/
cur = cmdline ;
nbargs = 0 ;
while ( ( * cur = = ' ' ) | | ( * cur = = ' \t ' ) )
cur + + ;
i = 0 ;
while ( ( * cur ! = ' ' ) & & ( * cur ! = ' \t ' ) & &
( * cur ! = ' \n ' ) & & ( * cur ! = ' \r ' ) ) {
if ( * cur = = 0 )
break ;
command [ i + + ] = * cur + + ;
}
command [ i ] = 0 ;
if ( i = = 0 )
continue ;
nbargs + + ;
2001-02-23 20:55:21 +03:00
2001-10-11 13:12:24 +04:00
/*
* Parse the argument
*/
while ( ( * cur = = ' ' ) | | ( * cur = = ' \t ' ) )
cur + + ;
i = 0 ;
while ( ( * cur ! = ' \n ' ) & & ( * cur ! = ' \r ' ) & & ( * cur ! = 0 ) ) {
if ( * cur = = 0 )
break ;
arg [ i + + ] = * cur + + ;
}
arg [ i ] = 0 ;
if ( i ! = 0 )
nbargs + + ;
/*
* start interpreting the command
*/
2001-02-23 20:55:21 +03:00
if ( ! strcmp ( command , " exit " ) )
2001-10-11 13:12:24 +04:00
break ;
2001-02-23 20:55:21 +03:00
if ( ! strcmp ( command , " quit " ) )
2001-10-11 13:12:24 +04:00
break ;
2001-02-23 20:55:21 +03:00
if ( ! strcmp ( command , " bye " ) )
2001-10-11 13:12:24 +04:00
break ;
2001-11-08 16:53:05 +03:00
if ( ! strcmp ( command , " help " ) ) {
2002-10-09 01:26:42 +04:00
fprintf ( ctxt - > output , " \t base display XML base of the node \n " ) ;
fprintf ( ctxt - > output , " \t setbase URI change the XML base of the node \n " ) ;
fprintf ( ctxt - > output , " \t bye leave shell \n " ) ;
fprintf ( ctxt - > output , " \t cat [node] display node or current node \n " ) ;
fprintf ( ctxt - > output , " \t cd [path] change directory to path or to root \n " ) ;
fprintf ( ctxt - > output , " \t dir [path] dumps informations about the node (namespace, attributes, content) \n " ) ;
fprintf ( ctxt - > output , " \t du [path] show the structure of the subtree under path or the current node \n " ) ;
fprintf ( ctxt - > output , " \t exit leave shell \n " ) ;
fprintf ( ctxt - > output , " \t help display this help \n " ) ;
fprintf ( ctxt - > output , " \t free display memory usage \n " ) ;
fprintf ( ctxt - > output , " \t load [name] load a new document with name \n " ) ;
fprintf ( ctxt - > output , " \t ls [path] list contents of path or the current directory \n " ) ;
2002-01-23 01:12:19 +03:00
# ifdef LIBXML_XPATH_ENABLED
2002-10-09 01:26:42 +04:00
fprintf ( ctxt - > output , " \t xpath expr evaluate the XPath expression in that context and print the result \n " ) ;
2002-01-23 01:12:19 +03:00
# endif /* LIBXML_XPATH_ENABLED */
2002-10-09 01:26:42 +04:00
fprintf ( ctxt - > output , " \t pwd display current working directory \n " ) ;
fprintf ( ctxt - > output , " \t quit leave shell \n " ) ;
fprintf ( ctxt - > output , " \t save [name] save this document to name or the original name \n " ) ;
fprintf ( ctxt - > output , " \t validate check the document for errors \n " ) ;
fprintf ( ctxt - > output , " \t write [name] write the current node to the filename \n " ) ;
2002-10-22 18:25:25 +04:00
fprintf ( ctxt - > output , " \t grep string search for a string in the subtree \n " ) ;
2001-11-08 16:53:05 +03:00
} else if ( ! strcmp ( command , " validate " ) ) {
2001-10-11 13:12:24 +04:00
xmlShellValidate ( ctxt , arg , NULL , NULL ) ;
} else if ( ! strcmp ( command , " load " ) ) {
xmlShellLoad ( ctxt , arg , NULL , NULL ) ;
} else if ( ! strcmp ( command , " save " ) ) {
xmlShellSave ( ctxt , arg , NULL , NULL ) ;
} else if ( ! strcmp ( command , " write " ) ) {
xmlShellWrite ( ctxt , arg , NULL , NULL ) ;
2002-10-22 18:25:25 +04:00
} else if ( ! strcmp ( command , " grep " ) ) {
xmlShellGrep ( ctxt , arg , ctxt - > node , NULL ) ;
2001-10-11 13:12:24 +04:00
} else if ( ! strcmp ( command , " free " ) ) {
if ( arg [ 0 ] = = 0 ) {
2002-10-09 01:26:42 +04:00
xmlMemShow ( ctxt - > output , 0 ) ;
2001-10-11 13:12:24 +04:00
} else {
int len = 0 ;
sscanf ( arg , " %d " , & len ) ;
2002-10-09 01:26:42 +04:00
xmlMemShow ( ctxt - > output , len ) ;
2001-10-11 13:12:24 +04:00
}
} else if ( ! strcmp ( command , " pwd " ) ) {
char dir [ 500 ] ;
if ( ! xmlShellPwd ( ctxt , dir , ctxt - > node , NULL ) )
2002-10-09 01:26:42 +04:00
fprintf ( ctxt - > output , " %s \n " , dir ) ;
2001-10-11 13:12:24 +04:00
} else if ( ! strcmp ( command , " du " ) ) {
xmlShellDu ( ctxt , NULL , ctxt - > node , NULL ) ;
} else if ( ! strcmp ( command , " base " ) ) {
xmlShellBase ( ctxt , NULL , ctxt - > node , NULL ) ;
2002-01-23 01:12:19 +03:00
# ifdef LIBXML_XPATH_ENABLED
} else if ( ! strcmp ( command , " xpath " ) ) {
if ( arg [ 0 ] = = 0 ) {
xmlGenericError ( xmlGenericErrorContext ,
" xpath: expression required \n " ) ;
} else {
ctxt - > pctxt - > node = ctxt - > node ;
list = xmlXPathEval ( ( xmlChar * ) arg , ctxt - > pctxt ) ;
2002-10-09 01:26:42 +04:00
xmlXPathDebugDumpObject ( ctxt - > output , list , 0 ) ;
2002-01-23 01:12:19 +03:00
xmlXPathFreeObject ( list ) ;
}
# endif /* LIBXML_XPATH_ENABLED */
2002-01-17 11:46:58 +03:00
} else if ( ! strcmp ( command , " setbase " ) ) {
xmlShellSetBase ( ctxt , arg , ctxt - > node , NULL ) ;
2001-10-11 13:12:24 +04:00
} else if ( ( ! strcmp ( command , " ls " ) ) | | ( ! strcmp ( command , " dir " ) ) ) {
int dir = ( ! strcmp ( command , " dir " ) ) ;
if ( arg [ 0 ] = = 0 ) {
if ( dir )
xmlShellDir ( ctxt , NULL , ctxt - > node , NULL ) ;
else
xmlShellList ( ctxt , NULL , ctxt - > node , NULL ) ;
} else {
ctxt - > pctxt - > node = ctxt - > node ;
2001-02-23 20:55:21 +03:00
# ifdef LIBXML_XPATH_ENABLED
2001-10-11 13:12:24 +04:00
ctxt - > pctxt - > node = ctxt - > node ;
list = xmlXPathEval ( ( xmlChar * ) arg , ctxt - > pctxt ) ;
2001-02-23 20:55:21 +03:00
# else
2001-10-11 13:12:24 +04:00
list = NULL ;
2001-02-23 20:55:21 +03:00
# endif /* LIBXML_XPATH_ENABLED */
2001-10-11 13:12:24 +04:00
if ( list ! = NULL ) {
switch ( list - > type ) {
case XPATH_UNDEFINED :
xmlGenericError ( xmlGenericErrorContext ,
" %s: no such node \n " , arg ) ;
break ;
case XPATH_NODESET : {
int indx ;
2001-11-07 16:33:59 +03:00
if ( list - > nodesetval = = NULL )
break ;
2001-10-11 13:12:24 +04:00
for ( indx = 0 ;
indx < list - > nodesetval - > nodeNr ;
indx + + ) {
if ( dir )
xmlShellDir ( ctxt , NULL ,
list - > nodesetval - >
nodeTab [ indx ] , NULL ) ;
else
xmlShellList ( 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 ;
}
2001-04-27 21:13:01 +04:00
# ifdef LIBXML_XPATH_ENABLED
2001-10-11 13:12:24 +04:00
xmlXPathFreeObject ( list ) ;
2001-04-27 21:13:01 +04:00
# endif
2001-10-11 13:12:24 +04:00
} 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 {
2001-02-23 20:55:21 +03:00
# ifdef LIBXML_XPATH_ENABLED
2001-10-11 13:12:24 +04:00
ctxt - > pctxt - > node = ctxt - > node ;
list = xmlXPathEval ( ( xmlChar * ) arg , ctxt - > pctxt ) ;
2001-02-23 20:55:21 +03:00
# else
2001-10-11 13:12:24 +04:00
list = NULL ;
2001-02-23 20:55:21 +03:00
# endif /* LIBXML_XPATH_ENABLED */
2001-10-11 13:12:24 +04:00
if ( list ! = NULL ) {
switch ( list - > type ) {
case XPATH_UNDEFINED :
xmlGenericError ( xmlGenericErrorContext ,
" %s: no such node \n " , arg ) ;
break ;
case XPATH_NODESET :
2001-11-07 16:33:59 +03:00
if ( list - > nodesetval ! = NULL ) {
if ( list - > nodesetval - > nodeNr = = 1 ) {
ctxt - > node = list - > nodesetval - > nodeTab [ 0 ] ;
} else
xmlGenericError ( xmlGenericErrorContext ,
" %s is a %d Node Set \n " ,
arg ,
list - > nodesetval - > nodeNr ) ;
2001-10-11 13:12:24 +04:00
} else
xmlGenericError ( xmlGenericErrorContext ,
2001-11-07 16:33:59 +03:00
" %s is an empty Node Set \n " ,
arg ) ;
2001-10-11 13:12:24 +04:00
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 ;
}
2001-04-27 21:13:01 +04:00
# ifdef LIBXML_XPATH_ENABLED
2001-10-11 13:12:24 +04:00
xmlXPathFreeObject ( list ) ;
2001-04-27 21:13:01 +04:00
# endif
2001-10-11 13:12:24 +04:00
} else {
xmlGenericError ( xmlGenericErrorContext ,
" %s: no such node \n " , arg ) ;
}
ctxt - > pctxt - > node = NULL ;
}
} else if ( ! strcmp ( command , " cat " ) ) {
if ( arg [ 0 ] = = 0 ) {
xmlShellCat ( ctxt , NULL , ctxt - > node , NULL ) ;
} else {
ctxt - > pctxt - > node = ctxt - > node ;
2001-02-23 20:55:21 +03:00
# ifdef LIBXML_XPATH_ENABLED
2001-10-11 13:12:24 +04:00
ctxt - > pctxt - > node = ctxt - > node ;
list = xmlXPathEval ( ( xmlChar * ) arg , ctxt - > pctxt ) ;
2001-02-23 20:55:21 +03:00
# else
2001-10-11 13:12:24 +04:00
list = NULL ;
2001-02-23 20:55:21 +03:00
# endif /* LIBXML_XPATH_ENABLED */
2001-10-11 13:12:24 +04:00
if ( list ! = NULL ) {
switch ( list - > type ) {
case XPATH_UNDEFINED :
xmlGenericError ( xmlGenericErrorContext ,
" %s: no such node \n " , arg ) ;
break ;
case XPATH_NODESET : {
int indx ;
2001-11-07 16:33:59 +03:00
if ( list - > nodesetval = = NULL )
break ;
2001-10-11 13:12:24 +04:00
for ( indx = 0 ;
indx < list - > nodesetval - > nodeNr ;
indx + + ) {
if ( i > 0 )
2002-10-09 01:26:42 +04:00
fprintf ( ctxt - > output , " ------- \n " ) ;
2001-10-11 13:12:24 +04:00
xmlShellCat ( 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 ;
}
2001-04-27 21:13:01 +04:00
# ifdef LIBXML_XPATH_ENABLED
2001-10-11 13:12:24 +04:00
xmlXPathFreeObject ( list ) ;
2001-04-27 21:13:01 +04:00
# endif
2001-10-11 13:12:24 +04:00
} else {
xmlGenericError ( xmlGenericErrorContext ,
" %s: no such node \n " , arg ) ;
}
ctxt - > pctxt - > node = NULL ;
}
} else {
xmlGenericError ( xmlGenericErrorContext ,
" Unknown command %s \n " , command ) ;
}
free ( cmdline ) ; /* not xmlFree here ! */
2001-02-23 20:55:21 +03:00
}
# ifdef LIBXML_XPATH_ENABLED
xmlXPathFreeContext ( ctxt - > pctxt ) ;
# endif /* LIBXML_XPATH_ENABLED */
if ( ctxt - > loaded ) {
xmlFreeDoc ( ctxt - > doc ) ;
}
2001-07-09 20:01:19 +04:00
if ( ctxt - > filename ! = NULL )
2001-10-11 13:12:24 +04:00
xmlFree ( ctxt - > filename ) ;
2001-02-23 20:55:21 +03:00
xmlFree ( ctxt ) ;
if ( cmdline ! = NULL )
2001-10-11 13:12:24 +04:00
free ( cmdline ) ; /* not xmlFree here ! */
2001-02-23 20:55:21 +03:00
}
# endif /* LIBXML_DEBUG_ENABLED */