aboutsummaryrefslogtreecommitdiff
path: root/core/encoding/hex
diff options
context:
space:
mode:
Diffstat (limited to 'core/encoding/hex')
-rw-r--r--core/encoding/hex/hex.odin57
1 files changed, 28 insertions, 29 deletions
diff --git a/core/encoding/hex/hex.odin b/core/encoding/hex/hex.odin
index f66febbff..8d0102c02 100644
--- a/core/encoding/hex/hex.odin
+++ b/core/encoding/hex/hex.odin
@@ -4,12 +4,12 @@ import "core:strings"
encode :: proc(src: []byte, allocator := context.allocator) -> []byte #no_bounds_check {
dst := make([]byte, len(src) * 2, allocator)
- for i := 0; i < len(src); i += 1 {
+ for i := 0; i < len(src); i += 1 {
v := src[i]
- dst[i] = HEXTABLE[v>>4]
- dst[i+1] = HEXTABLE[v&0x0f]
- i += 2
- }
+ dst[i] = HEXTABLE[v>>4]
+ dst[i+1] = HEXTABLE[v&0x0f]
+ i += 2
+ }
return dst
}
@@ -36,39 +36,38 @@ decode :: proc(src: []byte, allocator := context.allocator) -> (dst: []byte, ok:
}
// Decodes the given sequence into one byte.
-// Should be called with one rune worth of the source, eg: 0x23 -> '#'.
-decode_sequence :: proc(str: string) -> (byte, bool) {
- no_prefix_str := strings.trim_prefix(str, "0x")
- val: byte
- for i := 0; i < len(no_prefix_str); i += 1 {
- index := (len(no_prefix_str) - 1) - i // reverse the loop.
-
- hd, ok := hex_digit(no_prefix_str[i])
- if !ok {
- return 0, false
- }
-
- val += u8(hd) << uint(4 * index)
+// Should be called with one byte worth of the source, eg: 0x23 -> '#'.
+decode_sequence :: proc(str: string) -> (res: byte, ok: bool) {
+ str := str
+ if strings.has_prefix(str, "0x") || strings.has_prefix(str, "0X") {
+ str = str[2:]
+ }
+
+ if len(str) != 2 {
+ return 0, false
}
- return val, true
+ upper := hex_digit(str[0]) or_return
+ lower := hex_digit(str[1]) or_return
+
+ return upper << 4 | lower, true
}
@(private)
HEXTABLE := [16]byte {
- '0', '1', '2', '3',
- '4', '5', '6', '7',
- '8', '9', 'a', 'b',
- 'c', 'd', 'e', 'f',
+ '0', '1', '2', '3',
+ '4', '5', '6', '7',
+ '8', '9', 'a', 'b',
+ 'c', 'd', 'e', 'f',
}
@(private)
hex_digit :: proc(char: byte) -> (u8, bool) {
- switch char {
- case '0' ..= '9': return char - '0', true
- case 'a' ..= 'f': return char - 'a' + 10, true
- case 'A' ..= 'F': return char - 'A' + 10, true
- case: return 0, false
- }
+ switch char {
+ case '0' ..= '9': return char - '0', true
+ case 'a' ..= 'f': return char - 'a' + 10, true
+ case 'A' ..= 'F': return char - 'A' + 10, true
+ case: return 0, false
+ }
}