# Copyright 1998-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/>.

# 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


standard_testfile

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

# 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
}


if {[prepare_for_testing $testfile.exp $testfile $srcfile debug]} {
    untested $testfile.exp
    return -1
}

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 {
    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

