From 6a698772b2a3bfd3f8e05e8aa90fd763ae67daa6 Mon Sep 17 00:00:00 2001
From: Jari Vetoniemi <mailroxas@gmail.com>
Date: Mon, 22 Oct 2018 22:36:32 +0300
Subject: memview: handle errorneus offsets

---
 src/memview.c | 37 ++++++++++++++++++++++++++++++++-----
 1 file changed, 32 insertions(+), 5 deletions(-)

(limited to 'src')

diff --git a/src/memview.c b/src/memview.c
index 0f07cba..27e23f0 100644
--- a/src/memview.c
+++ b/src/memview.c
@@ -163,14 +163,20 @@ bytes_fits_screen(void)
    return bytes_fits_row() * (ctx.term.ws.h - 3); // 3 for top and bottom bars
 }
 
+static void
+screen_vprintf(const char *fmt, va_list ap)
+{
+   ctx.screen.pointer += vsnprintf(ctx.screen.buffer + ctx.screen.pointer, ctx.screen.size - ctx.screen.pointer, fmt, ap);
+   ctx.screen.pointer = (ctx.screen.pointer > ctx.screen.size ? ctx.screen.size : ctx.screen.pointer);
+}
+
 static void
 __attribute__((format(printf, 1, 2)))
 screen_printf(const char *fmt, ...)
 {
    va_list ap;
    va_start(ap, fmt);
-   ctx.screen.pointer += vsnprintf(ctx.screen.buffer + ctx.screen.pointer, ctx.screen.size - ctx.screen.pointer, fmt, ap);
-   ctx.screen.pointer = (ctx.screen.pointer > ctx.screen.size ? ctx.screen.size : ctx.screen.pointer);
+   screen_vprintf(fmt, ap);
    va_end(ap);
 }
 
@@ -473,6 +479,19 @@ navigate(int arg)
    }
 }
 
+static void
+__attribute__((format(printf, 1, 2)))
+error(const char *fmt, ...)
+{
+   screen_cursor(0, ctx.term.ws.h);
+   screen_print(ESCA CLEAR_LINE);
+   screen_print(FMT(FG RED) "error: " FMT(PLAIN));
+   va_list ap; va_start(ap, fmt); screen_vprintf(fmt, ap); va_end(ap);
+   screen_flush();
+   for (char input; input != 0x04 && input != 0x1b && input != '\n';)
+      fread(&input, 1, 1, TERM_STREAM);
+}
+
 static const char*
 input(const char *prompt)
 {
@@ -511,12 +530,20 @@ goto_offset(int arg)
    if (!(v = input("offset:")))
       return;
 
+   char *invalid;
+   const size_t ret = hexdecstrtoull(v, &invalid);
+
+   if (*invalid != 0) {
+      error("invalid offset `%s`", v);
+      return;
+   }
+
    if (v[0] == '+') {
-      ctx.hexview.offset += hexdecstrtoull(v, NULL);
+      ctx.hexview.offset += ret;
    } else if (v[0] == '-') {
-      ctx.hexview.offset -= hexdecstrtoull(v, NULL);
+      ctx.hexview.offset -= ret;
    } else {
-      ctx.hexview.offset = hexdecstrtoull(v, NULL);
+      ctx.hexview.offset = ret;
    }
 }
 
-- 
cgit v1.2.3-70-g09d2