summaryrefslogtreecommitdiff
path: root/core.c
diff options
context:
space:
mode:
Diffstat (limited to 'core.c')
-rw-r--r--core.c36
1 files changed, 15 insertions, 21 deletions
diff --git a/core.c b/core.c
index 97953b0..b72f104 100644
--- a/core.c
+++ b/core.c
@@ -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;