/*
 * debugXML.h : Interfaces to a set of routines used for debugging the tree
 *              produced by the XML parser.
 *
 * Daniel Veillard <daniel@veillard.com>
 */

#ifndef __DEBUG_XML__
#define __DEBUG_XML__
#include <stdio.h>
#include <libxml/tree.h>

#ifdef LIBXML_DEBUG_ENABLED

#include <libxml/xpath.h>

#ifdef __cplusplus
extern "C" {
#endif

/*
 * The standard Dump routines
 */
void	xmlDebugDumpString	(FILE *output,
				 const xmlChar *str);
void	xmlDebugDumpAttr	(FILE *output,
				 xmlAttrPtr attr,
				 int depth);
void	xmlDebugDumpAttrList	(FILE *output,
				 xmlAttrPtr attr,
				 int depth);
void	xmlDebugDumpOneNode	(FILE *output,
				 xmlNodePtr node,
				 int depth);
void	xmlDebugDumpNode	(FILE *output,
				 xmlNodePtr node,
				 int depth);
void	xmlDebugDumpNodeList	(FILE *output,
				 xmlNodePtr node,
				 int depth);
void	xmlDebugDumpDocumentHead(FILE *output,
				 xmlDocPtr doc);
void	xmlDebugDumpDocument	(FILE *output,
				 xmlDocPtr doc);
void	xmlDebugDumpDTD		(FILE *output,
				 xmlDtdPtr dtd);
void	xmlDebugDumpEntities	(FILE *output,
				 xmlDocPtr doc);

void	xmlLsOneNode		(FILE *output, xmlNodePtr node);
int	xmlLsCountNode		(xmlNodePtr node);

const char *xmlBoolToText	(int boolval);
long	xmlGetLineNo		(xmlNodePtr node);
xmlChar *xmlGetNodePath		(xmlNodePtr node);

/****************************************************************
 *								*
 *	 The XML shell related structures and functions		*
 *								*
 ****************************************************************/

/**
 * xmlShellReadlineFunc:
 * @prompt:  a string prompt
 *
 * This is a generic signature for the XML shell input function
 *
 * Returns a string which will be freed by the Shell
 */
typedef char * (* xmlShellReadlineFunc)(char *prompt);

/**
 * xmlShellCtxt:
 *
 * A debugging shell context
 * TODO: add the defined function tables.
 */
typedef struct _xmlShellCtxt xmlShellCtxt;
typedef xmlShellCtxt *xmlShellCtxtPtr;
struct _xmlShellCtxt {
    char *filename;
    xmlDocPtr doc;
    xmlNodePtr node;
    xmlXPathContextPtr pctxt;
    int loaded;
    FILE *output;
    xmlShellReadlineFunc input;
};

/**
 * xmlShellCmd:
 * @ctxt:  a shell context
 * @arg:  a string argument
 * @node:  a first node
 * @node2:  a second node
 *
 * This is a generic signature for the XML shell functions
 *
 * Returns an int, negative returns indicating errors
 */
typedef int (* xmlShellCmd) (xmlShellCtxtPtr ctxt,
                             char *arg,
			     xmlNodePtr node,
			     xmlNodePtr node2);

void	xmlShellPrintXPathError	(int errorType, const char* arg);
void	xmlShellPrintNode	(xmlNodePtr node);
void	xmlShellPrintXPathResult(xmlXPathObjectPtr list);
int	xmlShellList		(xmlShellCtxtPtr ctxt,
				 char *arg,
				 xmlNodePtr node,
				 xmlNodePtr node2);
int	xmlShellBase		(xmlShellCtxtPtr ctxt,
				 char *arg,
				 xmlNodePtr node,
				 xmlNodePtr node2);
int	xmlShellDir		(xmlShellCtxtPtr ctxt,
				 char *arg,
				 xmlNodePtr node,
				 xmlNodePtr node2);
int	xmlShellCat		(xmlShellCtxtPtr ctxt,
				 char *arg,
				 xmlNodePtr node,
				 xmlNodePtr node2);
int	xmlShellLoad		(xmlShellCtxtPtr ctxt,
				 char *filename,
				 xmlNodePtr node,
				 xmlNodePtr node2);
int	xmlShellWrite		(xmlShellCtxtPtr ctxt,
				 char *filename,
				 xmlNodePtr node,
				 xmlNodePtr node2);
int	xmlShellSave		(xmlShellCtxtPtr ctxt,
				 char *filename,
				 xmlNodePtr node,
				 xmlNodePtr node2);
int	xmlShellValidate	(xmlShellCtxtPtr ctxt,
				 char *dtd,
				 xmlNodePtr node,
				 xmlNodePtr node2);
int	xmlShellDu		(xmlShellCtxtPtr ctxt,
				 char *arg,
				 xmlNodePtr tree,
				 xmlNodePtr node2);
int	xmlShellPwd		(xmlShellCtxtPtr ctxt,
				 char *buffer,
				 xmlNodePtr node,
				 xmlNodePtr node2);

/*
 * The Shell interface.
 */
void	xmlShell		(xmlDocPtr doc,
				 char *filename,
				 xmlShellReadlineFunc input,
				 FILE *output);
			 
#ifdef __cplusplus
}
#endif

#endif /* LIBXML_DEBUG_ENABLED */
#endif /* __DEBUG_XML__ */
