R_API char *r_type_enum_getbitfield(Sdb *TDB, const char *name, ut64 val) { char *q, *ret = NULL; const char *res; int i; if (r_type_kind (TDB, name) != R_TYPE_ENUM) { return NULL; } bool isFirst = true; ret = r_str_appendf (ret, "0x%08"PFMT64x" : ", val); for (i = 0; i < 32; i++) { if (!(val & (1 << i))) { continue; } q = sdb_fmt ("enum.%s.0x%x", name, (1<<i)); res = sdb_const_get (TDB, q, 0); if (isFirst) { isFirst = false; } else { ret = r_str_append (ret, " | "); } if (res) { ret = r_str_append (ret, res); } else { ret = r_str_appendf (ret, "0x%x", (1<<i)); } } return ret; }
R_API RList* r_type_get_enum (Sdb *TDB, const char *name) { char *p, var[130]; int n; if (r_type_kind (TDB, name) != R_TYPE_ENUM) { return NULL; } RList *res = r_list_new (); snprintf (var, sizeof (var), "enum.%s", name); for (n = 0; (p = sdb_array_get (TDB, var, n, NULL)); n++) { RTypeEnum *member = R_NEW0 (RTypeEnum); if (member) { char *var2 = r_str_newf ("%s.%s", var, p); if (var2) { char *val = sdb_array_get (TDB, var2, 0, NULL); if (val) { member->name = p; member->val = val; r_list_append (res, member); } else { free (member); free (var2); } } else { free (member); } } } return res; }
R_API char *r_type_enum_member(Sdb *TDB, const char *name, const char *member, ut64 val) { const char *q; if (r_type_kind (TDB, name) != R_TYPE_ENUM) { return NULL; } if (member) { q = sdb_fmt ("enum.%s.%s", name, member); } else { q = sdb_fmt ("enum.%s.0x%x", name, val); } return sdb_get (TDB, q, 0); }