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