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

if $tracelevel then {
        strace $tracelevel
}

load_lib mi-support.exp
set MIFLAGS "-i=mi1"

set prms_id 0
set bug_id 0

if [target_info exists nocarbon64] {
    verbose "Skipping Carbon tests on 64-bit PowerPC."
    return
}

set testfile "ostype"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/$srcfile" "${binfile}" executable {debug}] != "" } {
     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_load ${binfile}

gdb_test "break [gdb_get_line_number "run to this point"]" "Breakpoint 1 at $hex: file.*, line.*\\." "breakpoint after ostypes set up"
gdb_test "run" "Starting program: $binfile *\r\n\Reading symbols for shared libraries \(\[.+\]\)+ done.*Breakpoint 1, main.*" "continue to breakpoint in main()"

gdb_test "p /T x\[0\]" "= 'FeqA'"
gdb_test "p /T x\[1\]" {= '\\000\\000\\000\\000'}
gdb_test "p /T x\[2\]" {= '\\012\\012\\012\\012'}

# make sure it ignores sizes and counts in the 'p' command
gdb_test "p /8Tg x\[0\]" "Size letters are meaningless in \"print\" command."
gdb_test "p /8T x\[0\]" "Item count other than 1 is meaningless in \"print\" command."

# make sure 'x' honors the count but ignores the size
gdb_test "x /4Tg x" {.*'FeqA'.*'\\000\\000\\000\\000'.*'\\012\\012\\012\\012'.*'XXXX'}

gdb_test "p/T a" "= 'abcd'"
gdb_test "x/T &a" "$hex:\[ 	\]*'abcd'"

gdb_test "help x" ".*T.OSType.*"

send_gdb "set interpreter mi1\n"

mi_gdb_test "11-stack-list-locals 2 1" "11\\^done,locals=.*" "create varobjs for local variables"
mi_gdb_test "22-var-evaluate-expression var1" "22\\^done,value=.1633837924.*" "value of a as an integer"
mi_gdb_test "33-var-set-format var1 unsigned" "33\\^done,format=.unsigned.*" "set formatting of a to unsigned"
mi_gdb_test "44-var-evaluate-expression var1" "44\\^done,value=.1633837924.*" "value of a as an unsigned"
mi_gdb_test "55-var-set-format var1 OSType" "55\\^done,format=.OSType.*" "set formatting of a to OSType"
mi_gdb_test "66-var-evaluate-expression var1" "66\\^done,value=.abcd.*" "value of a as an OSType"
mi_gdb_test "77-var-set-format var1 unsigned" "77\\^done,format=.unsigned.*" "set formatting of a to unsigned again"
mi_gdb_test "88-var-evaluate-expression var1" "88\\^done,value=.1633837924.*" "value of a as an unsigned again"

gdb_exit
return 0
