xref: /aosp_15_r20/external/coreboot/src/lib/hexstrtobin.c (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <ctype.h>
4 #include <lib.h>
5 
hexstrtobin(const char * str,uint8_t * buf,size_t len)6 size_t hexstrtobin(const char *str, uint8_t *buf, size_t len)
7 {
8 	size_t count, ptr = 0;
9 	uint8_t byte;
10 
11 	for (byte = count = 0; str && *str; str++) {
12 		uint8_t c = *str;
13 
14 		if (!isxdigit(c))
15 			continue;
16 		if (isdigit(c))
17 			c -= '0';
18 		else
19 			c = tolower(c) - 'a' + 10;
20 
21 		byte <<= 4;
22 		byte |= c;
23 
24 		if (++count > 1) {
25 			if (ptr >= len)
26 				return ptr;
27 			buf[ptr++] = byte;
28 			byte = count = 0;
29 		}
30 	}
31 
32 	return ptr;
33 }
34