Skip to content

Instantly share code, notes, and snippets.

@vaiorabbit
Last active December 12, 2016 14:05
Show Gist options
  • Save vaiorabbit/9d2b9fcb684e3e73ee7a5d8e9c1f25d7 to your computer and use it in GitHub Desktop.
Save vaiorabbit/9d2b9fcb684e3e73ee7a5d8e9c1f25d7 to your computer and use it in GitHub Desktop.
[Experimental] Collecting enum values from nuklear.h
{'anonymous_enum_0': [('nk_false', 0), ('nk_true', 1)],
'nk_allocation_type': [('NK_BUFFER_FIXED', 0), ('NK_BUFFER_DYNAMIC', 1)],
'nk_anti_aliasing': [('NK_ANTI_ALIASING_OFF', 0), ('NK_ANTI_ALIASING_ON', 1)],
'nk_buffer_allocation_type': [('NK_BUFFER_FRONT', 0),
('NK_BUFFER_BACK', 1),
('NK_BUFFER_MAX', 2)],
'nk_button_behavior': [('NK_BUTTON_DEFAULT', 0), ('NK_BUTTON_REPEATER', 1)],
'nk_buttons': [('NK_BUTTON_LEFT', 0),
('NK_BUTTON_MIDDLE', 1),
('NK_BUTTON_RIGHT', 2),
('NK_BUTTON_MAX', 3)],
'nk_chart_event': [('NK_CHART_HOVERING', 1), ('NK_CHART_CLICKED', 2)],
'nk_chart_type': [('NK_CHART_LINES', 0),
('NK_CHART_COLUMN', 1),
('NK_CHART_MAX', 2)],
'nk_collapse_states': [('NK_MINIMIZED', 0), ('NK_MAXIMIZED', 1)],
'nk_color_format': [('NK_RGB', 0), ('NK_RGBA', 1)],
'nk_command_clipping': [('NK_CLIPPING_OFF', 0), ('NK_CLIPPING_ON', 1)],
'nk_command_type': [('NK_COMMAND_NOP', 0),
('NK_COMMAND_SCISSOR', 1),
('NK_COMMAND_LINE', 2),
('NK_COMMAND_CURVE', 3),
('NK_COMMAND_RECT', 4),
('NK_COMMAND_RECT_FILLED', 5),
('NK_COMMAND_RECT_MULTI_COLOR', 6),
('NK_COMMAND_CIRCLE', 7),
('NK_COMMAND_CIRCLE_FILLED', 8),
('NK_COMMAND_ARC', 9),
('NK_COMMAND_ARC_FILLED', 10),
('NK_COMMAND_TRIANGLE', 11),
('NK_COMMAND_TRIANGLE_FILLED', 12),
('NK_COMMAND_POLYGON', 13),
('NK_COMMAND_POLYGON_FILLED', 14),
('NK_COMMAND_POLYLINE', 15),
('NK_COMMAND_TEXT', 16),
('NK_COMMAND_IMAGE', 17)],
'nk_draw_list_stroke': [('NK_STROKE_OPEN', 0), ('NK_STROKE_CLOSED', 1)],
'nk_draw_vertex_layout_attribute': [('NK_VERTEX_POSITION', 0),
('NK_VERTEX_COLOR', 1),
('NK_VERTEX_TEXCOORD', 2),
('NK_VERTEX_ATTRIBUTE_COUNT', 3)],
'nk_draw_vertex_layout_format': [('NK_FORMAT_SCHAR', 0),
('NK_FORMAT_SSHORT', 1),
('NK_FORMAT_SINT', 2),
('NK_FORMAT_UCHAR', 3),
('NK_FORMAT_USHORT', 4),
('NK_FORMAT_UINT', 5),
('NK_FORMAT_FLOAT', 6),
('NK_FORMAT_DOUBLE', 7),
('NK_FORMAT_COLOR_BEGIN', 8),
('NK_FORMAT_R8G8B8', 8),
('NK_FORMAT_R16G15B16', 9),
('NK_FORMAT_R32G32B32', 10),
('NK_FORMAT_R8G8B8A8', 11),
('NK_FORMAT_R16G15B16A16', 12),
('NK_FORMAT_R32G32B32A32', 13),
('NK_FORMAT_R32G32B32A32_FLOAT', 14),
('NK_FORMAT_R32G32B32A32_DOUBLE', 15),
('NK_FORMAT_RGB32', 16),
('NK_FORMAT_RGBA32', 17),
('NK_FORMAT_COLOR_END', 17),
('NK_FORMAT_COUNT', 18)],
'nk_edit_events': [('NK_EDIT_ACTIVE', 1),
('NK_EDIT_INACTIVE', 2),
('NK_EDIT_ACTIVATED', 4),
('NK_EDIT_DEACTIVATED', 8),
('NK_EDIT_COMMITED', 16)],
'nk_edit_flags': [('NK_EDIT_DEFAULT', 0),
('NK_EDIT_READ_ONLY', 1),
('NK_EDIT_AUTO_SELECT', 2),
('NK_EDIT_SIG_ENTER', 4),
('NK_EDIT_ALLOW_TAB', 8),
('NK_EDIT_NO_CURSOR', 16),
('NK_EDIT_SELECTABLE', 32),
('NK_EDIT_CLIPBOARD', 64),
('NK_EDIT_CTRL_ENTER_NEWLINE', 128),
('NK_EDIT_NO_HORIZONTAL_SCROLL', 256),
('NK_EDIT_ALWAYS_INSERT_MODE', 512),
('NK_EDIT_MULTILINE', 2048),
('NK_EDIT_GOTO_END_ON_ACTIVATE', 4096)],
'nk_edit_types': [('NK_EDIT_SIMPLE', 512),
('NK_EDIT_FIELD', 608),
('NK_EDIT_BOX', 2664),
('NK_EDIT_EDITOR', 2152)],
'nk_font_atlas_format': [('NK_FONT_ATLAS_ALPHA8', 0),
('NK_FONT_ATLAS_RGBA32', 1)],
'nk_font_coord_type': [('NK_COORD_UV', 0), ('NK_COORD_PIXEL', 1)],
'nk_heading': [('NK_UP', 0), ('NK_RIGHT', 1), ('NK_DOWN', 2), ('NK_LEFT', 3)],
'nk_keys': [('NK_KEY_NONE', 0),
('NK_KEY_SHIFT', 1),
('NK_KEY_CTRL', 2),
('NK_KEY_DEL', 3),
('NK_KEY_ENTER', 4),
('NK_KEY_TAB', 5),
('NK_KEY_BACKSPACE', 6),
('NK_KEY_COPY', 7),
('NK_KEY_CUT', 8),
('NK_KEY_PASTE', 9),
('NK_KEY_UP', 10),
('NK_KEY_DOWN', 11),
('NK_KEY_LEFT', 12),
('NK_KEY_RIGHT', 13),
('NK_KEY_TEXT_INSERT_MODE', 14),
('NK_KEY_TEXT_REPLACE_MODE', 15),
('NK_KEY_TEXT_RESET_MODE', 16),
('NK_KEY_TEXT_LINE_START', 17),
('NK_KEY_TEXT_LINE_END', 18),
('NK_KEY_TEXT_START', 19),
('NK_KEY_TEXT_END', 20),
('NK_KEY_TEXT_UNDO', 21),
('NK_KEY_TEXT_REDO', 22),
('NK_KEY_TEXT_WORD_LEFT', 23),
('NK_KEY_TEXT_WORD_RIGHT', 24),
('NK_KEY_SCROLL_START', 25),
('NK_KEY_SCROLL_END', 26),
('NK_KEY_SCROLL_DOWN', 27),
('NK_KEY_SCROLL_UP', 28),
('NK_KEY_MAX', 29)],
'nk_layout_format': [('NK_DYNAMIC', 0), ('NK_STATIC', 1)],
'nk_modify': [('NK_FIXED', 0), ('NK_MODIFIABLE', 1)],
'nk_orientation': [('NK_VERTICAL', 0), ('NK_HORIZONTAL', 1)],
'nk_panel_flags': [('NK_WINDOW_BORDER', 1),
('NK_WINDOW_MOVABLE', 2),
('NK_WINDOW_SCALABLE', 4),
('NK_WINDOW_CLOSABLE', 8),
('NK_WINDOW_MINIMIZABLE', 16),
('NK_WINDOW_NO_SCROLLBAR', 32),
('NK_WINDOW_TITLE', 64),
('NK_WINDOW_SCROLL_AUTO_HIDE', 128),
('NK_WINDOW_BACKGROUND', 256)],
'nk_panel_set': [('NK_PANEL_SET_NONBLOCK', 240),
('NK_PANEL_SET_POPUP', 244),
('NK_PANEL_SET_SUB', 246)],
'nk_panel_type': [('NK_PANEL_WINDOW', 1),
('NK_PANEL_GROUP', 2),
('NK_PANEL_POPUP', 4),
('NK_PANEL_CONTEXTUAL', 16),
('NK_PANEL_COMBO', 32),
('NK_PANEL_MENU', 64),
('NK_PANEL_TOOLTIP', 128)],
'nk_popup_type': [('NK_POPUP_STATIC', 0), ('NK_POPUP_DYNAMIC', 1)],
'nk_show_states': [('NK_HIDDEN', 0), ('NK_SHOWN', 1)],
'nk_style_colors': [('NK_COLOR_TEXT', 0),
('NK_COLOR_WINDOW', 1),
('NK_COLOR_HEADER', 2),
('NK_COLOR_BORDER', 3),
('NK_COLOR_BUTTON', 4),
('NK_COLOR_BUTTON_HOVER', 5),
('NK_COLOR_BUTTON_ACTIVE', 6),
('NK_COLOR_TOGGLE', 7),
('NK_COLOR_TOGGLE_HOVER', 8),
('NK_COLOR_TOGGLE_CURSOR', 9),
('NK_COLOR_SELECT', 10),
('NK_COLOR_SELECT_ACTIVE', 11),
('NK_COLOR_SLIDER', 12),
('NK_COLOR_SLIDER_CURSOR', 13),
('NK_COLOR_SLIDER_CURSOR_HOVER', 14),
('NK_COLOR_SLIDER_CURSOR_ACTIVE', 15),
('NK_COLOR_PROPERTY', 16),
('NK_COLOR_EDIT', 17),
('NK_COLOR_EDIT_CURSOR', 18),
('NK_COLOR_COMBO', 19),
('NK_COLOR_CHART', 20),
('NK_COLOR_CHART_COLOR', 21),
('NK_COLOR_CHART_COLOR_HIGHLIGHT', 22),
('NK_COLOR_SCROLLBAR', 23),
('NK_COLOR_SCROLLBAR_CURSOR', 24),
('NK_COLOR_SCROLLBAR_CURSOR_HOVER', 25),
('NK_COLOR_SCROLLBAR_CURSOR_ACTIVE', 26),
('NK_COLOR_TAB_HEADER', 27),
('NK_COLOR_COUNT', 28)],
'nk_style_cursor': [('NK_CURSOR_ARROW', 0),
('NK_CURSOR_TEXT', 1),
('NK_CURSOR_MOVE', 2),
('NK_CURSOR_RESIZE_VERTICAL', 3),
('NK_CURSOR_RESIZE_HORIZONTAL', 4),
('NK_CURSOR_RESIZE_TOP_LEFT_DOWN_RIGHT', 5),
('NK_CURSOR_RESIZE_TOP_RIGHT_DOWN_LEFT', 6),
('NK_CURSOR_COUNT', 7)],
'nk_style_header_align': [('NK_HEADER_LEFT', 0), ('NK_HEADER_RIGHT', 1)],
'nk_style_item_type': [('NK_STYLE_ITEM_COLOR', 0),
('NK_STYLE_ITEM_IMAGE', 1)],
'nk_symbol_type': [('NK_SYMBOL_NONE', 0),
('NK_SYMBOL_X', 1),
('NK_SYMBOL_UNDERSCORE', 2),
('NK_SYMBOL_CIRCLE_SOLID', 3),
('NK_SYMBOL_CIRCLE_OUTLINE', 4),
('NK_SYMBOL_RECT_SOLID', 5),
('NK_SYMBOL_RECT_OUTLINE', 6),
('NK_SYMBOL_TRIANGLE_UP', 7),
('NK_SYMBOL_TRIANGLE_DOWN', 8),
('NK_SYMBOL_TRIANGLE_LEFT', 9),
('NK_SYMBOL_TRIANGLE_RIGHT', 10),
('NK_SYMBOL_PLUS', 11),
('NK_SYMBOL_MINUS', 12),
('NK_SYMBOL_MAX', 13)],
'nk_text_align': [('NK_TEXT_ALIGN_LEFT', 1),
('NK_TEXT_ALIGN_CENTERED', 2),
('NK_TEXT_ALIGN_RIGHT', 4),
('NK_TEXT_ALIGN_TOP', 8),
('NK_TEXT_ALIGN_MIDDLE', 16),
('NK_TEXT_ALIGN_BOTTOM', 32)],
'nk_text_alignment': [('NK_TEXT_LEFT', 17),
('NK_TEXT_CENTERED', 18),
('NK_TEXT_RIGHT', 20)],
'nk_text_edit_mode': [('NK_TEXT_EDIT_MODE_VIEW', 0),
('NK_TEXT_EDIT_MODE_INSERT', 1),
('NK_TEXT_EDIT_MODE_REPLACE', 2)],
'nk_text_edit_type': [('NK_TEXT_EDIT_SINGLE_LINE', 0),
('NK_TEXT_EDIT_MULTI_LINE', 1)],
'nk_tree_type': [('NK_TREE_NODE', 0), ('NK_TREE_TAB', 1)],
'nk_widget_layout_states': [('NK_WIDGET_INVALID', 0),
('NK_WIDGET_VALID', 1),
('NK_WIDGET_ROM', 2)],
'nk_widget_states': [('NK_WIDGET_STATE_MODIFIED', 2),
('NK_WIDGET_STATE_INACTIVE', 4),
('NK_WIDGET_STATE_ENTERED', 8),
('NK_WIDGET_STATE_HOVER', 16),
('NK_WIDGET_STATE_ACTIVED', 32),
('NK_WIDGET_STATE_LEFT', 64),
('NK_WIDGET_STATE_HOVERED', 18),
('NK_WIDGET_STATE_ACTIVE', 34)],
'nk_window_flags': [('NK_WINDOW_PRIVATE', 1024),
('NK_WINDOW_DYNAMIC', 1024),
('NK_WINDOW_ROM', 2048),
('NK_WINDOW_HIDDEN', 4096),
('NK_WINDOW_CLOSED', 8192),
('NK_WINDOW_MINIMIZED', 16384),
('NK_WINDOW_REMOVE_ROM', 32768)]}
# Usage:
# $ PYTHONPATH=/usr/local/Cellar/llvm/3.9.0/lib/python2.7/site-packages python2 nuklear_parser.py path/to/nuklear.h > nuklear.ast
import os, pprint, sys
from clang.cindex import Config, CursorKind, Index, TranslationUnit, TranslationUnitLoadError
Config.set_library_path("/usr/local/Cellar/llvm/3.9.0/lib")
class ParseContext(object):
"""
Holds current parsing context.
"""
# Collection Mode
Decl_Unknown = 0
Decl_Macro = 1
Decl_Typedef = 2
Decl_Enum = 3
Decl_Struct = 4
Decl_Function = 5
def __init__(self):
self.collection_mode = ParseContext.Decl_Unknown
self.depth = 0
self.decl_enums = {}
def push(self):
self.depth += 1
def pop(self):
self.depth -= 1
def add_decl_enum(self, name=None, values=[]):
if name == None or name == "":
name = "anonymous_enum_" + str(len(self.decl_enums))
self.decl_enums[name] = values
def collect_decl_macro(ctx, cursor):
ctx.collection_mode = ParseContext.Decl_Macro
pass # TODO
ctx.collection_mode = ParseContext.Decl_Unknown
def collect_decl_typedef(ctx, cursor):
ctx.collection_mode = ParseContext.Decl_Typedef
pass # TODO
ctx.collection_mode = ParseContext.Decl_Unknown
def collect_decl_enum(ctx, cursor):
ctx.collection_mode = ParseContext.Decl_Enum
val = []
ctx.push()
for child in cursor.get_children():
if child.kind == CursorKind.ENUM_CONSTANT_DECL:
pair = (child.displayname, child.enum_value)
val.append(pair)
ctx.pop()
ctx.add_decl_enum(name=cursor.displayname, values=val)
ctx.collection_mode = ParseContext.Decl_Unknown
def collect_decl_struct(ctx, cursor):
ctx.collection_mode = ParseContext.Decl_Struct
pass # TODO
ctx.collection_mode = ParseContext.Decl_Unknown
def collect_decl_function(ctx, cursor):
ctx.collection_mode = ParseContext.Decl_Function
pass # TODO
ctx.collection_mode = ParseContext.Decl_Unknown
def collect_decl(ctx, cursor):
ctx.push()
for child in cursor.get_children():
if child.kind == CursorKind.MACRO_DEFINITION:
collect_decl_macro(ctx, child)
elif child.kind == CursorKind.TYPEDEF_DECL:
collect_decl_typedef(ctx, child)
elif child.kind == CursorKind.ENUM_DECL:
collect_decl_enum(ctx, child)
elif child.kind in {CursorKind.STRUCT_DECL, CursorKind.UNION_DECL}:
collect_decl_struct(ctx, child)
elif child.kind == CursorKind.FUNCTION_DECL:
collect_decl_function(ctx, child)
else:
pass
ctx.pop()
if __name__ == "__main__":
ctx = ParseContext()
arg = ["-fsyntax-only", "-DNK_INCLUDE_DEFAULT_ALLOCATOR", "-DNK_INCLUDE_VERTEX_BUFFER_OUTPUT", "-DNK_INCLUDE_FONT_BAKING"]
opt = TranslationUnit.PARSE_INCOMPLETE | TranslationUnit.PARSE_SKIP_FUNCTION_BODIES | TranslationUnit.PARSE_DETAILED_PROCESSING_RECORD
idx = Index.create()
try:
tu = idx.parse(sys.argv[1], args=arg, unsaved_files=None, options=opt)
ctx.depth = 0
collect_decl(ctx, tu.cursor)
except TranslationUnitLoadError as err:
print(err)
assert ctx.depth == 0
pp = pprint.PrettyPrinter(depth=6)
pp.pprint(ctx.decl_enums)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment