ea_t resolve_label(ea_t base, uint16 id) { ea_t ea = base; OutHdr oh; // first search down, then search up for(;;) { if (netnode(ea).supval(PSEUDO_NETNODE_SUPVAL,&oh,sizeof(oh)) == -1) return NULL; if (oh.label == id) return ea; if (oh.flags & 1) break; ea--; } ea = base; // first search down, then search up for(;;) { if (netnode(ea).supval(PSEUDO_NETNODE_SUPVAL,&oh,sizeof(oh)) == -1) return NULL; if (oh.label == id) return ea; if (oh.flags & 2) break; ea++; } return 0; }
bool save_class(class_t * clas) { bytevec_t buffer; append_ea(buffer, clas->virt_table_ea); append_dd(buffer, clas->flags); append_eavec(buffer, 0, clas->functions_ea); append_eavec(buffer, 0, clas->parents_tid); netnode n = netnode(clas->tid); n.setblob(&buffer.front(), buffer.size(), 0, 'm'); return true; }
inline bool is_ghost_enum(enum_t id) { return (netnode(id).altval(ENUM_FLAGS) & ENUM_FLAGS_GHOST) != 0; }
//same as get_struc_name for now inline ssize_t get_class_name(tid_t id, char *buf, size_t bufsize) { return netnode(id).name(buf, bufsize); }
inline DEPRECATED uchar get_const_serial(const_t cid) { return uchar(netnode(cid).altval(CONST_SERIAL)); }
inline DEPRECATED bmask_t get_const_bmask(const_t id) { return id > MAXADDR ? netnode(id).altval(CONST_BMASK)-1 : BADNODE; }
inline DEPRECATED uval_t get_const_value(const_t id) { return id > MAXADDR ? netnode(id).altval(CONST_VALUE) : 0; }
inline bool set_enum_flag(enum_t id, flags_t flag) { return netnode(id).altset(ENUM_FLG_IDX,flag) != 0; }
inline enum_t get_enum_member_enum(const_t id) { return id > MAXADDR ? netnode(id).altval(CONST_ENUM)-1 : BADNODE; }
inline uval_t get_enum_member_value(const_t id) { return id > MAXADDR ? netnode(id).altval(CONST_VALUE) : 0; }
inline flags_t get_enum_flag(enum_t id) { return id > MAXADDR ? flags_t(netnode(id).altval(ENUM_FLG_IDX)) : 0; }
inline size_t get_enum_size(enum_t id) { return id > MAXADDR ? size_t(netnode(id).altval(ENUM_QTY_IDX)) : 0; }
inline ssize_t get_enum_cmt(enum_t id, bool repeatable, char *buf, size_t bufsize) { return id > MAXADDR ? netnode(id).supstr(repeatable != 0, buf, bufsize) : -1; }
inline size_t get_enum_width(enum_t id) { return id > MAXADDR ? size_t((netnode(id).altval(ENUM_FLAGS) & ENUM_FLAGS_WIDTH) >> 3) : 0; }
inline ssize_t get_enum_name(qstring *out, enum_t id) { return id > MAXADDR ? netnode(id).get_name(out) : -1; }
inline int32 get_enum_type_ordinal(enum_t id) { return int32(netnode(id).altval(ENUM_ORDINAL)-1); }
inline void set_enum_type_ordinal(enum_t id, int32 ord) { netnode(id).altset(ENUM_ORDINAL, ord+1); }
inline bmask_t get_enum_member_bmask(const_t id) { return id > MAXADDR ? netnode(id).altval(CONST_BMASK)-1 : BADNODE; }
inline netnode get_bmask_node(enum_t id, bmask_t bmask) { if ( !is_bf(id) ) return BADNODE; return netnode(id).altval(bmask, ENUM_MASKS)-1; }
inline bmask_t get_last_bmask(enum_t id) { return netnode(id).altlast(ENUM_MASKS); }
inline DEPRECATED enum_t get_const_enum(const_t id) { return id > MAXADDR ? netnode(id).altval(CONST_ENUM)-1 : BADNODE; }
inline bmask_t get_next_bmask(enum_t id,bmask_t bmask) { return netnode(id).altnxt(bmask,ENUM_MASKS); }
inline DEPRECATED ssize_t get_const_cmt(const_t id, bool repeatable, char *buf, size_t bufsize) { return netnode(id).supstr(repeatable != 0, buf, bufsize); }
inline bmask_t get_prev_bmask(enum_t id,bmask_t bmask) { return netnode(id).altprev(bmask,ENUM_MASKS); }
inline tid_t get_class_id(const char *name) // get struct id by name { tid_t id = netnode(name); return get_class(id) == NULL ? BADADDR : id; }
inline ssize_t get_enum_member_name(qstring *out, const_t id) { return netnode(id).get_name(out); }
//same as get_struc_cmt inline ssize_t get_class_cmt(tid_t id, bool repeatable, char *buf, size_t bufsize) { return netnode(id).supstr(repeatable != 0, buf, bufsize); }
inline ssize_t get_enum_member_cmt(const_t id, bool repeatable, char *buf, size_t bufsize) { return netnode(id).supstr(repeatable != 0, buf, bufsize); }
//-------------------------------------------------------------------------- static int idaapi init(void) { add_menu_item("Edit/Other/Create", "Specify switch idiom", "", SETMENU_INS, callback, NULL); ignore_micro = netnode("$ ignore micro"); return PLUGIN_KEEP; }
inline uchar get_enum_member_serial(const_t cid) { return uchar(netnode(cid).altval(CONST_SERIAL)); }