1#!/usr/bin/env python3 2# 3# Module information generator 4# 5# Copyright Red Hat, Inc. 2015 - 2016 6# 7# Authors: 8# Marc Mari <markmb@redhat.com> 9# 10# This work is licensed under the terms of the GNU GPL, version 2. 11# See the COPYING file in the top-level directory. 12 13import sys 14import os 15 16def get_string_struct(line): 17 data = line.split() 18 19 # data[0] -> struct element name 20 # data[1] -> = 21 # data[2] -> value 22 23 return data[2].replace('"', '')[:-1] 24 25def add_module(fheader, library, format_name, protocol_name): 26 lines = [] 27 lines.append('.library_name = "' + library + '",') 28 if format_name != "": 29 lines.append('.format_name = "' + format_name + '",') 30 if protocol_name != "": 31 lines.append('.protocol_name = "' + protocol_name + '",') 32 33 text = '\n '.join(lines) 34 fheader.write('\n {\n ' + text + '\n },') 35 36def process_file(fheader, filename): 37 # This parser assumes the coding style rules are being followed 38 with open(filename, "r") as cfile: 39 found_start = False 40 library, _ = os.path.splitext(os.path.basename(filename)) 41 for line in cfile: 42 if found_start: 43 line = line.replace('\n', '') 44 if line.find(".format_name") != -1: 45 format_name = get_string_struct(line) 46 elif line.find(".protocol_name") != -1: 47 protocol_name = get_string_struct(line) 48 elif line == "};": 49 add_module(fheader, library, format_name, protocol_name) 50 found_start = False 51 elif line.find("static BlockDriver") != -1: 52 found_start = True 53 format_name = "" 54 protocol_name = "" 55 56def print_top(fheader): 57 fheader.write('''/* AUTOMATICALLY GENERATED, DO NOT MODIFY */ 58/* 59 * QEMU Block Module Infrastructure 60 * 61 * Authors: 62 * Marc Mari <markmb@redhat.com> 63 */ 64 65''') 66 67 fheader.write('''#ifndef QEMU_MODULE_BLOCK_H 68#define QEMU_MODULE_BLOCK_H 69 70static const struct { 71 const char *format_name; 72 const char *protocol_name; 73 const char *library_name; 74} block_driver_modules[] = {''') 75 76def print_bottom(fheader): 77 fheader.write(''' 78}; 79 80#endif 81''') 82 83if __name__ == '__main__': 84 # First argument: output file 85 # All other arguments: modules source files (.c) 86 output_file = sys.argv[1] 87 with open(output_file, 'w') as fheader: 88 print_top(fheader) 89 90 for filename in sys.argv[2:]: 91 if os.path.isfile(filename): 92 process_file(fheader, filename) 93 else: 94 print("File " + filename + " does not exist.", file=sys.stderr) 95 sys.exit(1) 96 97 print_bottom(fheader) 98 99 sys.exit(0) 100