#   Copyright (C) 2012-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/>.


if { [prepare_for_testing dprintf.exp "dprintf" {} {debug}] } {
    return -1
}

set srcfile dprintf.c

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

if ![runto main] {
    return -1
}

gdb_test "dprintf" "Format string required"

gdb_test "dprintf foo" "Format string required"

gdb_test "dprintf 29" "Format string required"

delete_breakpoints

gdb_breakpoint "main"

gdb_test "dprintf foo,\"At foo entry\\n\"" \
  "Dprintf .*"

gdb_test "dprintf $dp_location1,\"arg=%d, g=%d\\n\", arg, g" \
  "Dprintf .*"

gdb_test_sequence "info breakpoints" "dprintf info 1" {
    "\[\r\n\]Num     Type           Disp Enb Address +What"
    "\[\r\n\]2       breakpoint"
    "\[\r\n\]3       dprintf"
    "\[\r\n\]        printf \"At foo entry\\\\n\""
    "\[\r\n\]        continue"
    "\[\r\n\]4       dprintf"
    "\[\r\n\]        printf \"arg=%d, g=%d\\\\n\", arg, g"
    "\[\r\n\]        continue"
}

gdb_test "break $bp_location1" \
  "Breakpoint .*"

gdb_run_cmd

gdb_test "" "Breakpoint"

gdb_test "continue" "At foo entry.*arg=1234, g=1234.*" "1st dprintf, gdb"

gdb_test "continue" "At foo entry.*arg=1235, g=2222.*" "2nd 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.

    gdb_test_no_output "set dprintf-style call" "Set dprintf style to call"

    gdb_run_cmd

    gdb_test "" "Breakpoint"

    gdb_test "continue" "At foo entry.*arg=1234, g=1234.*" "1st dprintf, call"

    gdb_test "continue" "At foo entry.*arg=1235, g=2222.*" "2nd dprintf, call"

    gdb_test_no_output "set dprintf-function fprintf" "Set dprintf function"
    gdb_test_no_output "set dprintf-channel stderr" "Set dprintf channel"

    gdb_run_cmd

    gdb_test "" "Breakpoint"

    gdb_test "continue" "At foo entry.*arg=1234, g=1234.*" \
	"1st dprintf, fprintf"

    gdb_test "continue" "At foo entry.*arg=1235, g=2222.*" \
	"2nd dprintf, fprintf"
}

set target_can_dprintf 1
set msg "Set dprintf style to agent"
gdb_test_multiple "set dprintf-style agent" $msg {
    -re "warning: Target cannot run dprintf commands.*\r\n$gdb_prompt $" {
	set target_can_dprintf 0
	pass "$msg - cannot do"
    }
    -re ".*$gdb_prompt $" {
	pass "$msg - can do"
    }
}

if $target_can_dprintf {

    gdb_run_cmd

    gdb_test "" "Breakpoint"

    gdb_test "continue" "Breakpoint \[0-9\]+, foo .*" "1st dprintf, agent"

    gdb_test "continue" "Breakpoint \[0-9\]+, foo .*" "2nd dprintf, agent"

    gdb_test_sequence "info breakpoints" "dprintf info 2" {
	"\[\r\n\]Num     Type           Disp Enb Address +What"
	"\[\r\n\]2       breakpoint"
	"\[\r\n\]\tbreakpoint already hit 2 times"
	"\[\r\n\]3       dprintf"
	"\[\r\n\]\tbreakpoint already hit 2 times"
	"\[\r\n\]        agent-printf \"At foo entry\\\\n\""
	"\[\r\n\]4       dprintf"
	"\[\r\n\]\tbreakpoint already hit 2 times"
	"\[\r\n\]        agent-printf \"arg=%d, g=%d\\\\n\", arg, g"
    }
}

gdb_test "set dprintf-style foobar" "Undefined item: \"foobar\"." \
    "Set dprintf style to an unrecognized type"

