TOOLS/matroska.py: allow using as module

Don't force CLI usage. It can be imported, and generate_C_header() and
generate_C_definitions() can be called with a file argument instead of
writing to stdout always.
This commit is contained in:
wm4 2016-12-17 16:05:51 +01:00
parent ff9f5e06ff
commit a61eb81141
1 changed files with 48 additions and 45 deletions

View File

@ -284,56 +284,58 @@ def parse_elems(l, namespace):
parse_elems(elements_ebml, 'EBML') parse_elems(elements_ebml, 'EBML')
parse_elems(elements_matroska, 'MATROSKA') parse_elems(elements_matroska, 'MATROSKA')
def generate_C_header(): def printf(out, *args):
print('// Generated by TOOLS/matroska.py, do not edit manually') out.write(' '.join([str(x) for x in args]))
print() out.write('\n')
def generate_C_header(out):
printf(out, '// Generated by TOOLS/matroska.py, do not edit manually')
printf(out)
for el in elementlist: for el in elementlist:
print('#define {0.definename:40} 0x{0.elid}'.format(el)) printf(out, '#define {0.definename:40} 0x{0.elid}'.format(el))
print() printf(out)
for el in reversed(elementlist): for el in reversed(elementlist):
if not el.subelements: if not el.subelements:
continue continue
print() printf(out)
print('struct {0.structname} {{'.format(el)) printf(out, 'struct {0.structname} {{'.format(el))
l = max(len(subel.valname) for subel, multiple in el.subelements)+1 l = max(len(subel.valname) for subel, multiple in el.subelements)+1
for subel, multiple in el.subelements: for subel, multiple in el.subelements:
print(' {e.valname:{l}} {star}{e.fieldname};'.format( printf(out, ' {e.valname:{l}} {star}{e.fieldname};'.format(
e=subel, l=l, star=' *'[multiple])) e=subel, l=l, star=' *'[multiple]))
print() printf(out)
for subel, multiple in el.subelements: for subel, multiple in el.subelements:
print(' int n_{0.fieldname};'.format(subel)) printf(out, ' int n_{0.fieldname};'.format(subel))
print('};') printf(out, '};')
for el in elementlist: for el in elementlist:
if not el.subelements: if not el.subelements:
continue continue
print('extern const struct ebml_elem_desc {0.structname}_desc;'.format( printf(out, 'extern const struct ebml_elem_desc {0.structname}_desc;'.format(el))
el))
print() printf(out)
print('#define MAX_EBML_SUBELEMENTS', max(len(el.subelements) printf(out, '#define MAX_EBML_SUBELEMENTS', max(len(el.subelements)
for el in elementlist)) for el in elementlist))
def generate_C_definitions(out):
def generate_C_definitions(): printf(out, '// Generated by TOOLS/matroska.py, do not edit manually')
print('// Generated by TOOLS/matroska.py, do not edit manually') printf(out)
print()
for el in reversed(elementlist): for el in reversed(elementlist):
print() printf(out)
if el.subelements: if el.subelements:
print('#define N', el.fieldname) printf(out, '#define N', el.fieldname)
print('E_S("{0}", {1})'.format(el.name, len(el.subelements))) printf(out, 'E_S("{0}", {1})'.format(el.name, len(el.subelements)))
for subel, multiple in el.subelements: for subel, multiple in el.subelements:
print('F({0.definename}, {0.fieldname}, {1})'.format( printf(out, 'F({0.definename}, {0.fieldname}, {1})'.format(
subel, int(multiple))) subel, int(multiple)))
print('}};') printf(out, '}};')
print('#undef N') printf(out, '#undef N')
else: else:
print('E("{0.name}", {0.fieldname}, {0.ebmltype})'.format(el)) printf(out, 'E("{0.name}", {0.fieldname}, {0.ebmltype})'.format(el))
def read(s, length): def read(s, length):
t = s.read(length) t = s.read(length)
@ -444,20 +446,21 @@ def parse_one(s, depth, parent, maxlen):
read(s, length) read(s, length)
return this_length return this_length
def parse_toplevel(s): if __name__ == "__main__":
parse_one(s, 0, None, 1 << 63) def parse_toplevel(s):
parse_one(s, 0, None, 1 << 63)
if sys.argv[1] == '--generate-header': if sys.argv[1] == '--generate-header':
generate_C_header() generate_C_header(sys.stdout)
elif sys.argv[1] == '--generate-definitions': elif sys.argv[1] == '--generate-definitions':
generate_C_definitions() generate_C_definitions(sys.stdout)
else: else:
s = open(sys.argv[1], "rb") s = open(sys.argv[1], "rb")
while 1: while 1:
start = s.tell() start = s.tell()
try: try:
parse_toplevel(s) parse_toplevel(s)
except EOF: except EOF:
if s.tell() != start: if s.tell() != start:
raise Exception("Unexpected end of file") raise Exception("Unexpected end of file")
break break