#!/usr/bin/python3

import sys
import re

files = {}

def dump_file(buf):
    name = buf['name']

    if name not in files:
        files[name] = 0
    else:
        files[name] += 1
        name = name + str(files[name])

    print ("Writing %s in %s and %s.bin" % (buf['name'], name, name))

    fp = open(name, "w")
    fp.write(",".join(buf['data']))

    fp = open(name + ".bin", "w")
    for byte in buf['data']:
        byte = byte.strip()
        if byte:
            fp.write(chr(int(byte, 16)))

def find_buffer(name, data):
    pattern = r"Name\s*\((%s),\s*Buffer\s*\(((0x)?[\dA-Fa-f]+)\)\s*{(.*?)}\s*\)" % name

    for group in re.findall(pattern, data, re.DOTALL):
        buf = {}
        buf['name'] = group[0]
        buf['size'] = group[1]
        buf['data'] = group[3]

        buf['data'] = re.sub(r"\s*/\*.*?\*/\s*", "", buf['data'])
        buf['data'] = re.split("\s*,\s*|\s*", buf['data'])

        yield buf

def main():
    if len(sys.argv) >= 2:
        if sys.argv[1] == '--help':
            print ('Usage: %s DSDT.dsl' % sys.argv[0])
            return 0
        stdin = open(sys.argv[1])
    else:
        stdin = sys.stdin

    data = stdin.read()

    for buf in find_buffer("_WDG", data):
        dump_file(buf)
    for buf in find_buffer("WQ[A-Z]{2}", data):
        dump_file(buf)

if __name__ == '__main__':
    ret = main()
    sys.exit(ret)
