mirror of
https://github.com/Rogiel/star-replay
synced 2025-12-05 22:32:46 +00:00
112 lines
4.0 KiB
Python
112 lines
4.0 KiB
Python
|
|
def generate_integer(bounds, className):
|
|
generated = "new IntegerNode({0}, {1}".format(bounds[0][1], bounds[0][0])
|
|
if className:
|
|
generated += ", '{0}'".format(className)
|
|
return generated + ")"
|
|
|
|
def generate_choice(tagger, choices, className):
|
|
generated = "new ChoiceNode(new IntegerNode({0}), [\n".format(tagger[1])
|
|
for index, choice in choices.iteritems():
|
|
generated += "\t{tag} => {index},\n".format(tag = index, index = choice[1])
|
|
generated += "]"
|
|
if className:
|
|
generated += ", '{0}'".format(className)
|
|
return generated + ")"
|
|
|
|
def generate_struct(members, className):
|
|
generated = "new StructNode([\n"
|
|
for member in members[0]:
|
|
if member:
|
|
member_name = member[0]
|
|
if member_name.startswith('m_'):
|
|
member_name = member[0][2:]
|
|
generated += "\t\"{name}\" => array('type' => {index}, 'tag' => {tag}),\n".format(name = member_name, index = member[1], tag = member[2])
|
|
|
|
generated += "]"
|
|
if className:
|
|
generated += ",\n\t'{0}'\n".format(className)
|
|
generated += ")"
|
|
return generated
|
|
|
|
def generate_optional(bounds, className):
|
|
generated = "new OptionalNode({0}".format(bounds[0])
|
|
if className:
|
|
generated += ", '{0}'".format(className)
|
|
return generated + ")"
|
|
|
|
def generate_blob(bounds, className):
|
|
generated = "new BlobNode(new IntegerNode({0}, {1})".format(bounds[0][1], bounds[0][0])
|
|
if className:
|
|
generated += ", '{0}'".format(className)
|
|
return generated + ")"
|
|
|
|
def generate_bool(className):
|
|
generated = "new BooleanNode("
|
|
if className:
|
|
generated += ", '{0}'".format(className)
|
|
return generated + ")"
|
|
|
|
def generate_array(bounds, className):
|
|
generated = "new ArrayNode(\n"
|
|
generated += "\tnew IntegerNode({size}, {constant}),\n".format(size=bounds[0][1], constant=bounds[0][0])
|
|
generated += "\t{0}".format(bounds[1])
|
|
|
|
if className:
|
|
generated += ",\n\t'{0}'\n".format(className)
|
|
|
|
generated += "\n)"
|
|
return generated
|
|
|
|
def generate_bitarray(bounds, className):
|
|
generated = "new BitArrayNode(\n"
|
|
generated += "\tnew IntegerNode({size}, {constant})\n".format(size=bounds[0][1], constant=bounds[0][0])
|
|
if className:
|
|
generated += ",\n\t'{0}'".format(className)
|
|
generated += ")"
|
|
return generated
|
|
|
|
def generate_null(className):
|
|
return "new NullNode()"
|
|
|
|
def generate_fourcc(className):
|
|
generated = "new FourCCNode("
|
|
if className:
|
|
generated += ", '{0}'".format(className)
|
|
generated += ")"
|
|
return generated
|
|
|
|
def generate_tree(protocol, classes):
|
|
nodes = []
|
|
for index, typeinfo in enumerate(protocol.typeinfos):
|
|
if typeinfo[0] == "_int":
|
|
generated = generate_integer(typeinfo[1], classes.get(index))
|
|
elif typeinfo[0] == "_choice":
|
|
generated = generate_choice(typeinfo[1][0], typeinfo[1][1], classes.get(index))
|
|
elif typeinfo[0] == "_struct":
|
|
generated = generate_struct(typeinfo[1], classes.get(index))
|
|
elif typeinfo[0] == "_optional":
|
|
generated = generate_optional(typeinfo[1], classes.get(index))
|
|
elif typeinfo[0] == "_blob":
|
|
generated = generate_blob(typeinfo[1], classes.get(index))
|
|
elif typeinfo[0] == "_bool":
|
|
generated = generate_bool(classes.get(index))
|
|
elif typeinfo[0] == "_array":
|
|
generated = generate_array(typeinfo[1], classes.get(index))
|
|
elif typeinfo[0] == "_bitarray":
|
|
generated = generate_bitarray(typeinfo[1], classes.get(index))
|
|
elif typeinfo[0] == "_fourcc":
|
|
generated = generate_fourcc(classes.get(index))
|
|
elif typeinfo[0] == "_null":
|
|
generated = generate_null(classes.get(index))
|
|
else:
|
|
print "Node %s unknown!" % typeinfo[0]
|
|
exit()
|
|
nodes.append(generated)
|
|
|
|
tree = "[\n"
|
|
for index, node in enumerate(nodes):
|
|
tree += "{index} => {code},\n".format(index=index, code = node)
|
|
tree += "]\n"
|
|
return tree
|