mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-06 05:28:26 +00:00
Fix #5019 - registers are now accessible by index
This commit is contained in:
parent
cdd4f70814
commit
2138ca700c
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user