UINTN Length;\r
EFI_STRING PathHdr;\r
EFI_STRING DevicePathString;\r
+ UINT8 *DevicePathBuffer;\r
+ CHAR16 TemStr[2];\r
+ UINTN Index;\r
+ UINT8 DigitUint8;\r
\r
if (String == NULL || DevicePath == NULL) {\r
return EFI_INVALID_PARAMETER;\r
// as the device path resides in RAM memory.\r
// Translate the data into binary.\r
//\r
- Length /= 2;\r
- *DevicePath = (UINT8 *) AllocateZeroPool (Length);\r
- if (*DevicePath == NULL) {\r
+ DevicePathBuffer = (UINT8 *) AllocateZeroPool ((Length + 1) / 2);\r
+ if (DevicePathBuffer == NULL) {\r
FreePool (DevicePathString);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- HexStringToBufInReverseOrder (*DevicePath, &Length, DevicePathString);\r
+ ZeroMem (TemStr, sizeof (TemStr));\r
+ for (Index = 0; DevicePathString[Index] != L'\0'; Index ++) {\r
+ TemStr[0] = DevicePathString[Index];\r
+ DigitUint8 = (UINT8) StrHexToUint64 (TemStr);\r
+ if ((Index & 1) == 0) {\r
+ DevicePathBuffer [Index/2] = DigitUint8;\r
+ } else {\r
+ DevicePathBuffer [Index/2] = (UINT8) ((DevicePathBuffer [Index/2] << 4) + DigitUint8);\r
+ }\r
+ }\r
\r
FreePool (DevicePathString);\r
+ \r
+ *DevicePath = DevicePathBuffer;\r
\r
return EFI_SUCCESS;\r
\r
}\r
\r
+/**\r
+ Converts the unicode character of the string from uppercase to lowercase.\r
+ This is a internal function.\r
+\r
+ @param Str String to be converted\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+HiiToLower (\r
+ IN OUT CHAR16 *Str\r
+ )\r
+{\r
+ CHAR16 *Ptr;\r
+ \r
+ for (Ptr = Str; *Ptr != L'\0'; Ptr++) {\r
+ if (*Ptr >= L'A' && *Ptr <= L'Z') {\r
+ *Ptr = (CHAR16) (*Ptr - L'A' + L'a');\r
+ }\r
+ }\r
+}\r
\r
/**\r
Generate a sub string then output it.\r
{\r
UINTN Length;\r
EFI_STRING Str;\r
- EFI_STATUS Status;\r
EFI_STRING StringHeader;\r
+ CHAR16 *TemString;\r
+ CHAR16 *TemName;\r
+ UINT8 *TemBuffer;\r
+ UINTN Index;\r
\r
ASSERT (String != NULL && SubStr != NULL);\r
\r
}\r
\r
Length = StrLen (String) + BufferLen * 2 + 1 + 1;\r
- Str = AllocateZeroPool (Length * sizeof (CHAR16));\r
+ Str = AllocateZeroPool (Length * sizeof (CHAR16));\r
ASSERT (Str != NULL);\r
\r
StrCpy (Str, String);\r
Length = (BufferLen * 2 + 1) * sizeof (CHAR16);\r
\r
- Status = EFI_SUCCESS;\r
StringHeader = Str + StrLen (String);\r
+ TemString = (CHAR16 *) StringHeader;\r
\r
switch (Flag) {\r
case 1:\r
- Status = BufInReverseOrderToHexString (StringHeader, (UINT8 *) Buffer, BufferLen);\r
+ //\r
+ // Convert Buffer to Hex String in reverse order\r
+ //\r
+ TemBuffer = ((UINT8 *) Buffer);\r
+ for (Index = 0; Index < BufferLen; Index ++, TemBuffer ++) {\r
+ TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);\r
+ }\r
break;\r
case 2:\r
- Status = UnicodeToConfigString (StringHeader, &Length, (CHAR16 *) Buffer);\r
+ //\r
+ // Check buffer is enough\r
+ //\r
+ TemName = (CHAR16 *) Buffer;\r
+ ASSERT (Length < ((StrLen (TemName) * 4 + 1) * sizeof (CHAR16)));\r
+ //\r
+ // Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"\r
+ //\r
+ for (; *TemName != L'\0'; TemName++) {\r
+ TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemName, 4);\r
+ }\r
break;\r
case 3:\r
- Status = BufToHexString (StringHeader, &Length, (UINT8 *) Buffer, BufferLen);\r
//\r
- // Convert the uppercase to lowercase since <HexAf> is defined in lowercase format.\r
+ // Convert Buffer to Hex String\r
//\r
- ToLower (StringHeader);\r
+ TemBuffer = ((UINT8 *) Buffer) + BufferLen - 1;\r
+ for (Index = 0; Index < BufferLen; Index ++, TemBuffer --) {\r
+ TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);\r
+ }\r
break;\r
default:\r
break;\r
}\r
\r
- ASSERT_EFI_ERROR (Status);\r
+ //\r
+ // Convert the uppercase to lowercase since <HexAf> is defined in lowercase format.\r
+ //\r
+ HiiToLower (StringHeader);\r
StrCat (Str, L"&");\r
\r
*SubStr = Str;\r
EFI_STRING Str;\r
UINT8 *Buf;\r
EFI_STATUS Status;\r
+ UINT8 DigitUint8;\r
+ UINTN Index;\r
+ CHAR16 TemStr[2];\r
\r
ASSERT (StringPtr != NULL && Number != NULL && Len != NULL);\r
- ASSERT (*StringPtr != 0);\r
+ ASSERT (*StringPtr != L'\0');\r
\r
Buf = NULL;\r
\r
TmpPtr = StringPtr;\r
- while (*StringPtr != 0 && *StringPtr != L'&') {\r
+ while (*StringPtr != L'\0' && *StringPtr != L'&') {\r
StringPtr++;\r
}\r
*Len = StringPtr - TmpPtr;\r
goto Exit;\r
}\r
CopyMem (Str, TmpPtr, *Len * sizeof (CHAR16));\r
- *(Str + *Len) = 0;\r
+ *(Str + *Len) = L'\0';\r
\r
Length = (Length + 1) / 2;\r
Buf = (UINT8 *) AllocateZeroPool (Length);\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Exit;\r
}\r
-\r
- Status = HexStringToBuf (Buf, &Length, Str, NULL);\r
- if (EFI_ERROR (Status)) {\r
- goto Exit;\r
+ \r
+ Length = *Len;\r
+ ZeroMem (TemStr, sizeof (TemStr));\r
+ for (Index = 0; Index < Length; Index ++) {\r
+ TemStr[0] = Str[Length - Index - 1];\r
+ DigitUint8 = (UINT8) StrHexToUint64 (TemStr);\r
+ if ((Index & 1) == 0) {\r
+ Buf [Index/2] = DigitUint8;\r
+ } else {\r
+ Buf [Index/2] = (UINT8) ((Buf [Index/2] << 4) + DigitUint8);\r
+ }\r
}\r
\r
*Number = Buf;\r
if (Str != NULL) {\r
FreePool (Str);\r
}\r
+\r
return Status;\r
}\r
\r
UINT8 *Value;\r
EFI_STRING ValueStr;\r
EFI_STRING ConfigElement;\r
+ UINTN Index;\r
+ UINT8 *TemBuffer;\r
+ CHAR16 *TemString;\r
\r
if (This == NULL || Progress == NULL || Config == NULL) {\r
return EFI_INVALID_PARAMETER;\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Exit;\r
}\r
-\r
- Status = BufToHexString (ValueStr, &Length, Value, Width);\r
- ASSERT_EFI_ERROR (Status);\r
- ToLower (ValueStr);\r
+ \r
+ TemString = ValueStr;\r
+ TemBuffer = Value + Width - 1;\r
+ for (Index = 0; Index < Width; Index ++, TemBuffer --) {\r
+ TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);\r
+ }\r
+ HiiToLower (ValueStr);\r
\r
FreePool (Value);\r
Value = NULL;\r