Replace BufToHexString by UnicodeValueToString
Replace HexStringToBuf by StrHexToUint64 git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8034 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -605,7 +605,13 @@ EnterCarriageReturn:
|
||||
default:
|
||||
if (ManualInput) {
|
||||
if (HexInput) {
|
||||
if (!IsHexDigit (&Digital, Key.UnicodeChar)) {
|
||||
if ((Key.UnicodeChar >= L'0') && (Key.UnicodeChar <= L'9')) {
|
||||
Digital = (UINT8) (Key.UnicodeChar - L'0');
|
||||
} else if ((Key.UnicodeChar >= L'A') && (Key.UnicodeChar <= L'F')) {
|
||||
Digital = (UINT8) (Key.UnicodeChar - L'A' + 0x0A);
|
||||
} else if ((Key.UnicodeChar >= L'a') && (Key.UnicodeChar <= L'f')) {
|
||||
Digital = (UINT8) (Key.UnicodeChar - L'a' + 0x0A);
|
||||
} else {
|
||||
UpdateStatusBar (INPUT_ERROR, Question->QuestionFlags, TRUE);
|
||||
break;
|
||||
}
|
||||
|
@@ -1018,8 +1018,12 @@ GetQuestionValue (
|
||||
CHAR16 *Value;
|
||||
CHAR16 *StringPtr;
|
||||
UINTN Length;
|
||||
UINTN Index;
|
||||
UINTN LengthStr;
|
||||
BOOLEAN IsBufferStorage;
|
||||
BOOLEAN IsString;
|
||||
CHAR16 TemStr[5];
|
||||
UINT8 DigitUint8;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
|
||||
@@ -1141,15 +1145,44 @@ GetQuestionValue (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
LengthStr = StrLen (Value);
|
||||
Status = EFI_SUCCESS;
|
||||
if (IsString) {
|
||||
//
|
||||
// Convert Config String to Unicode String, e.g "0041004200430044" => "ABCD"
|
||||
// Add string tail char L'\0' into Length
|
||||
//
|
||||
Length = StorageWidth + sizeof (CHAR16);
|
||||
Status = ConfigStringToUnicode ((CHAR16 *) Dst, &Length, Value);
|
||||
Length = StorageWidth + sizeof (CHAR16);
|
||||
if (Length < ((LengthStr / 4 + 1) * 2)) {
|
||||
Status = EFI_BUFFER_TOO_SMALL;
|
||||
} else {
|
||||
StringPtr = (CHAR16 *) Dst;
|
||||
ZeroMem (TemStr, sizeof (TemStr));
|
||||
for (Index = 0; Index < LengthStr; Index += 4) {
|
||||
StrnCpy (TemStr, Value + Index, 4);
|
||||
StringPtr[Index/4] = (CHAR16) StrHexToUint64 (TemStr);
|
||||
}
|
||||
//
|
||||
// Add tailing L'\0' character
|
||||
//
|
||||
StringPtr[Index/4] = L'\0';
|
||||
}
|
||||
} else {
|
||||
Status = HexStringToBuf (Dst, &StorageWidth, Value, NULL);
|
||||
if (StorageWidth < ((LengthStr + 1) / 2)) {
|
||||
Status = EFI_BUFFER_TOO_SMALL;
|
||||
} else {
|
||||
ZeroMem (TemStr, sizeof (TemStr));
|
||||
for (Index = 0; Index < LengthStr; Index ++) {
|
||||
TemStr[0] = Value[LengthStr - Index - 1];
|
||||
DigitUint8 = (UINT8) StrHexToUint64 (TemStr);
|
||||
if ((Index & 1) == 0) {
|
||||
Dst [Index/2] = DigitUint8;
|
||||
} else {
|
||||
Dst [Index/2] = (UINT8) ((Dst [Index/2] << 4) + DigitUint8);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FreePool (Value);
|
||||
@@ -1222,18 +1255,48 @@ GetQuestionValue (
|
||||
}
|
||||
*StringPtr = L'\0';
|
||||
|
||||
LengthStr = StrLen (Value);
|
||||
Status = EFI_SUCCESS;
|
||||
if (!IsBufferStorage && IsString) {
|
||||
//
|
||||
// Convert Config String to Unicode String, e.g "0041004200430044" => "ABCD"
|
||||
// Add string tail char L'\0' into Length
|
||||
//
|
||||
Length = StorageWidth + sizeof (CHAR16);
|
||||
Status = ConfigStringToUnicode ((CHAR16 *) Dst, &Length, Value);
|
||||
} else {
|
||||
Status = HexStringToBuf (Dst, &StorageWidth, Value, NULL);
|
||||
if (EFI_ERROR (Status)) {
|
||||
FreePool (Result);
|
||||
return Status;
|
||||
Length = StorageWidth + sizeof (CHAR16);
|
||||
if (Length < ((LengthStr / 4 + 1) * 2)) {
|
||||
Status = EFI_BUFFER_TOO_SMALL;
|
||||
} else {
|
||||
StringPtr = (CHAR16 *) Dst;
|
||||
ZeroMem (TemStr, sizeof (TemStr));
|
||||
for (Index = 0; Index < LengthStr; Index += 4) {
|
||||
StrnCpy (TemStr, Value + Index, 4);
|
||||
StringPtr[Index/4] = (CHAR16) StrHexToUint64 (TemStr);
|
||||
}
|
||||
//
|
||||
// Add tailing L'\0' character
|
||||
//
|
||||
StringPtr[Index/4] = L'\0';
|
||||
}
|
||||
} else {
|
||||
if (StorageWidth < ((LengthStr + 1) / 2)) {
|
||||
Status = EFI_BUFFER_TOO_SMALL;
|
||||
} else {
|
||||
ZeroMem (TemStr, sizeof (TemStr));
|
||||
for (Index = 0; Index < LengthStr; Index ++) {
|
||||
TemStr[0] = Value[LengthStr - Index - 1];
|
||||
DigitUint8 = (UINT8) StrHexToUint64 (TemStr);
|
||||
if ((Index & 1) == 0) {
|
||||
Dst [Index/2] = DigitUint8;
|
||||
} else {
|
||||
Dst [Index/2] = (UINT8) ((Dst [Index/2] << 4) + DigitUint8);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
FreePool (Result);
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -1244,6 +1307,7 @@ GetQuestionValue (
|
||||
} else {
|
||||
SetValueByName (Storage, Question->VariableName, Value);
|
||||
}
|
||||
|
||||
FreePool (Result);
|
||||
}
|
||||
|
||||
@@ -1286,6 +1350,10 @@ SetQuestionValue (
|
||||
UINTN Length;
|
||||
BOOLEAN IsBufferStorage;
|
||||
BOOLEAN IsString;
|
||||
UINT8 *TemBuffer;
|
||||
CHAR16 *TemName;
|
||||
CHAR16 *TemString;
|
||||
UINTN Index;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
|
||||
@@ -1397,20 +1465,32 @@ SetQuestionValue (
|
||||
} else {
|
||||
if (IsString) {
|
||||
//
|
||||
// Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"
|
||||
// Allocate enough string buffer.
|
||||
//
|
||||
Value = NULL;
|
||||
BufferLen = ((StrLen ((CHAR16 *) Src) * 4) + 1) * sizeof (CHAR16);
|
||||
Value = AllocateZeroPool (BufferLen);
|
||||
ASSERT (Value != NULL);
|
||||
Status = UnicodeToConfigString (Value, &BufferLen, (CHAR16 *) Src);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
//
|
||||
// Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"
|
||||
//
|
||||
TemName = (CHAR16 *) Src;
|
||||
TemString = Value;
|
||||
for (; *TemName != L'\0'; TemName++) {
|
||||
TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemName, 4);
|
||||
}
|
||||
} else {
|
||||
BufferLen = StorageWidth * 2 + 1;
|
||||
Value = AllocateZeroPool (BufferLen * sizeof (CHAR16));
|
||||
ASSERT (Value != NULL);
|
||||
BufToHexString (Value, &BufferLen, Src, StorageWidth);
|
||||
ToLower (Value);
|
||||
//
|
||||
// Convert Buffer to Hex String
|
||||
//
|
||||
TemBuffer = Src + StorageWidth - 1;
|
||||
TemString = Value;
|
||||
for (Index = 0; Index < StorageWidth; Index ++, TemBuffer --) {
|
||||
TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);
|
||||
}
|
||||
}
|
||||
|
||||
Status = SetValueByName (Storage, Question->VariableName, Value);
|
||||
@@ -1446,17 +1526,34 @@ SetQuestionValue (
|
||||
}
|
||||
|
||||
Value = ConfigResp + StrLen (ConfigResp);
|
||||
|
||||
if (!IsBufferStorage && IsString) {
|
||||
//
|
||||
// Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"
|
||||
//
|
||||
BufferLen = ((StrLen ((CHAR16 *) Src) * 4) + 1) * sizeof (CHAR16);
|
||||
Status = UnicodeToConfigString (Value, &BufferLen, (CHAR16 *) Src);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
TemName = (CHAR16 *) Src;
|
||||
TemString = Value;
|
||||
for (; *TemName != L'\0'; TemName++) {
|
||||
TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemName, 4);
|
||||
}
|
||||
} else {
|
||||
BufferLen = StorageWidth * 2 + 1;
|
||||
BufToHexString (Value, &BufferLen, Src, StorageWidth);
|
||||
ToLower (Value);
|
||||
//
|
||||
// Convert Buffer to Hex String
|
||||
//
|
||||
TemBuffer = Src + StorageWidth - 1;
|
||||
TemString = Value;
|
||||
for (Index = 0; Index < StorageWidth; Index ++, TemBuffer --) {
|
||||
TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Convert to lower char.
|
||||
//
|
||||
for (TemString = Value; *Value != L'\0'; Value++) {
|
||||
if (*Value >= L'A' && *Value <= L'Z') {
|
||||
*Value = (CHAR16) (*Value - L'A' + L'a');
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
|
@@ -1506,6 +1506,9 @@ UiDisplayMenu (
|
||||
UINT16 DefaultId;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
FORM_BROWSER_STATEMENT *Statement;
|
||||
CHAR16 TemStr[2];
|
||||
UINT8 *DevicePathBuffer;
|
||||
UINT8 DigitUint8;
|
||||
|
||||
CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));
|
||||
|
||||
@@ -2358,8 +2361,27 @@ UiDisplayMenu (
|
||||
}
|
||||
BufferSize = StrLen (StringPtr) / 2;
|
||||
DevicePath = AllocatePool (BufferSize);
|
||||
|
||||
//
|
||||
// Convert from Device Path String to DevicePath Buffer in the reverse order.
|
||||
//
|
||||
DevicePathBuffer = (UINT8 *) DevicePath;
|
||||
for (Index = 0; StringPtr[Index] != L'\0'; Index ++) {
|
||||
TemStr[0] = StringPtr[Index];
|
||||
DigitUint8 = (UINT8) StrHexToUint64 (TemStr);
|
||||
if (DigitUint8 == 0 && TemStr[0] != L'0') {
|
||||
//
|
||||
// Invalid Hex Char as the tail.
|
||||
//
|
||||
break;
|
||||
}
|
||||
if ((Index & 1) == 0) {
|
||||
DevicePathBuffer [Index/2] = DigitUint8;
|
||||
} else {
|
||||
DevicePathBuffer [Index/2] = (UINT8) ((DevicePathBuffer [Index/2] << 4) + DigitUint8);
|
||||
}
|
||||
}
|
||||
|
||||
HexStringToBufInReverseOrder ((UINT8 *) DevicePath, &BufferSize, StringPtr);
|
||||
Selection->Handle = HiiLibDevicePathToHiiHandle (DevicePath);
|
||||
if (Selection->Handle == NULL) {
|
||||
//
|
||||
|
Reference in New Issue
Block a user