#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-2.0-or-later

import os, sys, xml.etree.ElementTree

def writeliteral(indent, bytes):
    sys.stdout.write(' ' * indent)
    sys.stdout.write('"')
    quoted = True

    for c in bytes:
        if not quoted:
            sys.stdout.write('\n')
            sys.stdout.write(' ' * indent)
            sys.stdout.write('"')
            quoted = True

        if c == b'"'[0]:
            sys.stdout.write('\\"')
        elif c == b'\\'[0]:
            sys.stdout.write('\\\\')
        elif c == b'\n'[0]:
            sys.stdout.write('\\n"')
            quoted = False
        elif c >= 32 and c < 127:
            sys.stdout.write(c.to_bytes(1, 'big').decode())
        else:
            sys.stdout.write(f'\{c:03o}')

    if quoted:
        sys.stdout.write('"')

sys.stdout.write('#include "qemu/osdep.h"\n' \
                 '#include "exec/gdbstub.h"\n' \
                 '\n'
                 'const GDBFeature gdb_static_features[] = {\n')

for input in sys.argv[1:]:
    with open(input, 'rb') as file:
        read = file.read()

    parser = xml.etree.ElementTree.XMLPullParser(['start', 'end'])
    parser.feed(read)
    events = parser.read_events()
    event, element = next(events)
    if event != 'start':
        sys.stderr.write(f'unexpected event: {event}\n')
        exit(1)
    if element.tag != 'feature':
        sys.stderr.write(f'unexpected start tag: {element.tag}\n')
        exit(1)

    feature_name = element.attrib['name']
    regnum = 0
    regnames = []
    regnums = []
    tags = ['feature']
    for event, element in events:
        if event == 'end':
            if element.tag != tags[len(tags) - 1]:
                sys.stderr.write(f'unexpected end tag: {element.tag}\n')
                exit(1)

            tags.pop()
            if element.tag == 'feature':
                break
        elif event == 'start':
            if len(tags) < 2 and element.tag == 'reg':
                if 'regnum' in element.attrib:
                    regnum = int(element.attrib['regnum'])

                regnames.append(element.attrib['name'])
                regnums.append(regnum)
                regnum += 1

            tags.append(element.tag)
        else:
            raise Exception(f'unexpected event: {event}\n')

    if len(tags):
        sys.stderr.write('unterminated feature tag\n')
        exit(1)

    base_reg = min(regnums)
    num_regs = max(regnums) - base_reg + 1 if len(regnums) else 0

    sys.stdout.write('    {\n')
    sys.stdout.write('        .xmlname = ')
    writeliteral(0, bytes(os.path.basename(input), 'utf-8'))
    sys.stdout.write(',\n')
    sys.stdout.write('        .xml = \n')
    writeliteral(12, read)
    sys.stdout.write(',\n')
    sys.stdout.write('        .name = ')
    writeliteral(0, bytes(feature_name, 'utf-8'))
    sys.stdout.write(',\n')
    sys.stdout.write(f'        .regs = (const char * const [{num_regs}]) {{\n')

    for index, regname in enumerate(regnames):
        sys.stdout.write(f'            [{regnums[index] - base_reg}] =\n')
        writeliteral(16, bytes(regname, 'utf-8'))
        sys.stdout.write(',\n')

    sys.stdout.write( '        },\n')
    sys.stdout.write(f'        .base_reg = {base_reg},\n')
    sys.stdout.write(f'        .num_regs = {num_regs},\n')
    sys.stdout.write( '    },\n')

sys.stdout.write('    { NULL }\n};\n')
