diff options
Diffstat (limited to 'core.c')
-rw-r--r-- | core.c | 36 |
1 files changed, 15 insertions, 21 deletions
@@ -50,25 +50,18 @@ 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 size_t current_map = 0; 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); + for (int i = 0; i < n; i++) { + current_map = (current_map + 1) % n; + if (maps[current_map].prot & PROT_READ) + break; + } + goto_addr(maps[current_map].base); free(maps); } @@ -76,11 +69,12 @@ 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); + for (int i = 0; i < n; i++) { + current_map = current_map > 1 ? current_map - 1 : n - 1; + if (maps[current_map].prot & PROT_READ) + break; + } + goto_addr(maps[current_map].base); free(maps); } @@ -184,12 +178,12 @@ int main(int argc, char *argv[]) { char title[1024]; snprintf(title, 1024, "%s [%d]", argv[0], pid); - init_sdl(argv[0]); + init_sdl(title); viewer = create_viewer(mem_fd, renderer); if (!viewer) abort(); atexit(cleanup); - next_map(); + prev_map(); int last_time = 0; int current_time = 0; |