#!/usr/bin/env python

import argparse
import collections
import logging
import os
import re
import subprocess
import textwrap

from gensyscalls import 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 ('arm', 'arm64', 'mips', 'mips64', 'x86', 'x86_64'):
    base_names = load_syscall_names_from_file(base_syscall_file, arch)

    for func,syscall in base_names.iteritems():
      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_files = []
  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()
