git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4599 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			285 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			285 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /**@file
 | |
|   Copyright (c) 2007, 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"
 | |
| 
 | |
| 
 | |
| CHAR16
 | |
| NibbleToHexChar (
 | |
|   IN UINT8      Nibble
 | |
|   )
 | |
| /*++
 | |
| 
 | |
|   Routine Description:
 | |
|     Converts the low nibble of a byte  to hex unicode character.
 | |
| 
 | |
|   Arguments:
 | |
|     Nibble - lower nibble of a byte.
 | |
| 
 | |
|   Returns:
 | |
|     Hex unicode character.
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   Nibble &= 0x0F;
 | |
|   if (Nibble <= 0x9) {
 | |
|     return (CHAR16)(Nibble + L'0');
 | |
|   }
 | |
| 
 | |
|   return (CHAR16)(Nibble - 0xA + L'A');
 | |
| }
 | |
| 
 | |
| /**
 | |
|   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;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Converts binary buffer to Unicode string.
 | |
|   At a minimum, any blob of data could be represented as a hex string.
 | |
| 
 | |
|   @param  Str                    Pointer to the string.
 | |
|   @param  HexStringBufferLength  Length in bytes of buffer to hold the hex string.
 | |
|                                  Includes tailing '\0' character. If routine return
 | |
|                                  with EFI_SUCCESS, containing length of hex string
 | |
|                                  buffer. If routine return with
 | |
|                                  EFI_BUFFER_TOO_SMALL, containg length of hex
 | |
|                                  string buffer desired.
 | |
|   @param  Buf                    Buffer to be converted from.
 | |
|   @param  Len                    Length in bytes of the buffer to be converted.
 | |
| 
 | |
|   @retval EFI_SUCCESS            Routine success.
 | |
|   @retval EFI_BUFFER_TOO_SMALL   The hex string buffer is too small.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| R8_BufToHexString (
 | |
|   IN OUT CHAR16                    *Str,
 | |
|   IN OUT UINTN                     *HexStringBufferLength,
 | |
|   IN     UINT8                     *Buf,
 | |
|   IN     UINTN                      Len
 | |
|   )
 | |
| {
 | |
|   //
 | |
|   // Porting Guide:
 | |
|   // This library interface is simply obsolete.
 | |
|   // Include the source code to user code.
 | |
|   //
 | |
|   UINTN       Idx;
 | |
|   UINT8       Byte;
 | |
|   UINTN       StrLen;
 | |
| 
 | |
|   //
 | |
|   // Make sure string is either passed or allocate enough.
 | |
|   // It takes 2 Unicode characters (4 bytes) to represent 1 byte of the binary buffer.
 | |
|   // Plus the Unicode termination character.
 | |
|   //
 | |
|   StrLen = Len * 2;
 | |
|   if (StrLen > ((*HexStringBufferLength) - 1)) {
 | |
|     *HexStringBufferLength = StrLen + 1;
 | |
|     return EFI_BUFFER_TOO_SMALL;
 | |
|   }
 | |
| 
 | |
|   *HexStringBufferLength = StrLen + 1;
 | |
|   //
 | |
|   // Ends the string.
 | |
|   //
 | |
|   Str[StrLen] = L'\0';
 | |
| 
 | |
|   for (Idx = 0; Idx < Len; Idx++) {
 | |
| 
 | |
|     Byte = Buf[Idx];
 | |
|     Str[StrLen - 1 - Idx * 2] = NibbleToHexChar (Byte);
 | |
|     Str[StrLen - 2 - Idx * 2] = NibbleToHexChar ((UINT8)(Byte >> 4));
 | |
|   }
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Converts Unicode string to binary buffer.
 | |
|   The conversion may be partial.
 | |
|   The first character in the string that is not hex digit stops the conversion.
 | |
|   At a minimum, any blob of data could be represented as a hex string.
 | |
| 
 | |
|   @param  Buf                    Pointer to buffer that receives the data.
 | |
|   @param  Len                    Length in bytes of the buffer to hold converted
 | |
|                                  data. If routine return with EFI_SUCCESS,
 | |
|                                  containing length of converted data. If routine
 | |
|                                  return with EFI_BUFFER_TOO_SMALL, containg length
 | |
|                                  of buffer desired.
 | |
|   @param  Str                    String to be converted from.
 | |
|   @param  ConvertedStrLen        Length of the Hex String consumed.
 | |
| 
 | |
|   @retval EFI_SUCCESS            Routine Success.
 | |
|   @retval EFI_BUFFER_TOO_SMALL   The buffer is too small to hold converted data.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| R8_HexStringToBuf (
 | |
|   IN OUT UINT8                     *Buf,
 | |
|   IN OUT UINTN                    *Len,
 | |
|   IN     CHAR16                    *Str,
 | |
|   OUT    UINTN                     *ConvertedStrLen  OPTIONAL
 | |
|   )
 | |
| {
 | |
|   //
 | |
|   // Porting Guide:
 | |
|   // This library interface is simply obsolete.
 | |
|   // Include the source code to user code.
 | |
|   //
 | |
| 
 | |
|   UINTN       HexCnt;
 | |
|   UINTN       Idx;
 | |
|   UINTN       BufferLength;
 | |
|   UINT8       Digit;
 | |
|   UINT8       Byte;
 | |
| 
 | |
|   //
 | |
|   // Find out how many hex characters the string has.
 | |
|   //
 | |
|   for (Idx = 0, HexCnt = 0; R8_IsHexDigit (&Digit, Str[Idx]); Idx++, HexCnt++);
 | |
| 
 | |
|   if (HexCnt == 0) {
 | |
|     *Len = 0;
 | |
|     return EFI_SUCCESS;
 | |
|   }
 | |
|   //
 | |
|   // Two Unicode characters make up 1 buffer byte. Round up.
 | |
|   //
 | |
|   BufferLength = (HexCnt + 1) / 2;
 | |
| 
 | |
|   //
 | |
|   // Test if  buffer is passed enough.
 | |
|   //
 | |
|   if (BufferLength > (*Len)) {
 | |
|     *Len = BufferLength;
 | |
|     return EFI_BUFFER_TOO_SMALL;
 | |
|   }
 | |
| 
 | |
|   *Len = BufferLength;
 | |
| 
 | |
|   for (Idx = 0; Idx < HexCnt; Idx++) {
 | |
| 
 | |
|     R8_IsHexDigit (&Digit, Str[HexCnt - 1 - Idx]);
 | |
| 
 | |
|     //
 | |
|     // For odd charaters, write the lower nibble for each buffer byte,
 | |
|     // and for even characters, the upper nibble.
 | |
|     //
 | |
|     if ((Idx & 1) == 0) {
 | |
|       Byte = Digit;
 | |
|     } else {
 | |
|       Byte = Buf[Idx / 2];
 | |
|       Byte &= 0x0F;
 | |
|       Byte = (UINT8) (Byte | Digit << 4);
 | |
|     }
 | |
| 
 | |
|     Buf[Idx / 2] = Byte;
 | |
|   }
 | |
| 
 | |
|   if (ConvertedStrLen != NULL) {
 | |
|     *ConvertedStrLen = HexCnt;
 | |
|   }
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Determines if a Unicode character is a hexadecimal digit.
 | |
|   The test is case insensitive.
 | |
| 
 | |
|   @param  Digit                  Pointer to byte that receives the value of the hex
 | |
|                                  character.
 | |
|   @param  Char                   Unicode character to test.
 | |
| 
 | |
|   @retval TRUE                   If the character is a hexadecimal digit.
 | |
|   @retval FALSE                  Otherwise.
 | |
| 
 | |
| **/
 | |
| BOOLEAN
 | |
| R8_IsHexDigit (
 | |
|   OUT UINT8      *Digit,
 | |
|   IN  CHAR16      Char
 | |
|   )
 | |
| {
 | |
|   //
 | |
|   // Porting Guide:
 | |
|   // This library interface is simply obsolete.
 | |
|   // Include the source code to user code.
 | |
|   //
 | |
| 
 | |
|   if ((Char >= L'0') && (Char <= L'9')) {
 | |
|     *Digit = (UINT8) (Char - L'0');
 | |
|     return TRUE;
 | |
|   }
 | |
| 
 | |
|   if ((Char >= L'A') && (Char <= L'F')) {
 | |
|     *Digit = (UINT8) (Char - L'A' + 0x0A);
 | |
|     return TRUE;
 | |
|   }
 | |
| 
 | |
|   if ((Char >= L'a') && (Char <= L'f')) {
 | |
|     *Digit = (UINT8) (Char - L'a' + 0x0A);
 | |
|     return TRUE;
 | |
|   }
 | |
| 
 | |
|   return FALSE;
 | |
| }
 | |
| 
 | |
| 
 |