#!../bash
#
# Test correct functioning bash debug support not via the bashdb
# debugger but merely by printing via print_trap()
# $Id: dbg-support.tests,v 1.13 2003/02/17 22:02:25 rockyb Exp $
shopt -s extdebug
print_debug_trap() {
   echo "debug lineno: $1 ${FUNCNAME[1]}"
   return
}

print_return_trap() {
   echo "return lineno: $1 ${FUNCNAME[1]}"
   return
}

fn1() {
    echo "LINENO $LINENO"
    echo "LINENO $LINENO"
    echo "BASH_SOURCE[0]" ${BASH_SOURCE[0]}
    echo "FUNCNAME[0]" ${FUNCNAME[0]}
    echo `caller`
    echo `caller 0`
    echo `caller 1`
    echo `caller foo`
}    

fn2() {
    echo "fn2 here. Calling fn1..."
    fn1
}    

fn3() {
    echo "LINENO $LINENO"
    echo "BASH_SOURCE[0]" ${BASH_SOURCE[0]}
    
    # Print a stack trace
    declare -i n
    n=${#FUNCNAME[@]}
    for (( i=0 ; (( i < $n )) ; i++ )) ; do 
        local -i j=i+1
	[ $j -eq $n ] && j=i  # main()'s file is the same as the first caller
	echo "${FUNCNAME[$i]} called from file " \
	    "\`${BASH_SOURCE[$j]}' at line ${BASH_LINENO[$j]}"
    done
    source ./dbg-support.sub
}    

fn4() {
    echo "fn4 here. Calling fn3..."
    fn3
}    


#!../bash
#
# Test of support for debugging facilities in bash
# 
# Test debugger set option functrace - set on. Not in vanilla Bash 2.05
#
set -o functrace
trap 'print_debug_trap $LINENO' DEBUG
trap 'print_return_trap $LINENO' RETURN

# Funcname is now an array, but you still can't see it outside a function
echo "FUNCNAME" ${FUNCNAME[0]:-main}

# We should trace into the below. 
# Start easy with a simple function.
fn1
fn2
fn3
source ./dbg-support.sub

# Test debugger set option functrace - set off
set +T

# We should not trace into this.
fn1
fn2
fn3
fn4
source ./dbg-support.sub

# Another way to say: set -o functrace
set -T

# We should trace into this.
source ./dbg-support.sub
set +T

# Test that the line numbers in the presence of conditionals are correct.
for (( i=0 ; (( i <= 2 )) ; i++ )) ; do 
    if [ $i -eq 2 ] ; then
	echo "Hit 2"
    fi
    j=4
done

#
# Check line numbers in command substitution
#
echo $(sourced_fn)
echo `sourced_fn`
x=$((sourced_fn))
x={ sourced_fn }

# Make sure we step into sourced_fn as a comand when we request to do so.
# Vanilla bash 2.0 doesn't do.
set -o functrace
x={ sourced_fn }

# Should see line number of xyzzy below. Vanilla bash 2.05b doesn't do
case xyzzy in
 a )
    x=5
    ;; 
 xyzz? )
    case 3 in 
      2 ) 
	x=6 ;;
      3 ) 
	echo "got it" ;;
      * ) echo "no good" ;;
      esac
    ;;
 * )
esac

# Should see line numbers for initial for lines.
for i in 0 1 ; do
  for j in 3 4 ; do
    ((x=i+j))
  done
done
#;;; Local Variables: ***
#;;; mode:shell-script ***
#;;; eval: (sh-set-shell "bash") ***
#;;; End: ***
