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

# Utility procedures, shared between test suite domains.

# A helper procedure to retrieve commands to send to GDB before a program
# is started.

proc gdb_init_commands {} {
    set commands ""
    if [target_info exists gdb_init_command] {
	lappend commands [target_info gdb_init_command]
    }
    if [target_info exists gdb_init_commands] {
	set commands [concat $commands [target_info gdb_init_commands]]
    }
    return $commands
}

# Given an input string, adds backslashes as needed to create a
# regexp that will match the string.

proc string_to_regexp {str} {
    set result $str
    regsub -all {[]?*+.|(){}^$\[\\]} $str {\\&} result
    return $result
}

# Given a list of strings, adds backslashes as needed to each string to
# create a regexp that will match the string, and join the result.

proc string_list_to_regexp { args } {
    set result ""
    foreach arg $args {
	set arg [string_to_regexp $arg]
       append result $arg
    }
    return $result
}

# Wrap STR in an ANSI terminal escape sequences -- one to set the
# style to STYLE, and one to reset the style to the default.  The
# return value is suitable for use as a regular expression.

# STYLE can either be the payload part of an ANSI terminal sequence,
# or a shorthand for one of the gdb standard styles: "file",
# "function", "variable", or "address".

proc style {str style} {
    switch -exact -- $style {
	title { set style 1 }
	file { set style 32 }
	function { set style 33 }
	highlight { set style 31 }
	variable { set style 36 }
	address { set style 34 }
	metadata { set style 2 }
	version { set style "35;1" }
	none { return $str }
    }
    return "\033\\\[${style}m${str}\033\\\[m"
}
