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:
lgao4
2009-04-08 00:56:51 +00:00
parent dfbe9de95f
commit 63d55bb98a
12 changed files with 398 additions and 264 deletions

View File

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

View File

@@ -809,7 +809,7 @@ InsertStringPackage (
AsciiStrCpy (Language, (CHAR8 *) PackageHdr + HeaderSize - LanguageSize);
for (Link = PackageList->StringPkgHdr.ForwardLink; Link != &PackageList->StringPkgHdr; Link = Link->ForwardLink) {
StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);
if (R8_EfiLibCompareLanguage (Language, StringPackage->StringPkgHdr->Language)) {
if (HiiCompareLanguage (Language, StringPackage->StringPkgHdr->Language)) {
FreePool (Language);
return EFI_UNSUPPORTED;
}

View File

@@ -41,6 +41,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include <Library/UefiLib.h>
#include <Library/PcdLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/PrintLib.h>
#define HII_DATABASE_NOTIFY_GUID \
@@ -1688,11 +1689,25 @@ HiiGetAltCfg (
);
/**
Compare whether two names of languages are identical.
@param Language1 Name of language 1
@param Language2 Name of language 2
@retval TRUE same
@retval FALSE not same
**/
BOOLEAN
HiiCompareLanguage (
IN CHAR8 *Language1,
IN CHAR8 *Language2
)
;
//
// Global variables
//
extern EFI_EVENT gHiiKeyboardLayoutChanged;
#include "R8Lib.h"
#endif

View File

@@ -36,9 +36,6 @@
String.c
Database.c
Font.c
R8Lib.h
R8Lib.c
[Packages]
MdePkg/MdePkg.dec
@@ -57,6 +54,7 @@
UefiLib
PcdLib
UefiRuntimeServicesTableLib
PrintLib
[Protocols]
gEfiDevicePathProtocolGuid ## SOMETIMES_CONSUMES

View File

@@ -1,60 +0,0 @@
/** @file
Implement a utility function named R8_EfiLibCompareLanguage.
Copyright (c) 2007 - 2008, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#include "HiiDatabase.h"
/**
Compare whether two names of languages are identical.
@param Language1 Name of language 1
@param Language2 Name of language 2
@retval TRUE same
@retval FALSE not same
**/
BOOLEAN
R8_EfiLibCompareLanguage (
IN CHAR8 *Language1,
IN CHAR8 *Language2
)
{
//
// Porting Guide:
// This library interface is simply obsolete.
// Include the source code to user code.
//
UINTN Index;
for (Index = 0; (Language1[Index] != 0) && (Language2[Index] != 0); Index++) {
if (Language1[Index] != Language2[Index]) {
return FALSE;
}
}
if (((Language1[Index] == 0) && (Language2[Index] == 0)) ||
((Language1[Index] == 0) && (Language2[Index] != ';')) ||
((Language1[Index] == ';') && (Language2[Index] != 0)) ||
((Language1[Index] == ';') && (Language2[Index] != ';'))) {
return TRUE;
}
return FALSE;
}

View File

@@ -1,39 +0,0 @@
/** @file
Implement a utility function named R8_EfiLibCompareLanguage.
Copyright (c) 2007 - 2008, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef __R8_LIB_H__
#define __R8_LIB_H__
/**
Compare whether two names of languages are identical.
@param Language1 Name of language 1
@param Language2 Name of language 2
@retval TRUE same
@retval FALSE not same
**/
BOOLEAN
R8_EfiLibCompareLanguage (
IN CHAR8 *Language1,
IN CHAR8 *Language2
)
;
#endif

View File

@@ -1014,7 +1014,7 @@ HiiNewString (
Link = Link->ForwardLink
) {
StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);
if (R8_EfiLibCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {
if (HiiCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {
Matched = TRUE;
break;
}
@@ -1353,7 +1353,7 @@ HiiGetString (
Link = Link->ForwardLink
) {
StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);
if (R8_EfiLibCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {
if (HiiCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {
Status = GetStringWorker (Private, StringPackage, StringId, String, StringSize, StringFontInfo);
if (Status != EFI_NOT_FOUND) {
return Status;
@@ -1446,7 +1446,7 @@ HiiSetString (
Link = Link->ForwardLink
) {
StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);
if (R8_EfiLibCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {
if (HiiCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {
OldPackageLen = StringPackage->StringPkgHdr->Header.Length;
Status = SetStringWorker (
Private,
@@ -1635,7 +1635,7 @@ HiiGetSecondaryLanguages (
Link1 = Link1->ForwardLink
) {
StringPackage = CR (Link1, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);
if (R8_EfiLibCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) FirstLanguage)) {
if (HiiCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) FirstLanguage)) {
Languages = StringPackage->StringPkgHdr->Language;
//
// Language is a series of ';' terminated strings, first one is primary
@@ -1663,3 +1663,41 @@ HiiGetSecondaryLanguages (
return EFI_INVALID_LANGUAGE;
}
/**
Compare whether two names of languages are identical.
@param Language1 Name of language 1
@param Language2 Name of language 2
@retval TRUE same
@retval FALSE not same
**/
BOOLEAN
HiiCompareLanguage (
IN CHAR8 *Language1,
IN CHAR8 *Language2
)
{
//
// Porting Guide:
// This library interface is simply obsolete.
// Include the source code to user code.
//
UINTN Index;
for (Index = 0; (Language1[Index] != 0) && (Language2[Index] != 0); Index++) {
if (Language1[Index] != Language2[Index]) {
return FALSE;
}
}
if (((Language1[Index] == 0) && (Language2[Index] == 0)) ||
((Language1[Index] == 0) && (Language2[Index] != ';')) ||
((Language1[Index] == ';') && (Language2[Index] != 0)) ||
((Language1[Index] == ';') && (Language2[Index] != ';'))) {
return TRUE;
}
return FALSE;
}