#!/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 ", 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()