type menulist [display="Menu List"] { // MenuList header (12 bytes) i32 name_ptr [ui, readonly, display="Name Ptr"]; u32 menu_count [ui, readonly, display="Menu Count"]; i32 menus_ptr [ui, readonly, display="Menus Ptr"]; // Name string (if inline) if (name_ptr == -1) { name = cstring() [ui, readonly, display="Name"]; _name = name; } // Menu definitions (if inline) if (menus_ptr == -1 && menu_count > 0 ) { // First pass: parse all menu pointers menu_ptrs = 0; repeat(menu_count) { _ptr = parse_here("menuptr"); menu_ptrs = push("menu_ptrs", _ptr); } // Second pass: parse menudefs for inline pointers menus = 0; repeat(menu_count) { _ptr_obj = get(menu_ptrs, _i); _ptr_val = get(_ptr_obj, "ptr"); if (_ptr_val == -1) { _menu = parse_here("menudef"); menus = push("menus", _menu); } } menus = menus [table="Menus", columns="name"]; } }