# Copyright (C) 2008-2023 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 is part of the GDB testsuite.  It tests python pretty
# printers.

import re
import gdb


def _iterator(pointer, len):
    start = pointer
    end = pointer + len
    while pointer != end:
        yield ("[%d]" % int(pointer - start), pointer.dereference())
        pointer += 1


# Same as _iterator but can be told to raise an exception.
def _iterator_except(pointer, len):
    start = pointer
    end = pointer + len
    while pointer != end:
        if exception_flag:
            raise gdb.MemoryError("hi bob")
        yield ("[%d]" % int(pointer - start), pointer.dereference())
        pointer += 1


# Test returning a Value from a printer.
class string_print(object):
    def __init__(self, val):
        self.val = val

    def to_string(self):
        return self.val["whybother"]["contents"]


# Test a class-based printer.
class ContainerPrinter(object):
    def __init__(self, val):
        self.val = val

    def to_string(self):
        return "container %s with %d elements" % (self.val["name"], self.val["len"])

    def children(self):
        return _iterator(self.val["elements"], self.val["len"])

    def display_hint(self):
        if self.val["is_map_p"] and self.val["is_array_p"]:
            raise Exception("invalid object state found in display_hint")

        if self.val["is_map_p"]:
            return "map"
        elif self.val["is_array_p"]:
            return "array"
        else:
            return None


# Treats a container as array.
class ArrayPrinter(object):
    def __init__(self, val):
        self.val = val

    def to_string(self):
        return "array %s with %d elements" % (self.val["name"], self.val["len"])

    def children(self):
        return _iterator(self.val["elements"], self.val["len"])

    def display_hint(self):
        return "array"


# Flag to make NoStringContainerPrinter throw an exception.
exception_flag = False


# Test a printer where to_string is None
class NoStringContainerPrinter(object):
    def __init__(self, val):
        self.val = val

    def to_string(self):
        return None

    def children(self):
        return _iterator_except(self.val["elements"], self.val["len"])


# See ToStringReturnsValueWrapper.
class ToStringReturnsValueInner:
    def __init__(self, val):
        self.val = val

    def to_string(self):
        return "Inner to_string {}".format(int(self.val["val"]))


# Test a printer that returns a gdb.Value in its to_string.  That gdb.Value
# also has its own pretty-printer.
class ToStringReturnsValueWrapper:
    def __init__(self, val):
        self.val = val

    def to_string(self):
        return self.val["inner"]


class pp_s(object):
    def __init__(self, val):
        self.val = val

    def to_string(self):
        a = self.val["a"]
        b = self.val["b"]
        if a.address != b:
            raise Exception("&a(%s) != b(%s)" % (str(a.address), str(b)))
        return " a=<" + str(self.val["a"]) + "> b=<" + str(self.val["b"]) + ">"


class pp_ss(object):
    def __init__(self, val):
        self.val = val

    def to_string(self):
        return "a=<" + str(self.val["a"]) + "> b=<" + str(self.val["b"]) + ">"


class pp_sss(object):
    def __init__(self, val):
        self.val = val

    def to_string(self):
        return "a=<" + str(self.val["a"]) + "> b=<" + str(self.val["b"]) + ">"


class pp_multiple_virtual(object):
    def __init__(self, val):
        self.val = val

    def to_string(self):
        return "pp value variable is: " + str(self.val["value"])


class pp_vbase1(object):
    def __init__(self, val):
        self.val = val

    def to_string(self):
        return "pp class name: " + self.val.type.tag


class pp_nullstr(object):
    def __init__(self, val):
        self.val = val

    def to_string(self):
        return self.val["s"].string(gdb.target_charset())


class pp_ns(object):
    "Print a std::basic_string of some kind"

    def __init__(self, val):
        self.val = val

    def to_string(self):
        len = self.val["length"]
        return self.val["null_str"].string(gdb.target_charset(), length=len)

    def display_hint(self):
        return "string"


pp_ls_encoding = None


class pp_ls(object):
    "Print a std::basic_string of some kind"

    def __init__(self, val):
        self.val = val

    def to_string(self):
        length = self.val["len"]
        if pp_ls_encoding is not None:
            if length >= 0:
                return self.val["lazy_str"].lazy_string(
                    encoding=pp_ls_encoding, length=length
                )
            else:
                return self.val["lazy_str"].lazy_string(encoding=pp_ls_encoding)
        else:
            if length >= 0:
                return self.val["lazy_str"].lazy_string(length=length)
            else:
                return self.val["lazy_str"].lazy_string()

    def display_hint(self):
        return "string"


class pp_hint_error(object):
    "Throw error from display_hint"

    def __init__(self, val):
        self.val = val

    def to_string(self):
        return "hint_error_val"

    def display_hint(self):
        raise Exception("hint failed")


class pp_children_as_list(object):
    "Throw error from display_hint"

    def __init__(self, val):
        self.val = val

    def to_string(self):
        return "children_as_list_val"

    def children(self):
        return [("one", 1)]


class pp_outer(object):
    "Print struct outer"

    def __init__(self, val):
        self.val = val

    def to_string(self):
        return "x = %s" % self.val["x"]

    def children(self):
        yield "s", self.val["s"]
        yield "x", self.val["x"]


class MemoryErrorString(object):
    "Raise an error"

    def __init__(self, val):
        self.val = val

    def to_string(self):
        raise gdb.MemoryError("Cannot access memory.")

    def display_hint(self):
        return "string"


class pp_eval_type(object):
    def __init__(self, val):
        self.val = val

    def to_string(self):
        gdb.execute("bt", to_string=True)
        return (
            "eval=<"
            + str(gdb.parse_and_eval("eval_func (123456789, 2, 3, 4, 5, 6, 7, 8)"))
            + ">"
        )


class pp_int_typedef(object):
    def __init__(self, val):
        self.val = val

    def to_string(self):
        return "type=%s, val=%s" % (self.val.type, int(self.val))


class pp_int_typedef3(object):
    "A printer without a to_string method"

    def __init__(self, val):
        self.val = val

    def children(self):
        yield "s", 27


def lookup_function(val):
    "Look-up and return a pretty-printer that can print val."

    # Get the type.
    type = val.type

    # If it points to a reference, get the reference.
    if type.code == gdb.TYPE_CODE_REF:
        type = type.target()

    # Get the unqualified type, stripped of typedefs.
    type = type.unqualified().strip_typedefs()

    # Get the type name.
    typename = type.tag

    if typename is None:
        return None

    # Iterate over local dictionary of types to determine
    # if a printer is registered for that type.  Return an
    # instantiation of the printer if found.
    for function in pretty_printers_dict:
        if function.match(typename):
            return pretty_printers_dict[function](val)

    # Cannot find a pretty printer.  Return None.

    return None


def disable_lookup_function():
    lookup_function.enabled = False


def enable_lookup_function():
    lookup_function.enabled = True


# Lookup a printer for VAL in the typedefs dict.
def lookup_typedefs_function(val):
    "Look-up and return a pretty-printer that can print val (typedefs)."

    # Get the type.
    type = val.type

    if type is None or type.name is None or type.code != gdb.TYPE_CODE_TYPEDEF:
        return None

    # Iterate over local dictionary of typedef types to determine if a
    # printer is registered for that type.  Return an instantiation of
    # the printer if found.
    for function in typedefs_pretty_printers_dict:
        if function.match(type.name):
            return typedefs_pretty_printers_dict[function](val)

    # Cannot find a pretty printer.
    return None


def register_pretty_printers():
    pretty_printers_dict[re.compile("^struct s$")] = pp_s
    pretty_printers_dict[re.compile("^s$")] = pp_s
    pretty_printers_dict[re.compile("^S$")] = pp_s

    pretty_printers_dict[re.compile("^struct ss$")] = pp_ss
    pretty_printers_dict[re.compile("^ss$")] = pp_ss
    pretty_printers_dict[re.compile("^const S &$")] = pp_s
    pretty_printers_dict[re.compile("^SSS$")] = pp_sss

    pretty_printers_dict[re.compile("^VirtualTest$")] = pp_multiple_virtual
    pretty_printers_dict[re.compile("^Vbase1$")] = pp_vbase1

    pretty_printers_dict[re.compile("^struct nullstr$")] = pp_nullstr
    pretty_printers_dict[re.compile("^nullstr$")] = pp_nullstr

    # Note that we purposely omit the typedef names here.
    # Printer lookup is based on canonical name.
    # However, we do need both tagged and untagged variants, to handle
    # both the C and C++ cases.
    pretty_printers_dict[re.compile("^struct string_repr$")] = string_print
    pretty_printers_dict[re.compile("^struct container$")] = ContainerPrinter
    pretty_printers_dict[re.compile("^struct justchildren$")] = NoStringContainerPrinter
    pretty_printers_dict[re.compile("^string_repr$")] = string_print
    pretty_printers_dict[re.compile("^container$")] = ContainerPrinter
    pretty_printers_dict[re.compile("^justchildren$")] = NoStringContainerPrinter

    pretty_printers_dict[
        re.compile("^struct to_string_returns_value_inner$")
    ] = ToStringReturnsValueInner
    pretty_printers_dict[
        re.compile("^to_string_returns_value_inner$")
    ] = ToStringReturnsValueInner
    pretty_printers_dict[
        re.compile("^struct to_string_returns_value_wrapper$")
    ] = ToStringReturnsValueWrapper
    pretty_printers_dict[
        re.compile("^to_string_returns_value_wrapper$")
    ] = ToStringReturnsValueWrapper

    pretty_printers_dict[re.compile("^struct ns$")] = pp_ns
    pretty_printers_dict[re.compile("^ns$")] = pp_ns

    pretty_printers_dict[re.compile("^struct lazystring$")] = pp_ls
    pretty_printers_dict[re.compile("^lazystring$")] = pp_ls

    pretty_printers_dict[re.compile("^struct outerstruct$")] = pp_outer
    pretty_printers_dict[re.compile("^outerstruct$")] = pp_outer

    pretty_printers_dict[re.compile("^struct hint_error$")] = pp_hint_error
    pretty_printers_dict[re.compile("^hint_error$")] = pp_hint_error

    pretty_printers_dict[re.compile("^struct children_as_list$")] = pp_children_as_list
    pretty_printers_dict[re.compile("^children_as_list$")] = pp_children_as_list

    pretty_printers_dict[re.compile("^memory_error$")] = MemoryErrorString

    pretty_printers_dict[re.compile("^eval_type_s$")] = pp_eval_type

    typedefs_pretty_printers_dict[re.compile("^int_type$")] = pp_int_typedef
    typedefs_pretty_printers_dict[re.compile("^int_type2$")] = pp_int_typedef
    typedefs_pretty_printers_dict[re.compile("^int_type3$")] = pp_int_typedef3


# Dict for struct types with typedefs fully stripped.
pretty_printers_dict = {}
# Dict for typedef types.
typedefs_pretty_printers_dict = {}

register_pretty_printers()
gdb.pretty_printers.append(lookup_function)
gdb.pretty_printers.append(lookup_typedefs_function)
