From 2138ca700ce7995e4a5a62eb8a2f7f2fdd726a77 Mon Sep 17 00:00:00 2001 From: pancake Date: Tue, 31 May 2016 14:11:09 +0200 Subject: [PATCH] Fix #5019 - registers are now accessible by index --- libr/include/r_reg.h | 4 ++++ libr/reg/profile.c | 1 + libr/reg/reg.c | 44 +++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/libr/include/r_reg.h b/libr/include/r_reg.h index 68f9d29d62..86556a76f1 100644 --- a/libr/include/r_reg.h +++ b/libr/include/r_reg.h @@ -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); diff --git a/libr/reg/profile.c b/libr/reg/profile.c index fa3c5a7364..752d9b8910 100644 --- a/libr/reg/profile.c +++ b/libr/reg/profile.c @@ -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; } diff --git a/libr/reg/reg.c b/libr/reg/reg.c index 49d5639f24..9095cf9a17 100644 --- a/libr/reg/reg.c +++ b/libr/reg/reg.c @@ -1,4 +1,4 @@ -/* radare - LGPL - Copyright 2009-2015 - pancake */ +/* radare - LGPL - Copyright 2009-2016 - pancake */ #include #include @@ -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;