voodoo/voodoo2_bits_csv.py
2025-09-14 18:43:37 -05:00

68 lines
1.7 KiB
Python

import sys
import csv
def next_l(it):
n = next(it)
while not n.strip():
n = next(it)
return n.strip()
def next_s(it):
n = next(it)
return n.strip()
def parse_bit(s):
if ':' in s:
a, b = s.split(':')
return int(a, 10), int(b, 10)
else:
return int(s, 10)
def parse(lines):
it = iter(lines)
while True:
try:
name = next_l(it)
assert name not in {'Bit', 'Description'}
except StopIteration:
return
n = next_l(it)
assert n == 'Bit', n
bits = []
n = next_s(it)
while n != 'Description' and n != 'Name':
bits.append(parse_bit(n))
n = next_s(it)
names = []
if n == 'Name':
n = next_s(it)
while n != 'Description':
names.append(n)
n = next_s(it)
assert n == 'Description'
descriptions = []
n = next_s(it)
while n != '':
descriptions.append(n)
n = next_s(it)
assert len(descriptions) == len(bits), (descriptions, bits)
if names:
assert len(names) == len(bits), (names, bits)
yield name, bits, names, descriptions
def generate_csv(parsed):
with open(sys.argv[2], 'w', newline='') as f:
writer = csv.writer(f)
for name, bits, _, descriptions in parsed:
for bit, description in zip(bits, descriptions):
bits = str(bit) if type(bit) is int else ':'.join(map(str, bit))
writer.writerow([name, bits, description])
writer.writerow([])
with open(sys.argv[1], 'r') as f:
buf = f.read()
lines = buf.split('\n')
#list(parse(lines))
generate_csv(parse(lines))