#!/usr/bin/env python3
"""Generates the builtins map to be used by host_init_verifier.

It copies the builtin function map from builtins.cpp, then replaces do_xxx() functions with the
equivalent check_xxx() if found in check_builtins.cpp.

"""

import re
import argparse

parser = argparse.ArgumentParser('host_builtin_map.py')
parser.add_argument('--builtins', required=True, help='Path to builtins.cpp')
parser.add_argument('--check_builtins', required=True, help='Path to check_builtins.cpp')
args = parser.parse_args()

CHECK_REGEX = re.compile(r'.+check_(\S+)\(.+')
check_functions = []
with open(args.check_builtins) as check_file:
  for line in check_file:
    match = CHECK_REGEX.match(line)
    if match:
      check_functions.append(match.group(1))

function_map = []
with open(args.builtins) as builtins_file:
  in_function_map = False
  for line in builtins_file:
    if '// Builtin-function-map start' in line:
      in_function_map = True
    elif '// Builtin-function-map end' in line:
      in_function_map = False
    elif in_function_map:
      function_map.append(line)

DO_REGEX = re.compile(r'.+do_([^\}]+).+')
FUNCTION_REGEX = re.compile(r'(do_[^\}]+)')
for line in function_map:
  match = DO_REGEX.match(line)
  if match:
    if match.group(1) in check_functions:
      line = line.replace('do_', 'check_')
    else:
      line = FUNCTION_REGEX.sub('check_stub', line)
  print(line, end=' ')
