diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/memview.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/memview.c b/src/memview.c index 07c50b1..422789b 100644 --- a/src/memview.c +++ b/src/memview.c @@ -152,6 +152,13 @@ static struct { struct { unsigned int x; unsigned int y; } cur; } term; + // kind of hack, lets make real action history someday + // but for now, I want u to work at least for offsets + struct { + size_t data[32]; + unsigned char pointer; + } undo; + struct { char data[255]; unsigned char pointer; @@ -202,6 +209,17 @@ hex_for_byte(unsigned char byte) return hex[byte]; } +static void +store_offset(const size_t offset) +{ + if (ctx.undo.pointer > 0 && offset == ctx.undo.data[0]) + return; + + memmove(ctx.undo.data + 1, ctx.undo.data, ctx.undo.pointer * sizeof(ctx.undo.data[0])); + ctx.undo.data[0] = ctx.last_hexview.offset; + ctx.undo.pointer += (ctx.undo.pointer < ARRAY_SIZE(ctx.undo.data)); +} + static bool offset_is_in_named_region(const size_t offset, const struct named_region *named) { @@ -739,6 +757,8 @@ goto_offset(void *arg) return; } + store_offset(ctx.hexview.offset); + if (v[0] == '+') { ctx.hexview.offset += ret; } else if (v[0] == '-') { @@ -752,6 +772,7 @@ static void follow(void *arg) { (void)arg; + store_offset(ctx.hexview.offset); const union selection v = get_selection(); switch (ctx.native_bits) { case 64: ctx.hexview.offset = v.u64; break; @@ -762,6 +783,17 @@ follow(void *arg) } static void +undo(void *arg) +{ + (void)arg; + if (!ctx.undo.pointer) + return; + + ctx.hexview.offset = ctx.undo.data[0]; + memmove(ctx.undo.data, ctx.undo.data + 1, --ctx.undo.pointer * sizeof(ctx.undo.data[0])); +} + +static void write_bytes(void *arg) { (void)arg; @@ -923,6 +955,7 @@ main(int argc, char *argv[]) { .seq = { 'q', 0 }, .fun = q_quit }, { .seq = { 'o', 0 }, .fun = goto_offset }, { .seq = { 'f', 0 }, .fun = follow }, + { .seq = { 'u', 0 }, .fun = undo }, { .seq = { 'w', 0 }, .fun = write_bytes }, }; |