-/**\r
- Convert a Unicode character to numerical value.\r
-\r
- This internal function only deal with Unicode character\r
- which maps to a valid hexadecimal ASII character, i.e.\r
- L'0' to L'9', L'a' to L'f' or L'A' to L'F'. For other\r
- Unicode character, the value returned does not make sense.\r
-\r
- @param Char The character to convert.\r
-\r
- @return The numerical value converted.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-HexCharToUintn (\r
- IN CHAR16 Char\r
- )\r
-{\r
- if (Char >= L'0' && Char <= L'9') {\r
- return Char - L'0';\r
- }\r
-\r
- return (UINTN) (10 + CharToUpper (Char) - L'A');\r
-}\r
-\r
-/**\r
- Convert a string representation of a guid to a Guid value.\r
-\r
- @param[in] StringGuid The pointer to the string of a guid.\r
- @param[in,out] Guid The pointer to the GUID structure to populate.\r
-\r
- @retval EFI_INVALID_PARAMETER A parameter was invalid.\r
- @retval EFI_SUCCESS The conversion was successful.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-ConvertStringToGuid (\r
- IN CONST CHAR16 *StringGuid,\r
- IN OUT EFI_GUID *Guid\r
- )\r
-{\r
- CHAR16 *TempCopy;\r
- CHAR16 *TempSpot;\r
- CHAR16 *Walker;\r
- UINT64 TempVal;\r
- EFI_STATUS Status;\r
-\r
- if (StringGuid == NULL) {\r
- return (EFI_INVALID_PARAMETER);\r
- } else if (StrLen(StringGuid) != 36) {\r
- return (EFI_INVALID_PARAMETER);\r
- } \r
- TempCopy = NULL;\r
- TempCopy = StrnCatGrow(&TempCopy, NULL, StringGuid, 0);\r
- Walker = TempCopy;\r
- TempSpot = StrStr(Walker, L"-");\r
- *TempSpot = CHAR_NULL;\r
- Status = ShellConvertStringToUint64(Walker, &TempVal, TRUE, FALSE);\r
- if (EFI_ERROR(Status)) {\r
- FreePool(TempCopy);\r
- return (Status);\r
- }\r
- Guid->Data1 = (UINT32)TempVal;\r
- Walker += 9;\r
- TempSpot = StrStr(Walker, L"-");\r
- *TempSpot = CHAR_NULL;\r
- Status = ShellConvertStringToUint64(Walker, &TempVal, TRUE, FALSE);\r
- if (EFI_ERROR(Status)) {\r
- FreePool(TempCopy);\r
- return (Status);\r
- }\r
- Guid->Data2 = (UINT16)TempVal;\r
- Walker += 5;\r
- TempSpot = StrStr(Walker, L"-");\r
- *TempSpot = CHAR_NULL;\r
- Status = ShellConvertStringToUint64(Walker, &TempVal, TRUE, FALSE);\r
- if (EFI_ERROR(Status)) {\r
- FreePool(TempCopy);\r
- return (Status);\r
- }\r
- Guid->Data3 = (UINT16)TempVal;\r
- Walker += 5;\r
- Guid->Data4[0] = (UINT8)(HexCharToUintn(Walker[0]) * 16);\r
- Guid->Data4[0] = (UINT8)(Guid->Data4[0]+ (UINT8)HexCharToUintn(Walker[1]));\r
- Walker += 2;\r
- Guid->Data4[1] = (UINT8)(HexCharToUintn(Walker[0]) * 16);\r
- Guid->Data4[1] = (UINT8)(Guid->Data4[1] + (UINT8)HexCharToUintn(Walker[1]));\r
- Walker += 3;\r
- Guid->Data4[2] = (UINT8)(HexCharToUintn(Walker[0]) * 16);\r
- Guid->Data4[2] = (UINT8)(Guid->Data4[2] + (UINT8)HexCharToUintn(Walker[1]));\r
- Walker += 2;\r
- Guid->Data4[3] = (UINT8)(HexCharToUintn(Walker[0]) * 16);\r
- Guid->Data4[3] = (UINT8)(Guid->Data4[3] + (UINT8)HexCharToUintn(Walker[1]));\r
- Walker += 2;\r
- Guid->Data4[4] = (UINT8)(HexCharToUintn(Walker[0]) * 16);\r
- Guid->Data4[4] = (UINT8)(Guid->Data4[4] + (UINT8)HexCharToUintn(Walker[1]));\r
- Walker += 2;\r
- Guid->Data4[5] = (UINT8)(HexCharToUintn(Walker[0]) * 16);\r
- Guid->Data4[5] = (UINT8)(Guid->Data4[5] + (UINT8)HexCharToUintn(Walker[1]));\r
- Walker += 2;\r
- Guid->Data4[6] = (UINT8)(HexCharToUintn(Walker[0]) * 16);\r
- Guid->Data4[6] = (UINT8)(Guid->Data4[6] + (UINT8)HexCharToUintn(Walker[1]));\r
- Walker += 2;\r
- Guid->Data4[7] = (UINT8)(HexCharToUintn(Walker[0]) * 16);\r
- Guid->Data4[7] = (UINT8)(Guid->Data4[7] + (UINT8)HexCharToUintn(Walker[1]));\r
- FreePool(TempCopy);\r
- return (EFI_SUCCESS);\r
-}\r
-\r
-CHAR16 TempBufferCatSPrint[1000];\r
-/** \r
- Appends a formatted Unicode string to a Null-terminated Unicode string\r
- \r
- This function appends a formatted Unicode string to the Null-terminated \r
- Unicode string specified by String. String is optional and may be NULL.\r
- Storage for the formatted Unicode string returned is allocated using \r
- AllocateZeroPool(). The pointer to the appended string is returned. The caller\r
- is responsible for freeing the returned string.\r
- \r
- If String is not NULL and not aligned on a 16-bit boundary, then ASSERT().\r
- If Format is NULL, then ASSERT().\r
- If Format is not aligned on a 16-bit boundary, then ASSERT().\r
- \r
- @param String A null-terminated Unicode string.\r
- @param FormatString A null-terminated Unicode format string.\r
- @param ... The variable argument list whose contents are accessed based \r
- on the format string specified by Format.\r
-\r
- @retval NULL There was not enough available memory.\r
- @return Null terminated Unicode string is that is the formatted \r
- string appended to String.\r
- @sa CatVSPrint\r
-**/\r
-CHAR16*\r
-EFIAPI\r
-CatSPrint (\r
- IN CONST CHAR16 *String OPTIONAL,\r
- IN CONST CHAR16 *FormatString,\r
- ...\r
- )\r
-{\r
- VA_LIST Marker;\r
- UINTN StringLength;\r
- if (String != NULL) {\r
- StrCpy(TempBufferCatSPrint, String);\r
- } else {\r
- *TempBufferCatSPrint = CHAR_NULL;\r
- }\r
- VA_START (Marker, FormatString);\r
- StringLength = StrLen(TempBufferCatSPrint);\r
-\r
- UnicodeVSPrint(TempBufferCatSPrint+StrLen(TempBufferCatSPrint), 1000-StringLength, FormatString, Marker);\r
- return (AllocateCopyPool(StrSize(TempBufferCatSPrint), TempBufferCatSPrint));\r
-}\r
-\r