from collections import namedtuple import xml.etree.ElementTree as xml resource = namedtuple('resource', 'alias variable path') def to_variable_name(path): name = path.replace('/', '_') if name.endswith('.zstd'): name = name[:-5] name = name.replace('-', '_') name = name.replace('.', '_') return name def filelist(file): root = xml.parse(file).getroot() if root.tag != 'RCC': return None files = [] for child in root: if child.tag == 'qresource': prefix = child.attrib['prefix'] for i in child: alias = prefix + '/' + i.attrib['alias'] variable = to_variable_name(i.text) path = i.text files.append(resource(alias, variable, path)) return files def write_header(file, namespace): print("// Autogenerated binary file hexdump", file=file) print("// This file may get overwritten by the build system\n", file=file) print("#include \n", file=file) print("namespace {} {{".format(namespace), file=file) def write_item(file, array_name, array_data): line_items = 0 print("constexpr uint8_t {}[] = {{".format(array_name), file=file) for byte in array_data[0:len(array_data)]: line_items+=1 if line_items == 16: print(" 0x{:02X},".format(byte), file=file) line_items = 0 else: print(" 0x{:02X},".format(byte), file=file, end='') print("};", file=file) print("constexpr size_t {}_len = {};\n".format(array_name, len(array_data)), file=file) def write_entries(file, resource_list): print("constexpr std::array entries {", file=file) for f in resource_list: print(" \"{}\", ".format(f.alias), file=file) print("};\n", file=file) print("constexpr std::array values {", file=file) for f in resource_list: print(" std::span( {}, {}_len ),".format(f.variable, f.variable), file=file) print("};\n", file=file) def write_footer(file, namespace): print("\n}} // namespace {}".format(namespace), file=file)