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
14ACPI_MODULE_NAME("uthex")
15
16/* Hex to ASCII conversion table */
17static 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
36char 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
58acpi_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
88u8 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