# Copyright (C) 2011-2013 Free Software Foundation, Inc.
#
# 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 3 of the License, 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.  If not, see <http://www.gnu.org/licenses/>.

# Specialized subroutines for launching gdb and testing the very first prompt.


#
# start gdb -- start gdb running, prompt procedure
# this procedure differs from the default in that you must pass 'set height 0',
# and 'set width 0', yourself in GDBFLAGS, and it has a gdb_prompt_fail variable,
#
# uses pass if it sees $gdb_prompt, and fail if it sees $gdb_prompt_fail.
#
proc default_prompt_gdb_start { } {
    global verbose
    global GDB
    global INTERNAL_GDBFLAGS GDBFLAGS
    global gdb_prompt
    global gdb_prompt_fail
    global timeout
    global gdb_spawn_id

    gdb_stop_suppressing_tests

    verbose "Spawning $GDB $INTERNAL_GDBFLAGS $GDBFLAGS"

    if [info exists gdb_spawn_id] {
	return 0
    }

    if ![is_remote host] {
	if { [which $GDB] == 0 } then {
	    perror "$GDB does not exist."
	    exit 1
	}
    }
    set res [remote_spawn host "$GDB $INTERNAL_GDBFLAGS $GDBFLAGS [host_info gdb_opts]"]
    if { $res < 0 || $res == "" } {
	perror "Spawning $GDB failed."
	return 1
    }
    gdb_expect 360 {
	-re ".*$gdb_prompt_fail.*$gdb_prompt_fail.*" {
	    fail "double prompted fail prompt"
	}
	-re ".*$gdb_prompt.*$gdb_prompt.*" {
	    fail "double prompted"
	}
	-re "\[\r\n\]$gdb_prompt_fail $" {
	    fail "GDB initializing first prompt"
	}
	-re "\[\r\n\]$gdb_prompt $" {
	    pass "GDB initializing first prompt"
	}
	-re "$gdb_prompt $"	{
	    perror "GDB never initialized."
	    return -1
	}
	-re "$gdb_prompt_fail $"	{
	    perror "GDB never initialized."
	    return -1
	}
	timeout	{
	    perror "(timeout) GDB never initialized after 10 seconds."
	    remote_close host
	    return -1
	}
    }
    set gdb_spawn_id -1
    return 0
}

#
# Overridable function. You can override this function in your
# baseboard file.
#
proc prompt_gdb_start { } {
    default_prompt_gdb_start
}

