| #!/usr/bin/env python |
| |
| # Copyright 2019 Google LLC. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| ''' |
| Generate a source file containing the given binary data. |
| |
| Output type is C++. |
| ''' |
| |
| from __future__ import print_function |
| |
| import os |
| import struct |
| import sys |
| import mmap |
| |
| def iterate_as_uint32(path): |
| with open(path, 'rb') as f: |
| s = struct.Struct('@I') |
| assert s.size == 4 |
| mm = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) |
| assert (len(mm) % s.size) == 0 |
| for offset in range(0, len(mm), s.size): |
| yield s.unpack_from(mm, offset)[0] |
| mm.close() |
| |
| |
| def convert(fmt, name, src_path, dst_path): |
| header, line_begin, line_end, footer = fmt |
| assert os.path.exists(src_path) |
| src = iterate_as_uint32(src_path) |
| with open(dst_path, 'w') as o: |
| o.write(header.format(name)) |
| while True: |
| line = ','.join('%d' % v for _, v in zip(range(8), src)) |
| if not line: |
| break |
| o.write('%s%s%s\n' % (line_begin, line, line_end)) |
| o.write(footer.format(name)) |
| |
| |
| cpp = ('#include <cstdint>\nextern "C" uint32_t {0}[] __attribute__((aligned(16))) = {{\n', |
| '', ',', '}};\n') |
| |
| if __name__ == '__main__': |
| print('\n'.join('>>> %r' % x for x in sys.argv)) |
| convert(cpp, sys.argv[1], sys.argv[2], sys.argv[3]) |