# -*- shell-script -*-
# help.sh - gdb-like "help" debugger command
#
#   Copyright (C) 2002-2006, 2008, 2010-2011, 2015
#   Rocky Bernstein <rocky@gnu.org>
#
#   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, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program; see the file COPYING.  If not, write to
#   the Free Software Foundation, 59 Temple Place, Suite 330, Boston,
#   MA 02111 USA.

if [[ $0 == ${BASH_SOURCE[0]} ]] ; then
    dirname=${BASH_SOURCE[0]%/*}
    [[ $dirname == $0 ]] && top_dir='..' || top_dir=${dirname}/..
    for file in help alias ; do source "$top_dir/lib/${file}.sh"; done
fi

_Dbg_help_add help \
'**help** [*command* [*subcommand* ..]]

If no arguments are given, print a list of command names.
With a command name give help for that command. For many commands
you can get further detailed help by listing the subcommand name.

Examples:
---------

  help
  help up
  help set
  help set args' 1 _Dbg_complete_help

_Dbg_complete_help() {
    typeset -a words;
    IFS=' ' words=( $COMP_LINE )
    typeset subcmds
    subcmds="${!_Dbg_command_help[@]}"
    if (( ${#words[@]} == 1 )); then
	COMPREPLY=( $subcmds )
    elif (( ${#words[@]} == 2 )) ; then
	typeset commands="${!_Dbg_command_help[@]}"
	COMPREPLY=( $(compgen -W  "$subcmds" "${words[1]}") )
    else
	COMPREPLY=()
    fi
}

# print help command
function _Dbg_do_help {

    # We have to use be careful to make sure globbing, e.g. * isn't
    # done.

    # Treat "help *" the same as help
    [[ "$_Dbg_args" == '*' ]] && _Dbg_args=''

    if [[ '' == $_Dbg_args ]] ; then
      _Dbg_help_sort_command_names
      _Dbg_section 'Available commands:'
      typeset -a list=("${_Dbg_sorted_command_names[@]}")
      _Dbg_list_columns
      _Dbg_msg ''
      _Dbg_msg 'Readline command line editing (emacs/vi mode) is available.'
      _Dbg_msg 'Type "help" followed by command name for full documentation.'
      return 0
    else
	typeset dbg_cmd="$1"
	if [[ -n ${_Dbg_command_help[$dbg_cmd]} ]] ; then
 	    _Dbg_msg_rst "${_Dbg_command_help[$dbg_cmd]}"
	else
	    typeset _Dbg_expanded_alias; _Dbg_alias_expand $dbg_cmd
	    dbg_cmd="$_Dbg_expanded_alias"
	    if [[ -n ${_Dbg_command_help[$dbg_cmd]} ]] ; then
 		_Dbg_msg_rst "${_Dbg_command_help[$dbg_cmd]}"
	    else
		case $dbg_cmd in
		    i | in | inf | info )
			_Dbg_info_help $2
			return
			;;
		    sh | sho | show )
			_Dbg_help_show $2
			;;
		    se | set )
			_Dbg_help_set $2
			;;
		    * )
			# Look for a unique abbreviation
			typeset -i count=0
			typeset found_cmd
			typeset list; list="${!_Dbg_command_help[@]}"
			for try in $list ; do
			    if [[ $try =~ ^$dbg_cmd ]] ; then
				found_cmd=$try
				((count++))
			    fi
			done
			((found=(count==1)))
			if ((found)); then
 			    _Dbg_msg "${_Dbg_command_help[$found_cmd]}"
			else
  			    _Dbg_errmsg "Undefined command: \"$dbg_cmd\".  Try \"help\"."
  			    return 1
			fi
			;;
		esac
	    fi
	fi

	declare _Dbg_aliases_found=''
	_Dbg_alias_find_aliased "$dbg_cmd"
	if [[ -n $_Dbg_aliases_found ]] ; then
	    _Dbg_msg ''
	    _Dbg_msg "Aliases for $dbg_cmd: $_Dbg_aliases_found"
	fi
	return 2
    fi
}

_Dbg_alias_add 'h' help
_Dbg_alias_add '?' help

# Demo it.
if [[ $0 == ${BASH_SOURCE[0]} ]] ; then
    for file in sort columnize list msg ; do
	source "$top_dir/lib/${file}.sh";
    done
    # source /usr/local/share/bashdb/bashdb-trace
    # _Dbg_debugger
    _Dbg_do_help
    echo '---'
    _Dbg_args='help'
    _Dbg_do_help help
fi
