# Copyright 1998-2021 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

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


if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} {
    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

gdb_test "next 2" \
    "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_stdio "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_stdio "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_stdio "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_stdio "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_stdio "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_stdio "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_stdio "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_stdio "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_stdio "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_stdio "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

