/*
 * Summary: Tree debugging APIs
 * Description: Interfaces to a set of routines used for debugging the tree
 *              produced by the XML parser.
 *
 * Copy: See Copyright for the status of this software.
 *
 * Author: Daniel Veillard
 */

#ifndef __DEBUG_XML__
#define __DEBUG_XML__
#include <stdio.h>
#include "xmlversion.h"
#include "tree.h"

#ifdef LIBXML_DEBUG_ENABLED

#include "xpath.h"

#ifdef __cplusplus
extern "C" {
#endif

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

/****************************************************************
 *                                                              *
 *                      Checking routines                       *
 *                                                              *
 ****************************************************************/

XMLPUBFUN int XMLCALL
        xmlDebugCheckDocument   (FILE * output,
                                 xmlDocPtr doc);

/****************************************************************
 *                                                              *
 *                      XML shell helpers                       *
 *                                                              *
 ****************************************************************/

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

XMLPUBFUN const char * XMLCALL 
        xmlBoolToText           (int boolval);

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

#ifdef LIBXML_XPATH_ENABLED
/**
 * 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);

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

/*
 * The Shell interface.
 */
XMLPUBFUN void XMLCALL  
        xmlShell                (xmlDocPtr doc,
                                 char *filename,
                                 xmlShellReadlineFunc input,
                                 FILE *output);
                         
#endif /* LIBXML_XPATH_ENABLED */

#ifdef __cplusplus
}
#endif

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