1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2 /******************************************************************************
3  *
4  * Module Name: uthex -- Hex/ASCII support functions
5  *
6  * Copyright (C) 2000 - 2023, Intel Corp.
7  *
8  *****************************************************************************/
9 
10 #include <acpi/acpi.h>
11 #include "accommon.h"
12 
13 #define _COMPONENT          ACPI_COMPILER
14 ACPI_MODULE_NAME("uthex")
15 
16 /* Hex to ASCII conversion table */
17 static const char acpi_gbl_hex_to_ascii[] = {
18 	'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
19 	    'E', 'F'
20 };
21 
22 /*******************************************************************************
23  *
24  * FUNCTION:    acpi_ut_hex_to_ascii_char
25  *
26  * PARAMETERS:  integer             - Contains the hex digit
27  *              position            - bit position of the digit within the
28  *                                    integer (multiple of 4)
29  *
30  * RETURN:      The converted Ascii character
31  *
32  * DESCRIPTION: Convert a hex digit to an Ascii character
33  *
34  ******************************************************************************/
35 
acpi_ut_hex_to_ascii_char(u64 integer,u32 position)36 char acpi_ut_hex_to_ascii_char(u64 integer, u32 position)
37 {
38 	u64 index;
39 
40 	acpi_ut_short_shift_right(integer, position, &index);
41 	return (acpi_gbl_hex_to_ascii[index & 0xF]);
42 }
43 
44 /*******************************************************************************
45  *
46  * FUNCTION:    acpi_ut_ascii_to_hex_byte
47  *
48  * PARAMETERS:  two_ascii_chars             - Pointer to two ASCII characters
49  *              return_byte                 - Where converted byte is returned
50  *
51  * RETURN:      Status and converted hex byte
52  *
53  * DESCRIPTION: Perform ascii-to-hex translation, exactly two ASCII characters
54  *              to a single converted byte value.
55  *
56  ******************************************************************************/
57 
acpi_ut_ascii_to_hex_byte(char * two_ascii_chars,u8 * return_byte)58 acpi_status acpi_ut_ascii_to_hex_byte(char *two_ascii_chars, u8 *return_byte)
59 {
60 
61 	/* Both ASCII characters must be valid hex digits */
62 
63 	if (!isxdigit((int)two_ascii_chars[0]) ||
64 	    !isxdigit((int)two_ascii_chars[1])) {
65 		return (AE_BAD_HEX_CONSTANT);
66 	}
67 
68 	*return_byte =
69 	    acpi_ut_ascii_char_to_hex(two_ascii_chars[1]) |
70 	    (acpi_ut_ascii_char_to_hex(two_ascii_chars[0]) << 4);
71 
72 	return (AE_OK);
73 }
74 
75 /*******************************************************************************
76  *
77  * FUNCTION:    acpi_ut_ascii_char_to_hex
78  *
79  * PARAMETERS:  hex_char                - Hex character in Ascii. Must be:
80  *                                        0-9 or A-F or a-f
81  *
82  * RETURN:      The binary value of the ascii/hex character
83  *
84  * DESCRIPTION: Perform ascii-to-hex translation
85  *
86  ******************************************************************************/
87 
acpi_ut_ascii_char_to_hex(int hex_char)88 u8 acpi_ut_ascii_char_to_hex(int hex_char)
89 {
90 
91 	/* Values 0-9 */
92 
93 	if (hex_char <= '9') {
94 		return ((u8)(hex_char - '0'));
95 	}
96 
97 	/* Upper case A-F */
98 
99 	if (hex_char <= 'F') {
100 		return ((u8)(hex_char - 0x37));
101 	}
102 
103 	/* Lower case a-f */
104 
105 	return ((u8)(hex_char - 0x57));
106 }
107