mirror of
https://github.com/radareorg/radare2.git
synced 2024-12-02 10:16:21 +00:00
* Apply @earada's patch fixing undo/redo seek
This commit is contained in:
parent
7c3339bbbe
commit
2646161b77
@ -1045,7 +1045,7 @@ static int cmd_seek(void *data, const char *input) {
|
||||
if (input[1] && input[2]) {
|
||||
if (core->io->debug) {
|
||||
off = r_debug_reg_get (core->dbg, input+2);
|
||||
r_io_sundo_push (core->io);
|
||||
r_io_sundo_push (core->io, core->offset);
|
||||
r_core_seek (core, off, 1);
|
||||
}// else eprintf ("cfg.debug is false\n");
|
||||
} else eprintf ("Usage: 'sr pc' ; seek to register\n");
|
||||
@ -1088,7 +1088,7 @@ static int cmd_seek(void *data, const char *input) {
|
||||
break;
|
||||
case 1:
|
||||
r_cons_printf ("0x%08"PFMT64x" %s\n", item->from, item->str);
|
||||
r_io_sundo_push (core->io);
|
||||
r_io_sundo_push (core->io, core->offset);
|
||||
r_core_seek (core, off, 1);
|
||||
r_core_block_read (core, 0);
|
||||
break;
|
||||
@ -1097,7 +1097,7 @@ static int cmd_seek(void *data, const char *input) {
|
||||
} else eprintf ("Usage: sC comment grep\n");
|
||||
break;
|
||||
case ' ':
|
||||
r_io_sundo_push (core->io);
|
||||
r_io_sundo_push (core->io, core->offset);
|
||||
r_core_seek (core, off, 1);
|
||||
r_core_block_read (core, 0);
|
||||
break;
|
||||
@ -1117,7 +1117,7 @@ static int cmd_seek(void *data, const char *input) {
|
||||
case '+':
|
||||
if (input[1]!='\0') {
|
||||
delta = (input[1]=='+')? core->blocksize: off;
|
||||
r_io_sundo_push (core->io);
|
||||
r_io_sundo_push (core->io, core->offset);
|
||||
r_core_seek_delta (core, delta);
|
||||
} else if (r_io_sundo_redo (core->io))
|
||||
r_core_seek (core, core->io->off, 0);
|
||||
@ -1125,20 +1125,21 @@ static int cmd_seek(void *data, const char *input) {
|
||||
case '-':
|
||||
if (input[1]!='\0') {
|
||||
if (input[1]=='-') delta = -core->blocksize; else delta = -off;
|
||||
r_io_sundo_push (core->io);
|
||||
r_io_sundo_push (core->io, core->offset);
|
||||
r_core_seek_delta (core, delta);
|
||||
} else {
|
||||
if (r_io_sundo (core->io)) {
|
||||
r_core_seek (core, core->io->off, 0);
|
||||
off = r_io_sundo (core->io);
|
||||
if (off != UT64_MAX) {
|
||||
r_core_seek (core, off, 0);
|
||||
} else eprintf ("Cannot undo\n");
|
||||
}
|
||||
break;
|
||||
case 'f':
|
||||
r_io_sundo_push (core->io);
|
||||
r_io_sundo_push (core->io, core->offset);
|
||||
r_core_seek_next (core, r_config_get (core->config, "scr.fkey"));
|
||||
break;
|
||||
case 'F':
|
||||
r_io_sundo_push (core->io);
|
||||
r_io_sundo_push (core->io, core->offset);
|
||||
r_core_seek_previous (core, r_config_get (core->config, "scr.fkey"));
|
||||
break;
|
||||
case 'a':
|
||||
@ -1155,11 +1156,11 @@ static int cmd_seek(void *data, const char *input) {
|
||||
r_cmd_call (core->cmd, cmd);
|
||||
free (cmd);
|
||||
}
|
||||
r_io_sundo_push (core->io);
|
||||
r_io_sundo_push (core->io, core->offset);
|
||||
r_core_seek_align (core, off, 0);
|
||||
break;
|
||||
case 'b':
|
||||
r_io_sundo_push (core->io);
|
||||
r_io_sundo_push (core->io, core->offset);
|
||||
r_core_anal_bb_seek (core, off);
|
||||
break;
|
||||
case 'n':
|
||||
|
@ -129,8 +129,8 @@ R_API int r_core_visual_cmd(RCore *core, int ch) {
|
||||
|
||||
// do we need hotkeys for data references? not only calls?
|
||||
if (ch>='0'&&ch<='9') {
|
||||
r_io_sundo_push (core->io, core->offset);
|
||||
r_core_seek (core, core->asmqjmps[ch-'0'], 1);
|
||||
r_io_sundo_push (core->io);
|
||||
} else
|
||||
switch (ch) {
|
||||
case 'c':
|
||||
@ -249,7 +249,7 @@ R_API int r_core_visual_cmd(RCore *core, int ch) {
|
||||
r_core_seek (core, offset, 1);
|
||||
} else
|
||||
r_core_cmd (core, "s 0", 0);
|
||||
r_io_sundo_push (core->io);
|
||||
r_io_sundo_push (core->io, core->offset);
|
||||
break;
|
||||
case 'G':
|
||||
{
|
||||
@ -268,7 +268,7 @@ R_API int r_core_visual_cmd(RCore *core, int ch) {
|
||||
}
|
||||
} else ret = r_core_seek (core, core->file->size-core->blocksize, 1);
|
||||
if (ret != -1)
|
||||
r_io_sundo_push (core->io);
|
||||
r_io_sundo_push (core->io, core->offset);
|
||||
}
|
||||
break;
|
||||
case 'h':
|
||||
@ -497,12 +497,12 @@ R_API int r_core_visual_cmd(RCore *core, int ch) {
|
||||
break;
|
||||
case '>':
|
||||
r_core_seek_align (core, core->blocksize, 1);
|
||||
r_io_sundo_push (core->io);
|
||||
r_io_sundo_push (core->io, core->offset);
|
||||
break;
|
||||
case '<':
|
||||
r_core_seek_align (core, core->blocksize, -1);
|
||||
r_core_seek_align (core, core->blocksize, -1);
|
||||
r_io_sundo_push (core->io);
|
||||
r_io_sundo_push (core->io, core->offset);
|
||||
break;
|
||||
case '.':
|
||||
r_core_cmd (core, "sr pc", 0); // XXX
|
||||
@ -553,8 +553,12 @@ R_API int r_core_visual_cmd(RCore *core, int ch) {
|
||||
r_cons_clear ();
|
||||
break;
|
||||
case 'u':
|
||||
if (r_io_sundo (core->io))
|
||||
r_core_seek (core, core->io->off, 1);
|
||||
{
|
||||
ut64 off = r_io_sundo (core->io);
|
||||
if (off != UT64_MAX)
|
||||
r_core_seek (core, off, 1);
|
||||
else eprintf ("Cannot undo\n");
|
||||
}
|
||||
break;
|
||||
case 'U':
|
||||
if (r_io_sundo_redo (core->io))
|
||||
|
@ -279,10 +279,10 @@ R_API ut64 r_io_section_next(RIO *io, ut64 o);
|
||||
R_API int r_io_undo_init(RIO *io);
|
||||
R_API void r_io_undo_enable(RIO *io, int seek, int write);
|
||||
/* seek undo */
|
||||
R_API int r_io_sundo(RIO *io);
|
||||
R_API ut64 r_io_sundo(RIO *io);
|
||||
R_API ut64 r_io_sundo_last(RIO *io);
|
||||
R_API int r_io_sundo_redo(RIO *io);
|
||||
R_API void r_io_sundo_push(RIO *io);
|
||||
R_API void r_io_sundo_push(RIO *io, ut64 off);
|
||||
R_API void r_io_sundo_reset(RIO *io);
|
||||
R_API void r_io_sundo_list(RIO *io);
|
||||
/* write undo */
|
||||
|
@ -30,14 +30,18 @@ R_API ut64 r_io_sundo_last(RIO *io) {
|
||||
io->undo.seek[io->undo.idx-2] : io->off;
|
||||
}
|
||||
|
||||
R_API int r_io_sundo(RIO *io) {
|
||||
R_API ut64 r_io_sundo(RIO *io) {
|
||||
ut64 off;
|
||||
if (io->undo.idx == io->undo.limit)
|
||||
r_io_sundo_push (io);
|
||||
r_io_sundo_push (io, 0);
|
||||
io->undo.idx--;
|
||||
if (io->undo.idx<0)
|
||||
return io->undo.idx = 0;
|
||||
io->off = io->undo.seek[io->undo.idx-1];
|
||||
return R_TRUE;
|
||||
if (io->undo.idx<0) {
|
||||
io->undo.idx = 0;
|
||||
return UT64_MAX;
|
||||
}
|
||||
off = io->undo.seek[io->undo.idx-1];
|
||||
io->off = r_io_section_vaddr_to_offset (io, off);
|
||||
return off;
|
||||
}
|
||||
|
||||
R_API int r_io_sundo_redo(RIO *io) {
|
||||
@ -53,8 +57,7 @@ R_API int r_io_sundo_redo(RIO *io) {
|
||||
return R_FALSE;
|
||||
}
|
||||
|
||||
R_API void r_io_sundo_push(RIO *io) {
|
||||
ut64 off = io->off;
|
||||
R_API void r_io_sundo_push(RIO *io, ut64 off) {
|
||||
if (!io->undo.s_enable)
|
||||
return;
|
||||
//if (io->undo.seek[io->undo.idx-1] == off) return;
|
||||
|
Loading…
Reference in New Issue
Block a user