1460301d4Schristos /******************************************************************************
2460301d4Schristos *
3460301d4Schristos * Module Name: uthex -- Hex/ASCII support functions
4460301d4Schristos *
5460301d4Schristos *****************************************************************************/
6460301d4Schristos
7460301d4Schristos /*
8*046a2985Schristos * Copyright (C) 2000 - 2023, Intel Corp.
9460301d4Schristos * All rights reserved.
10460301d4Schristos *
11460301d4Schristos * Redistribution and use in source and binary forms, with or without
12460301d4Schristos * modification, are permitted provided that the following conditions
13460301d4Schristos * are met:
14460301d4Schristos * 1. Redistributions of source code must retain the above copyright
15460301d4Schristos * notice, this list of conditions, and the following disclaimer,
16460301d4Schristos * without modification.
17460301d4Schristos * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18460301d4Schristos * substantially similar to the "NO WARRANTY" disclaimer below
19460301d4Schristos * ("Disclaimer") and any redistribution must be conditioned upon
20460301d4Schristos * including a substantially similar Disclaimer requirement for further
21460301d4Schristos * binary redistribution.
22460301d4Schristos * 3. Neither the names of the above-listed copyright holders nor the names
23460301d4Schristos * of any contributors may be used to endorse or promote products derived
24460301d4Schristos * from this software without specific prior written permission.
25460301d4Schristos *
26460301d4Schristos * Alternatively, this software may be distributed under the terms of the
27460301d4Schristos * GNU General Public License ("GPL") version 2 as published by the Free
28460301d4Schristos * Software Foundation.
29460301d4Schristos *
30460301d4Schristos * NO WARRANTY
31460301d4Schristos * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32460301d4Schristos * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3346a330b4Schristos * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34460301d4Schristos * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35460301d4Schristos * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36460301d4Schristos * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37460301d4Schristos * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38460301d4Schristos * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39460301d4Schristos * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40460301d4Schristos * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41460301d4Schristos * POSSIBILITY OF SUCH DAMAGES.
42460301d4Schristos */
43460301d4Schristos
44460301d4Schristos #include "acpi.h"
45460301d4Schristos #include "accommon.h"
46460301d4Schristos
47460301d4Schristos #define _COMPONENT ACPI_COMPILER
48460301d4Schristos ACPI_MODULE_NAME ("uthex")
49460301d4Schristos
50460301d4Schristos
51460301d4Schristos /* Hex to ASCII conversion table */
52460301d4Schristos
5371e38f1dSchristos static const char AcpiGbl_HexToAscii[] =
54460301d4Schristos {
55460301d4Schristos '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
56460301d4Schristos };
57460301d4Schristos
58460301d4Schristos
59460301d4Schristos /*******************************************************************************
60460301d4Schristos *
61460301d4Schristos * FUNCTION: AcpiUtHexToAsciiChar
62460301d4Schristos *
63460301d4Schristos * PARAMETERS: Integer - Contains the hex digit
64460301d4Schristos * Position - bit position of the digit within the
65460301d4Schristos * integer (multiple of 4)
66460301d4Schristos *
67460301d4Schristos * RETURN: The converted Ascii character
68460301d4Schristos *
69460301d4Schristos * DESCRIPTION: Convert a hex digit to an Ascii character
70460301d4Schristos *
71460301d4Schristos ******************************************************************************/
72460301d4Schristos
73460301d4Schristos char
AcpiUtHexToAsciiChar(UINT64 Integer,UINT32 Position)74460301d4Schristos AcpiUtHexToAsciiChar (
75460301d4Schristos UINT64 Integer,
76460301d4Schristos UINT32 Position)
77460301d4Schristos {
7889b8eb6cSchristos UINT64 Index;
79460301d4Schristos
8089b8eb6cSchristos AcpiUtShortShiftRight (Integer, Position, &Index);
8189b8eb6cSchristos return (AcpiGbl_HexToAscii[Index & 0xF]);
82460301d4Schristos }
83460301d4Schristos
84460301d4Schristos
85460301d4Schristos /*******************************************************************************
86460301d4Schristos *
87d4ca3bd6Schristos * FUNCTION: AcpiUtAsciiToHexByte
88d4ca3bd6Schristos *
89d4ca3bd6Schristos * PARAMETERS: TwoAsciiChars - Pointer to two ASCII characters
90d4ca3bd6Schristos * ReturnByte - Where converted byte is returned
91d4ca3bd6Schristos *
92d4ca3bd6Schristos * RETURN: Status and converted hex byte
93d4ca3bd6Schristos *
94d4ca3bd6Schristos * DESCRIPTION: Perform ascii-to-hex translation, exactly two ASCII characters
95d4ca3bd6Schristos * to a single converted byte value.
96d4ca3bd6Schristos *
97d4ca3bd6Schristos ******************************************************************************/
98d4ca3bd6Schristos
99d4ca3bd6Schristos ACPI_STATUS
AcpiUtAsciiToHexByte(char * TwoAsciiChars,UINT8 * ReturnByte)100d4ca3bd6Schristos AcpiUtAsciiToHexByte (
101d4ca3bd6Schristos char *TwoAsciiChars,
102d4ca3bd6Schristos UINT8 *ReturnByte)
103d4ca3bd6Schristos {
104d4ca3bd6Schristos
105d4ca3bd6Schristos /* Both ASCII characters must be valid hex digits */
106d4ca3bd6Schristos
107d4ca3bd6Schristos if (!isxdigit ((int) TwoAsciiChars[0]) ||
108d4ca3bd6Schristos !isxdigit ((int) TwoAsciiChars[1]))
109d4ca3bd6Schristos {
110d4ca3bd6Schristos return (AE_BAD_HEX_CONSTANT);
111d4ca3bd6Schristos }
112d4ca3bd6Schristos
113d4ca3bd6Schristos *ReturnByte =
114d4ca3bd6Schristos AcpiUtAsciiCharToHex (TwoAsciiChars[1]) |
115d4ca3bd6Schristos (AcpiUtAsciiCharToHex (TwoAsciiChars[0]) << 4);
116d4ca3bd6Schristos
117d4ca3bd6Schristos return (AE_OK);
118d4ca3bd6Schristos }
119d4ca3bd6Schristos
120d4ca3bd6Schristos
121d4ca3bd6Schristos /*******************************************************************************
122d4ca3bd6Schristos *
123c72da027Schristos * FUNCTION: AcpiUtAsciiCharToHex
124460301d4Schristos *
125d4ca3bd6Schristos * PARAMETERS: HexChar - Hex character in Ascii. Must be:
126d4ca3bd6Schristos * 0-9 or A-F or a-f
127460301d4Schristos *
128460301d4Schristos * RETURN: The binary value of the ascii/hex character
129460301d4Schristos *
130460301d4Schristos * DESCRIPTION: Perform ascii-to-hex translation
131460301d4Schristos *
132460301d4Schristos ******************************************************************************/
133460301d4Schristos
134460301d4Schristos UINT8
AcpiUtAsciiCharToHex(int HexChar)135460301d4Schristos AcpiUtAsciiCharToHex (
136460301d4Schristos int HexChar)
137460301d4Schristos {
138460301d4Schristos
139d4ca3bd6Schristos /* Values 0-9 */
140d4ca3bd6Schristos
141d4ca3bd6Schristos if (HexChar <= '9')
142460301d4Schristos {
143d4ca3bd6Schristos return ((UINT8) (HexChar - '0'));
144460301d4Schristos }
145460301d4Schristos
146d4ca3bd6Schristos /* Upper case A-F */
147d4ca3bd6Schristos
148d4ca3bd6Schristos if (HexChar <= 'F')
149460301d4Schristos {
150460301d4Schristos return ((UINT8) (HexChar - 0x37));
151460301d4Schristos }
152460301d4Schristos
153d4ca3bd6Schristos /* Lower case a-f */
154d4ca3bd6Schristos
155460301d4Schristos return ((UINT8) (HexChar - 0x57));
156460301d4Schristos }
157