r_list_foreach (bpargs, iter, var) { char *tmpf = NULL; if (var->delta < 10) { tmpf = "%d(%s)"; } else if (var->delta > 0) { tmpf = "0x%x(%s)"; } else { tmpf = "-0x%x(%s)"; } oldstr = r_str_newf (tmpf, r_num_abs (var->delta), anal->reg->name[R_REG_NAME_BP]); if (ucase) { char *comma = strchr (oldstr, ','); if (comma) { *comma = 0; r_str_case (oldstr, true); *comma = ','; } } if (strstr (tstr, oldstr)) { char *newstr = (p->localvar_only) ? r_str_newf ("(%s)", var->name): r_str_newf ("%s%s(%s)", var->delta > 0 ? "" : "-", var->name, anal->reg->name[R_REG_NAME_SP]); tstr = r_str_replace (tstr, oldstr, newstr, 1); free (newstr); free (oldstr); break; } free (oldstr); }
/* moves bytes up (+) or down (-) within the specified range */ R_API int r_io_shift(RIO *io, ut64 start, ut64 end, st64 move) { ut8 *buf; ut64 chunksize = 0x10000; ut64 rest, src, shiftsize = r_num_abs (move); if (!shiftsize || (end-start) <= shiftsize) return R_FALSE; rest = (end-start) - shiftsize; if (!(buf = malloc (chunksize))) return R_FALSE; if (move>0) src = end-shiftsize; else src = start+shiftsize; while (rest>0) { if (chunksize>rest) chunksize=rest; if (move>0) src -= chunksize; r_io_read_at (io, src, buf, chunksize); r_io_write_at (io, src+move, buf, chunksize); if (move<0) src += chunksize; rest -= chunksize; } free (buf); return R_TRUE; }
static bool varsub(RParse *p, RAnalFunction *f, ut64 addr, int oplen, char *data, char *str, int len) { RAnalVar *var; RListIter *iter; char *oldstr; char *tstr = strdup (data); RAnal *anal = p->analb.anal; if (!p->varlist) { free (tstr); return false; } RList *bpargs = p->varlist (anal, f, 'b'); RList *spargs = p->varlist (anal, f, 's'); const bool ucase = IS_UPPER (*tstr); r_list_foreach (spargs, iter, var) { char *tmpf; //TODO: honor asm pseudo if (var->delta < 10) { tmpf = "%d(%s)"; } else if (var->delta > 0) { tmpf = "0x%x(%s)"; } else { tmpf = "-0x%x(%s)"; } oldstr = r_str_newf (tmpf, r_num_abs(var->delta), anal->reg->name[R_REG_NAME_SP]); if (ucase) { char *comma = strchr (oldstr, ','); if (comma) { *comma = 0; r_str_case (oldstr, true); *comma = ','; } } if (strstr (tstr, oldstr)) { char *newstr = (p->localvar_only) ? r_str_newf ("(%s)", var->name): r_str_newf ("%s%s(%s)", var->delta > 0 ? "" : "-", var->name, anal->reg->name[R_REG_NAME_SP]); tstr = r_str_replace (tstr, oldstr, newstr, 1); free (newstr); free (oldstr); break; } free (oldstr); }