+# Turn BASENAME into a full file name in the standard output
+# directory. It is ok if BASENAME is the empty string; in this case
+# the directory is returned.
+
+proc standard_output_file {basename} {
+ global objdir subdir
+
+ return [file join $objdir $subdir $basename]
+}
+
+# Set 'testfile', 'srcfile', and 'binfile'.
+#
+# ARGS is a list of source file specifications.
+# Without any arguments, the .exp file's base name is used to
+# compute the source file name. The ".c" extension is added in this case.
+# If ARGS is not empty, each entry is a source file specification.
+# If the specification starts with a ".", it is treated as a suffix
+# to append to the .exp file's base name.
+# If the specification is the empty string, it is treated as if it
+# were ".c".
+# Otherwise it is a file name.
+# The first file in the list is used to set the 'srcfile' global.
+# Each subsequent name is used to set 'srcfile2', 'srcfile3', etc.
+#
+# Most tests should call this without arguments.
+#
+# If a completely different binary file name is needed, then it
+# should be handled in the .exp file with a suitable comment.
+
+proc standard_testfile {args} {
+ global gdb_test_file_name
+ global subdir
+ global gdb_test_file_last_vars
+
+ # Outputs.
+ global testfile binfile
+
+ set testfile $gdb_test_file_name
+ set binfile [standard_output_file ${testfile}]
+
+ if {[llength $args] == 0} {
+ set args .c
+ }
+
+ # Unset our previous output variables.
+ # This can help catch hidden bugs.
+ if {[info exists gdb_test_file_last_vars]} {
+ foreach varname $gdb_test_file_last_vars {
+ global $varname
+ catch {unset $varname}
+ }
+ }
+ # 'executable' is often set by tests.
+ set gdb_test_file_last_vars {executable}
+
+ set suffix ""
+ foreach arg $args {
+ set varname srcfile$suffix
+ global $varname
+
+ # Handle an extension.
+ if {$arg == ""} {
+ set arg $testfile.c
+ } elseif {[string range $arg 0 0] == "."} {
+ set arg $testfile$arg
+ }
+
+ set $varname $arg
+ lappend gdb_test_file_last_vars $varname
+
+ if {$suffix == ""} {
+ set suffix 2
+ } else {
+ incr suffix
+ }
+ }
+}
+