summaryrefslogtreecommitdiffstatshomepage
path: root/lib/memzip/make-memzip.py
blob: 9730f5e008aad4a56d298f00deeb209c18c61af8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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()