# Copyright 2003, 2007, 2008 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/>.

# This is a test for the gdb invocation option --args.

if $tracelevel then {
    strace $tracelevel
}


global GDBFLAGS

# Skip test if target does not support argument passing.
if [target_info exists noargs] {
    return;
}

set testfile "args"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } {
    untested args.exp
    return -1
}

proc args_test { name arglist } {
    global srcdir
    global subdir
    global binfile
    global hex
    global decimal

    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir

    # No loading needs to be done when the target is `exec'.  Some targets
    # require that the program be loaded, however, and it doesn't hurt
    # for `exec'.
    gdb_load $binfile

    runto_main
    gdb_breakpoint [gdb_get_line_number "set breakpoint here"]
    gdb_continue_to_breakpoint "breakpoint for $name"

    set expected_len [expr 1 + [llength $arglist]]
    gdb_test "print argc" "\\\$$decimal = $expected_len" "argc for $name"

    set i 1
    foreach arg $arglist {
	gdb_test "print argv\[$i\]" "\\\$$decimal = $hex \"$arg\"" \
	    "argv\[$i\] for $name"
	set i [expr $i + 1]
    }
}

#
# Test that the --args are processed correctly.
#
set old_gdbflags $GDBFLAGS
set GDBFLAGS "-nx --args $binfile 1 3"
args_test basic {{1} {3}}

#
# Test that the --args are processed correctly even if one of them is empty.
# The syntax needed is a little peculiar; DejaGNU treats the arguments as a
# list and expands them itself, since no shell redirection is involved.
#
set GDBFLAGS "-nx --args $binfile 1 {} 3"
args_test "one empty" {{1} {} {3}}

#
# try with 2 empty args
#
set GDBFLAGS "-nx --args $binfile 1 {} {} 3"
args_test "two empty" {{1} {} {} 3}

# Try with arguments containing literal single quotes.

set GDBFLAGS "-nx --args $binfile 1 '' 3"
args_test "one empty (with single quotes)" {{1} {''} {3}}

set GDBFLAGS "-nx --args $binfile 1 '' '' 3"
args_test "two empty (with single quotes)" {{1} {''} {''} {3}}

set GDBFLAGS $old_gdbflags
