# Copyright 2005 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# This file test whether we can set breakpoints in files where the 
# source file & the executable have "(" or ")" in the filename.
#

if $tracelevel then {
        strace $tracelevel
        }

#
# test running programs
#

set prms_id 0
set bug_id 0

proc do_tests {testfile gdb_name} {
    global objdir subdir srcdir hex gdb_prompt

    set srcfile ${testfile}.c
    set binfile ${objdir}/${subdir}/$testfile
    set gdb_binfile "$objdir/$subdir/$gdb_name"
    
    set additional_flags "additional_flags=-std=c99"
    if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug $additional_flags]] != "" } {
	gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
    }
    
    # Start with a fresh gdb
    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_file_cmd "\"${gdb_binfile}\""
    
    send_gdb "set width 0\n"
    gdb_expect -re "$gdb_prompt $"
    
    gdb_test "break \"$gdb_name.c\":7" "Breakpoint 1 at $hex: file.*, line.*\\." "File: $testfile - Set breakpoint on line  7"
    
    if {[string first " " $gdb_name] == -1} {
	gdb_test "break $gdb_name.c:8" "Breakpoint 2 at $hex: file.*, line.*\\." "File: $testfile - Set breakpoint on line 8 - no quotes"
    }
    gdb_test "run" "Starting program: $binfile *\r\n\Reading symbols for shared libraries \(\[.+\]\)+ done.*Breakpoint 1, main.*" \
	"File: $testfile - run to main"
    
}

do_tests {file\ \(my\ name\)} {file (my name)}
do_tests {file\(myname\)} {file(myname)}

return 0


