xref: /netbsd-src/sys/external/bsd/acpica/dist/utilities/uthex.c (revision 046a29855e04359424fd074e8313af6b6be8cfb6)
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