diff --git a/libr/anal/cond.c b/libr/anal/cond.c index c87c93c679..45b0d4ba26 100644 --- a/libr/anal/cond.c +++ b/libr/anal/cond.c @@ -23,10 +23,40 @@ static inline const char *condstring(RAnalCond *cond) { condstr_single [cond->type%sizeof (condstr_single)]; } -R_API int r_anal_cond_eval(RAnalCond *cond) { - ut64 arg0 = 0; - ut64 arg1 = 0; - // TODO: collect register values and return true if matching +R_API int r_anal_cond_eval(RAnal *anal, RAnalCond *cond) { + ut64 arg0 = r_anal_value_to_ut64 (anal, cond->arg[0]); + if (cond->arg[1]) { + ut64 arg1 = r_anal_value_to_ut64 (anal, cond->arg[1]); + switch (cond->type) { + case R_ANAL_COND_EQ: + return arg0 == arg1; + case R_ANAL_COND_NE: + return arg0 != arg1; + case R_ANAL_COND_GE: + return arg0 >= arg1; + case R_ANAL_COND_GT: + return arg0 > arg1; + case R_ANAL_COND_LE: + return arg0 <= arg1; + case R_ANAL_COND_LT: + return arg0 < arg1; + } + } else { + switch (cond->type) { + case R_ANAL_COND_EQ: + return !arg0; + case R_ANAL_COND_NE: + return arg0; + case R_ANAL_COND_GT: + return arg0>0; + case R_ANAL_COND_GE: + return arg0>=0; + case R_ANAL_COND_LT: + return arg0<0; + case R_ANAL_COND_LE: + return arg0<=0; + } + } return R_FALSE; } diff --git a/libr/anal/value.c b/libr/anal/value.c index 1489f10f9a..861e7e66b1 100644 --- a/libr/anal/value.c +++ b/libr/anal/value.c @@ -19,11 +19,25 @@ R_API void r_anal_value_free(RAnalValue *value) { free (value); } -R_API st64 r_anal_value_eval(RAnalValue *value) { - /* OMFG TODO.. this is done by r_num_shit */ - // r_num_math (anal->num, ...); -#warning TODO r_anal_value_eval - return 0LL; +R_API ut64 r_anal_value_to_ut64(RAnal *anal, RAnalValue *val) { + ut64 num; + if (val==NULL) + return 0LL; + num = val->base + (val->delta*(val->mul?val->mul:1)); + if (val->reg) + num += r_reg_get_value (anal->reg, val->reg); + if (val->regdelta) + num += r_reg_get_value (anal->reg, val->regdelta); + switch (val->memref) { + case 1: + case 2: + case 4: + case 8: + //anal->bio ... + eprintf ("TODO: memref for to_ut64 not supported\n"); + break; + } + return num; } R_API char *r_anal_value_to_string (RAnalValue *value) { diff --git a/libr/core/anal.c b/libr/core/anal.c index 2ba32ad3a2..83597de8ec 100644 --- a/libr/core/anal.c +++ b/libr/core/anal.c @@ -1,4 +1,6 @@ -/* radare - LGPL - Copyright 2009-2010 nibble<.ds@gmail.com> */ +/* radare - LGPL - Copyright 2009-2010 */ +/* pancake */ +/* nibble<.ds@gmail.com> */ #include #include @@ -216,8 +218,11 @@ R_API int r_core_anal_bb_list(RCore *core, int rad) { r_cons_printf ("unmatch"); else r_cons_printf ("new"); - r_cons_printf (" cond=\"%s\"\n", bbi->cond? - r_anal_cond_to_string (bbi->cond):"none"); + if (bbi->cond) + r_cons_printf (" cond=\"%s\" match=%d\n", + r_anal_cond_to_string (bbi->cond), + r_anal_cond_eval (core->anal, bbi->cond)); + else r_cons_newline(); } } r_cons_flush (); diff --git a/libr/include/r_anal.h b/libr/include/r_anal.h index f52f646a5d..86934ad518 100644 --- a/libr/include/r_anal.h +++ b/libr/include/r_anal.h @@ -328,14 +328,14 @@ R_API RAnalValue *r_anal_value_new(); R_API RAnalValue *r_anal_value_new_from_string(const char *str); R_API st64 r_anal_value_eval(RAnalValue *value); R_API char *r_anal_value_to_string (RAnalValue *value); +R_API ut64 r_anal_value_to_ut64(RAnal *anal, RAnalValue *val); R_API void r_anal_value_free(RAnalValue *value); R_API RAnalCond *r_anal_cond_new(); R_API RAnalCond *r_anal_cond_new_from_aop(RAnalOp *op); #define r_anal_cond_free(x) free(x); -R_API int r_anal_cond_eval(RAnalCond *cond); R_API char *r_anal_cond_to_string(RAnalCond *cond); -R_API char *r_anal_value_to_string (RAnalValue *value); +R_API int r_anal_cond_eval (RAnal *anal, RAnalCond *cond); R_API RAnalCond *r_anal_cond_new_from_string(const char *str); /* reflines.c */