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. Zeebhex2bin(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