From 2c5471e05fccf3e76e0a7fec31abcebb78c2d632 Mon Sep 17 00:00:00 2001 From: silverweed Date: Thu, 25 Jul 2024 17:58:32 +0200 Subject: [PATCH] parse hexadecimals as int args --- src/argparse.cpp | 37 +++++++++++++++++++++++++++++-------- src/render.cpp | 2 +- src/str.h | 1 + 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/argparse.cpp b/src/argparse.cpp index cf87df0..ff224c5 100644 --- a/src/argparse.cpp +++ b/src/argparse.cpp @@ -33,14 +33,35 @@ internal Conv_Res str_to_u64(String8 s) { Conv_Res res {}; - for (u64 i = 0; i < s.size; ++i) { - u8 c = s.str[i]; - if (c >= '0' && c <= '9') { - res.num *= 10; - res.num += c - '0'; - } else { - res.error = true; - break; + if (s.size > 2 && s[0] == '0' && s[1] == 'x') { + // hexadecimal + for (u64 i = 2; i < s.size; ++i) { + u8 c = s.str[i]; + if (c >= '0' && c <= '9') { + res.num *= 16; + res.num += c - '0'; + } else if (c >= 'A' && c <= 'F') { + res.num *= 16; + res.num += 10 + c - 'A'; + } else if (c >= 'a' && c <= 'f') { + res.num *= 16; + res.num += 10 + c - 'a'; + } else { + res.error = true; + break; + } + } + } else { + // decimal + for (u64 i = 0; i < s.size; ++i) { + u8 c = s.str[i]; + if (c >= '0' && c <= '9') { + res.num *= 10; + res.num += c - '0'; + } else { + res.error = true; + break; + } } } return res; diff --git a/src/render.cpp b/src/render.cpp index 92283fd..0b9c63b 100644 --- a/src/render.cpp +++ b/src/render.cpp @@ -553,7 +553,7 @@ String8 render_range_to_string(Arena *arena, App_State &app, u64 len, u64 n_cols u64 off = start + i; /// Select color - u32 byte_col = mem_edit_bg_color_fn(data, off, &app); + u32 byte_col = mem_edit_bg_color_fn(data + start, i, &app); // piggyback off mem_edit_bg_color_fn instead of rewriting the color-choosing logic. // Kinda dumb code but we don't need speed here since we're printing this one-off. Ansi_Color acol = viewer_to_ansi_color(app.viewer, viewer, byte_col); diff --git a/src/str.h b/src/str.h index 1ddb483..32b2fb3 100644 --- a/src/str.h +++ b/src/str.h @@ -3,6 +3,7 @@ struct String8 { u64 size; const char *c() const { return reinterpret_cast(str); } + u8 operator[](u64 idx) const { return str[idx]; } }; #define str8(s) String8 { (u8*)(s), sizeof(s) - 1 }