def get_const_from_enum()

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