mirror of https://github.com/mpv-player/mpv
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:
parent
ff9f5e06ff
commit
a61eb81141
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue