diff options
author | the lemons <citrons@mondecitronne.com> | 2023-02-06 13:59:02 -0600 |
---|---|---|
committer | the lemons <citrons@mondecitronne.com> | 2023-02-06 13:59:02 -0600 |
commit | 855e3c832cb83c68c8e97eb7f73adf92b645efbe (patch) | |
tree | bb76da7c0a0cf322e44227196b693246304e0192 | |
parent | 5b53f34340bff793106af3c475e5bb3315589e53 (diff) |
jump to mappings
-rw-r--r-- | core.c | 54 |
1 files changed, 52 insertions, 2 deletions
@@ -22,6 +22,7 @@ static int mouse_y = 0; SDL_Window *window = NULL; SDL_Renderer *renderer = NULL; +pid_t pid; int mem_fd; struct viewer *viewer; @@ -35,6 +36,12 @@ static void add_scale(double amount) { pos_y -= mouse_y / scale; } +static uintptr_t current_addr() { + return to_addr( + pos_x + screen_width / 2 * scale, + pos_y + screen_width / 2 * scale); +} + static void goto_addr(uintptr_t addr) { int x, y; to_pos(addr, &x, &y); @@ -43,6 +50,40 @@ static void goto_addr(uintptr_t addr) { pos_y -= (double) screen_height / 2 * scale; } +static size_t closest_map(struct procfs_map *maps, size_t n, uintptr_t addr) { + uintptr_t min = -1; + size_t closest; + for (size_t i = 0; i < n; i++) { + uintptr_t base = maps[i].base; + uintptr_t diff = base > addr ? base - addr : addr - base; + if (diff < min) { + min = diff; closest = i; + } + } + return closest; +} + +static void next_map() { + struct procfs_map *maps; + int n = procfs_maps(pid, &maps); + if (n < 1) return; + size_t m = closest_map(maps, n, current_addr()); + goto_addr(maps[(m + 1) % n].base); + free(maps); +} + +static void prev_map() { + struct procfs_map *maps; + int n = procfs_maps(pid, &maps); + if (n < 1) return; + size_t m = closest_map(maps, n, current_addr()); + if (m != 0) + goto_addr(maps[m - 1].base); + else + goto_addr(maps[n - 1].base); + free(maps); +} + static void report_error() { fprintf(stderr, "SDL Error: %s\n", SDL_GetError()); exit(-1); @@ -101,6 +142,15 @@ static void handle_events() { add_scale((double) e.wheel.y / 2); refresh = true; break; + case SDL_KEYDOWN: + switch (e.key.keysym.sym) { + case SDLK_RIGHT: + next_map(); + break; + case SDLK_LEFT: + prev_map(); + break; + } default: break; } @@ -120,7 +170,7 @@ int main(int argc, char *argv[]) { fprintf(stderr, "todo: show usage\n"); return -1; } - int pid = atoi(argv[1]); + pid = atoi(argv[1]); if (pid == 0) { fprintf(stderr, "todo: show usage\n"); return -1; @@ -135,7 +185,7 @@ int main(int argc, char *argv[]) { if (!viewer) abort(); atexit(cleanup); - goto_addr(0x7fea87727000); + next_map(); int last_time = 0; int current_time = 0; |