xref: /freebsd/sys/compat/linuxkpi/common/include/linux/hex.h (revision 98297ff3cfbb42df86fa7af51a2740d5aa7236eb)
1*98297ff3SBjoern A. Zeeb /*
2*98297ff3SBjoern A. Zeeb  * Copyright (c) 2022-2026 Bjoern A. Zeeb
3*98297ff3SBjoern A. Zeeb  *
4*98297ff3SBjoern A. Zeeb  * SPDX-License-Identifier: BSD-2-Clause
5*98297ff3SBjoern A. Zeeb  */
6*98297ff3SBjoern A. Zeeb 
7*98297ff3SBjoern A. Zeeb #ifndef	_LINUXKPI_LINUX_HEX_H_
8*98297ff3SBjoern A. Zeeb #define	_LINUXKPI_LINUX_HEX_H_
9*98297ff3SBjoern A. Zeeb 
10*98297ff3SBjoern A. Zeeb #include <linux/types.h>
11*98297ff3SBjoern A. Zeeb #include <linux/errno.h>
12*98297ff3SBjoern A. Zeeb 
13*98297ff3SBjoern A. Zeeb static inline int
_h2b(const char c)14*98297ff3SBjoern A. Zeeb _h2b(const char c)
15*98297ff3SBjoern A. Zeeb {
16*98297ff3SBjoern A. Zeeb 
17*98297ff3SBjoern A. Zeeb 	if (c >= '0' && c <= '9')
18*98297ff3SBjoern A. Zeeb 		return (c - '0');
19*98297ff3SBjoern A. Zeeb 	if (c >= 'a' && c <= 'f')
20*98297ff3SBjoern A. Zeeb 		return (10 + c - 'a');
21*98297ff3SBjoern A. Zeeb 	if (c >= 'A' && c <= 'F')
22*98297ff3SBjoern A. Zeeb 		return (10 + c - 'A');
23*98297ff3SBjoern A. Zeeb 	return (-EINVAL);
24*98297ff3SBjoern A. Zeeb }
25*98297ff3SBjoern A. Zeeb 
26*98297ff3SBjoern A. Zeeb static inline int
hex2bin(uint8_t * bindst,const char * hexsrc,size_t binlen)27*98297ff3SBjoern A. Zeeb hex2bin(uint8_t *bindst, const char *hexsrc, size_t binlen)
28*98297ff3SBjoern A. Zeeb {
29*98297ff3SBjoern A. Zeeb 	int hi4, lo4;
30*98297ff3SBjoern A. Zeeb 
31*98297ff3SBjoern A. Zeeb 	while (binlen > 0) {
32*98297ff3SBjoern A. Zeeb 		hi4 = _h2b(*hexsrc++);
33*98297ff3SBjoern A. Zeeb 		lo4 = _h2b(*hexsrc++);
34*98297ff3SBjoern A. Zeeb 		if (hi4 < 0 || lo4 < 0)
35*98297ff3SBjoern A. Zeeb 			return (-EINVAL);
36*98297ff3SBjoern A. Zeeb 
37*98297ff3SBjoern A. Zeeb 		*bindst++ = (hi4 << 4) | lo4;
38*98297ff3SBjoern A. Zeeb 		binlen--;
39*98297ff3SBjoern A. Zeeb 	}
40*98297ff3SBjoern A. Zeeb 
41*98297ff3SBjoern A. Zeeb 	return (0);
42*98297ff3SBjoern A. Zeeb }
43*98297ff3SBjoern A. Zeeb 
44*98297ff3SBjoern A. Zeeb #endif	/* _LINUXKPI_LINUX_HEX_H_ */
45