Fix #5019 - registers are now accessible by index

This commit is contained in:
pancake 2016-05-31 14:11:09 +02:00
parent cdd4f70814
commit 2138ca700c
3 changed files with 48 additions and 1 deletions

View File

@ -97,6 +97,7 @@ typedef struct r_reg_t {
char *reg_profile_str;
char *name[R_REG_NAME_LAST];
RRegSet regset[R_REG_TYPE_LAST];
RList *allregs;
int iters;
int arch;
int bits;
@ -133,6 +134,9 @@ R_API RList *r_reg_get_list(RReg *reg, int type);
R_API RRegItem *r_reg_get_at(RReg *reg, int type, int regsize, int delta);
R_API RRegItem *r_reg_next_diff(RReg *reg, int type, const ut8 *buf, int buflen, RRegItem *prev_ri, int regsize);
R_API void r_reg_reindex(RReg *reg);
R_API RRegItem *r_reg_index_get(RReg *reg, int idx);
/* Item */
R_API void r_reg_item_free(RRegItem *item);

View File

@ -182,6 +182,7 @@ R_API int r_reg_set_profile_string(RReg *reg, const char *str) {
// dup the last arena to allow regdiffing
r_reg_arena_push (reg);
r_reg_reindex (reg);
// reset arenas
return true;
}

View File

@ -1,4 +1,4 @@
/* radare - LGPL - Copyright 2009-2015 - pancake */
/* radare - LGPL - Copyright 2009-2016 - pancake */
#include <r_reg.h>
#include <r_util.h>
@ -116,6 +116,48 @@ R_API void r_reg_free_internal(RReg *reg, bool init) {
reg->size = 0;
}
static int regcmp(RRegItem *a, RRegItem *b) {
int offa = (a->offset * 16) + a->size;
int offb = (b->offset * 16) + b->size;
return offa > offb;
}
R_API void r_reg_reindex(RReg *reg) {
int i, index;
RListIter *iter;
RRegItem *r;
RList *all = r_list_newf (NULL);
for (i = 0; i < R_REG_TYPE_LAST; i++) {
r_list_foreach (reg->regset[i].regs, iter, r) {
r_list_append (all, r);
}
}
r_list_sort (all, (RListComparator)regcmp);
index = 0;
r_list_foreach (all, iter, r) {
r->index = index++;
}
r_list_free (reg->allregs);
reg->allregs = all;
}
R_API RRegItem *r_reg_index_get(RReg *reg, int idx) {
RRegItem *r;
RListIter *iter;
if (idx < 0) {
return NULL;
}
if (!reg->allregs) {
r_reg_reindex (reg);
}
r_list_foreach (reg->allregs, iter, r) {
if (r->index == idx) {
return r;
}
}
return NULL;
}
R_API void r_reg_free(RReg *reg) {
int i;