asluuid.c revision 245582
1107590Sobrien/******************************************************************************
2169689Skan *
3132718Skan * Module Name: asluuid-- compiler UUID support
4107590Sobrien *
5107590Sobrien *****************************************************************************/
6107590Sobrien
7132718Skan/*
8107590Sobrien * Copyright (C) 2000 - 2013, Intel Corp.
9132718Skan * All rights reserved.
10132718Skan *
11132718Skan * Redistribution and use in source and binary forms, with or without
12132718Skan * modification, are permitted provided that the following conditions
13107590Sobrien * are met:
14132718Skan * 1. Redistributions of source code must retain the above copyright
15132718Skan *    notice, this list of conditions, and the following disclaimer,
16132718Skan *    without modification.
17132718Skan * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18107590Sobrien *    substantially similar to the "NO WARRANTY" disclaimer below
19107590Sobrien *    ("Disclaimer") and any redistribution must be conditioned upon
20132718Skan *    including a substantially similar Disclaimer requirement for further
21169689Skan *    binary redistribution.
22169689Skan * 3. Neither the names of the above-listed copyright holders nor the names
23107590Sobrien *    of any contributors may be used to endorse or promote products derived
24107590Sobrien *    from this software without specific prior written permission.
25107590Sobrien *
26132718Skan * Alternatively, this software may be distributed under the terms of the
27132718Skan * GNU General Public License ("GPL") version 2 as published by the Free
28107590Sobrien * Software Foundation.
29107590Sobrien *
30107590Sobrien * NO WARRANTY
31107590Sobrien * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32107590Sobrien * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33107590Sobrien * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34107590Sobrien * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35107590Sobrien * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36107590Sobrien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37107590Sobrien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38107590Sobrien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39107590Sobrien * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40107590Sobrien * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41107590Sobrien * POSSIBILITY OF SUCH DAMAGES.
42107590Sobrien */
43107590Sobrien
44107590Sobrien
45107590Sobrien#include <contrib/dev/acpica/compiler/aslcompiler.h>
46107590Sobrien
47107590Sobrien#define _COMPONENT          ACPI_COMPILER
48107590Sobrien        ACPI_MODULE_NAME    ("asluuid")
49107590Sobrien
50107590Sobrien
51117395Skan/*
52117395Skan * UUID support functions.
53169689Skan *
54107590Sobrien * This table is used to convert an input UUID ascii string to a 16 byte
55107590Sobrien * buffer and the reverse. The table maps a UUID buffer index 0-15 to
56169689Skan * the index within the 36-byte UUID string where the associated 2-byte
57132718Skan * hex value can be found.
58169689Skan *
59169689Skan * 36-byte UUID strings are of the form:
60169689Skan *     aabbccdd-eeff-gghh-iijj-kkllmmnnoopp
61169689Skan * Where aa-pp are one byte hex numbers, made up of two hex digits
62169689Skan *
63169689Skan * Note: This table is basically the inverse of the string-to-offset table
64169689Skan * found in the ACPI spec in the description of the ToUUID macro.
65169689Skan */
66169689Skanstatic UINT8    Gbl_MapToUuidOffset[16] =
67169689Skan{
68169689Skan    6,4,2,0,11,9,16,14,19,21,24,26,28,30,32,34
69169689Skan};
70169689Skan
71169689Skan#define UUID_BUFFER_LENGTH          16
72169689Skan#define UUID_STRING_LENGTH          36
73169689Skan
74169689Skan/* Positions for required hyphens (dashes) in UUID strings */
75169689Skan
76169689Skan#define UUID_HYPHEN1_OFFSET         8
77169689Skan#define UUID_HYPHEN2_OFFSET         13
78169689Skan#define UUID_HYPHEN3_OFFSET         18
79169689Skan#define UUID_HYPHEN4_OFFSET         23
80169689Skan
81169689Skan
82169689Skan/*******************************************************************************
83169689Skan *
84169689Skan * FUNCTION:    AuValiduateUuid
85169689Skan *
86169689Skan * PARAMETERS:  InString            - 36-byte formatted UUID string
87169689Skan *
88169689Skan * RETURN:      Status
89169689Skan *
90169689Skan * DESCRIPTION: Check all 36 characters for correct format
91169689Skan *
92169689Skan ******************************************************************************/
93169689Skan
94169689SkanACPI_STATUS
95132718SkanAuValidateUuid (
96169689Skan    char                    *InString)
97132718Skan{
98169689Skan    UINT32                  i;
99169689Skan
100169689Skan
101169689Skan    if (!InString || (ACPI_STRLEN (InString) != UUID_STRING_LENGTH))
102169689Skan    {
103169689Skan        return (AE_BAD_PARAMETER);
104169689Skan    }
105169689Skan
106169689Skan    /* Check all 36 characters for correct format */
107169689Skan
108169689Skan    for (i = 0; i < UUID_STRING_LENGTH; i++)
109169689Skan    {
110169689Skan        /* Must have 4 hyphens (dashes) in these positions: */
111169689Skan
112169689Skan        if ((i == UUID_HYPHEN1_OFFSET) ||
113169689Skan            (i == UUID_HYPHEN2_OFFSET) ||
114169689Skan            (i == UUID_HYPHEN3_OFFSET) ||
115169689Skan            (i == UUID_HYPHEN4_OFFSET))
116169689Skan        {
117169689Skan            if (InString[i] != '-')
118169689Skan            {
119169689Skan                return (AE_BAD_PARAMETER);
120169689Skan            }
121169689Skan        }
122169689Skan
123169689Skan        /* All other positions must contain hex digits */
124169689Skan
125169689Skan        else
126169689Skan        {
127169689Skan            if (!isxdigit ((int) InString[i]))
128169689Skan            {
129169689Skan                return (AE_BAD_PARAMETER);
130169689Skan            }
131169689Skan        }
132107590Sobrien    }
133169689Skan
134169689Skan    return (AE_OK);
135169689Skan}
136169689Skan
137169689Skan
138169689Skan/*******************************************************************************
139169689Skan *
140169689Skan * FUNCTION:    AuConvertStringToUuid
141169689Skan *
142169689Skan * PARAMETERS:  InString            - 36-byte formatted UUID string
143169689Skan *              UuidBuffer          - 16-byte UUID buffer
144169689Skan *
145169689Skan * RETURN:      Status
146169689Skan *
147169689Skan * DESCRIPTION: Convert 36-byte formatted UUID string to 16-byte UUID buffer
148169689Skan *
149169689Skan ******************************************************************************/
150169689Skan
151169689SkanACPI_STATUS
152169689SkanAuConvertStringToUuid (
153169689Skan    char                    *InString,
154169689Skan    char                    *UuidBuffer)
155169689Skan{
156169689Skan    UINT32                  i;
157169689Skan
158169689Skan
159169689Skan    if (!InString || !UuidBuffer)
160169689Skan    {
161169689Skan        return (AE_BAD_PARAMETER);
162169689Skan    }
163169689Skan
164169689Skan    for (i = 0; i < UUID_BUFFER_LENGTH; i++)
165169689Skan    {
166169689Skan        UuidBuffer[i]  = (char) (UtHexCharToValue (InString[Gbl_MapToUuidOffset[i]]) << 4);
167107590Sobrien        UuidBuffer[i] |= (char)  UtHexCharToValue (InString[Gbl_MapToUuidOffset[i] + 1]);
168169689Skan    }
169169689Skan
170169689Skan    return (AE_OK);
171169689Skan}
172169689Skan
173169689Skan
174169689Skan/*******************************************************************************
175169689Skan *
176169689Skan * FUNCTION:    AuConvertUuidToString
177169689Skan *
178169689Skan * PARAMETERS:  UuidBuffer          - 16-byte UUID buffer
179169689Skan *              OutString           - 36-byte formatted UUID string
180169689Skan *
181169689Skan * RETURN:      Status
182169689Skan *
183169689Skan * DESCRIPTION: Convert 16-byte UUID buffer to 36-byte formatted UUID string
184169689Skan *              OutString must be 37 bytes to include null terminator.
185169689Skan *
186169689Skan ******************************************************************************/
187169689Skan
188169689SkanACPI_STATUS
189169689SkanAuConvertUuidToString (
190169689Skan    char                    *UuidBuffer,
191169689Skan    char                    *OutString)
192169689Skan{
193169689Skan    UINT32                  i;
194169689Skan
195169689Skan
196169689Skan    if (!UuidBuffer || !OutString)
197169689Skan    {
198169689Skan        return (AE_BAD_PARAMETER);
199169689Skan    }
200169689Skan
201169689Skan    for (i = 0; i < UUID_BUFFER_LENGTH; i++)
202107590Sobrien    {
203107590Sobrien        OutString[Gbl_MapToUuidOffset[i]] =     (UINT8) AslHexLookup[(UuidBuffer[i] >> 4) & 0xF];
204107590Sobrien        OutString[Gbl_MapToUuidOffset[i] + 1] = (UINT8) AslHexLookup[UuidBuffer[i] & 0xF];
205107590Sobrien    }
206107590Sobrien
207107590Sobrien    /* Insert required hyphens (dashes) */
208107590Sobrien
209169689Skan    OutString[UUID_HYPHEN1_OFFSET] =
210169689Skan    OutString[UUID_HYPHEN2_OFFSET] =
211169689Skan    OutString[UUID_HYPHEN3_OFFSET] =
212169689Skan    OutString[UUID_HYPHEN4_OFFSET] = '-';
213107590Sobrien
214107590Sobrien    OutString[UUID_STRING_LENGTH] = 0; /* Null terminate */
215107590Sobrien    return (AE_OK);
216107590Sobrien}
217107590Sobrien