import argparse
import subprocess
import json
import os
import re

if __name__== '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('input')
    parser.add_argument('output')
    parser.add_argument('buildroot')

    args = parser.parse_known_args()

    # c_args might contain things that are essential for crosscompilation, but
    # are not included in cc.cmd_array(), so we have to look them up ourselves
    host_cargs = []
    buildroot = args[0].buildroot
    with open(os.path.join(buildroot, 'meson-info', 'intro-buildoptions.json')) as json_file:
        bopts = json.load(json_file)
        for opt in bopts:
            if opt['name'] == 'c_args' and opt['section'] == 'compiler' and opt['machine'] == 'host':
                host_cargs = opt['value']
                break

    cpp = args[1]
    ret = subprocess.run(cpp + host_cargs + [args[0].input], stdout=subprocess.PIPE, check=True)

    stdout = ret.stdout.decode('utf8')

    with open(args[0].output, 'w') as out:
        write = True
        for l in stdout.split('\n'):
            l = l.strip('\r')
            if l.startswith('CUT_OUT_BEGIN'):
                write = False

            if write and l:
                stripped = re.sub('^\s+', '', l)
                stripped = re.sub('\s*,\s*', ',', stripped)
                if not stripped.isspace() and stripped:
                    out.write('%s\n' % stripped)

            if l.startswith('CUT_OUT_END'):
                write = True
