# cgreen-debug
#
# Script to start cgreen-runner under gdb, load a library and break
# on a named test.
#

# This is actually not that script, but a template for argbash
# (https://argbash.io) which generates argument parsing capable bash
# scripts from a template just like this.

# To generate a new 'cgreen-debug' use 'argbash cgreen-debug.argbash -o cgreen-debug'
# if you have argbash installed, or go to https://argbash.io and paste this file
# into the online version.

# ARG_HELP([Start cgreen-runner under GDB and break at a specific test])
# ARG_POSITIONAL_SINGLE([library],[Dynamically loadable library with Cgreen tests],[])
# ARG_POSITIONAL_SINGLE([testname],[The test to debug, in Cgreen notation ('<Context>:<test>')],[])
# ARGBASH_GO()
# needed because of Argbash --> m4_ignore([
### START OF CODE GENERATED BY Argbash v2.7.1 one line above ###
# Argbash is a bash code generator used to get arguments parsing right.
# Argbash is FREE SOFTWARE, see https://argbash.io for more info


die()
{
	local _ret=$2
	test -n "$_ret" || _ret=1
	test "$_PRINT_HELP" = yes && print_help >&2
	echo "$1" >&2
	exit ${_ret}
}


begins_with_short_option()
{
	local first_option all_short_options='h'
	first_option="${1:0:1}"
	test "$all_short_options" = "${all_short_options/$first_option/}" && return 1 || return 0
}

# THE DEFAULTS INITIALIZATION - POSITIONALS
_positionals=()
# THE DEFAULTS INITIALIZATION - OPTIONALS


print_help()
{
	printf '%s\n' "Start cgreen-runner under GDB and break at a specific test"
	printf 'Usage: %s [-h|--help] <library> <testname>\n' "$0"
	printf '\t%s\n' "<library>: Dynamically loadable library with Cgreen tests"
	printf '\t%s\n' "<testname>: The test to debug, in Cgreen notation ('<Context>:<test>')"
	printf '\t%s\n' "-h, --help: Prints help"
}


parse_commandline()
{
	_positionals_count=0
	while test $# -gt 0
	do
		_key="$1"
		case "$_key" in
			-h|--help)
				print_help
				exit 0
				;;
			-h*)
				print_help
				exit 0
				;;
			*)
				_last_positional="$1"
				_positionals+=("$_last_positional")
				_positionals_count=$((_positionals_count + 1))
				;;
		esac
		shift
	done
}


handle_passed_args_count()
{
	local _required_args_string="'library' and 'testname'"
	test "${_positionals_count}" -ge 2 || _PRINT_HELP=yes die "FATAL ERROR: Not enough positional arguments - we require exactly 2 (namely: $_required_args_string), but got only ${_positionals_count}." 1
	test "${_positionals_count}" -le 2 || _PRINT_HELP=yes die "FATAL ERROR: There were spurious positional arguments --- we expect exactly 2 (namely: $_required_args_string), but got ${_positionals_count} (the last one was: '${_last_positional}')." 1
}


assign_positional_args()
{
	local _positional_name _shift_for=$1
	_positional_names="_arg_library _arg_testname "

	shift "$_shift_for"
	for _positional_name in ${_positional_names}
	do
		test $# -gt 0 || break
		eval "$_positional_name=\${1}" || die "Error during argument parsing, possibly an Argbash bug." 1
		shift
	done
}

parse_commandline "$@"
handle_passed_args_count
assign_positional_args 1 "${_positionals[@]}"

# OTHER STUFF GENERATED BY Argbash

### END OF CODE GENERATED BY Argbash (sortof) ### ])
# [ <-- needed because of Argbash


bp=${2//:/__}
echo break $bp > .cgreen-debug-commands
echo run $1 $2 >> .cgreen-debug-commands
if command -v cgdb ; then
    debugger=cgdb
else
    debugger=gdb
fi
$debugger -ex "set breakpoint pending on" cgreen-runner --command=.cgreen-debug-commands
rm .cgreen-debug-commands

# ] <-- needed because of Argbash
