# Copyright 1998-2000, 2007-2012 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


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 print symbol off"
gdb_test_no_output "set width 0"

if ![runto_main] then {
    fail "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

