#   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 "ignore \$bpnum 1" ".*Will ignore next crossing of breakpoint.*"

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\]4       dprintf"
    "\[\r\n\]        printf \"arg=%d, g=%d\\\\n\", arg, g"
}

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

gdb_run_cmd

gdb_test "" "Breakpoint"

gdb_test "continue" "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"
