# Copyright 1998, 1999, 2000, 2007, 2008, 2009, 2010, 2011
# 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 file was written by Elena Zannoni (ezannoni@cygnus.com)

# This test deals with calling functions which have strings as parameters.
# it plays around with constant strings.
# the corresponding source file is call-strs.c
#

#debug strarg

if $tracelevel then {
        strace $tracelevel
}


set testfile "call-strs"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

# Test depends on printf, which the sparclet stub doesn't support.  
if { [istarget "sparclet-*-*"] } {
    return 0;
}

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



# Some targets can't call functions, so don't even bother with this
# test.
if [target_info exists gdb,cannot_call_functions] {
    setup_xfail "*-*-*" 2416
    fail "This target can not call functions"
    continue
}


# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
gdb_test_no_output "set print sevenbit-strings"
gdb_test_no_output "set print address off"
gdb_test_no_output "set width 0"

if ![runto_main] then {
    perror "couldn't run to breakpoint"
    continue
}

set prev_timeout $timeout
set timeout 120

#step
gdb_test "step" \
    "strcpy\\(buf, \"test string\"\\);" \
    "step after assignment to s"

#next
gdb_test "next" \
    "str_func\\(\"abcd\", \"efgh\", \"ijkl\", \"mnop\", \"qrst\", \"uvwx\", \"yz12\"\\);" \
    "next over strcpy"

#print buf
gdb_test "print buf" \
    "\"test string\",.*repeats 88 times.*"

#print s
gdb_test "print s" \
    " = \"test string\".*"

#print str_func1(s)
if ![gdb_skip_stdio_test "print str_func1(s)"] {
    gdb_test "print str_func1(s)" \
	"first string arg is: test string.*\"test string\".*"
}

#print str_func1("test string")
if ![gdb_skip_stdio_test "print str_func1(teststring)"] {
    gdb_test "print str_func1(\"test string\")" \
	"first string arg is: test string.*\"test string\".*"
}

#call str_func1(s)
if ![gdb_skip_stdio_test "call str_func1(s)"] {
    gdb_test "call str_func1(s)" \
	"first string arg is: test string.*\"test string\".*"
}

#call str_func1("test string")
if ![gdb_skip_stdio_test "call str_func1 (...)"] {
    gdb_test "call str_func1(\"test string\")" \
	"first string arg is: test string.*\"test string\".*"
}

#print str_func1(buf)
if ![gdb_skip_stdio_test "print str_func1(buf)"] {
    gdb_test "print str_func1(buf)" \
	"first string arg is: test string.*\"test string\".*"
}

#call str_func1(buf)
if ![gdb_skip_stdio_test "call str_func1(buf)"] {
    gdb_test "call str_func1(buf)" \
	"first string arg is: test string.*\"test string\".*"
}

#print str_func("a","b","c","d","e","f","g")
if ![gdb_skip_stdio_test "print str_func(a,b,c,d,e,f,g)"] {
    gdb_test "print str_func(\"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\")" \
	"first string arg is: a\[ \t\r\n\]+second string arg is: b\[ \t\r\n\]+third string arg is: c\[ \t\r\n\]+fourth string arg is: d\[ \t\r\n\]+fifth string arg is: e\[ \t\r\n\]+sixth string arg is: f\[ \t\r\n\]+seventh string arg is: g\[ \t\r\n\]+.*= \"abcdefg\".*"
}

#call str_func("a","b","c","d","e","f","g")
if ![gdb_skip_stdio_test "call str_func(a,b,c,d,e,f,g)"] {
    gdb_test "call str_func(\"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\")" \
	"first string arg is: a\[ \t\r\n\]+second string arg is: b\[ \t\r\n\]+third string arg is: c\[ \t\r\n\]+fourth string arg is: d\[ \t\r\n\]+fifth string arg is: e\[ \t\r\n\]+sixth string arg is: f\[ \t\r\n\]+seventh string arg is: g\[ \t\r\n\]+.*= \"abcdefg\".*"
}

#print str_func(s,s,s,s,s,s,s)
if ![gdb_skip_stdio_test "print str_func(s,s,s,s,s,s,s,s)"] {
    gdb_test "print str_func(s,s,s,s,s,s,s)" \
	"first string arg is: test string\[ \t\r\n\]+second string arg is: test string\[ \t\r\n\]+third string arg is: test string\[ \t\r\n\]+fourth string arg is: test string\[ \t\r\n\]+fifth string arg is: test string\[ \t\r\n\]+sixth string arg is: test string\[ \t\r\n\]+seventh string arg is: test string\[ \t\r\n\]+.*\"test stringtest stringtest stringtest stringtest stringtest stringtest string\".*"
}

#call str_func(s,s,s,s,s,s,s)
if ![gdb_skip_stdio_test "call str_func(s,s,s,s,s,s,s,s)"] {
    gdb_test "call str_func(s,s,s,s,s,s,s)" \
	"first string arg is: test string\[ \t\r\n\]+second string arg is: test string\[ \t\r\n\]+third string arg is: test string\[ \t\r\n\]+fourth string arg is: test string\[ \t\r\n\]+fifth string arg is: test string\[ \t\r\n\]+sixth string arg is: test string\[ \t\r\n\]+seventh string arg is: test string\[ \t\r\n\]+.*\"test stringtest stringtest stringtest stringtest stringtest stringtest string\".*"
}

gdb_exit

set timeout $prev_timeout

