#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Extract QEMU Plugin API symbols from a header file
#
# Copyright 2024 Linaro Ltd
#
# Author: Pierrick Bouvier <pierrick.bouvier@linaro.org>
#
# This work is licensed under the terms of the GNU GPL, version 2 or later.
# See the COPYING file in the top-level directory.
#
# SPDX-License-Identifier: GPL-2.0-or-later

import argparse
import re

def extract_symbols(plugin_header):
    with open(plugin_header) as file:
        content = file.read()
    # Remove QEMU_PLUGIN_API macro definition.
    content = content.replace('#define QEMU_PLUGIN_API', '')
    expected = content.count('QEMU_PLUGIN_API')
    # Find last word between QEMU_PLUGIN_API and (, matching on several lines.
    # We use *? non-greedy quantifier.
    syms = re.findall(r'QEMU_PLUGIN_API.*?(\w+)\s*\(', content, re.DOTALL)
    syms.sort()
    # Ensure we found as many symbols as API markers.
    assert len(syms) == expected
    return syms

def main() -> None:
    parser = argparse.ArgumentParser(description='Extract QEMU plugin symbols')
    parser.add_argument('plugin_header', help='Path to QEMU plugin header.')
    args = parser.parse_args()

    syms = extract_symbols(args.plugin_header)

    print('{')
    for s in syms:
        print("  {};".format(s))
    print('};')

if __name__ == '__main__':
    main()
