#!/bin/bash
# -*- shell-script -*-
#   Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 
#   2009  Rocky Bernstein rocky@gnu.org
#
#   bashdb 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.
#
#   bashdb 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 bashdb; see the file COPYING.  If not, write to the Free Software
#   Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
#

# The alternate way to invoke debugger, "bash --debugger", has some
# advantages: it sets $0 correctly and doesn't show this script in
# the call trace. However the bash has been a bit inflexible and
# quirky so sadly this script seems to be needed more than it would
# normally.

[[ -z $_Dbg_ver ]] && typeset _Dbg_ver=\
'$Id: bashdb.in,v 1.48 2008/10/30 08:22:23 rockyb Exp $'

# This routine gets called via the -c or --command option and its sole
# purpose is to capture the command string such as via "x $*" or 
# in a traceback ("where").
function _Dbg_eval {
  eval $*  
}

# Name we refer to ourselves by
typeset _Dbg_debugger_name='bashdb'

# The shell we are configured to run under.
typeset _Dbg_shell='/bin/bash'

# The release name we are configured to run under.
typeset _Dbg_release='4.0-0.4'

# The short shell name. Helps keep code common in bash, zsh, and ksh debuggers.
typeset _Dbg_shell_name=${_Dbg_shell##*/}  # Equivalent to basename(_Dbg_shell)

# Original $0. Note we can't set this in an include.
typeset _Dbg_orig_0=$0

# Equivalent to basename $0; the short program name
typeset _Dbg_pname=${0##*/}  

## Stuff set by autoconf/configure ###
typeset prefix=/usr/local
typeset _Dbg_libdir=${prefix}/share/bashdb
###

[[ ! -d $_Dbg_libdir ]] && _Dbg_libdir='.'
# Parse just the libdir option
# Show basename only in location listing. This is needed in regression tests
typeset -i _Dbg_basename_only=${BASHDB_BASENAME_ONLY:-0}

typeset    _Dbg_bashdb_main=/usr/local/lib/bashdb/bashdb-main.inc
typeset -x _Dbg_libdir=${_Dbg_bashdb_main%/*}  # dirname(_Dbg_bashdb_main)
# typeset    _Dbg_libdir=${prefix}/share/bashdb

typeset    _Dbg_main=dbg-main.sh
typeset    _Dbg_bindir=$(dirname $0)

# What to set for location of helper routines? 
if [[ ! -e $_Dbg_libdir/$_Dbg_main ]] ; then
  # Use bindir/../share as fallback
    _Dbg_libdir=
    if [[ -d $_Dbg_bindir/../share/bashdb ]] ; then
      _Dbg_libdir=$_Dbg_bindir/../share/bashdb
    fi
fi

# Parse just the library option
typeset -ax _Dbg_script_args=("$@")
typeset -i _Dbg_i
for ((_Dbg_i=0; _Dbg_i<${#_Dbg_script_args[@]}-1; _Dbg_i++)) ; do 
    typeset arg=${_Dbg_script_args[$_Dbg_i]}
    if [[ $arg == '-L' || $arg == '--library' ]] ; then
	((_Dbg_i++))
	_Dbg_libdir="${_Dbg_script_args[$_Dbg_i]}"
	break
    fi
done
if [[ ! -d $_Dbg_libdir ]] && [[ ! -d $_Dbg_libdir ]] ; then 
  echo "${_Dbg_pname}: Can't read debugger library directory '${_Dbg_libdir}'."
  echo "${_Dbg_pname}: Perhaps bashdb is installed wrong (if its installed)." >&2
  echo "${_Dbg_pname}: Try running bashdb using -L (with a different directory)." >&2
  echo "${_Dbg_pname}: Run bashdb --help for a list and explanation of options." >&2
  exit 1
fi

# Pull in the rest of the debugger code.
typeset _Dbg_main="$_Dbg_libdir/dbg-main.sh"
if [[ ! -r $_Dbg_main ]] ; then 
  print "${_Dbg_pname}: Can't read debugger library file '${_Dbg_main}'."
  print "${_Dbg_pname}: Perhaps bashdb is installed wrong (if its installed)." >&2
  print "${_Dbg_pname}: Try running bashdb using -L (with a different directory)." >&2
  print "${_Dbg_pname}: Run bashdb --help for a list and explanation of options." >&2
  exit 1
    
fi

. $_Dbg_libdir/dbg-main.sh ;

# I don't know why when this is done in dbg-opts.sh it doesn't have
# an effect.
((OPTLIND > 0)) && shift "$((OPTLIND - 1))"

if (($# == 0)) && [[ -z $_Dbg_EXECUTION_STRING ]] ; then
    echo >&2 "${_Dbg_pname}: need to give a script to debug or use the -c option."
    exit 1
fi
    
_Dbg_script_file="$1"
shift

if [[ ! -d $_Dbg_tmpdir ]] && [[ ! -w $_Dbg_tmpdir ]] ; then
  echo "${_Dbg_pname}: cannot write to temp directory $_Dbg_tmpdir." >&2
  echo "${_Dbg_pname}: Use -T try directory location." >&2
  exit 1
fi

# Note that this is called via bashdb rather than "bash --debugger"
_Dbg_script=1

if [[ -n $_Dbg_EXECUTION_STRING ]] ; then
    _Dbg_script_file=$(_Dbg_tempname cmd)
    echo "$_Dbg_EXECUTION_STRING" >$_Dbg_script_file
fi

if [[ ! -r "$_Dbg_script_file" ]] ; then
    echo "${_Dbg_pname}: cannot read program to debug: ${_Dbg_script_file}." >&2
    exit 1
fi

typeset -r _Dbg_Dbg_script_file=$(_Dbg_expand_filename $_Dbg_script_file)

if ((_Dbg_linetrace)) ; then 
  # No stepping.
  _Dbg_write_journal_eval "_Dbg_step_ignore=-1" 
  _Dbg_QUIT_ON_QUIT=1
else 
  # Set to skip over statements up to ". $_Dbg_script_file"
  _Dbg_write_journal_eval "_Dbg_step_ignore=3" 
fi
_Dbg_init_default_traps
trap '_Dbg_debug_trap_handler 0 "$BASH_COMMAND" "$@"' DEBUG
set -o functrace
. "$_Dbg_script_file"

# end of bashdb
