in scripts/gen_wrappers.py [0:0]
def get_const_from_enum(processed_src):
# ===== Parse and extract structs =====
ast = pycparser.c_parser.CParser().parse(processed_src)
lines = []
for node in ast.children():
assert (node[1].name is None) == isinstance(
node[1].type, pycparser.c_ast.Struct)
struct = node[1].children()[0][1]
# Check if it is an enum
if hasattr(struct, "type") and isinstance(struct.type, pycparser.c_ast.Enum):
lines.append(" # " + struct.type.name)
# enum list os a list of key-value enumerations
enumlist = struct.children()[0][1].children()[0][1].children()
last_value = None
for _, enum in enumlist:
var = enum.name[2:]
# Enum has two parts - name and value
if enum.value is not None:
if isinstance(enum.value, BinaryOp):
# An enum is actually a binary operation
if enum.value.op == '<<':
# Parse and evaluate simple constant expression. Will throw if it's anything more complex
value = int(enum.value.children()[0][1].value) << int(enum.value.children()[1][1].value)
else:
raise NotImplementedError
elif isinstance(enum.value, UnaryOp):
# If we want to be correct we need to do a bit of parsing here....
if enum.value.op == '-':
# Again, if some assumptions I'm making here are not correct, this should throw
value = -int(enum.value.expr.value)
else:
raise NotImplementedError
else:
children = enum.value.children()
if len(children) > 0:
value = children[1][1].value
else:
value = enum.value.value
value = int(value)
last_value = value
new_line = str(var) + " = " + str(value)
lines.append(new_line)
else:
assert(last_value is not None)
last_value += 1
lines.append(str(var) + " = " + str(last_value))
lines.append("")
return lines