|  | #!/usr/bin/env python3 | 
|  | # | 
|  | # Module information generator | 
|  | # | 
|  | # Copyright Red Hat, Inc. 2015 - 2016 | 
|  | # | 
|  | # Authors: | 
|  | #  Marc Mari <markmb@redhat.com> | 
|  | # | 
|  | # This work is licensed under the terms of the GNU GPL, version 2. | 
|  | # See the COPYING file in the top-level directory. | 
|  |  | 
|  | import sys | 
|  | import os | 
|  |  | 
|  | def get_string_struct(line): | 
|  | data = line.split() | 
|  |  | 
|  | # data[0] -> struct element name | 
|  | # data[1] -> = | 
|  | # data[2] -> value | 
|  |  | 
|  | return data[2].replace('"', '')[:-1] | 
|  |  | 
|  | def add_module(fheader, library, format_name, protocol_name): | 
|  | lines = [] | 
|  | lines.append('.library_name = "' + library + '",') | 
|  | if format_name != "": | 
|  | lines.append('.format_name = "' + format_name + '",') | 
|  | if protocol_name != "": | 
|  | lines.append('.protocol_name = "' + protocol_name + '",') | 
|  |  | 
|  | text = '\n        '.join(lines) | 
|  | fheader.write('\n    {\n        ' + text + '\n    },') | 
|  |  | 
|  | def process_file(fheader, filename): | 
|  | # This parser assumes the coding style rules are being followed | 
|  | with open(filename, "r") as cfile: | 
|  | found_start = False | 
|  | library, _ = os.path.splitext(os.path.basename(filename)) | 
|  | for line in cfile: | 
|  | if found_start: | 
|  | line = line.replace('\n', '') | 
|  | if line.find(".format_name") != -1: | 
|  | format_name = get_string_struct(line) | 
|  | elif line.find(".protocol_name") != -1: | 
|  | protocol_name = get_string_struct(line) | 
|  | elif line == "};": | 
|  | add_module(fheader, library, format_name, protocol_name) | 
|  | found_start = False | 
|  | elif line.find("static BlockDriver") != -1: | 
|  | found_start = True | 
|  | format_name = "" | 
|  | protocol_name = "" | 
|  |  | 
|  | def print_top(fheader): | 
|  | fheader.write('''/* AUTOMATICALLY GENERATED, DO NOT MODIFY */ | 
|  | /* | 
|  | * QEMU Block Module Infrastructure | 
|  | * | 
|  | * Authors: | 
|  | *  Marc Mari       <markmb@redhat.com> | 
|  | */ | 
|  |  | 
|  | ''') | 
|  |  | 
|  | fheader.write('''#ifndef QEMU_MODULE_BLOCK_H | 
|  | #define QEMU_MODULE_BLOCK_H | 
|  |  | 
|  | static const struct { | 
|  | const char *format_name; | 
|  | const char *protocol_name; | 
|  | const char *library_name; | 
|  | } block_driver_modules[] = {''') | 
|  |  | 
|  | def print_bottom(fheader): | 
|  | fheader.write(''' | 
|  | }; | 
|  |  | 
|  | #endif | 
|  | ''') | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | # First argument: output file | 
|  | # All other arguments: modules source files (.c) | 
|  | output_file = sys.argv[1] | 
|  | with open(output_file, 'w') as fheader: | 
|  | print_top(fheader) | 
|  |  | 
|  | for filename in sys.argv[2:]: | 
|  | if os.path.isfile(filename): | 
|  | process_file(fheader, filename) | 
|  | else: | 
|  | print("File " + filename + " does not exist.", file=sys.stderr) | 
|  | sys.exit(1) | 
|  |  | 
|  | print_bottom(fheader) | 
|  |  | 
|  | sys.exit(0) |