-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathgenerator.py
97 lines (72 loc) · 2.88 KB
/
generator.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import os, filters
from distutils.dir_util import copy_tree
from typing import Dict, List
from jinja2 import Environment, PackageLoader
from xml.etree import ElementTree
env = Environment(
loader=PackageLoader('generator', 'templates'),
keep_trailing_newline=True,
)
env.filters["bitflag"] = filters.bitflag
env.filters["escape_backslashes"] = filters.escape_backslashes
env.filters["hex_string"] = filters.hex_string
env.filters["enum_name"] = filters.enum_name
env.filters["field_name"] = filters.field_name
env.filters["to_basic_type"] = filters.to_basic_type
basics: List[str] = []
def write_file(filename: str, contents: str):
dir = os.path.dirname(filename)
if not os.path.exists(dir):
os.makedirs(dir)
with open(filename, 'w', encoding='utf-8') as file:
file.write(contents)
def write_basic(element: ElementTree.Element):
print(element.attrib['name'])
if element.attrib.get('integral', 'false') == 'true' and (element.attrib.get('boolean', 'false') == 'false' or element.attrib['name'] == 'byte'):
size: int = int(element.attrib.get('size', '4'))
signed: bool = element.attrib.get('countable', 'true') == 'true'
min_value: str = hex(not signed and -pow(2, size * 4) or 0)
max_value: str = hex(pow(2, size * (not signed and 8 or 4)) - 1)
write_file(
"output/basics/%s.py" % (element.attrib['name']),
env.get_template('basic_integral.py.jinja').render(
basic=element, min=min_value, max=max_value, size=size)
)
basics.append(element.attrib['name'])
def write_basic_init(classes: List[str]):
write_file(
"output/basics/__init__.py",
env.get_template('__init__.py.jinja').render(classes=classes)
)
def write_enum(element: ElementTree.Element):
print(element.attrib['name'])
write_file(
"output/enums/%s.py" % (element.attrib['name']),
env.get_template('enum.py.jinja').render(enum=element)
)
def write_bitflags(element: ElementTree.Element):
print(element.attrib['name'])
write_file(
"output/bitflags/%s.py" % (element.attrib['name']),
env.get_template('bitflags.py.jinja').render(bitflags=element)
)
def write_bitfield(element: ElementTree.Element):
print(element.attrib['name'])
write_file(
"output/bitfields/%s.py" % (element.attrib['name']),
env.get_template('bitfield.py.jinja').render(bitfield=element)
)
def write_templates():
nif_xml = ElementTree.parse('nifxml/nif.xml')
root = nif_xml.getroot()
for basic in root.iter('basic'):
write_basic(basic)
write_basic_init(basics)
for enum in root.iter('enum'):
write_enum(enum)
for bitflags in root.iter('bitflags'):
write_bitflags(bitflags)
for bitfield in root.iter('bitfield'):
write_bitfield(bitfield)
copy_tree('source', 'output')
# write_templates()