aboutsummaryrefslogtreecommitdiff
path: root/scripts/rcc_format.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/rcc_format.py')
-rw-r--r--scripts/rcc_format.py62
1 files changed, 62 insertions, 0 deletions
diff --git a/scripts/rcc_format.py b/scripts/rcc_format.py
new file mode 100644
index 0000000..d0ab06d
--- /dev/null
+++ b/scripts/rcc_format.py
@@ -0,0 +1,62 @@
+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 <embed.h>\n", file=file)
+ print("namespace {} {{".format(namespace), file=file)
+
+def write_item(file, array_name, array_data):
+ line_items = 0
+
+ print("constexpr unsigned char {}[] = {{".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 auto entries = frozen::make_unordered_map<frozen::string, std::span<const unsigned char>>({", file=file)
+ for f in resource_list:
+ print(" {{ \"{}\", std::span({}, {}_len) }},".format(f.alias, f.variable, f.variable), file=file)
+ print("});\n", file=file)
+
+def write_footer(file, namespace):
+ print("\n}} // namespace {}".format(namespace), file=file)
+