# Copyright 2021 Dolphin Emulator Project
# Licensed under GPLv2+
# Refer to the license.txt file included.

#@category Dolphin

from collections import namedtuple


DolphinSymbol = namedtuple("DolphinSymbol", [
    "section", "addr", "size", "vaddr", "align", "name"
])


def load_dolphin_map(filepath):
    with open(filepath, "r") as f:
        section = ""
        symbol_map = []
        for line in f.readlines():
            t = line.strip().split(" ", 4)
            if len(t) == 3 and t[1] == "section" and t[2] == "layout":
                section = t[0]
                continue
            if not section or len(t) != 5:
                continue
            symbol_map.append(DolphinSymbol(section, *t))
        return symbol_map


def ghidra_main():
    from ghidra.program.model.symbol import SourceType
    from ghidra.program.model.symbol import SymbolUtilities

    f = askFile("Load a Dolphin emulator symbol map", "Load")
    symbol_map = load_dolphin_map(f.getPath())

    for symbol in symbol_map:
        addr = toAddr(int(symbol.vaddr, 16))
        size = int(symbol.size, 16)
        name = SymbolUtilities.replaceInvalidChars(symbol.name, True)
        if symbol.section in [".init", ".text"]:
            createFunction(addr, symbol.name);
            success = getFunctionAt(addr) is not None
            if not success:
                print("Can't apply properties for symbol:"
                      " {0.vaddr} - {0.name}\n".format(symbol))
                createLabel(addr, name, True)
            else:
                getFunctionAt(addr).setName(name, SourceType.USER_DEFINED)
        else:
            createLabel(addr, name, True)


if __name__ == "__main__":
    ghidra_main()