summaryrefslogtreecommitdiffstatshomepage
path: root/lib/memzip/make-memzip.py
diff options
context:
space:
mode:
authorDave Hylands <dhylands@gmail.com>2015-10-31 21:24:47 -0700
committerDamien George <damien.p.george@gmail.com>2015-11-04 14:21:10 +0000
commit074d713bfb845a87e557e608f5215f53694e7d01 (patch)
tree3688db7f8d476613bc0888b4be6a01a5238b63af /lib/memzip/make-memzip.py
parenta9f3030371094e3308b4d2150853db2ee3aa4a6b (diff)
downloadmicropython-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-xlib/memzip/make-memzip.py79
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()
+