* Initial implementation of cmd 'Cv' for renaming vars

* Add r_parse_varsub() to r_parse
* Add config variable 'asm.varsub'
* Minor fixup in core/anal.c
This commit is contained in:
Nibble 2011-02-23 15:17:06 +01:00
parent e84907fb98
commit 8546c2d61b
8 changed files with 75 additions and 7 deletions

View File

@ -320,7 +320,7 @@ R_API int r_core_anal_fcn_list(RCore *core, const char *input, int rad) {
RListIter *iter, *iter2;
r_list_foreach (core->anal->fcns, iter, fcni)
if ((input == NULL || input[0] == '\0' && fcni->type!=R_ANAL_FCN_TYPE_LOC) ||
if (((input == NULL || input[0] == '\0') && fcni->type!=R_ANAL_FCN_TYPE_LOC) ||
!strcmp (fcni->name, input+1)) {
if (!rad) {
r_cons_printf ("[0x%08"PFMT64x"] size=%"PFMT64d" name=%s",

View File

@ -90,7 +90,7 @@ static void r_print_disasm(RPrint *p, RCore *core, ut64 addr, ut8 *buf, int len,
int ret, idx, i, j, k, lines, ostackptr, stackptr = 0;
int counter = 0;
int middle = 0;
char str[128];
char str[128], strsub[128];
char *line = NULL, *comment, *opstr, *osl = NULL; // old source line
RAsmAop asmop;
RAnalOp analop;
@ -107,6 +107,7 @@ static void r_print_disasm(RPrint *p, RCore *core, ut64 addr, ut8 *buf, int len,
int decode = r_config_get_i (core->config, "asm.decode");
int pseudo = r_config_get_i (core->config, "asm.pseudo");
int filter = r_config_get_i (core->config, "asm.filter");
int varsub = r_config_get_i (core->config, "asm.varsub");
int show_lines = r_config_get_i (core->config, "asm.lines");
int show_dwarf = r_config_get_i (core->config, "asm.dwarf");
int show_linescall = r_config_get_i (core->config, "asm.linescall");
@ -391,6 +392,13 @@ r_cons_printf ("%s ", pre);
r_parse_filter (core->parser, core->flags, asmop.buf_asm, str, sizeof (str));
opstr = str;
} else opstr = asmop.buf_asm;
if (varsub) {
RAnalFcn *f = r_anal_fcn_find (core->anal, at, R_ANAL_FCN_TYPE_NULL);
if (f) {
r_parse_varsub (core->parser, f, opstr, strsub, sizeof (strsub));
opstr = strsub;
}
}
r_cons_strcat (opstr);
if (decode)
free (opstr);
@ -3485,6 +3493,34 @@ static int cmd_meta(void *data, const char *input) {
}
}
break;
case 'v':
{
RAnalFcn *f;
char *ptr = strdup(input+2), *varname, *varsub;
ut64 offset = -1LL;
int n = r_str_word_set0 (ptr), i;
if (n > 2) {
switch(n) {
case 3:
varsub = r_str_word_get0 (ptr, 2);
case 2:
varname = r_str_word_get0 (ptr, 1);
case 1:
offset = r_num_math (core->num, r_str_word_get0 (ptr, 0));
}
if ((f = r_anal_fcn_find (core->anal, offset, R_ANAL_FCN_TYPE_NULL)) != NULL) {
for (i = 0; i < R_ANAL_MAX_VARSUB; i++)
if (f->varnames[i][0] == '\0') {
strncpy (f->varnames[i], varname, 1024);
strncpy (f->varsubs[i], varsub, 1024);
break;
}
} else eprintf ("Error: Function not found\n");
}
free (ptr);
}
break;
case '-':
if (input[1]!='*') {
if (input[1]==' ')
@ -3500,6 +3536,7 @@ static int cmd_meta(void *data, const char *input) {
" C-[@][ addr] # delete metadata at given address\n"
" CL[-] [addr] # show 'code line' information (bininfo)\n"
" CC [string] # add comment\n"
" Cv[-] offset reg name # add var substitution\n"
" Cs[-] [size] [[addr]] # add string\n"
" CS[-] [size] # ...\n"
" Cd[-] [fmt] [..] # hexdump data\n"

View File

@ -334,6 +334,7 @@ R_API int r_core_config_init(RCore *core) {
r_config_set_i (cfg, "asm.nbytes", 8);
r_config_set (cfg, "asm.pseudo", "false"); // DEPRECATED ???
r_config_set (cfg, "asm.filter", "true");
r_config_set (cfg, "asm.varsub", "true");
r_config_set (cfg, "asm.trace", "true");
r_config_set (cfg, "asm.decode", "false");
r_config_set (cfg, "asm.bytes", "true");

View File

@ -244,6 +244,8 @@ enum {
R_ANAL_FCN_TYPE_IMP = 8
};
#define R_ANAL_MAX_VARSUB 32
typedef struct r_anal_fcn_t {
char *name;
ut64 addr;
@ -253,6 +255,8 @@ typedef struct r_anal_fcn_t {
int stack;
int ninstr;
int nargs;
char varnames[R_ANAL_MAX_VARSUB][1024];
char varsubs[R_ANAL_MAX_VARSUB][1024];
ut8 *fingerprint;
RAnalDiff *diff;
RList *bbs;

View File

@ -5,6 +5,7 @@
#include <r_types.h>
#include <r_flags.h>
#include <r_anal.h>
#include <list.h>
// XXX : remove this define???
@ -24,6 +25,7 @@ typedef struct r_parse_plugin_t {
int (*parse)(struct r_parse_t *p, void *data, char *str);
int (*assemble)(struct r_parse_t *p, char *data, char *str);
int (*filter)(RParse *p, struct r_flag_t *f, char *data, char *str, int len);
int (*varsub)(RParse *p, struct r_anal_fcn_t *f, char *data, char *str, int len);
struct list_head list;
} RParsePlugin;
@ -37,6 +39,7 @@ R_API int r_parse_use(RParse *p, const char *name);
R_API int r_parse_parse(RParse *p, void *data, char *str);
R_API int r_parse_assemble(RParse *p, char *data, char *str);
R_API int r_parse_filter(RParse *p, RFlag *f, char *data, char *str, int len);
R_API int r_parse_varsub(RParse *p, RAnalFcn *f, char *data, char *str, int len);
/* plugin pointers */
extern struct r_parse_plugin_t r_parse_plugin_dummy;

View File

@ -1,5 +1,5 @@
NAME=r_parse
DEPS=r_lib r_flags r_util
DEPS=r_lib r_flags r_util r_anal
-include ../config.mk
foo: pre libr_parse.${EXT_SO} libr_parse.${EXT_AR} plugins bins

View File

@ -7,6 +7,7 @@
#include <r_lib.h>
#include <r_util.h>
#include <r_flags.h>
#include <r_anal.h>
#include <r_parse.h>
static int replace(int argc, const char *argv[], char *newstr) {
@ -157,10 +158,25 @@ static int filter(struct r_parse_t *p, struct r_flag_t *f, char *data, char *str
}
ptr = ptr2;
}
strcpy (str, data);
strncpy (str, data, len);
return R_FALSE;
}
static int varsub(struct r_parse_t *p, struct r_anal_fcn_t *f, char *data, char *str, int len) {
char *ptr, *ptr2;
int i;
strncpy (str, data, len);
for (i = 0; i < R_ANAL_MAX_VARSUB; i++)
if (f->varnames[i][0] != '\0' && f->varsubs[i][0] != '\0' &&
(ptr = strstr (data, f->varnames[i]))) {
*ptr = '\0';
ptr2 = ptr + strlen (f->varnames[i]);
snprintf (str, len, "%s%s%s", data, f->varsubs[i], ptr2);
}
return R_TRUE;
}
struct r_parse_plugin_t r_parse_plugin_x86_pseudo = {
.name = "x86.pseudo",
.desc = "X86 pseudo syntax",
@ -169,6 +185,7 @@ struct r_parse_plugin_t r_parse_plugin_x86_pseudo = {
.parse = &parse,
.assemble = &assemble,
.filter = &filter,
.varsub = &varsub,
};
struct r_lib_struct_t radare_plugin = {

View File

@ -90,14 +90,20 @@ R_API int r_parse_assemble(struct r_parse_t *p, char *data, char *str) {
return ret;
}
R_API int r_parse_parse(struct r_parse_t *p, void *data, char *str) {
if (p->cur && p->cur->parse)
return p->cur->parse(p, data, str);
return R_FALSE;
}
R_API int r_parse_filter(struct r_parse_t *p, struct r_flag_t *f, char *data, char *str, int len) {
if (p->cur && p->cur->filter)
return p->cur->filter(p, f, data, str, len);
return R_FALSE;
}
R_API int r_parse_parse(struct r_parse_t *p, void *data, char *str) {
if (p->cur && p->cur->parse)
return p->cur->parse(p, data, str);
R_API int r_parse_varsub(struct r_parse_t *p, struct r_anal_fcn_t *f, char *data, char *str, int len) {
if (p->cur && p->cur->varsub)
return p->cur->varsub(p, f, data, str, len);
return R_FALSE;
}