From 6a698772b2a3bfd3f8e05e8aa90fd763ae67daa6 Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi 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(-) 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