* Apply @earada's patch fixing undo/redo seek

This commit is contained in:
pancake 2011-12-04 21:09:16 +01:00
parent 7c3339bbbe
commit 2646161b77
4 changed files with 36 additions and 28 deletions

View File

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

View File

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

View File

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

View File

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