# Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file # for details. All rights reserved. Use of this source code is governed by a # BSD-style license that can be found in the LICENSE file. # # This python script creates string literals in a C++ source file from a C++ # source template and one or more resource files. import os import sys from os.path import join import time from optparse import OptionParser import re from datetime import date def makeResources(root_dir, input_files): result = '' resources = [] # Write each file's contents as a byte string constant. for resource_file in input_files: if root_dir and resource_file.startswith(root_dir): resource_file_name = resource_file[ len(root_dir) : ] else: resource_file_name = resource_file resource_url = '/%s' % resource_file_name result += '// %s\n' % resource_file result += 'const char ' resource_name = re.sub(r'(/|\.|-)', '_', resource_file_name) + '_' result += resource_name result += '[] = {\n ' fileHandle = open(resource_file, 'rb') lineCounter = 0 for byte in fileHandle.read(): result += r" '\x%02x'," % ord(byte) lineCounter += 1 if lineCounter == 10: result += '\n ' lineCounter = 0 if lineCounter != 0: result += '\n ' result += ' 0\n};\n\n' resources.append( (resource_url, resource_name, os.stat(resource_file).st_size) ); # Write the resource table. result += 'Resources::resource_map_entry Resources::builtin_resources_[] = ' result += '{\n' for res in resources: result += ' { "%s", %s, %d },\n' % res result += '};\n\n' result += 'const intptr_t Resources::builtin_resources_count_ ' result += '= %d;\n' % len(resources) return result def makeFile(output_file, root_dir, input_files): cc_text = ''' // Copyright (c) %d, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. ''' % date.today().year cc_text += '#include "bin/resources.h"\n\n' cc_text += 'namespace dart {\n' cc_text += 'namespace bin {\n' cc_text += makeResources(root_dir, input_files) cc_text += '} // namespace bin\n} // namespace dart\n' open(output_file, 'w').write(cc_text) return True def main(args): try: # Parse input. parser = OptionParser() parser.add_option("--output", action="store", type="string", help="output file name") parser.add_option("--root_prefix", action="store", type="string", help="root directory for resources") (options, args) = parser.parse_args() if not options.output: sys.stderr.write('--output not specified\n') return -1 if len(args) == 0: sys.stderr.write('No input files specified\n') return -1 files = [ ] for arg in args: files.append(arg) if not makeFile(options.output, options.root_prefix, files): return -1 return 0 except Exception, inst: sys.stderr.write('create_resources.py exception\n') sys.stderr.write(str(inst)) sys.stderr.write('\n') return -1 if __name__ == '__main__': sys.exit(main(sys.argv))