#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # Extract QEMU Plugin API symbols from a header file # # Copyright 2024 Linaro Ltd # # Author: Pierrick Bouvier # # 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()