mirror of
https://github.com/radareorg/radare2.git
synced 2024-10-07 10:33:30 +00:00
Handle fcn in r_parse, unify filter() and add locdiff utility
This commit is contained in:
parent
95fd9628f8
commit
8c5a6d68ff
@ -254,7 +254,8 @@ R_API RAnalFunction *r_anal_fcn_find(RAnal *anal, ut64 addr, int type) {
|
|||||||
#if USE_NEW_FCN_STORE
|
#if USE_NEW_FCN_STORE
|
||||||
// TODO: type is ignored here? wtf.. we need more work on fcnstore
|
// TODO: type is ignored here? wtf.. we need more work on fcnstore
|
||||||
//if (root) return r_listrange_find_root (anal->fcnstore, addr);
|
//if (root) return r_listrange_find_root (anal->fcnstore, addr);
|
||||||
return r_listrange_find_in_range (anal->fcnstore, addr);
|
RAnalFunction *f = r_listrange_find_in_range (anal->fcnstore, addr);
|
||||||
|
return (f->addr == addr)? f: NULL;
|
||||||
#else
|
#else
|
||||||
RAnalFunction *fcn, *ret = NULL;
|
RAnalFunction *fcn, *ret = NULL;
|
||||||
RListIter *iter;
|
RListIter *iter;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
include ../config.mk
|
include ../config.mk
|
||||||
|
|
||||||
NAME=r_cons
|
NAME=r_cons
|
||||||
OBJS=cons.o pipe.o output.o grep.o input.o hud.o rgb.o
|
OBJS=cons.o pipe.o output.o grep.o
|
||||||
OBJS+=line.o
|
OBJS+=line.o hud.o rgb.o input.o
|
||||||
DEPS=r_util
|
DEPS=r_util
|
||||||
|
|
||||||
include ../rules.mk
|
include ../rules.mk
|
||||||
|
@ -513,6 +513,7 @@ R_API int r_core_init(RCore *core) {
|
|||||||
r_anal_set_user_ptr (core->anal, core);
|
r_anal_set_user_ptr (core->anal, core);
|
||||||
core->anal->meta->printf = (void *) r_cons_printf;
|
core->anal->meta->printf = (void *) r_cons_printf;
|
||||||
core->parser = r_parse_new ();
|
core->parser = r_parse_new ();
|
||||||
|
core->parser->anal = core->anal;
|
||||||
r_parse_set_user_ptr (core->parser, core);
|
r_parse_set_user_ptr (core->parser, core);
|
||||||
core->bin = r_bin_new ();
|
core->bin = r_bin_new ();
|
||||||
r_bin_set_user_ptr (core->bin, core);
|
r_bin_set_user_ptr (core->bin, core);
|
||||||
|
@ -660,8 +660,10 @@ toro:
|
|||||||
free (opstr);
|
free (opstr);
|
||||||
opstr = strdup (str);
|
opstr = strdup (str);
|
||||||
core->parser->flagspace = ofs; // ???
|
core->parser->flagspace = ofs; // ???
|
||||||
} else
|
} else {
|
||||||
if (!opstr) opstr = strdup (asmop.buf_asm);
|
if (!opstr)
|
||||||
|
opstr = strdup (asmop.buf_asm);
|
||||||
|
}
|
||||||
if (pseudo) {
|
if (pseudo) {
|
||||||
r_parse_parse (core->parser, opstr?
|
r_parse_parse (core->parser, opstr?
|
||||||
opstr:asmop.buf_asm, str);
|
opstr:asmop.buf_asm, str);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* radare - LGPL - Copyright 2009-2012 - pancake, nibble */
|
/* radare - LGPL - Copyright 2009-2013 - pancake, nibble */
|
||||||
|
|
||||||
#ifndef _INCLUDE_R_PARSE_H_
|
#ifndef _INCLUDE_R_PARSE_H_
|
||||||
#define _INCLUDE_R_PARSE_H_
|
#define _INCLUDE_R_PARSE_H_
|
||||||
@ -16,6 +16,7 @@ typedef struct r_parse_t {
|
|||||||
int flagspace;
|
int flagspace;
|
||||||
int notin_flagspace;
|
int notin_flagspace;
|
||||||
struct r_parse_plugin_t *cur;
|
struct r_parse_plugin_t *cur;
|
||||||
|
RAnal *anal; // weak anal ref
|
||||||
RList *parsers;
|
RList *parsers;
|
||||||
} RParse;
|
} RParse;
|
||||||
|
|
||||||
|
@ -170,32 +170,6 @@ static int assemble(RParse *p, char *data, char *str) {
|
|||||||
return R_TRUE;
|
return R_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int filter(RParse *p, RFlag *f, char *data, char *str, int len) {
|
|
||||||
RListIter *iter;
|
|
||||||
RFlagItem *flag;
|
|
||||||
char *ptr, *ptr2;
|
|
||||||
ut64 off;
|
|
||||||
ptr = data;
|
|
||||||
while ((ptr = strstr (ptr, "0x"))) {
|
|
||||||
for (ptr2 = ptr; *ptr2 && !isseparator (*ptr2); ptr2++);
|
|
||||||
off = r_num_math (NULL, ptr);
|
|
||||||
if (!off) {
|
|
||||||
ptr = ptr2;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
r_list_foreach (f->flags, iter, flag) {
|
|
||||||
if (flag->offset == off && strchr (flag->name, '.')) {
|
|
||||||
*ptr = 0;
|
|
||||||
snprintf (str, len, "%s%s%s", data, flag->name, ptr2!=ptr? ptr2: "");
|
|
||||||
return R_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ptr = ptr2;
|
|
||||||
}
|
|
||||||
strncpy (str, data, len);
|
|
||||||
return R_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int varsub(RParse *p, RAnalFunction *f, char *data, char *str, int len) {
|
static int varsub(RParse *p, RAnalFunction *f, char *data, char *str, int len) {
|
||||||
char *ptr, *ptr2;
|
char *ptr, *ptr2;
|
||||||
int i;
|
int i;
|
||||||
@ -218,7 +192,6 @@ struct r_parse_plugin_t r_parse_plugin_att2intel = {
|
|||||||
.fini = NULL,
|
.fini = NULL,
|
||||||
.parse = &parse,
|
.parse = &parse,
|
||||||
.assemble = &assemble,
|
.assemble = &assemble,
|
||||||
.filter = &filter,
|
|
||||||
.varsub = &varsub,
|
.varsub = &varsub,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* radare - LGPL - Copyright 2012 - pancake */
|
/* radare - LGPL - Copyright 2012-2013 - pancake */
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -274,32 +274,6 @@ static int assemble(RParse *p, char *data, char *str) {
|
|||||||
return R_TRUE;
|
return R_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int filter(RParse *p, RFlag *f, char *data, char *str, int len) {
|
|
||||||
RListIter *iter;
|
|
||||||
RFlagItem *flag;
|
|
||||||
char *ptr, *ptr2;
|
|
||||||
ut64 off;
|
|
||||||
ptr = data;
|
|
||||||
while ((ptr = strstr (ptr, "0x"))) {
|
|
||||||
for (ptr2 = ptr; *ptr2 && !isseparator (*ptr2); ptr2++);
|
|
||||||
off = r_num_math (NULL, ptr);
|
|
||||||
if (!off) {
|
|
||||||
ptr = ptr2;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
r_list_foreach (f->flags, iter, flag) {
|
|
||||||
if (flag->offset == off && strchr (flag->name, '.')) {
|
|
||||||
*ptr = 0;
|
|
||||||
snprintf (str, len, "%s%s%s", data, flag->name, ptr2!=ptr? ptr2: "");
|
|
||||||
return R_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ptr = ptr2;
|
|
||||||
}
|
|
||||||
strncpy (str, data, len);
|
|
||||||
return R_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int varsub(RParse *p, RAnalFunction *f, char *data, char *str, int len) {
|
static int varsub(RParse *p, RAnalFunction *f, char *data, char *str, int len) {
|
||||||
char *ptr, *ptr2;
|
char *ptr, *ptr2;
|
||||||
int i;
|
int i;
|
||||||
@ -322,7 +296,6 @@ struct r_parse_plugin_t r_parse_plugin_dalvik_pseudo = {
|
|||||||
.fini = NULL,
|
.fini = NULL,
|
||||||
.parse = parse,
|
.parse = parse,
|
||||||
.assemble = &assemble,
|
.assemble = &assemble,
|
||||||
.filter = &filter,
|
|
||||||
.varsub = &varsub,
|
.varsub = &varsub,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -205,32 +205,6 @@ static int assemble(RParse *p, char *data, char *str) {
|
|||||||
return R_TRUE;
|
return R_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int filter(RParse *p, RFlag *f, char *data, char *str, int len) {
|
|
||||||
RListIter *iter;
|
|
||||||
RFlagItem *flag;
|
|
||||||
char *ptr, *ptr2;
|
|
||||||
ut64 off;
|
|
||||||
ptr = data;
|
|
||||||
while ((ptr = strstr (ptr, "0x"))) {
|
|
||||||
for (ptr2 = ptr; *ptr2 && !isseparator (*ptr2); ptr2++);
|
|
||||||
off = r_num_math (NULL, ptr);
|
|
||||||
if (!off) {
|
|
||||||
ptr = ptr2;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
r_list_foreach (f->flags, iter, flag) {
|
|
||||||
if (flag->offset == off && strchr (flag->name, '.')) {
|
|
||||||
*ptr = 0;
|
|
||||||
snprintf (str, len, "%s%s%s", data, flag->name, ptr2!=ptr? ptr2: "");
|
|
||||||
return R_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ptr = ptr2;
|
|
||||||
}
|
|
||||||
strncpy (str, data, len);
|
|
||||||
return R_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int varsub(RParse *p, RAnalFunction *f, char *data, char *str, int len) {
|
static int varsub(RParse *p, RAnalFunction *f, char *data, char *str, int len) {
|
||||||
char *ptr, *ptr2;
|
char *ptr, *ptr2;
|
||||||
int i;
|
int i;
|
||||||
@ -253,7 +227,6 @@ struct r_parse_plugin_t r_parse_plugin_mips_pseudo = {
|
|||||||
.fini = NULL,
|
.fini = NULL,
|
||||||
.parse = parse,
|
.parse = parse,
|
||||||
.assemble = &assemble,
|
.assemble = &assemble,
|
||||||
.filter = &filter,
|
|
||||||
.varsub = &varsub,
|
.varsub = &varsub,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -156,48 +156,6 @@ static inline int issegoff (const char *w) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define isx86separator(x) ( \
|
|
||||||
(x)==' '||(x)=='\t'||(x)=='\n'|| (x)=='\r'||(x)==' '|| \
|
|
||||||
(x)==','||(x)==';'||(x)=='['||(x)==']'|| \
|
|
||||||
(x)=='('||(x)==')'||(x)=='{'||(x)=='}')
|
|
||||||
|
|
||||||
static int filter(RParse *p, RFlag *f, char *data, char *str, int len) {
|
|
||||||
char *ptr = data, *ptr2;
|
|
||||||
//RListIter *iter;
|
|
||||||
RFlagItem *flag;
|
|
||||||
ut64 off;
|
|
||||||
|
|
||||||
ptr2 = NULL;
|
|
||||||
while ((ptr = strstr (ptr, "0x"))) {
|
|
||||||
for (ptr2 = ptr; *ptr2 && !isx86separator (*ptr2); ptr2++);
|
|
||||||
off = r_num_math (NULL, ptr);
|
|
||||||
if (!off) {
|
|
||||||
ptr = ptr2;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
flag = r_flag_get_i (f, off);
|
|
||||||
if (flag && strchr (flag->name, '.')) {
|
|
||||||
// XXX. tooslow but correct
|
|
||||||
//r_list_foreach (f->flags, iter, flag) { if (flag->offset == off && strchr (flag->name, '.')) {
|
|
||||||
if (p->notin_flagspace != -1) {
|
|
||||||
if (p->flagspace == flag->space)
|
|
||||||
continue;
|
|
||||||
} else
|
|
||||||
if (p->flagspace != -1 && \
|
|
||||||
(p->flagspace != flag->space)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
*ptr = 0;
|
|
||||||
snprintf (str, len, "%s%s%s", data, flag->name,
|
|
||||||
ptr2!=ptr? ptr2: "");
|
|
||||||
return R_TRUE;
|
|
||||||
}
|
|
||||||
//}
|
|
||||||
ptr = ptr2;
|
|
||||||
}
|
|
||||||
strncpy (str, data, len);
|
|
||||||
return R_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int varsub(RParse *p, RAnalFunction *f, char *data, char *str, int len) {
|
static int varsub(RParse *p, RAnalFunction *f, char *data, char *str, int len) {
|
||||||
int i;
|
int i;
|
||||||
@ -222,7 +180,7 @@ struct r_parse_plugin_t r_parse_plugin_x86_pseudo = {
|
|||||||
.fini = NULL,
|
.fini = NULL,
|
||||||
.parse = parse,
|
.parse = parse,
|
||||||
.assemble = &assemble,
|
.assemble = &assemble,
|
||||||
.filter = &filter,
|
.filter = NULL,
|
||||||
.varsub = &varsub,
|
.varsub = &varsub,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -85,7 +85,63 @@ R_API int r_parse_parse(RParse *p, const char *data, char *str) {
|
|||||||
return R_FALSE;
|
return R_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define isx86separator(x) ( \
|
||||||
|
(x)==' '||(x)=='\t'||(x)=='\n'|| (x)=='\r'||(x)==' '|| \
|
||||||
|
(x)==','||(x)==';'||(x)=='['||(x)==']'|| \
|
||||||
|
(x)=='('||(x)==')'||(x)=='{'||(x)=='}')
|
||||||
|
|
||||||
|
static int filter(RParse *p, RFlag *f, char *data, char *str, int len) {
|
||||||
|
char *ptr = data, *ptr2;
|
||||||
|
RAnalFunction *fcn;
|
||||||
|
RFlagItem *flag;
|
||||||
|
ut64 off;
|
||||||
|
int x86 = (p&&p->cur&&p->cur->name)?
|
||||||
|
(strstr (p->cur->name, "x86")? 1: 0): 0;
|
||||||
|
|
||||||
|
ptr2 = NULL;
|
||||||
|
while ((ptr = strstr (ptr, "0x"))) {
|
||||||
|
if (x86) for (ptr2 = ptr; *ptr2 && !isx86separator (*ptr2); ptr2++);
|
||||||
|
else for (ptr2 = ptr; *ptr2 && !isseparator (*ptr2); ptr2++);
|
||||||
|
off = r_num_math (NULL, ptr);
|
||||||
|
if (!off) {
|
||||||
|
ptr = ptr2;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
fcn = r_anal_fcn_find (p->anal, off, 0);
|
||||||
|
if (fcn) {
|
||||||
|
if (fcn->addr == off) {
|
||||||
|
*ptr = 0;
|
||||||
|
snprintf (str, len, "%s%s%s", data, fcn->name,
|
||||||
|
(ptr!=ptr2)? ptr2: "");
|
||||||
|
return R_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (f) {
|
||||||
|
flag = r_flag_get_i (f, off);
|
||||||
|
if (flag && strchr (flag->name, '.')) {
|
||||||
|
if (p->notin_flagspace != -1) {
|
||||||
|
if (p->flagspace == flag->space)
|
||||||
|
continue;
|
||||||
|
} else
|
||||||
|
if (p->flagspace != -1 && \
|
||||||
|
(p->flagspace != flag->space)) {
|
||||||
|
ptr = ptr2;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
*ptr = 0;
|
||||||
|
snprintf (str, len, "%s%s%s", data, flag->name,
|
||||||
|
(ptr!=ptr2)? ptr2: "");
|
||||||
|
return R_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ptr = ptr2;
|
||||||
|
}
|
||||||
|
strncpy (str, data, len);
|
||||||
|
return R_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
R_API int r_parse_filter(RParse *p, RFlag *f, char *data, char *str, int len) {
|
R_API int r_parse_filter(RParse *p, RFlag *f, char *data, char *str, int len) {
|
||||||
|
filter (p, f, data, str, len);
|
||||||
if (p->cur && p->cur->filter)
|
if (p->cur && p->cur->filter)
|
||||||
return p->cur->filter (p, f, data, str, len);
|
return p->cur->filter (p, f, data, str, len);
|
||||||
return R_FALSE;
|
return R_FALSE;
|
||||||
@ -115,4 +171,3 @@ R_API int r_parse_list(RParse *p) {
|
|||||||
}
|
}
|
||||||
return R_FALSE;
|
return R_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
6
sys/locdiff
Executable file
6
sys/locdiff
Executable file
@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#A=`hg diff $@ | grep -v '+++' | grep ^+ |wc -l`
|
||||||
|
#B=`hg diff $@ | grep -v -- '---' | grep ^- |wc -l`
|
||||||
|
A=`git diff $@ | grep -v '+++' | grep ^+ |wc -l`
|
||||||
|
B=`git diff $@ | grep -v -- '---' | grep ^- |wc -l`
|
||||||
|
echo $((A-B))
|
Loading…
Reference in New Issue
Block a user