Handle fcn in r_parse, unify filter() and add locdiff utility

This commit is contained in:
pancake 2013-05-22 01:49:18 +02:00
parent 95fd9628f8
commit 8c5a6d68ff
11 changed files with 75 additions and 132 deletions

View File

@ -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;

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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,
}; };

View File

@ -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,
}; };

View File

@ -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,
}; };

View File

@ -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,
}; };

View File

@ -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
View 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))