summaryrefslogtreecommitdiff
path: root/util/nvmutil
diff options
context:
space:
mode:
authorLeah Rowe <leah@libreboot.org>2026-03-06 17:03:50 +0000
committerLeah Rowe <leah@libreboot.org>2026-03-06 17:07:12 +0000
commit596643a0d5cfd4c5ed236a04dd0e95aacd910d78 (patch)
tree0b8b0ee8b641e88879f263dc0a1e97243b6c1962 /util/nvmutil
parent6023d17b6e37d0b95680c55aea85c48973e0cace (diff)
util/nvmutil: optimise hextonum
there is 0x20 of different between a and A so we can just or 0x20 and compare only lowercase. we can also cast char (which may me signed on some systems) to unsigned, and then only check whether it's lower than 10. this code results in far less branching (in C), but a good optimising compiler probably wouldn't have cared about the old version anyway. it's just nicer C code. this also means we no longer need to check for X, only x. Signed-off-by: Leah Rowe <leah@libreboot.org>
Diffstat (limited to 'util/nvmutil')
-rw-r--r--util/nvmutil/nvmutil.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/util/nvmutil/nvmutil.c b/util/nvmutil/nvmutil.c
index fa43c886..3c8eeed4 100644
--- a/util/nvmutil/nvmutil.c
+++ b/util/nvmutil/nvmutil.c
@@ -422,16 +422,17 @@ set_mac_nib(int mac_pos, int nib)
static uint8_t
hextonum(char ch)
{
- if (ch >= '0' && ch <= '9')
+ if ((unsigned)(ch - '0') <= 9)
return ch - '0';
- else if (ch >= 'A' && ch <= 'F')
- return ch - 'A' + 10;
- else if (ch >= 'a' && ch <= 'f')
+
+ ch |= 0x20;
+
+ if ((unsigned)(ch - 'a') <= 5)
return ch - 'a' + 10;
- else if (ch == '?' || ch == 'x' || ch == 'X')
- return rhex(); /* random hex value */
+ else if (ch == '?' || ch == 'x')
+ return rhex(); /* random character */
else
- return 16; /* error: invalid character */
+ return 16; /* invalid character */
}
static uint8_t