#!/usr/bin/env python3
#
# Copyright 2019 The Hafnium Authors.
#
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file or at
# https://opensource.org/licenses/BSD-3-Clause.

"""Generate a header file with definitions of constants parsed from a binary."""

import argparse
import os
import re
import subprocess
import sys

STRINGS = "llvm-strings"

PROLOGUE = """
/**
 * This file was auto-generated by {}.
 * Changes will be overwritten.
 */

#pragma once

""".format(__file__)

def main():
	parser = argparse.ArgumentParser()
	parser.add_argument("bin_file",
		help="binary file to be parsed for definitions of constants")
	parser.add_argument("out_file", help="output file");
	args = parser.parse_args()

	# Regex for finding definitions: <HAFNIUM_DEFINE name value />
	regex = re.compile(r'<HAFNIUM_DEFINE\s([A-Za-z0-9_]+)\s([0-9]+) />')

	# Extract strings from the input binary file.
	stdout = subprocess.check_output([ STRINGS, args.bin_file ])
	stdout = stdout.decode('utf-8').split(os.linesep)

	with open(args.out_file, "w") as f:
		f.write(PROLOGUE)
		for line in stdout:
			for match in regex.findall(line):
				f.write("#define {} ({})\n".format(
					match[0], match[1]))

if __name__ == "__main__":
    sys.exit(main())
