| """ |
| This pre-processor parses a single file containing a list of |
| MP_REGISTER_ROOT_POINTER(variable declaration) items. |
| |
| These are used to generate a header with the required entries for |
| "struct _mp_state_vm_t" in py/mpstate.h |
| """ |
| |
| from __future__ import print_function |
| |
| import argparse |
| import io |
| import re |
| |
| |
| PATTERN = re.compile(r"MP_REGISTER_ROOT_POINTER\((.*?)\);") |
| |
| |
| def find_root_pointer_registrations(filename): |
| """Find any MP_REGISTER_ROOT_POINTER definitions in the provided file. |
| |
| :param str filename: path to file to check |
| :return: List[variable_declaration] |
| """ |
| with io.open(filename, encoding="utf-8") as c_file_obj: |
| return set(re.findall(PATTERN, c_file_obj.read())) |
| |
| |
| def generate_root_pointer_header(root_pointers): |
| """Generate header with root pointer entries. |
| |
| :param List[variable_declaration] root_pointers: root pointer declarations |
| :return: None |
| """ |
| |
| # Print header file for all external modules. |
| print("// Automatically generated by make_root_pointers.py.") |
| print() |
| |
| for item in root_pointers: |
| print(item, end=";") |
| print() |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument("file", nargs=1, help="file with MP_REGISTER_ROOT_POINTER definitions") |
| args = parser.parse_args() |
| |
| root_pointers = find_root_pointer_registrations(args.file[0]) |
| generate_root_pointer_header(sorted(root_pointers)) |
| |
| |
| if __name__ == "__main__": |
| main() |