summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorthe lemons <citrons@mondecitronne.com>2023-02-06 13:59:02 -0600
committerthe lemons <citrons@mondecitronne.com>2023-02-06 13:59:02 -0600
commit855e3c832cb83c68c8e97eb7f73adf92b645efbe (patch)
treebb76da7c0a0cf322e44227196b693246304e0192
parent5b53f34340bff793106af3c475e5bb3315589e53 (diff)
jump to mappings
-rw-r--r--core.c54
1 files changed, 52 insertions, 2 deletions
diff --git a/core.c b/core.c
index 96ba866..97e0288 100644
--- a/core.c
+++ b/core.c
@@ -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;