#!/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)
