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 | |
36 | char acpi_ut_hex_to_ascii_char(u64 integer, u32 position) |
37 | { |
38 | u64 index; |
39 | |
40 | acpi_ut_short_shift_right(operand: integer, count: position, out_result: &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 | |
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(hex_char: two_ascii_chars[1]) | |
70 | (acpi_ut_ascii_char_to_hex(hex_char: 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 | |
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 | |