#!/usr/bin/env python

import argparse
import logging
import os
import re

from gensyscalls import SupportedArchitectures, SysCallsTxtParser
from genseccomp import parse_syscall_NRs


def load_syscall_names_from_file(file_path, architecture):
    parser = SysCallsTxtParser()
    parser.parse_open_file(open(file_path))
    arch_map = {}
    for syscall in parser.syscalls:
        if syscall.get(architecture):
            arch_map[syscall["func"]] = syscall["name"]

    return arch_map


def gen_syscall_nrs(out_file, base_syscall_file, syscall_NRs):
    for arch in SupportedArchitectures:
        base_names = load_syscall_names_from_file(base_syscall_file, arch)

        for func, syscall in base_names.items():
            out_file.write("#define __" + arch + "_" + func + " " +
                           str(syscall_NRs[arch][syscall]) + ";\n")


def main():
    parser = argparse.ArgumentParser(
        description=
        "Generates a mapping of bionic functions to system call numbers per architecture."
    )
    parser.add_argument("--verbose", "-v", help="Enables verbose logging.")
    parser.add_argument("--out-dir",
                        help="The output directory for the output files")
    parser.add_argument(
        "base_file",
        metavar="base-file",
        type=str,
        help="The path of the base syscall list (SYSCALLS.TXT).")
    parser.add_argument(
        "files",
        metavar="FILE",
        type=str,
        nargs="+",
        help=("A syscall name-number mapping file for an architecture.\n"))
    args = parser.parse_args()

    if args.verbose:
        logging.basicConfig(level=logging.DEBUG)
    else:
        logging.basicConfig(level=logging.INFO)

    syscall_NRs = {}
    for filename in args.files:
        m = re.search(r"libseccomp_gen_syscall_nrs_([^/]+)", filename)
        syscall_NRs[m.group(1)] = parse_syscall_NRs(filename)

    output_path = os.path.join(args.out_dir, "func_to_syscall_nrs.h")
    with open(output_path, "w") as output_file:
        gen_syscall_nrs(out_file=output_file,
                        syscall_NRs=syscall_NRs,
                        base_syscall_file=args.base_file)


if __name__ == "__main__":
    main()
