82 lines
2.5 KiB
Python
Executable File
82 lines
2.5 KiB
Python
Executable File
#!/usr/bin/env python
|
|
#
|
|
# Takes a directory of files and zips them up (as uncompressed files).
|
|
# This then gets converted into a C data structure which can be read
|
|
# like a filesystem at runtime.
|
|
#
|
|
# This is somewhat like frozen modules in python, but allows arbitrary files
|
|
# to be used.
|
|
|
|
from __future__ import print_function
|
|
|
|
import argparse
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
import types
|
|
|
|
|
|
def create_zip(zip_filename, zip_dir):
|
|
abs_zip_filename = os.path.abspath(zip_filename)
|
|
save_cwd = os.getcwd()
|
|
os.chdir(zip_dir)
|
|
if os.path.exists(abs_zip_filename):
|
|
os.remove(abs_zip_filename)
|
|
subprocess.check_call(["zip", "-0", "-r", "-D", abs_zip_filename, "."])
|
|
os.chdir(save_cwd)
|
|
|
|
|
|
def create_c_from_file(c_filename, zip_filename):
|
|
with open(zip_filename, "rb") as zip_file:
|
|
with open(c_filename, "wb") as c_file:
|
|
print("#include <stdint.h>", file=c_file)
|
|
print("", file=c_file)
|
|
print("const uint8_t memzip_data[] = {", file=c_file)
|
|
while True:
|
|
buf = zip_file.read(16)
|
|
if not buf:
|
|
break
|
|
print(" ", end="", file=c_file)
|
|
for byte in buf:
|
|
if isinstance(byte, types.StringType):
|
|
print(" 0x{:02x},".format(ord(byte)), end="", file=c_file)
|
|
else:
|
|
print(" 0x{:02x},".format(byte), end="", file=c_file)
|
|
print("", file=c_file)
|
|
print("};", file=c_file)
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(
|
|
prog="make-memzip.py",
|
|
usage="%(prog)s [options] [command]",
|
|
description="Generates a C source memzip file.",
|
|
)
|
|
parser.add_argument(
|
|
"-z",
|
|
"--zip-file",
|
|
dest="zip_filename",
|
|
help="Specifies the name of the created zip file.",
|
|
default="memzip_files.zip",
|
|
)
|
|
parser.add_argument(
|
|
"-c",
|
|
"--c-file",
|
|
dest="c_filename",
|
|
help="Specifies the name of the created C source file.",
|
|
default="memzip_files.c",
|
|
)
|
|
parser.add_argument(dest="source_dir", default="memzip_files")
|
|
args = parser.parse_args(sys.argv[1:])
|
|
|
|
print("args.zip_filename =", args.zip_filename)
|
|
print("args.c_filename =", args.c_filename)
|
|
print("args.source_dir =", args.source_dir)
|
|
|
|
create_zip(args.zip_filename, args.source_dir)
|
|
create_c_from_file(args.c_filename, args.zip_filename)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|