
/**************************************************************************
                          debugXSL.h  -  describes the core xsldbg shell functions
                             -------------------
    begin                : Sun Sep 16 2001
    copyright            : (C) 2001 by Keith Isdale
    email                : k_isdale@tpg.com.au
 **************************************************************************/

/**************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 **************************************************************************/

/*
 * Orinal file : debugXML.h : This is a set of routines used for
 *    debugging the tree   produced by the XML parser.
 *
 * New file : debugXSL.h : Debug support version
 *
 * See Copyright for the status of this software.
 *
 * Daniel Veillard <daniel@veillard.com>
 *
 * Permission abtained to modify the LGPL'd code and extend to include 
 *   break points, inspections of stylesheet source, xml data, stylesheet
 *    variables   Keith Isdale <k_isdale@tpg.com.au>
 */

#ifndef __DEBUG_XSL__
#define __DEBUG_XSL__

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#ifdef USE_XSLDBG_AS_THREAD
#include "xsldbgmsg.h"
#include "xsldbgthread.h"
#endif

/* We want skip most of these includes when building documentation*/
#ifndef BUILD_DOCS
#include "utils.h"
#include "breakpoint.h"
#endif

#include "debugXML_compat.h"

#ifdef __cplusplus
extern "C" {
#endif

#define DEBUG_BUFFER_SIZE 500   /*used by xslDbgShell */

/* how may items have been printed */
    extern int printCount;

  /* used to indicated that xsldbg should stop tracing/walking 
     value : 1 stop tracing at start of next cycle
     value : 0 normal operation 
  */

  extern int xsldbgStop;
  extern int xsldbgValidateBreakpoints;
  /* Some versions of libxml/libxslt need a different type of 
	line numbers handling */
  extern int xsldbgHasLineNumberFix;  
  extern bool xsldbgReachedFirstTemplate;

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

/*
   Note that functions that have a prefix of xslDbgShell are NOT implemented
      in debugXSL.c unless stated

   All functions with the prefix of debygXSL are implemented in debugXSL.c

 */

#ifdef USE_GNOME_DOCS

/**
 * debugXSLBreak:
 * @templ: The source node being executed
 * @node: The data node being processed
 * @root: The template being applied to "node"
 * @ctxt: The transform context for stylesheet being processed
 *
 * A break point has been found so pass control to user
 */
#else
#ifdef USE_KDE_DOCS

/**
 * A break point has been found so pass control to user
 *
 * @param templ The source node being executed
 * @param node The data node being processed
 * @param root The template being applied to "node"
 * @param ctxt transform context for stylesheet being processed
 */
#endif
#endif
    void debugXSLBreak(xmlNodePtr templ, xmlNodePtr node,
                       xsltTemplatePtr root, xsltTransformContextPtr ctxt);


#ifdef USE_GNOME_DOCS

/**
 * debugXSLGetTemplate:
 * 
 * Get the last template node found, if any
 *
 * Returns The last template node found, if any
 */
#else
#ifdef USE_KDE_DOCS

/** 
 * Get the last template node found, if any
 *
 * @returns the last template node found, if any
 */
#endif
#endif
    xsltTemplatePtr debugXSLGetTemplate(void);



/* -----------------------------------------
   Break Point related commands

   They are implemented in breakpoint_cmds.c
  ------------------------------------------- */


#ifdef USE_GNOME_DOCS

/**
 * xslDbgShellFrameBreak:
 * @arg: Is valid number of frames to change location by
 * @stepup: If != 1 then we step up, otherwise step down
 *
 * Set a "frame" break point either up or down from here
 *
 * Returns 1 on success,
 *         0 otherwise
 */
#else
#ifdef USE_KDE_DOCS

/**
 * Set a "frame" break point either up or down from here
 *
 * @returns 1 on success,
 *          0 otherwise
 *
 * @param arg Is valid  and in UTF-8
 * @param stepup If != 1 then we step up, otherwise step down
 */
#endif
#endif
    int xslDbgShellFrameBreak(xmlChar * arg, int stepup);



#ifdef USE_GNOME_DOCS

/**
 * xslDbgShellBreak:
 * @arg: Is valid and in UTF-8
 * @style: Is valid
 * @ctxt: Is valid
 * 
 * Add break point specified by arg
 *
 * Returns 1 on success,
 *         0 otherwise
 */
#else
#ifdef USE_KDE_DOCS

/**
 * Add break point specified by arg
 *
 * @returns 1 on success,
 *          0 otherwise
 *
 * @param arg Is valid and in UTF-8
 * @param style Is valid
 * @param ctxt Is valid
 */
#endif
#endif
    int xslDbgShellBreak(xmlChar * arg, xsltStylesheetPtr style,
                         xsltTransformContextPtr ctxt);



#ifdef USE_GNOME_DOCS

/**
 * xslDbgShellDelete:
 * @arg: Is valid and in UTF-8
 * 
 * Delete break point specified by arg
 *
 * Returns 1 on success,
 *         0 otherwise
 */
#else
#ifdef USE_KDE_DOCS

/**
 * Delete break point specified by arg
 *
 * @returns 1 on success,
 *          0 otherwise
 *
 * @param arg Is valid and in UTF-8
 */
#endif
#endif
    int xslDbgShellDelete(xmlChar * arg);


#ifdef USE_GNOME_DOCS

/**
 * xslDbgShellEnableBreakPoint:
 * @payload: A valid xslBreakPointPtr
 * @data: Enable type, a pointer to an integer 
 *         for a value of 
 *                 1 enable break point
 *                 0 disable break point
 *                 -1 toggle enabling of break point 
 * @name: Not used
 *
 * Enable/disable break points via use of scan of break points
*/
#else
#ifdef USE_KDE_DOCS

/**
 * Enable/disable break points via use of scan of break points
 *
 * @param payload Is valid xslBreakPointPtr
 * @param data Enable type, a pointer to an integer 
 *         for a value of 
 *              @li   1 enable break point
 *              @li   0 disable break point
 *              @li   -1 toggle enabling of break point 
 * @param name Not used
*/
#endif
#endif
    void xslDbgShellEnableBreakPoint(void *payload, void *data,
                                     xmlChar * name);



#ifdef USE_GNOME_DOCS

/**
 * xslDbgShellEnable:
 * @arg : is valid enable "commmand text" and in UTF-8
 * @enableType : enable break point if 1, disable if 0, toggle if -1
 *
 * Enable/disable break point specified by arg using enable 
 *      type of @enableType
 * Returns 1 if successful,
 *         0 otherwise
 */
#else
#ifdef USE_KDE_DOCS

  /**
   * Enable/disable break point specified by arg using enable
   *
   * @param arg: is valid enable "commmand text" and in UTF-8
   * @param enableType : enable break point if 1, disable if 0, toggle if -1
   *
   * @returns 1 if successful,
   *          0 otherwise
   */
#endif
#endif
    int xslDbgShellEnable(xmlChar * arg, int enableType);


#ifdef USE_GNOME_DOCS

/**
 * xslDbgShellPrintBreakPoint:
 * @payload: A valid xslBreakPointPtr
 * @data: Not used
 * @name: Not used
 *
 * Print data given by scan of break points 
*/
#else
#ifdef USE_KDE_DOCS

/**
 * Print data given by scan of break points 
 *
 * @param payload Is valid xslBreakPointPtr
 * @param data Not used
 * @param name Not used
*/
#endif
#endif
    void xslDbgShellPrintBreakPoint(void *payload, void *data,
                                    xmlChar * name);



#ifdef USE_GNOME_DOCS

/**
 * xslDbgShellValidateBreakPoint:
 * @payload: A valid xslBreakPointPtr
 * @data: Not used
 * @name: Not used
 *
 * Print an warning if a breakpoint is invalid
*/
#else
#ifdef USE_KDE_DOCS

/**
 * Print an warning if a breakpoint is invalid
 *
 * @param payload Is valid xslBreakPointPtr
 * @param data Not used
 * @param name Not used
*/
#endif
#endif
    void xslDbgShellValidateBreakPoint(void *payload, void *data,
                                    xmlChar * name);


/* -----------------------------------------
   Template related commands

   They are implemented in template_cmds.c
  ------------------------------------------- */

#ifdef USE_GNOME_DOCS

/**
 * xslDbgShellPrintStyleSheets:
 * @arg: The stylesheets of interests and in UTF-8, is NULL for all stylesheets
 *
 * Print stylesheets that can be found in loaded stylsheet
 *
 * Returns 1 on success,
 *         0 otherwise
 */
#else
#ifdef USE_KDE_DOCS

/**
 * Print stylesheets that can be found in loaded stylsheet
 *
 * @returns 1 on success,
 *          0 otherwise
 *
 * @param arg The stylesheets of interests and in UTF-8, is NULL for all stylesheets
 *
 */
#endif
#endif
    int xslDbgShellPrintStyleSheets(xmlChar * arg);



#ifdef USE_GNOME_DOCS

/** 
 * xslDbgShellPrintTemplateNames:
 * @styleCtxt: Is valid 
 * @ctxt: Not used
 * @arg: Not used
 * @verbose: If 1 then print extra messages about templates found,
 *            otherwise print normal messages only 
 * @allFiles: If 1 then look for all templates in stylsheets found in 
 *                 @styleCtxt
 *             otherwise look in the stylesheet found by 
 *                 debugXSLBreak function
 *
 * Print out the list of template names found that match critieria
*
 * Returns 1 on success,
 *         0 otherwise
 */
#else
#ifdef USE_KDE_DOCS

/** 
 * Print out the list of template names found that match critieria   
 *
 * @param styleCtxt Is valid 
 * @param ctxt Not used
 * @param arg Not used
 * @param verbose If 1 then print extra messages about templates found,
 *            otherwise print normal messages only 
 * @param allFiles If 1 then look for all templates in stylsheets found in 
 *                 @p styleCtxt
 *             otherwise look in the stylesheet found by 
 *                 debugXSLBreak function
 * @returns 1 on success,
 *          0 otherwise
 */
#endif
#endif
    int xslDbgShellPrintTemplateNames(xsltTransformContextPtr styleCtxt,
                                      xmlShellCtxtPtr ctxt,
                                      xmlChar * arg, int verbose,
                                      int allFiles);




/* -----------------------------------------

   Node viewing related commands

  ------------------------------------------- */


#ifdef USE_GNOME_DOCS

/**
 * xslDbgShellPrintList: 
 * @ctxt: The current shell context
 * @arg: What xpath to display  and in UTF-8
 * @dir: If 1 print in dir mode?, 
 *        otherwise ls mode
 *
 * Print list of nodes in either ls or dir format
 *
 * Returns 1 on success,
 *         0 otherwise
 */
#else
#ifdef USE_KDE_DOCS

/**
 * Print list of nodes in either ls or dir format
 *
 * @returns 1 on success,
 *          0 otherwise
 *
 * @param ctxt The current shell context
 * @param arg What xpath to display  and in UTF-8
 * @param dir If 1 print in dir mode, 
 *        otherwise ls mode
 */
#endif
#endif
    int xslDbgShellPrintList(xmlShellCtxtPtr ctxt, xmlChar * arg, int dir);



#ifdef USE_GNOME_DOCS

/** 
 * xslDbgShellCat:
 * @styleCtxt: the current stylesheet context
 * @ctxt: The current shell context
 * @arg: The xpath to print and in UTF-8
 *
 * Print the result of an xpath expression. This can include variables
 *        if styleCtxt is not NULL
 *
 * Returns 1 on success,
 *         0 otherwise
 */
#else
#ifdef USE_KDE_DOCS

/** 
 * Print the result of an xpath expression. This can include variables
 *        if styleCtxt is not NULL
 *
 * @returns 1 on success,
 *          0 otherwise
 *
 * @param styleCtxt Current stylesheet context
 * @param ctxt Current shell context
 * @param arg The xpath to print and in UTF-8
 */
#endif
#endif
    int xslDbgShellCat(xsltTransformContextPtr styleCtxt,
                       xmlShellCtxtPtr ctxt, xmlChar * arg);



#ifdef USE_GNOME_DOCS

/**
 * xslDbgShellPrintVariable:
 * @styleCtxt: The current stylesheet context 
 * @arg: The name of variable to look for '$' prefix is optional and in UTF-8
 * @type: A valid VariableTypeEnum
 *
 *  Print the value variable specified by args.
 *
 * Returns 1 on success,
 *         0 otherwise
 */
#else
#ifdef USE_KDE_DOCS

/**
 *  Print the value variable specified by args.
 *
 * @returns 1 on success,
 *          0 otherwise

 *
 * @param styleCtxt The current stylesheet context 
 * @param arg The name of variable to look for '$' prefix is optional and in UTF-8
 * @param type Is valid VariableTypeEnum
 */
#endif
#endif
    int xslDbgShellPrintVariable(xsltTransformContextPtr styleCtxt,
                                 xmlChar * arg, VariableTypeEnum type);


/* -----------------------------------------

   File related command

   Implemented in file_cmds.c
  ------------------------------------------- */
#ifdef USE_GNOME_DOCS

/**
 * xslDbgShellOutput:
 * @arg : Is valid, either a local file name which will be expanded 
 *        if needed, or a "file://" protocol URI
 *
 * Set the output file name to use
 *
 * Returns 1 on success, 
 *         0 otherwise
 */
#else
#ifdef USE_KDE_DOCS

/**
 * xslDbgShellOutput:
 * @arg : Is valid, either a local file name which will be expanded 
 *        if needed, or a "file://" protocol URI
 *
 * Set the output file name to use
 *
 * Returns 1 on success, 
 *         0 otherwise
 */
#endif
#endif
  int xslDbgShellOutput(const xmlChar *arg);




#ifdef USE_GNOME_DOCS

  /**
   * xslDbgEntities:
   * 
   * Print list of entites found 
   *
   * Returns 1 on sucess,
   *         0 otherwise
   */
#else
#ifdef USE_KDE_DOCS

#endif
#endif
    int xslDbgEntities(void);


#ifdef USE_GNOME_DOCS

  /**
   * xslDbgSystem:
   * @arg : Is valid in UTF-8
   * 
   * Print what a system file @arg maps to via the current xml catalog
   *
   * Returns 1 on sucess,
   *         0 otherwise
   */
#else
#ifdef USE_KDE_DOCS

  /**
   * Print what a system file @p arg maps to via the current xml catalog
   *
   * @param arg Is valid in UTF-8
   * 
   * @returns 1 on sucess,
   *          0 otherwise
   */
#endif
#endif
    int xslDbgSystem(const xmlChar * arg);


#ifdef USE_GNOME_DOCS

  /**
   * xslDbgPublic:
   * @arg : Is valid PublicID in UTF-8
   * 
   * Print what a public ID @arg maps to via the current xml catalog
   *
   * Returns 1 on sucess,
   *         0 otherwise
   */
#else
#ifdef USE_KDE_DOCS

  /**
   * Print what a public ID @p arg maps to via the current xml catalog
   *
   * @param arg Is valid PublicID in UTF-8
   * 
   * @returns 1 on sucess,
   *          0 otherwise
   */
#endif
#endif
    int xslDbgPublic(const xmlChar * arg);


#ifdef USE_GNOME_DOCS

  /**
   * xslDbgEncoding:
   * @arg: Is valid encoding supported by libxml2
   *
   * Set current encoding to use for output to standard output
   *
   * Returns 1 on sucess,
   *         0 otherwise
   */
#else
#ifdef USE_KDE_DOCS

  /**
   * Set current encoding to use for output to standard output
   *
   * @param arg Is valid encoding supported by libxml2
   *
   *
   * Returns 1 on sucess,
   */
#endif
#endif
    int xslDbgEncoding(xmlChar * arg);

/* -----------------------------------------

   Operating system related commands

   Implemented in os_cmds.c
  ------------------------------------------- */


#ifdef USE_GNOME_DOCS

/**
 * xslDbgShellChangeWd:
 * @path: The path to change to and in UTF-8
 *
 * Change the current working directory of the operating system
 *
 * Returns 1 if able to change xsldbg's working directory to @path
 *         0 otherwise
 */
#else
#ifdef USE_KDE_DOCS

/**
 * @returns 1 if able to change xsldbg working direcorty to @p path
 *          0 otherwise
 *
 * @param path Operating system path(directory) to change to and in UTF-8 
 */
#endif
#endif
    int xslDbgShellChangeWd(xmlChar * path);



#ifdef USE_GNOME_DOCS

/**
 * xslDbgShellExecute:
 * @name: The name of command string to be executed by operating system shell
 * @verbose: If 1 then print extra debugging messages,
 *            normal messages otherwise
 * 
 * Execute an operating system command
 *
 * Returns 1 on success,
 *         0 otherwise
 */
#else
#ifdef USE_KDE_DOCS

/**
 * @returns 1 if able to execute command @p name,
 *          0 otherwise
 *
 * @param name The name of command string to be executed 
 *            by operating system shell
 * @param verbose If 1 then print extra debugging messages,
 *            normal messages otherwise
 */
#endif
#endif
    int xslDbgShellExecute(xmlChar * name, int verbose);




/* -----------------------------------------

   libxslt parameter related commands

   Implemented in param_cmds.c
  ------------------------------------------- */


#ifdef USE_GNOME_DOCS

/** 
 * xslDbgShellAddParam:
 * @arg: A string comprised of two words separated by
 *          one or more spaces which are in UTF-8. 
 *
 * Add a libxslt parameter to be sent to libxslt later on
 *
 * Returns 1 on success,
 *         0 otherwise
*/
#else
#ifdef USE_KDE_DOCS

/* 
 * Add a parameter to be sent to libxslt later on
 *
 * @returns 1 on success,
 *          0 otherwise
 *
 * @param arg A string comprised of two words separated by
 *          one or more spaces which are in UTF-8
 */
#endif
#endif
    int xslDbgShellAddParam(xmlChar * arg);



#ifdef USE_GNOME_DOCS

/**
 * xslDbgShellDelParam:
 * @arg: A single white space trimmed parameter number to look for
 * 
 * Delete a libxslt parameter that was to be sent to libxslt later on
 *
 * Returns 1 if able to delete parameter @name,
 *         0 otherwise
 */
#else
#ifdef USE_KDE_DOCS

/**
 * Delete a libxslt parameter that was to be sent to libxslt later on
 *
 * @returns 1 if able to delete parameter @p name,
 *          0 otherwise
 *
 * @param arg A single white space trimmed libxslt parameter number to look for
 */
#endif
#endif
    int xslDbgShellDelParam(xmlChar * arg);



#ifdef USE_GNOME_DOCS

/**
 * xslDbgShellShowParam:
 * @arg: Not used
 *
 * Print list of current paramters
 *
 * Returns 1 on success,
 *         0 otherwise
 */
#else
#ifdef USE_KDE_DOCS

/**
 * Print list of current paramters
 *
 * @returns 1 on success,
 *         0 otherwise
 *
 * @param arg Not used
 */
#endif
#endif
    int xslDbgShellShowParam(xmlChar * arg);


    /* -----------------------------------------
     * 
     * Option related commands
     * 
     * Implemented in option_cmds.c
     * 
     * ------------------------------------------- */

#ifdef USE_GNOME_DOCS

/**
 * xslDbgShellSetOption:
 * @arg: Is valid, and in the format  <NAME> <VALUE>
 * 
 * Set the value of an option 
 *
 * Returns 1 on success,
 *         0 otherwise
 */
#else
#ifdef USE_KDE_DOCS

/**
 * Set the value of an option 
 *
 * @returns 1 on success,
 *          0 otherwise
 *
 * @param arg is valid, and in format   <NAME> <VALUE>
 * 
 */
#endif
#endif
    int xslDbgShellSetOption(xmlChar * arg);


#ifdef USE_GNOME_DOCS

/**
 * xslDbgShellOptions:
 *
 * Prints out values for user options
 *
 * Returns 1 on success,
 *         0 otherwise
 */
#else
#ifdef USE_KDE_DOCS

/**
 * Prints out values for user options
 *
 * @returns 1 on success,
 *          0 otherwise
 */
#endif
#endif
    int xslDbgShellOptions(void);


  /**
   * xslDbgShellShowWatches:
   * @styleCtxt: the current stylesheet context
   * @ctxt: The current shell context
   * @showWarnings : If 1 then showWarning messages,
   *                 otherwise do not show warning messages
   *
   * Print the current watches and their values
   *
   * Returns 1 on success,
   *         0 otherwise
   */
  int xslDbgShellShowWatches(xsltTransformContextPtr styleCtxt, 
			       xmlShellCtxtPtr ctx,int showWarnings);

  /**
   * xslDbgShellAddWatch:
   * @arg : A valid xPath of expression to watch the value of
   *
   * Add expression to list of expressions to watch value of
   *
   * Returns 1 on success,
   *         0 otherwise   
   */
  int xslDbgShellAddWatch(xmlChar* arg);

  /**
   * xslDbgShellDeleteWatch:
   * @arg : A watch ID to remove
   *
   * Delete a given watch ID from our list of expressions to watch
   *
   * Returns 1 on success,
   *         0 otherwise
   */
  int xslDbgShellDeleteWatch(xmlChar* arg);


    /* -----------------------------------------
     * 
     * Tracing, walking related commands
     * 
     * Implemented in shell.c
     * 
     * ------------------------------------------- */


#ifdef USE_GNOME_DOCS

/**
 * xslDbgShellTrace:
 * @arg: Not used
 *
 * Start the tracing of the stylesheet. First need to restart it.
 *
 * Returns 1 on success,
 *         0 otherwise
 */
#else
#ifdef USE_KDE_DOCS

/**
 * Start the tracing of the stylesheet. First need to restart it.
 *
 * @returns 1 on success,
 *          0 otherwise
 *
 * @param arg Not used
 */
#endif
#endif
    int xslDbgShellTrace(xmlChar * arg);



#ifdef USE_GNOME_DOCS

/**
 * xslDbgShellWalk:
 * @arg: An interger between 0 and 9 indicate the speed of walk
 *
 * Start walking through the stylesheet.
 *
 * Returns 1 on success,
 *         0 otherwise
 */
#else
#ifdef USE_KDE_DOCS

/**
 * Start walking through the stylesheet.
 *
 * @returns 1 on success,
 *          0 otherwise
 *
 * @param arg An interger between 0 and 9 indicate the speed of walk
 */
#endif
#endif
    int xslDbgShellWalk(xmlChar * arg);



    /* -----------------------------------------
     * 
     * Seach related commands
     * 
     * Implemented in search_cmds.c
     * ------------------------------------------- */


#ifdef USE_GNOME_DOCS

/**
 * xslDbgShellSearch:
 * @styleCtxt: Is valid
 * @style: Is valid
 * @arg: The xpath query to use for searching dataBase
 * 
 * Displays the result of performing a query on the search dataBase
 *
 * Returns 1 if able to run query with @arg, 
 *         0 otherwise
 */
#else
#ifdef USE_KDE_DOCS

/**
 * @returns 1 if able to run query with @p arg, 
 *          0 otherwise
 *
 * @param styleCtxt Is valid
 * @param style Is valid
 * @param arg The xpath query to use for searching dataBase
 */
#endif
#endif
    int xslDbgShellSearch(xsltTransformContextPtr styleCtxt,
                          xsltStylesheetPtr style, xmlChar * arg);


/* -----------------------------------------
   
   Seach related commands

   Implemented in variable_cmds.c
  ------------------------------------------- */

#ifdef USE_GNOME_DOCS

/**
 * xslDbgShellSetVariable:
 * @styleCtxt : Is valid
 * @arg : Is valid must be in the format of 
 *         <VARIABLE_NAME> <XPATH>
 * 
 * Change the value of a global or local variable
 *
 * Returns 1 on success,
 *         0 otherwise
 */
#else
#ifdef USE_KDE_DOCS

/**
 * Change the value of a global or local variable
 *
 * @param styleCtxt Is valid
 * @param arg Is valid must be in the format of 
 *         <VARIABLE_NAME> <XPATH>
 * 
 * @returns 1 on success,
 *          0 otherwise
 */
#endif
#endif

    int xslDbgShellSetVariable(xsltTransformContextPtr styleCtxt,
                               xmlChar * arg);

#ifdef __cplusplus
}
#endif
#endif
 /* __DEBUG_XSL__ */
