diff options
| author | Leah Rowe <leah@libreboot.org> | 2026-03-06 17:03:50 +0000 |
|---|---|---|
| committer | Leah Rowe <leah@libreboot.org> | 2026-03-06 17:07:12 +0000 |
| commit | 596643a0d5cfd4c5ed236a04dd0e95aacd910d78 (patch) | |
| tree | 0b8b0ee8b641e88879f263dc0a1e97243b6c1962 /util/nvmutil/nvmutil.c | |
| parent | 6023d17b6e37d0b95680c55aea85c48973e0cace (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/nvmutil.c')
| -rw-r--r-- | util/nvmutil/nvmutil.c | 15 |
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 |
