#   Copyright (C) 2013 Free Software Foundation, Inc.
#   Contributed by Hui Zhu  <hui@codesourcery.com>

# 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/>.

load_lib mi-support.exp
set MIFLAGS "-i=mi"

gdb_exit
if [mi_gdb_start] {
    continue
}

standard_testfile

if {[build_executable $testfile.exp $testfile $srcfile {debug}] == -1} {
    untested "failed to compile $testfile"
    return -1
}

mi_delete_breakpoints

set bp_location1 [gdb_get_line_number "set breakpoint 1 here"]
set dp_location1 [gdb_get_line_number "set dprintf 1 here"]

mi_run_to_main

mi_gdb_test "1-dprintf-insert" \
    "1\\^error,msg=\"-dprintf-insert: Missing <location>\"" "mi insert without location"

mi_gdb_test "2-dprintf-insert foo" \
    "2\\^error,msg=\"-dprintf-insert: Missing <format>\"" "mi insert breakpoint without format string"

mi_gdb_test "3-dprintf-insert 29" \
    "3\\^error,msg=\"-dprintf-insert: Missing <format>\"" "mi insert second breakpoint without format string"

mi_gdb_test "-break-insert main" ".*" "mi insert breakpoint main"
mi_delete_breakpoints

mi_gdb_test "4-dprintf-insert foo \"\\\"foobarbazqux\\\" At foo entry\\n\"" \
    "4\\^done,bkpt=\{number=\".*\",type=\"dprintf\".*func=\"foo\",file=\".*mi-dprintf.c\",fullname=\".*mi-dprintf.c\",line=\".*\".*" "mi insert dprintf foo"

mi_gdb_test "5-dprintf-insert $dp_location1 \"arg=%d, g=%d\\n\" arg g" \
    "5\\^done,bkpt=\{number=\".*\",type=\"dprintf\".*func=\"foo\",file=\".*mi-dprintf.c\",fullname=\".*mi-dprintf.c\",line=\"$dp_location1\".*" \
    "mi insert dprintf dp_location1"

mi_gdb_test "6-break-info" \
    "6\\^done,BreakpointTable=\{nr_rows=\".\",nr_cols=\".\",hdr=\\\[\{width=\".*\",alignment=\".*\",col_name=\"number\",colhdr=\"Num\"\},\{width=\".*\",alignment=\".*\",col_name=\"type\",colhdr=\"Type\"\},\{width=\".*\",alignment=\".*\",col_name=\"disp\",colhdr=\"Disp\"\},\{width=\".*\",alignment=\".*\",col_name=\"enabled\",colhdr=\"Enb\"\},\{width=\".*\",alignment=\".*\",col_name=\"addr\",colhdr=\"Address\"\},\{width=\".*\",alignment=\".*\",col_name=\"what\",colhdr=\"What\"\}\\\],body=\\\[bkpt=\{number=\"3\",type=\"dprintf\".*func=\"foo\",file=\".*mi-dprintf.c\",fullname=\".*mi-dprintf.c\",line=\".*\".*,bkpt=\{number=\".*\",type=\"dprintf\".*func=\"foo\",file=\".*mi-dprintf.c\",fullname=\".*mi-dprintf.c\",line=\"$dp_location1\".*" \
    "mi info dprintf"

mi_gdb_test "-break-insert $bp_location1" ".*" "mi insert breakpoint bp_location1"

proc mi_continue_dprintf {args} {
    with_test_prefix $args {
	global mi_gdb_prompt

	if { $args == "call" || $args == "fprintf" } {
	    set foobarbazqux "\"foobarbazqux\""
	} else {
	    set foobarbazqux "\\\\\"foobarbazqux\\\\\""
	}

	mi_run_cmd
	set msg "mi 1st dprintf"
	gdb_expect {
            -re ".*$foobarbazqux At foo entry.*arg=1234, g=1234" {
		pass $msg
	    }
	    -re ".*$mi_gdb_prompt$" {
		fail $msg
	    }
            timeout {
		fail $msg
            }
	}
	mi_expect_stop ".*" ".*" ".*" ".*" ".*" "" "$msg stop"

	set msg "mi 2nd dprintf"
	mi_send_resuming_command "exec-continue" "$msg continue"
	gdb_expect {
            -re ".*$foobarbazqux At foo entry.*arg=1235, g=2222" {
		pass $msg
	    }
	    -re ".*$mi_gdb_prompt$" {
		fail $msg
	    }
            timeout {
		fail $msg
            }
	}
	mi_expect_stop ".*" ".*" ".*" ".*" ".*" "" "$msg 2nd stop"
    }
}

mi_continue_dprintf "gdb"

# The "call" style depends on having I/O functions available, so test.

if ![target_info exists gdb,noinferiorio] {

    # Now switch styles and rerun; in the absence of redirection the
    # output should be the same.

    mi_gdb_test "set dprintf-style call" ".*" "mi set dprintf style to call"
    mi_continue_dprintf "call"

    mi_gdb_test "set dprintf-function fprintf" ".*" "mi set dprintf-channel stderr"
    mi_gdb_test "set dprintf-channel stderr" ".*" "mi set dprintf channel"
    mi_continue_dprintf "fprintf"
}

set target_can_dprintf 0
set msg "set dprintf style to agent"
send_gdb "set dprintf-style agent\n"
gdb_expect {
    -re "warning: Target cannot run dprintf commands, falling back to GDB printf.*$mi_gdb_prompt$" {
	unsupported "$msg"
    }
    -re ".*done.*$mi_gdb_prompt$" {
	set target_can_dprintf 1
	pass "$msg"
    }
    -re ".*$mi_gdb_prompt$" {
	fail "$msg"
    }
    timeout {
	fail "$msg"
    }
}

if $target_can_dprintf {
    mi_run_cmd

    mi_expect_stop ".*" ".*" ".*" ".*" ".*" "" "mi expect stop"

    mi_send_resuming_command "exec-continue" "mi 1st dprintf continue, agent"
    mi_expect_stop ".*" "foo" ".*" ".*" ".*" "" "mi 1st dprintf, agent"

    mi_send_resuming_command "exec-continue" "mi 2nd dprintf continue, agent"

    # The =breakpoint-modified text is a part of the "-exec-continue" output.
    set msg "mi info dprintf second time"
    gdb_expect {
	-re "=breakpoint-modified," {
	    pass $msg
	}
	-re ".*$mi_gdb_prompt$" {
	    fail "$msg"
	}
	timeout {
	    fail "$msg"
	}
    }

    mi_expect_stop ".*" "foo" ".*" ".*" ".*" "" "mi 2nd dprintf, agent"
}

mi_gdb_test "set dprintf-style foobar" ".*error.*" "mi set dprintf style to an unrecognized type"
