diff options
author | Dave Hylands <dhylands@gmail.com> | 2015-10-31 21:24:47 -0700 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2015-11-04 14:21:10 +0000 |
commit | 074d713bfb845a87e557e608f5215f53694e7d01 (patch) | |
tree | 3688db7f8d476613bc0888b4be6a01a5238b63af /lib/memzip/make-memzip.py | |
parent | a9f3030371094e3308b4d2150853db2ee3aa4a6b (diff) | |
download | micropython-074d713bfb845a87e557e608f5215f53694e7d01.tar.gz micropython-074d713bfb845a87e557e608f5215f53694e7d01.zip |
lib/memzip: Factor out memzip from teensy/ into lib/memzip.
Diffstat (limited to 'lib/memzip/make-memzip.py')
-rwxr-xr-x | lib/memzip/make-memzip.py | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/lib/memzip/make-memzip.py b/lib/memzip/make-memzip.py new file mode 100755 index 0000000000..9730f5e008 --- /dev/null +++ b/lib/memzip/make-memzip.py @@ -0,0 +1,79 @@ +#!/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 type(byte) is 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() + |