asluuid.c revision 256281
1/******************************************************************************
2 *
3 * Module Name: asluuid-- compiler UUID support
4 *
5 *****************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2013, Intel Corp.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions, and the following disclaimer,
16 *    without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 *    substantially similar to the "NO WARRANTY" disclaimer below
19 *    ("Disclaimer") and any redistribution must be conditioned upon
20 *    including a substantially similar Disclaimer requirement for further
21 *    binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 *    of any contributors may be used to endorse or promote products derived
24 *    from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44
45#include <contrib/dev/acpica/compiler/aslcompiler.h>
46
47#define _COMPONENT          ACPI_COMPILER
48        ACPI_MODULE_NAME    ("asluuid")
49
50
51/*
52 * UUID support functions.
53 *
54 * This table is used to convert an input UUID ascii string to a 16 byte
55 * buffer and the reverse. The table maps a UUID buffer index 0-15 to
56 * the index within the 36-byte UUID string where the associated 2-byte
57 * hex value can be found.
58 *
59 * 36-byte UUID strings are of the form:
60 *     aabbccdd-eeff-gghh-iijj-kkllmmnnoopp
61 * Where aa-pp are one byte hex numbers, made up of two hex digits
62 *
63 * Note: This table is basically the inverse of the string-to-offset table
64 * found in the ACPI spec in the description of the ToUUID macro.
65 */
66static UINT8    Gbl_MapToUuidOffset[16] =
67{
68    6,4,2,0,11,9,16,14,19,21,24,26,28,30,32,34
69};
70
71#define UUID_BUFFER_LENGTH          16
72#define UUID_STRING_LENGTH          36
73
74/* Positions for required hyphens (dashes) in UUID strings */
75
76#define UUID_HYPHEN1_OFFSET         8
77#define UUID_HYPHEN2_OFFSET         13
78#define UUID_HYPHEN3_OFFSET         18
79#define UUID_HYPHEN4_OFFSET         23
80
81
82/*******************************************************************************
83 *
84 * FUNCTION:    AuValiduateUuid
85 *
86 * PARAMETERS:  InString            - 36-byte formatted UUID string
87 *
88 * RETURN:      Status
89 *
90 * DESCRIPTION: Check all 36 characters for correct format
91 *
92 ******************************************************************************/
93
94ACPI_STATUS
95AuValidateUuid (
96    char                    *InString)
97{
98    UINT32                  i;
99
100
101    if (!InString || (ACPI_STRLEN (InString) != UUID_STRING_LENGTH))
102    {
103        return (AE_BAD_PARAMETER);
104    }
105
106    /* Check all 36 characters for correct format */
107
108    for (i = 0; i < UUID_STRING_LENGTH; i++)
109    {
110        /* Must have 4 hyphens (dashes) in these positions: */
111
112        if ((i == UUID_HYPHEN1_OFFSET) ||
113            (i == UUID_HYPHEN2_OFFSET) ||
114            (i == UUID_HYPHEN3_OFFSET) ||
115            (i == UUID_HYPHEN4_OFFSET))
116        {
117            if (InString[i] != '-')
118            {
119                return (AE_BAD_PARAMETER);
120            }
121        }
122
123        /* All other positions must contain hex digits */
124
125        else
126        {
127            if (!isxdigit ((int) InString[i]))
128            {
129                return (AE_BAD_PARAMETER);
130            }
131        }
132    }
133
134    return (AE_OK);
135}
136
137
138/*******************************************************************************
139 *
140 * FUNCTION:    AuConvertStringToUuid
141 *
142 * PARAMETERS:  InString            - 36-byte formatted UUID string
143 *              UuidBuffer          - 16-byte UUID buffer
144 *
145 * RETURN:      Status
146 *
147 * DESCRIPTION: Convert 36-byte formatted UUID string to 16-byte UUID buffer
148 *
149 ******************************************************************************/
150
151ACPI_STATUS
152AuConvertStringToUuid (
153    char                    *InString,
154    char                    *UuidBuffer)
155{
156    UINT32                  i;
157
158
159    if (!InString || !UuidBuffer)
160    {
161        return (AE_BAD_PARAMETER);
162    }
163
164    for (i = 0; i < UUID_BUFFER_LENGTH; i++)
165    {
166        UuidBuffer[i]  = (char) (UtHexCharToValue (InString[Gbl_MapToUuidOffset[i]]) << 4);
167        UuidBuffer[i] |= (char)  UtHexCharToValue (InString[Gbl_MapToUuidOffset[i] + 1]);
168    }
169
170    return (AE_OK);
171}
172
173
174/*******************************************************************************
175 *
176 * FUNCTION:    AuConvertUuidToString
177 *
178 * PARAMETERS:  UuidBuffer          - 16-byte UUID buffer
179 *              OutString           - 36-byte formatted UUID string
180 *
181 * RETURN:      Status
182 *
183 * DESCRIPTION: Convert 16-byte UUID buffer to 36-byte formatted UUID string
184 *              OutString must be 37 bytes to include null terminator.
185 *
186 ******************************************************************************/
187
188ACPI_STATUS
189AuConvertUuidToString (
190    char                    *UuidBuffer,
191    char                    *OutString)
192{
193    UINT32                  i;
194
195
196    if (!UuidBuffer || !OutString)
197    {
198        return (AE_BAD_PARAMETER);
199    }
200
201    for (i = 0; i < UUID_BUFFER_LENGTH; i++)
202    {
203        OutString[Gbl_MapToUuidOffset[i]] =     (UINT8) AslHexLookup[(UuidBuffer[i] >> 4) & 0xF];
204        OutString[Gbl_MapToUuidOffset[i] + 1] = (UINT8) AslHexLookup[UuidBuffer[i] & 0xF];
205    }
206
207    /* Insert required hyphens (dashes) */
208
209    OutString[UUID_HYPHEN1_OFFSET] =
210    OutString[UUID_HYPHEN2_OFFSET] =
211    OutString[UUID_HYPHEN3_OFFSET] =
212    OutString[UUID_HYPHEN4_OFFSET] = '-';
213
214    OutString[UUID_STRING_LENGTH] = 0; /* Null terminate */
215    return (AE_OK);
216}
217