void AcpiUtConvertStringToUuid ( const char *InString, UINT8 *UuidBuffer) { UINT32 i; for (i = 0; i < UUID_BUFFER_LENGTH; i++) { UuidBuffer[i] = (AcpiUtAsciiCharToHex (InString[AcpiGbl_MapToUuidOffset[i]]) << 4); UuidBuffer[i] |= AcpiUtAsciiCharToHex (InString[AcpiGbl_MapToUuidOffset[i] + 1]); } }
ACPI_STATUS AcpiUtAsciiToHexByte ( char *TwoAsciiChars, UINT8 *ReturnByte) { /* Both ASCII characters must be valid hex digits */ if (!isxdigit ((int) TwoAsciiChars[0]) || !isxdigit ((int) TwoAsciiChars[1])) { return (AE_BAD_HEX_CONSTANT); } *ReturnByte = AcpiUtAsciiCharToHex (TwoAsciiChars[1]) | (AcpiUtAsciiCharToHex (TwoAsciiChars[0]) << 4); return (AE_OK); }
static UINT64 AcpiUtStrtoulBase16 ( char *String, UINT32 Flags) { int AsciiDigit; UINT32 ValidDigits = 1; UINT64 ReturnValue = 0; /* Main loop: convert each ASCII byte in the input string */ while (*String) { /* Check for overflow (32 or 64 bit) - return current converted value */ if ((ValidDigits > 16) || ((ValidDigits > 8) && (Flags & ACPI_STRTOUL_32BIT))) { goto Exit; } AsciiDigit = *String; if (!isxdigit (AsciiDigit)) { /* Not Hex ASCII A-F, a-f, or 0-9, terminate */ goto Exit; } /* Convert and insert the hex digit */ ReturnValue = (ReturnValue << 4) | AcpiUtAsciiCharToHex (AsciiDigit); String++; ValidDigits++; } Exit: return (ReturnValue); }
static void OpcDoEisaId ( ACPI_PARSE_OBJECT *Op) { UINT32 EisaId = 0; UINT32 BigEndianId; char *InString; ACPI_STATUS Status = AE_OK; UINT32 i; InString = (char *) Op->Asl.Value.String; /* * The EISAID string must be exactly 7 characters and of the form * "UUUXXXX" -- 3 uppercase letters and 4 hex digits (e.g., "PNP0001") */ if (ACPI_STRLEN (InString) != 7) { Status = AE_BAD_PARAMETER; } else { /* Check all 7 characters for correct format */ for (i = 0; i < 7; i++) { /* First 3 characters must be uppercase letters */ if (i < 3) { if (!isupper ((int) InString[i])) { Status = AE_BAD_PARAMETER; } } /* Last 4 characters must be hex digits */ else if (!isxdigit ((int) InString[i])) { Status = AE_BAD_PARAMETER; } } } if (ACPI_FAILURE (Status)) { AslError (ASL_ERROR, ASL_MSG_INVALID_EISAID, Op, Op->Asl.Value.String); } else { /* Create ID big-endian first (bits are contiguous) */ BigEndianId = (UINT32) ((UINT8) (InString[0] - 0x40)) << 26 | (UINT32) ((UINT8) (InString[1] - 0x40)) << 21 | (UINT32) ((UINT8) (InString[2] - 0x40)) << 16 | (AcpiUtAsciiCharToHex (InString[3])) << 12 | (AcpiUtAsciiCharToHex (InString[4])) << 8 | (AcpiUtAsciiCharToHex (InString[5])) << 4 | AcpiUtAsciiCharToHex (InString[6]); /* Swap to little-endian to get final ID (see function header) */ EisaId = AcpiUtDwordByteSwap (BigEndianId); } /* * Morph the Op into an integer, regardless of whether there * was an error in the EISAID string */ Op->Asl.Value.Integer = EisaId; Op->Asl.CompileFlags &= ~NODE_COMPILE_TIME_CONST; Op->Asl.ParseOpcode = PARSEOP_INTEGER; (void) OpcSetOptimalIntegerSize (Op); /* Op is now an integer */ UtSetParseOpName (Op); }