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