-/** @file\r
- Unicode and ASCII string primatives.\r
-\r
- Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
- This program and the accompanying materials\r
- are licensed and made available under the terms and conditions of the BSD License\r
- which accompanies this distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php.\r
-\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "BaseLibInternals.h"\r
-\r
-\r
-/**\r
- Copies one Null-terminated Unicode string to another Null-terminated Unicode\r
- string and returns the new Unicode string.\r
-\r
- This function copies the contents of the Unicode string Source to the Unicode\r
- string Destination, and returns Destination. If Source and Destination\r
- overlap, then the results are undefined.\r
-\r
- If Destination is NULL, then ASSERT().\r
- If Destination is not aligned on a 16-bit boundary, then ASSERT().\r
- If Source is NULL, then ASSERT().\r
- If Source is not aligned on a 16-bit boundary, then ASSERT().\r
- If Source and Destination overlap, then ASSERT().\r
- If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
- PcdMaximumUnicodeStringLength Unicode characters, not including the\r
- Null-terminator, then ASSERT().\r
-\r
- @param Destination A pointer to a Null-terminated Unicode string.\r
- @param Source A pointer to a Null-terminated Unicode string.\r
-\r
- @return Destination.\r
-\r
-**/\r
-CHAR16 *\r
-EFIAPI\r
-StrCpy (\r
- OUT CHAR16 *Destination,\r
- IN CONST CHAR16 *Source\r
- )\r
-{\r
- CHAR16 *ReturnValue;\r
-\r
- //\r
- // Destination cannot be NULL\r
- //\r
- ASSERT (Destination != NULL);\r
- ASSERT (((UINTN) Destination & BIT0) == 0);\r
-\r
- //\r
- // Destination and source cannot overlap\r
- //\r
- ASSERT ((UINTN)(Destination - Source) > StrLen (Source));\r
- ASSERT ((UINTN)(Source - Destination) > StrLen (Source));\r
-\r
- ReturnValue = Destination;\r
- while (*Source != 0) {\r
- *(Destination++) = *(Source++);\r
- }\r
- *Destination = 0;\r
- return ReturnValue;\r
-}\r
-\r
-/**\r
- Copies up to a specified length from one Null-terminated Unicode string to \r
- another Null-terminated Unicode string and returns the new Unicode string.\r
-\r
- This function copies the contents of the Unicode string Source to the Unicode\r
- string Destination, and returns Destination. At most, Length Unicode\r
- characters are copied from Source to Destination. If Length is 0, then\r
- Destination is returned unmodified. If Length is greater that the number of\r
- Unicode characters in Source, then Destination is padded with Null Unicode\r
- characters. If Source and Destination overlap, then the results are\r
- undefined.\r
-\r
- If Length > 0 and Destination is NULL, then ASSERT().\r
- If Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT().\r
- If Length > 0 and Source is NULL, then ASSERT().\r
- If Length > 0 and Source is not aligned on a 16-bit boundary, then ASSERT().\r
- If Source and Destination overlap, then ASSERT().\r
- If PcdMaximumUnicodeStringLength is not zero, and Length is greater than \r
- PcdMaximumUnicodeStringLength, then ASSERT().\r
- If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
- PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator,\r
- then ASSERT().\r
-\r
- @param Destination A pointer to a Null-terminated Unicode string.\r
- @param Source A pointer to a Null-terminated Unicode string.\r
- @param Length The maximum number of Unicode characters to copy.\r
-\r
- @return Destination.\r
-\r
-**/\r
-CHAR16 *\r
-EFIAPI\r
-StrnCpy (\r
- OUT CHAR16 *Destination,\r
- IN CONST CHAR16 *Source,\r
- IN UINTN Length\r
- )\r
-{\r
- CHAR16 *ReturnValue;\r
-\r
- if (Length == 0) {\r
- return Destination;\r
- }\r
-\r
- //\r
- // Destination cannot be NULL if Length is not zero\r
- //\r
- ASSERT (Destination != NULL);\r
- ASSERT (((UINTN) Destination & BIT0) == 0);\r
-\r
- //\r
- // Destination and source cannot overlap\r
- //\r
- ASSERT ((UINTN)(Destination - Source) > StrLen (Source));\r
- ASSERT ((UINTN)(Source - Destination) >= Length);\r
-\r
- if (PcdGet32 (PcdMaximumUnicodeStringLength) != 0) {\r
- ASSERT (Length <= PcdGet32 (PcdMaximumUnicodeStringLength));\r
- }\r
-\r
- ReturnValue = Destination;\r
-\r
- while ((*Source != L'\0') && (Length > 0)) {\r
- *(Destination++) = *(Source++);\r
- Length--;\r
- }\r
-\r
- ZeroMem (Destination, Length * sizeof (*Destination));\r
- return ReturnValue;\r
-}\r
-\r
-/**\r
- Returns the length of a Null-terminated Unicode string.\r
-\r
- This function returns the number of Unicode characters in the Null-terminated\r
- Unicode string specified by String.\r
-\r
- If String is NULL, then ASSERT().\r
- If String is not aligned on a 16-bit boundary, then ASSERT().\r
- If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
- PcdMaximumUnicodeStringLength Unicode characters, not including the\r
- Null-terminator, then ASSERT().\r
-\r
- @param String A pointer to a Null-terminated Unicode string.\r
-\r
- @return The length of String.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-StrLen (\r
- IN CONST CHAR16 *String\r
- )\r
-{\r
- UINTN Length;\r
-\r
- ASSERT (String != NULL);\r
- ASSERT (((UINTN) String & BIT0) == 0);\r
-\r
- for (Length = 0; *String != L'\0'; String++, Length++) {\r
- //\r
- // If PcdMaximumUnicodeStringLength is not zero,\r
- // length should not more than PcdMaximumUnicodeStringLength\r
- //\r
- if (PcdGet32 (PcdMaximumUnicodeStringLength) != 0) {\r
- ASSERT (Length < PcdGet32 (PcdMaximumUnicodeStringLength));\r
- }\r
- }\r
- return Length;\r
-}\r
-\r
-/**\r
- Returns the size of a Null-terminated Unicode string in bytes, including the\r
- Null terminator.\r
-\r
- This function returns the size, in bytes, of the Null-terminated Unicode string \r
- specified by String.\r
-\r
- If String is NULL, then ASSERT().\r
- If String is not aligned on a 16-bit boundary, then ASSERT().\r
- If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
- PcdMaximumUnicodeStringLength Unicode characters, not including the\r
- Null-terminator, then ASSERT().\r
-\r
- @param String A pointer to a Null-terminated Unicode string.\r
-\r
- @return The size of String.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-StrSize (\r
- IN CONST CHAR16 *String\r
- )\r
-{\r
- return (StrLen (String) + 1) * sizeof (*String);\r
-}\r
-\r
-/**\r
- Compares two Null-terminated Unicode strings, and returns the difference\r
- between the first mismatched Unicode characters.\r
-\r
- This function compares the Null-terminated Unicode string FirstString to the\r
- Null-terminated Unicode string SecondString. If FirstString is identical to\r
- SecondString, then 0 is returned. Otherwise, the value returned is the first\r
- mismatched Unicode character in SecondString subtracted from the first\r
- mismatched Unicode character in FirstString.\r
-\r
- If FirstString is NULL, then ASSERT().\r
- If FirstString is not aligned on a 16-bit boundary, then ASSERT().\r
- If SecondString is NULL, then ASSERT().\r
- If SecondString is not aligned on a 16-bit boundary, then ASSERT().\r
- If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more\r
- than PcdMaximumUnicodeStringLength Unicode characters, not including the\r
- Null-terminator, then ASSERT().\r
- If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more\r
- than PcdMaximumUnicodeStringLength Unicode characters, not including the\r
- Null-terminator, then ASSERT().\r
-\r
- @param FirstString A pointer to a Null-terminated Unicode string.\r
- @param SecondString A pointer to a Null-terminated Unicode string.\r
-\r
- @retval 0 FirstString is identical to SecondString.\r
- @return others FirstString is not identical to SecondString.\r
-\r
-**/\r
-INTN\r
-EFIAPI\r
-StrCmp (\r
- IN CONST CHAR16 *FirstString,\r
- IN CONST CHAR16 *SecondString\r
- )\r
-{\r
- //\r
- // ASSERT both strings are less long than PcdMaximumUnicodeStringLength\r
- //\r
- ASSERT (StrSize (FirstString) != 0);\r
- ASSERT (StrSize (SecondString) != 0);\r
-\r
- while ((*FirstString != L'\0') && (*FirstString == *SecondString)) {\r
- FirstString++;\r
- SecondString++;\r
- }\r
- return *FirstString - *SecondString;\r
-}\r
-\r
-/**\r
- Compares up to a specified length the contents of two Null-terminated Unicode strings,\r
- and returns the difference between the first mismatched Unicode characters.\r
- \r
- This function compares the Null-terminated Unicode string FirstString to the\r
- Null-terminated Unicode string SecondString. At most, Length Unicode\r
- characters will be compared. If Length is 0, then 0 is returned. If\r
- FirstString is identical to SecondString, then 0 is returned. Otherwise, the\r
- value returned is the first mismatched Unicode character in SecondString\r
- subtracted from the first mismatched Unicode character in FirstString.\r
-\r
- If Length > 0 and FirstString is NULL, then ASSERT().\r
- If Length > 0 and FirstString is not aligned on a 16-bit boundary, then ASSERT().\r
- If Length > 0 and SecondString is NULL, then ASSERT().\r
- If Length > 0 and SecondString is not aligned on a 16-bit boundary, then ASSERT().\r
- If PcdMaximumUnicodeStringLength is not zero, and Length is greater than\r
- PcdMaximumUnicodeStringLength, then ASSERT().\r
- If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more than\r
- PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator,\r
- then ASSERT().\r
- If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more than\r
- PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator,\r
- then ASSERT().\r
-\r
- @param FirstString A pointer to a Null-terminated Unicode string.\r
- @param SecondString A pointer to a Null-terminated Unicode string.\r
- @param Length The maximum number of Unicode characters to compare.\r
-\r
- @retval 0 FirstString is identical to SecondString.\r
- @return others FirstString is not identical to SecondString.\r
-\r
-**/\r
-INTN\r
-EFIAPI\r
-StrnCmp (\r
- IN CONST CHAR16 *FirstString,\r
- IN CONST CHAR16 *SecondString,\r
- IN UINTN Length\r
- )\r
-{\r
- if (Length == 0) {\r
- return 0;\r
- }\r
-\r
- //\r
- // ASSERT both strings are less long than PcdMaximumUnicodeStringLength.\r
- // Length tests are performed inside StrLen().\r
- //\r
- ASSERT (StrSize (FirstString) != 0);\r
- ASSERT (StrSize (SecondString) != 0);\r
-\r
- if (PcdGet32 (PcdMaximumUnicodeStringLength) != 0) {\r
- ASSERT (Length <= PcdGet32 (PcdMaximumUnicodeStringLength));\r
- }\r
-\r
- while ((*FirstString != L'\0') &&\r
- (*FirstString == *SecondString) &&\r
- (Length > 1)) {\r
- FirstString++;\r
- SecondString++;\r
- Length--;\r
- }\r
-\r
- return *FirstString - *SecondString;\r
-}\r
-\r
-/**\r
- Concatenates one Null-terminated Unicode string to another Null-terminated\r
- Unicode string, and returns the concatenated Unicode string.\r
-\r
- This function concatenates two Null-terminated Unicode strings. The contents\r
- of Null-terminated Unicode string Source are concatenated to the end of\r
- Null-terminated Unicode string Destination. The Null-terminated concatenated\r
- Unicode String is returned. If Source and Destination overlap, then the\r
- results are undefined.\r
-\r
- If Destination is NULL, then ASSERT().\r
- If Destination is not aligned on a 16-bit boundary, then ASSERT().\r
- If Source is NULL, then ASSERT().\r
- If Source is not aligned on a 16-bit boundary, then ASSERT().\r
- If Source and Destination overlap, then ASSERT().\r
- If PcdMaximumUnicodeStringLength is not zero, and Destination contains more\r
- than PcdMaximumUnicodeStringLength Unicode characters, not including the\r
- Null-terminator, then ASSERT().\r
- If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
- PcdMaximumUnicodeStringLength Unicode characters, not including the\r
- Null-terminator, then ASSERT().\r
- If PcdMaximumUnicodeStringLength is not zero, and concatenating Destination\r
- and Source results in a Unicode string with more than\r
- PcdMaximumUnicodeStringLength Unicode characters, not including the\r
- Null-terminator, then ASSERT().\r
-\r
- @param Destination A pointer to a Null-terminated Unicode string.\r
- @param Source A pointer to a Null-terminated Unicode string.\r
-\r
- @return Destination.\r
-\r
-**/\r
-CHAR16 *\r
-EFIAPI\r
-StrCat (\r
- IN OUT CHAR16 *Destination,\r
- IN CONST CHAR16 *Source\r
- )\r
-{\r
- StrCpy (Destination + StrLen (Destination), Source);\r
-\r
- //\r
- // Size of the resulting string should never be zero.\r
- // PcdMaximumUnicodeStringLength is tested inside StrLen().\r
- //\r
- ASSERT (StrSize (Destination) != 0);\r
- return Destination;\r
-}\r
-\r
-/**\r
- Concatenates up to a specified length one Null-terminated Unicode to the end \r
- of another Null-terminated Unicode string, and returns the concatenated \r
- Unicode string.\r
-\r
- This function concatenates two Null-terminated Unicode strings. The contents\r
- of Null-terminated Unicode string Source are concatenated to the end of\r
- Null-terminated Unicode string Destination, and Destination is returned. At\r
- most, Length Unicode characters are concatenated from Source to the end of\r
- Destination, and Destination is always Null-terminated. If Length is 0, then\r
- Destination is returned unmodified. If Source and Destination overlap, then\r
- the results are undefined.\r
-\r
- If Destination is NULL, then ASSERT().\r
- If Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT().\r
- If Length > 0 and Source is NULL, then ASSERT().\r
- If Length > 0 and Source is not aligned on a 16-bit boundary, then ASSERT().\r
- If Source and Destination overlap, then ASSERT().\r
- If PcdMaximumUnicodeStringLength is not zero, and Length is greater than \r
- PcdMaximumUnicodeStringLength, then ASSERT().\r
- If PcdMaximumUnicodeStringLength is not zero, and Destination contains more\r
- than PcdMaximumUnicodeStringLength Unicode characters, not including the\r
- Null-terminator, then ASSERT().\r
- If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
- PcdMaximumUnicodeStringLength Unicode characters, not including the\r
- Null-terminator, then ASSERT().\r
- If PcdMaximumUnicodeStringLength is not zero, and concatenating Destination\r
- and Source results in a Unicode string with more than PcdMaximumUnicodeStringLength\r
- Unicode characters, not including the Null-terminator, then ASSERT().\r
-\r
- @param Destination A pointer to a Null-terminated Unicode string.\r
- @param Source A pointer to a Null-terminated Unicode string.\r
- @param Length The maximum number of Unicode characters to concatenate from\r
- Source.\r
-\r
- @return Destination.\r
-\r
-**/\r
-CHAR16 *\r
-EFIAPI\r
-StrnCat (\r
- IN OUT CHAR16 *Destination,\r
- IN CONST CHAR16 *Source,\r
- IN UINTN Length\r
- )\r
-{\r
- UINTN DestinationLen;\r
-\r
- DestinationLen = StrLen (Destination);\r
- StrnCpy (Destination + DestinationLen, Source, Length);\r
- Destination[DestinationLen + Length] = L'\0';\r
-\r
- //\r
- // Size of the resulting string should never be zero.\r
- // PcdMaximumUnicodeStringLength is tested inside StrLen().\r
- //\r
- ASSERT (StrSize (Destination) != 0);\r
- return Destination;\r
-}\r
-\r
-/**\r
- Returns the first occurrence of a Null-terminated Unicode sub-string\r
- in a Null-terminated Unicode string.\r
-\r
- This function scans the contents of the Null-terminated Unicode string\r
- specified by String and returns the first occurrence of SearchString.\r
- If SearchString is not found in String, then NULL is returned. If\r
- the length of SearchString is zero, then String is\r
- returned.\r
-\r
- If String is NULL, then ASSERT().\r
- If String is not aligned on a 16-bit boundary, then ASSERT().\r
- If SearchString is NULL, then ASSERT().\r
- If SearchString is not aligned on a 16-bit boundary, then ASSERT().\r
-\r
- If PcdMaximumUnicodeStringLength is not zero, and SearchString\r
- or String contains more than PcdMaximumUnicodeStringLength Unicode\r
- characters, not including the Null-terminator, then ASSERT().\r
-\r
- @param String A pointer to a Null-terminated Unicode string.\r
- @param SearchString A pointer to a Null-terminated Unicode string to search for.\r
-\r
- @retval NULL If the SearchString does not appear in String.\r
- @return others If there is a match.\r
-\r
-**/\r
-CHAR16 *\r
-EFIAPI\r
-StrStr (\r
- IN CONST CHAR16 *String,\r
- IN CONST CHAR16 *SearchString\r
- )\r
-{\r
- CONST CHAR16 *FirstMatch;\r
- CONST CHAR16 *SearchStringTmp;\r
-\r
- //\r
- // ASSERT both strings are less long than PcdMaximumUnicodeStringLength.\r
- // Length tests are performed inside StrLen().\r
- //\r
- ASSERT (StrSize (String) != 0);\r
- ASSERT (StrSize (SearchString) != 0);\r
-\r
- if (*SearchString == L'\0') {\r
- return (CHAR16 *) String;\r
- }\r
-\r
- while (*String != L'\0') {\r
- SearchStringTmp = SearchString;\r
- FirstMatch = String;\r
- \r
- while ((*String == *SearchStringTmp) \r
- && (*String != L'\0')) {\r
- String++;\r
- SearchStringTmp++;\r
- } \r
- \r
- if (*SearchStringTmp == L'\0') {\r
- return (CHAR16 *) FirstMatch;\r
- }\r
-\r
- if (*String == L'\0') {\r
- return NULL;\r
- }\r
-\r
- String = FirstMatch + 1;\r
- }\r
-\r
- return NULL;\r
-}\r
-\r
-/**\r
- Check if a Unicode character is a decimal character.\r
-\r
- This internal function checks if a Unicode character is a \r
- decimal character. The valid decimal character is from\r
- L'0' to L'9'.\r
-\r
- @param Char The character to check against.\r
-\r
- @retval TRUE If the Char is a decmial character.\r
- @retval FALSE If the Char is not a decmial character.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-InternalIsDecimalDigitCharacter (\r
- IN CHAR16 Char\r
- )\r
-{\r
- return (BOOLEAN) (Char >= L'0' && Char <= L'9');\r
-}\r
-\r
-/**\r
- Convert a Unicode character to upper case only if \r
- it maps to a valid small-case ASCII character.\r
-\r
- This internal function only deal with Unicode character\r
- which maps to a valid small-case ASCII character, i.e.\r
- L'a' to L'z'. For other Unicode character, the input character\r
- is returned directly.\r
-\r
- @param Char The character to convert.\r
-\r
- @retval LowerCharacter If the Char is with range L'a' to L'z'.\r
- @retval Unchanged Otherwise.\r
-\r
-**/\r
-CHAR16\r
-EFIAPI\r
-InternalCharToUpper (\r
- IN CHAR16 Char\r
- )\r
-{\r
- if (Char >= L'a' && Char <= L'z') {\r
- return (CHAR16) (Char - (L'a' - L'A'));\r
- }\r
-\r
- return Char;\r
-}\r
-\r
-/**\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
-InternalHexCharToUintn (\r
- IN CHAR16 Char\r
- )\r
-{\r
- if (InternalIsDecimalDigitCharacter (Char)) {\r
- return Char - L'0';\r
- }\r
-\r
- return (UINTN) (10 + InternalCharToUpper (Char) - L'A');\r
-}\r
-\r
-/**\r
- Check if a Unicode character is a hexadecimal character.\r
-\r
- This internal function checks if a Unicode character is a \r
- decimal character. The valid hexadecimal character is \r
- L'0' to L'9', L'a' to L'f', or L'A' to L'F'.\r
-\r
-\r
- @param Char The character to check against.\r
-\r
- @retval TRUE If the Char is a hexadecmial character.\r
- @retval FALSE If the Char is not a hexadecmial character.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-InternalIsHexaDecimalDigitCharacter (\r
- IN CHAR16 Char\r
- )\r
-{\r
-\r
- return (BOOLEAN) (InternalIsDecimalDigitCharacter (Char) ||\r
- (Char >= L'A' && Char <= L'F') ||\r
- (Char >= L'a' && Char <= L'f'));\r
-}\r
-\r
-/**\r
- Convert a Null-terminated Unicode decimal string to a value of\r
- type UINTN.\r
-\r
- This function returns a value of type UINTN by interpreting the contents\r
- of the Unicode string specified by String as a decimal number. The format\r
- of the input Unicode string String is:\r
-\r
- [spaces] [decimal digits].\r
-\r
- The valid decimal digit character is in the range [0-9]. The\r
- function will ignore the pad space, which includes spaces or\r
- tab characters, before [decimal digits]. The running zero in the\r
- beginning of [decimal digits] will be ignored. Then, the function\r
- stops at the first character that is a not a valid decimal character\r
- or a Null-terminator, whichever one comes first.\r
-\r
- If String is NULL, then ASSERT().\r
- If String is not aligned in a 16-bit boundary, then ASSERT().\r
- If String has only pad spaces, then 0 is returned.\r
- If String has no pad spaces or valid decimal digits,\r
- then 0 is returned.\r
- If the number represented by String overflows according\r
- to the range defined by UINTN, then ASSERT().\r
-\r
- If PcdMaximumUnicodeStringLength is not zero, and String contains\r
- more than PcdMaximumUnicodeStringLength Unicode characters, not including\r
- the Null-terminator, then ASSERT().\r
-\r
- @param String A pointer to a Null-terminated Unicode string.\r
-\r
- @retval Value translated from String.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-StrDecimalToUintn (\r
- IN CONST CHAR16 *String\r
- )\r
-{\r
- UINTN Result;\r
- \r
- //\r
- // ASSERT String is less long than PcdMaximumUnicodeStringLength.\r
- // Length tests are performed inside StrLen().\r
- //\r
- ASSERT (StrSize (String) != 0);\r
-\r
- //\r
- // Ignore the pad spaces (space or tab)\r
- //\r
- while ((*String == L' ') || (*String == L'\t')) {\r
- String++;\r
- }\r
-\r
- //\r
- // Ignore leading Zeros after the spaces\r
- //\r
- while (*String == L'0') {\r
- String++;\r
- }\r
-\r
- Result = 0;\r
-\r
- while (InternalIsDecimalDigitCharacter (*String)) {\r
- //\r
- // If the number represented by String overflows according \r
- // to the range defined by UINTN, then ASSERT().\r
- //\r
- ASSERT (Result <= ((((UINTN) ~0) - (*String - L'0')) / 10));\r
-\r
- Result = Result * 10 + (*String - L'0');\r
- String++;\r
- }\r
- \r
- return Result;\r
-}\r
-\r
-\r
-/**\r
- Convert a Null-terminated Unicode decimal string to a value of\r
- type UINT64.\r
-\r
- This function returns a value of type UINT64 by interpreting the contents\r
- of the Unicode string specified by String as a decimal number. The format\r
- of the input Unicode string String is:\r
-\r
- [spaces] [decimal digits].\r
-\r
- The valid decimal digit character is in the range [0-9]. The\r
- function will ignore the pad space, which includes spaces or\r
- tab characters, before [decimal digits]. The running zero in the\r
- beginning of [decimal digits] will be ignored. Then, the function\r
- stops at the first character that is a not a valid decimal character\r
- or a Null-terminator, whichever one comes first.\r
-\r
- If String is NULL, then ASSERT().\r
- If String is not aligned in a 16-bit boundary, then ASSERT().\r
- If String has only pad spaces, then 0 is returned.\r
- If String has no pad spaces or valid decimal digits,\r
- then 0 is returned.\r
- If the number represented by String overflows according\r
- to the range defined by UINT64, then ASSERT().\r
-\r
- If PcdMaximumUnicodeStringLength is not zero, and String contains\r
- more than PcdMaximumUnicodeStringLength Unicode characters, not including\r
- the Null-terminator, then ASSERT().\r
-\r
- @param String A pointer to a Null-terminated Unicode string.\r
-\r
- @retval Value translated from String.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-StrDecimalToUint64 (\r
- IN CONST CHAR16 *String\r
- )\r
-{\r
- UINT64 Result;\r
- \r
- //\r
- // ASSERT String is less long than PcdMaximumUnicodeStringLength.\r
- // Length tests are performed inside StrLen().\r
- //\r
- ASSERT (StrSize (String) != 0);\r
-\r
- //\r
- // Ignore the pad spaces (space or tab)\r
- //\r
- while ((*String == L' ') || (*String == L'\t')) {\r
- String++;\r
- }\r
-\r
- //\r
- // Ignore leading Zeros after the spaces\r
- //\r
- while (*String == L'0') {\r
- String++;\r
- }\r
-\r
- Result = 0;\r
-\r
- while (InternalIsDecimalDigitCharacter (*String)) {\r
- //\r
- // If the number represented by String overflows according \r
- // to the range defined by UINTN, then ASSERT().\r
- //\r
- ASSERT (Result <= DivU64x32 (((UINT64) ~0) - (*String - L'0') , 10));\r
-\r
- Result = MultU64x32 (Result, 10) + (*String - L'0');\r
- String++;\r
- }\r
- \r
- return Result;\r
-}\r
-\r
-/**\r
- Convert a Null-terminated Unicode hexadecimal string to a value of type UINTN.\r
-\r
- This function returns a value of type UINTN by interpreting the contents\r
- of the Unicode string specified by String as a hexadecimal number.\r
- The format of the input Unicode string String is:\r
-\r
- [spaces][zeros][x][hexadecimal digits].\r
-\r
- The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].\r
- The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix.\r
- If "x" appears in the input string, it must be prefixed with at least one 0.\r
- The function will ignore the pad space, which includes spaces or tab characters,\r
- before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or\r
- [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the\r
- first valid hexadecimal digit. Then, the function stops at the first character that is\r
- a not a valid hexadecimal character or NULL, whichever one comes first.\r
-\r
- If String is NULL, then ASSERT().\r
- If String is not aligned in a 16-bit boundary, then ASSERT().\r
- If String has only pad spaces, then zero is returned.\r
- If String has no leading pad spaces, leading zeros or valid hexadecimal digits,\r
- then zero is returned.\r
- If the number represented by String overflows according to the range defined by\r
- UINTN, then ASSERT().\r
-\r
- If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
- PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator,\r
- then ASSERT().\r
-\r
- @param String A pointer to a Null-terminated Unicode string.\r
-\r
- @retval Value translated from String.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-StrHexToUintn (\r
- IN CONST CHAR16 *String\r
- )\r
-{\r
- UINTN Result;\r
-\r
- //\r
- // ASSERT String is less long than PcdMaximumUnicodeStringLength.\r
- // Length tests are performed inside StrLen().\r
- //\r
- ASSERT (StrSize (String) != 0);\r
- \r
- //\r
- // Ignore the pad spaces (space or tab) \r
- //\r
- while ((*String == L' ') || (*String == L'\t')) {\r
- String++;\r
- }\r
-\r
- //\r
- // Ignore leading Zeros after the spaces\r
- //\r
- while (*String == L'0') {\r
- String++;\r
- }\r
-\r
- if (InternalCharToUpper (*String) == L'X') {\r
- if (*(String - 1) != L'0') {\r
- return 0;\r
- }\r
- //\r
- // Skip the 'X'\r
- //\r
- String++;\r
- }\r
-\r
- Result = 0;\r
- \r
- while (InternalIsHexaDecimalDigitCharacter (*String)) {\r
- //\r
- // If the Hex Number represented by String overflows according \r
- // to the range defined by UINTN, then ASSERT().\r
- //\r
- ASSERT (Result <= ((((UINTN) ~0) - InternalHexCharToUintn (*String)) >> 4));\r
-\r
- Result = (Result << 4) + InternalHexCharToUintn (*String);\r
- String++;\r
- }\r
-\r
- return Result;\r
-}\r
-\r
-\r
-/**\r
- Convert a Null-terminated Unicode hexadecimal string to a value of type UINT64.\r
-\r
- This function returns a value of type UINT64 by interpreting the contents\r
- of the Unicode string specified by String as a hexadecimal number.\r
- The format of the input Unicode string String is\r
-\r
- [spaces][zeros][x][hexadecimal digits].\r
-\r
- The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].\r
- The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix.\r
- If "x" appears in the input string, it must be prefixed with at least one 0.\r
- The function will ignore the pad space, which includes spaces or tab characters,\r
- before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or\r
- [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the\r
- first valid hexadecimal digit. Then, the function stops at the first character that is\r
- a not a valid hexadecimal character or NULL, whichever one comes first.\r
-\r
- If String is NULL, then ASSERT().\r
- If String is not aligned in a 16-bit boundary, then ASSERT().\r
- If String has only pad spaces, then zero is returned.\r
- If String has no leading pad spaces, leading zeros or valid hexadecimal digits,\r
- then zero is returned.\r
- If the number represented by String overflows according to the range defined by\r
- UINT64, then ASSERT().\r
-\r
- If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
- PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator,\r
- then ASSERT().\r
-\r
- @param String A pointer to a Null-terminated Unicode string.\r
-\r
- @retval Value translated from String.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-StrHexToUint64 (\r
- IN CONST CHAR16 *String\r
- )\r
-{\r
- UINT64 Result;\r
-\r
- //\r
- // ASSERT String is less long than PcdMaximumUnicodeStringLength.\r
- // Length tests are performed inside StrLen().\r
- //\r
- ASSERT (StrSize (String) != 0);\r
- \r
- //\r
- // Ignore the pad spaces (space or tab) \r
- //\r
- while ((*String == L' ') || (*String == L'\t')) {\r
- String++;\r
- }\r
-\r
- //\r
- // Ignore leading Zeros after the spaces\r
- //\r
- while (*String == L'0') {\r
- String++;\r
- }\r
-\r
- if (InternalCharToUpper (*String) == L'X') {\r
- ASSERT (*(String - 1) == L'0');\r
- if (*(String - 1) != L'0') {\r
- return 0;\r
- }\r
- //\r
- // Skip the 'X'\r
- //\r
- String++;\r
- }\r
-\r
- Result = 0;\r
- \r
- while (InternalIsHexaDecimalDigitCharacter (*String)) {\r
- //\r
- // If the Hex Number represented by String overflows according \r
- // to the range defined by UINTN, then ASSERT().\r
- //\r
- ASSERT (Result <= RShiftU64 (((UINT64) ~0) - InternalHexCharToUintn (*String) , 4));\r
-\r
- Result = LShiftU64 (Result, 4);\r
- Result = Result + InternalHexCharToUintn (*String);\r
- String++;\r
- }\r
-\r
- return Result;\r
-}\r
-\r
-/**\r
- Check if a ASCII character is a decimal character.\r
-\r
- This internal function checks if a Unicode character is a \r
- decimal character. The valid decimal character is from\r
- '0' to '9'.\r
-\r
- @param Char The character to check against.\r
-\r
- @retval TRUE If the Char is a decmial character.\r
- @retval FALSE If the Char is not a decmial character.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-InternalAsciiIsDecimalDigitCharacter (\r
- IN CHAR8 Char\r
- )\r
-{\r
- return (BOOLEAN) (Char >= '0' && Char <= '9');\r
-}\r
-\r
-/**\r
- Check if a ASCII character is a hexadecimal character.\r
-\r
- This internal function checks if a ASCII character is a \r
- decimal character. The valid hexadecimal character is \r
- L'0' to L'9', L'a' to L'f', or L'A' to L'F'.\r
-\r
-\r
- @param Char The character to check against.\r
-\r
- @retval TRUE If the Char is a hexadecmial character.\r
- @retval FALSE If the Char is not a hexadecmial character.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-InternalAsciiIsHexaDecimalDigitCharacter (\r
- IN CHAR8 Char\r
- )\r
-{\r
-\r
- return (BOOLEAN) (InternalAsciiIsDecimalDigitCharacter (Char) ||\r
- (Char >= 'A' && Char <= 'F') ||\r
- (Char >= 'a' && Char <= 'f'));\r
-}\r
-\r
-/**\r
- Convert a Null-terminated Unicode string to a Null-terminated\r
- ASCII string and returns the ASCII string.\r
-\r
- This function converts the content of the Unicode string Source\r
- to the ASCII string Destination by copying the lower 8 bits of\r
- each Unicode character. It returns Destination.\r
-\r
- If any Unicode characters in Source contain non-zero value in\r
- the upper 8 bits, then ASSERT().\r
-\r
- If Destination is NULL, then ASSERT().\r
- If Source is NULL, then ASSERT().\r
- If Source is not aligned on a 16-bit boundary, then ASSERT().\r
- If Source and Destination overlap, then ASSERT().\r
-\r
- If PcdMaximumUnicodeStringLength is not zero, and Source contains\r
- more than PcdMaximumUnicodeStringLength Unicode characters, not including\r
- the Null-terminator, then ASSERT().\r
-\r
- If PcdMaximumAsciiStringLength is not zero, and Source contains more\r
- than PcdMaximumAsciiStringLength Unicode characters, not including the\r
- Null-terminator, then ASSERT().\r
-\r
- @param Source A pointer to a Null-terminated Unicode string.\r
- @param Destination A pointer to a Null-terminated ASCII string.\r
-\r
- @return Destination.\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-UnicodeStrToAsciiStr (\r
- IN CONST CHAR16 *Source,\r
- OUT CHAR8 *Destination\r
- )\r
-{\r
- CHAR8 *ReturnValue;\r
-\r
- ASSERT (Destination != NULL);\r
-\r
- //\r
- // ASSERT if Source is long than PcdMaximumUnicodeStringLength.\r
- // Length tests are performed inside StrLen().\r
- //\r
- ASSERT (StrSize (Source) != 0);\r
-\r
- //\r
- // Source and Destination should not overlap\r
- //\r
- ASSERT ((UINTN) ((CHAR16 *) Destination - Source) > StrLen (Source));\r
- ASSERT ((UINTN) ((CHAR8 *) Source - Destination) > StrLen (Source));\r
-\r
-\r
- ReturnValue = Destination;\r
- while (*Source != '\0') {\r
- //\r
- // If any Unicode characters in Source contain \r
- // non-zero value in the upper 8 bits, then ASSERT().\r
- //\r
- ASSERT (*Source < 0x100);\r
- *(Destination++) = (CHAR8) *(Source++);\r
- }\r
-\r
- *Destination = '\0';\r
-\r
- //\r
- // ASSERT Original Destination is less long than PcdMaximumAsciiStringLength.\r
- // Length tests are performed inside AsciiStrLen().\r
- //\r
- ASSERT (AsciiStrSize (ReturnValue) != 0);\r
-\r
- return ReturnValue;\r
-}\r
-\r
-\r
-/**\r
- Copies one Null-terminated ASCII string to another Null-terminated ASCII\r
- string and returns the new ASCII string.\r
-\r
- This function copies the contents of the ASCII string Source to the ASCII\r
- string Destination, and returns Destination. If Source and Destination\r
- overlap, then the results are undefined.\r
-\r
- If Destination is NULL, then ASSERT().\r
- If Source is NULL, then ASSERT().\r
- If Source and Destination overlap, then ASSERT().\r
- If PcdMaximumAsciiStringLength is not zero and Source contains more than\r
- PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,\r
- then ASSERT().\r
-\r
- @param Destination A pointer to a Null-terminated ASCII string.\r
- @param Source A pointer to a Null-terminated ASCII string.\r
-\r
- @return Destination\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-AsciiStrCpy (\r
- OUT CHAR8 *Destination,\r
- IN CONST CHAR8 *Source\r
- )\r
-{\r
- CHAR8 *ReturnValue;\r
-\r
- //\r
- // Destination cannot be NULL\r
- //\r
- ASSERT (Destination != NULL);\r
-\r
- //\r
- // Destination and source cannot overlap\r
- //\r
- ASSERT ((UINTN)(Destination - Source) > AsciiStrLen (Source));\r
- ASSERT ((UINTN)(Source - Destination) > AsciiStrLen (Source));\r
-\r
- ReturnValue = Destination;\r
- while (*Source != 0) {\r
- *(Destination++) = *(Source++);\r
- }\r
- *Destination = 0;\r
- return ReturnValue;\r
-}\r
-\r
-/**\r
- Copies up to a specified length one Null-terminated ASCII string to another \r
- Null-terminated ASCII string and returns the new ASCII string.\r
-\r
- This function copies the contents of the ASCII string Source to the ASCII\r
- string Destination, and returns Destination. At most, Length ASCII characters\r
- are copied from Source to Destination. If Length is 0, then Destination is\r
- returned unmodified. If Length is greater that the number of ASCII characters\r
- in Source, then Destination is padded with Null ASCII characters. If Source\r
- and Destination overlap, then the results are undefined.\r
-\r
- If Destination is NULL, then ASSERT().\r
- If Source is NULL, then ASSERT().\r
- If Source and Destination overlap, then ASSERT().\r
- If PcdMaximumAsciiStringLength is not zero, and Length is greater than \r
- PcdMaximumAsciiStringLength, then ASSERT().\r
- If PcdMaximumAsciiStringLength is not zero, and Source contains more than\r
- PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,\r
- then ASSERT().\r
-\r
- @param Destination A pointer to a Null-terminated ASCII string.\r
- @param Source A pointer to a Null-terminated ASCII string.\r
- @param Length The maximum number of ASCII characters to copy.\r
-\r
- @return Destination\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-AsciiStrnCpy (\r
- OUT CHAR8 *Destination,\r
- IN CONST CHAR8 *Source,\r
- IN UINTN Length\r
- )\r
-{\r
- CHAR8 *ReturnValue;\r
-\r
- if (Length == 0) {\r
- return Destination;\r
- }\r
-\r
- //\r
- // Destination cannot be NULL\r
- //\r
- ASSERT (Destination != NULL);\r
-\r
- //\r
- // Destination and source cannot overlap\r
- //\r
- ASSERT ((UINTN)(Destination - Source) > AsciiStrLen (Source));\r
- ASSERT ((UINTN)(Source - Destination) >= Length);\r
-\r
- if (PcdGet32 (PcdMaximumAsciiStringLength) != 0) {\r
- ASSERT (Length <= PcdGet32 (PcdMaximumAsciiStringLength));\r
- }\r
-\r
- ReturnValue = Destination;\r
-\r
- while (*Source != 0 && Length > 0) {\r
- *(Destination++) = *(Source++);\r
- Length--;\r
- }\r
-\r
- ZeroMem (Destination, Length * sizeof (*Destination));\r
- return ReturnValue;\r
-}\r
-\r
-/**\r
- Returns the length of a Null-terminated ASCII string.\r
-\r
- This function returns the number of ASCII characters in the Null-terminated\r
- ASCII string specified by String.\r
-\r
- If Length > 0 and Destination is NULL, then ASSERT().\r
- If Length > 0 and Source is NULL, then ASSERT().\r
- If PcdMaximumAsciiStringLength is not zero and String contains more than\r
- PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,\r
- then ASSERT().\r
-\r
- @param String A pointer to a Null-terminated ASCII string.\r
-\r
- @return The length of String.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsciiStrLen (\r
- IN CONST CHAR8 *String\r
- )\r
-{\r
- UINTN Length;\r
-\r
- ASSERT (String != NULL);\r
-\r
- for (Length = 0; *String != '\0'; String++, Length++) {\r
- //\r
- // If PcdMaximumUnicodeStringLength is not zero,\r
- // length should not more than PcdMaximumUnicodeStringLength\r
- //\r
- if (PcdGet32 (PcdMaximumAsciiStringLength) != 0) {\r
- ASSERT (Length < PcdGet32 (PcdMaximumAsciiStringLength));\r
- }\r
- }\r
- return Length;\r
-}\r
-\r
-/**\r
- Returns the size of a Null-terminated ASCII string in bytes, including the\r
- Null terminator.\r
-\r
- This function returns the size, in bytes, of the Null-terminated ASCII string\r
- specified by String.\r
-\r
- If String is NULL, then ASSERT().\r
- If PcdMaximumAsciiStringLength is not zero and String contains more than\r
- PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,\r
- then ASSERT().\r
-\r
- @param String A pointer to a Null-terminated ASCII string.\r
-\r
- @return The size of String.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsciiStrSize (\r
- IN CONST CHAR8 *String\r
- )\r
-{\r
- return (AsciiStrLen (String) + 1) * sizeof (*String);\r
-}\r
-\r
-/**\r
- Compares two Null-terminated ASCII strings, and returns the difference\r
- between the first mismatched ASCII characters.\r
-\r
- This function compares the Null-terminated ASCII string FirstString to the\r
- Null-terminated ASCII string SecondString. If FirstString is identical to\r
- SecondString, then 0 is returned. Otherwise, the value returned is the first\r
- mismatched ASCII character in SecondString subtracted from the first\r
- mismatched ASCII character in FirstString.\r
-\r
- If FirstString is NULL, then ASSERT().\r
- If SecondString is NULL, then ASSERT().\r
- If PcdMaximumAsciiStringLength is not zero and FirstString contains more than\r
- PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,\r
- then ASSERT().\r
- If PcdMaximumAsciiStringLength is not zero and SecondString contains more\r
- than PcdMaximumAsciiStringLength ASCII characters, not including the\r
- Null-terminator, then ASSERT().\r
-\r
- @param FirstString A pointer to a Null-terminated ASCII string.\r
- @param SecondString A pointer to a Null-terminated ASCII string.\r
-\r
- @retval ==0 FirstString is identical to SecondString.\r
- @retval !=0 FirstString is not identical to SecondString.\r
-\r
-**/\r
-INTN\r
-EFIAPI\r
-AsciiStrCmp (\r
- IN CONST CHAR8 *FirstString,\r
- IN CONST CHAR8 *SecondString\r
- )\r
-{\r
- //\r
- // ASSERT both strings are less long than PcdMaximumAsciiStringLength\r
- //\r
- ASSERT (AsciiStrSize (FirstString));\r
- ASSERT (AsciiStrSize (SecondString));\r
-\r
- while ((*FirstString != '\0') && (*FirstString == *SecondString)) {\r
- FirstString++;\r
- SecondString++;\r
- }\r
-\r
- return *FirstString - *SecondString;\r
-}\r
-\r
-/**\r
- Converts a lowercase Ascii character to upper one.\r
-\r
- If Chr is lowercase Ascii character, then converts it to upper one.\r
-\r
- If Value >= 0xA0, then ASSERT().\r
- If (Value & 0x0F) >= 0x0A, then ASSERT().\r
-\r
- @param Chr one Ascii character\r
-\r
- @return The uppercase value of Ascii character \r
-\r
-**/\r
-CHAR8\r
-EFIAPI\r
-InternalBaseLibAsciiToUpper (\r
- IN CHAR8 Chr\r
- )\r
-{\r
- return (UINT8) ((Chr >= 'a' && Chr <= 'z') ? Chr - ('a' - 'A') : Chr);\r
-}\r
-\r
-/**\r
- Convert a ASCII 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
- '0' to '9', 'a' to 'f' or 'A' to 'F'. For other \r
- ASCII 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
-InternalAsciiHexCharToUintn (\r
- IN CHAR8 Char\r
- )\r
-{\r
- if (InternalIsDecimalDigitCharacter (Char)) {\r
- return Char - '0';\r
- }\r
-\r
- return (UINTN) (10 + InternalBaseLibAsciiToUpper (Char) - 'A');\r
-}\r
-\r
-\r
-/**\r
- Performs a case insensitive comparison of two Null-terminated ASCII strings,\r
- and returns the difference between the first mismatched ASCII characters.\r
-\r
- This function performs a case insensitive comparison of the Null-terminated\r
- ASCII string FirstString to the Null-terminated ASCII string SecondString. If\r
- FirstString is identical to SecondString, then 0 is returned. Otherwise, the\r
- value returned is the first mismatched lower case ASCII character in\r
- SecondString subtracted from the first mismatched lower case ASCII character\r
- in FirstString.\r
-\r
- If FirstString is NULL, then ASSERT().\r
- If SecondString is NULL, then ASSERT().\r
- If PcdMaximumAsciiStringLength is not zero and FirstString contains more than\r
- PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,\r
- then ASSERT().\r
- If PcdMaximumAsciiStringLength is not zero and SecondString contains more\r
- than PcdMaximumAsciiStringLength ASCII characters, not including the\r
- Null-terminator, then ASSERT().\r
-\r
- @param FirstString A pointer to a Null-terminated ASCII string.\r
- @param SecondString A pointer to a Null-terminated ASCII string.\r
-\r
- @retval ==0 FirstString is identical to SecondString using case insensitive\r
- comparisons.\r
- @retval !=0 FirstString is not identical to SecondString using case\r
- insensitive comparisons.\r
-\r
-**/\r
-INTN\r
-EFIAPI\r
-AsciiStriCmp (\r
- IN CONST CHAR8 *FirstString,\r
- IN CONST CHAR8 *SecondString\r
- )\r
-{\r
- CHAR8 UpperFirstString;\r
- CHAR8 UpperSecondString;\r
-\r
- //\r
- // ASSERT both strings are less long than PcdMaximumAsciiStringLength\r
- //\r
- ASSERT (AsciiStrSize (FirstString));\r
- ASSERT (AsciiStrSize (SecondString));\r
-\r
- UpperFirstString = InternalBaseLibAsciiToUpper (*FirstString);\r
- UpperSecondString = InternalBaseLibAsciiToUpper (*SecondString);\r
- while ((*FirstString != '\0') && (UpperFirstString == UpperSecondString)) {\r
- FirstString++;\r
- SecondString++;\r
- UpperFirstString = InternalBaseLibAsciiToUpper (*FirstString);\r
- UpperSecondString = InternalBaseLibAsciiToUpper (*SecondString);\r
- }\r
-\r
- return UpperFirstString - UpperSecondString;\r
-}\r
-\r
-/**\r
- Compares two Null-terminated ASCII strings with maximum lengths, and returns\r
- the difference between the first mismatched ASCII characters.\r
-\r
- This function compares the Null-terminated ASCII string FirstString to the\r
- Null-terminated ASCII string SecondString. At most, Length ASCII characters\r
- will be compared. If Length is 0, then 0 is returned. If FirstString is\r
- identical to SecondString, then 0 is returned. Otherwise, the value returned\r
- is the first mismatched ASCII character in SecondString subtracted from the\r
- first mismatched ASCII character in FirstString.\r
-\r
- If Length > 0 and FirstString is NULL, then ASSERT().\r
- If Length > 0 and SecondString is NULL, then ASSERT().\r
- If PcdMaximumAsciiStringLength is not zero, and Length is greater than \r
- PcdMaximumAsciiStringLength, then ASSERT().\r
- If PcdMaximumAsciiStringLength is not zero, and FirstString contains more than\r
- PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,\r
- then ASSERT().\r
- If PcdMaximumAsciiStringLength is not zero, and SecondString contains more than\r
- PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,\r
- then ASSERT().\r
-\r
- @param FirstString A pointer to a Null-terminated ASCII string.\r
- @param SecondString A pointer to a Null-terminated ASCII string.\r
- @param Length The maximum number of ASCII characters for compare.\r
- \r
- @retval ==0 FirstString is identical to SecondString.\r
- @retval !=0 FirstString is not identical to SecondString.\r
-\r
-**/\r
-INTN\r
-EFIAPI\r
-AsciiStrnCmp (\r
- IN CONST CHAR8 *FirstString,\r
- IN CONST CHAR8 *SecondString,\r
- IN UINTN Length\r
- )\r
-{\r
- if (Length == 0) {\r
- return 0;\r
- }\r
-\r
- //\r
- // ASSERT both strings are less long than PcdMaximumAsciiStringLength\r
- //\r
- ASSERT (AsciiStrSize (FirstString));\r
- ASSERT (AsciiStrSize (SecondString));\r
-\r
- if (PcdGet32 (PcdMaximumAsciiStringLength) != 0) {\r
- ASSERT (Length <= PcdGet32 (PcdMaximumAsciiStringLength));\r
- }\r
-\r
- while ((*FirstString != '\0') &&\r
- (*FirstString == *SecondString) &&\r
- (Length > 1)) {\r
- FirstString++;\r
- SecondString++;\r
- Length--;\r
- }\r
- return *FirstString - *SecondString;\r
-}\r
-\r
-/**\r
- Concatenates one Null-terminated ASCII string to another Null-terminated\r
- ASCII string, and returns the concatenated ASCII string.\r
-\r
- This function concatenates two Null-terminated ASCII strings. The contents of\r
- Null-terminated ASCII string Source are concatenated to the end of Null-\r
- terminated ASCII string Destination. The Null-terminated concatenated ASCII\r
- String is returned.\r
-\r
- If Destination is NULL, then ASSERT().\r
- If Source is NULL, then ASSERT().\r
- If PcdMaximumAsciiStringLength is not zero and Destination contains more than\r
- PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,\r
- then ASSERT().\r
- If PcdMaximumAsciiStringLength is not zero and Source contains more than\r
- PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,\r
- then ASSERT().\r
- If PcdMaximumAsciiStringLength is not zero and concatenating Destination and\r
- Source results in a ASCII string with more than PcdMaximumAsciiStringLength\r
- ASCII characters, then ASSERT().\r
-\r
- @param Destination A pointer to a Null-terminated ASCII string.\r
- @param Source A pointer to a Null-terminated ASCII string.\r
-\r
- @return Destination\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-AsciiStrCat (\r
- IN OUT CHAR8 *Destination,\r
- IN CONST CHAR8 *Source\r
- )\r
-{\r
- AsciiStrCpy (Destination + AsciiStrLen (Destination), Source);\r
-\r
- //\r
- // Size of the resulting string should never be zero.\r
- // PcdMaximumUnicodeStringLength is tested inside StrLen().\r
- //\r
- ASSERT (AsciiStrSize (Destination) != 0);\r
- return Destination;\r
-}\r
-\r
-/**\r
- Concatenates up to a specified length one Null-terminated ASCII string to \r
- the end of another Null-terminated ASCII string, and returns the \r
- concatenated ASCII string.\r
-\r
- This function concatenates two Null-terminated ASCII strings. The contents\r
- of Null-terminated ASCII string Source are concatenated to the end of Null-\r
- terminated ASCII string Destination, and Destination is returned. At most,\r
- Length ASCII characters are concatenated from Source to the end of\r
- Destination, and Destination is always Null-terminated. If Length is 0, then\r
- Destination is returned unmodified. If Source and Destination overlap, then\r
- the results are undefined.\r
-\r
- If Length > 0 and Destination is NULL, then ASSERT().\r
- If Length > 0 and Source is NULL, then ASSERT().\r
- If Source and Destination overlap, then ASSERT().\r
- If PcdMaximumAsciiStringLength is not zero, and Length is greater than\r
- PcdMaximumAsciiStringLength, then ASSERT().\r
- If PcdMaximumAsciiStringLength is not zero, and Destination contains more than\r
- PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,\r
- then ASSERT().\r
- If PcdMaximumAsciiStringLength is not zero, and Source contains more than\r
- PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,\r
- then ASSERT().\r
- If PcdMaximumAsciiStringLength is not zero, and concatenating Destination and\r
- Source results in a ASCII string with more than PcdMaximumAsciiStringLength\r
- ASCII characters, not including the Null-terminator, then ASSERT().\r
-\r
- @param Destination A pointer to a Null-terminated ASCII string.\r
- @param Source A pointer to a Null-terminated ASCII string.\r
- @param Length The maximum number of ASCII characters to concatenate from\r
- Source.\r
-\r
- @return Destination\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-AsciiStrnCat (\r
- IN OUT CHAR8 *Destination,\r
- IN CONST CHAR8 *Source,\r
- IN UINTN Length\r
- )\r
-{\r
- UINTN DestinationLen;\r
-\r
- DestinationLen = AsciiStrLen (Destination);\r
- AsciiStrnCpy (Destination + DestinationLen, Source, Length);\r
- Destination[DestinationLen + Length] = '\0';\r
-\r
- //\r
- // Size of the resulting string should never be zero.\r
- // PcdMaximumUnicodeStringLength is tested inside StrLen().\r
- //\r
- ASSERT (AsciiStrSize (Destination) != 0);\r
- return Destination;\r
-}\r
-\r
-/**\r
- Returns the first occurrence of a Null-terminated ASCII sub-string\r
- in a Null-terminated ASCII string.\r
-\r
- This function scans the contents of the ASCII string specified by String\r
- and returns the first occurrence of SearchString. If SearchString is not\r
- found in String, then NULL is returned. If the length of SearchString is zero,\r
- then String is returned.\r
-\r
- If String is NULL, then ASSERT().\r
- If SearchString is NULL, then ASSERT().\r
-\r
- If PcdMaximumAsciiStringLength is not zero, and SearchString or\r
- String contains more than PcdMaximumAsciiStringLength Unicode characters\r
- not including the Null-terminator, then ASSERT().\r
-\r
- @param String A pointer to a Null-terminated ASCII string.\r
- @param SearchString A pointer to a Null-terminated ASCII string to search for.\r
-\r
- @retval NULL If the SearchString does not appear in String.\r
- @retval others If there is a match return the first occurrence of SearchingString.\r
- If the length of SearchString is zero,return String.\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-AsciiStrStr (\r
- IN CONST CHAR8 *String,\r
- IN CONST CHAR8 *SearchString\r
- )\r
-{\r
- CONST CHAR8 *FirstMatch;\r
- CONST CHAR8 *SearchStringTmp;\r
-\r
- //\r
- // ASSERT both strings are less long than PcdMaximumAsciiStringLength\r
- //\r
- ASSERT (AsciiStrSize (String) != 0);\r
- ASSERT (AsciiStrSize (SearchString) != 0);\r
-\r
- if (*SearchString == '\0') {\r
- return (CHAR8 *) String;\r
- }\r
-\r
- while (*String != '\0') {\r
- SearchStringTmp = SearchString;\r
- FirstMatch = String;\r
- \r
- while ((*String == *SearchStringTmp) \r
- && (*String != '\0')) {\r
- String++;\r
- SearchStringTmp++;\r
- } \r
- \r
- if (*SearchStringTmp == '\0') {\r
- return (CHAR8 *) FirstMatch;\r
- }\r
-\r
- if (*String == '\0') {\r
- return NULL;\r
- }\r
-\r
- String = FirstMatch + 1;\r
- }\r
-\r
- return NULL;\r
-}\r
-\r
-/**\r
- Convert a Null-terminated ASCII decimal string to a value of type\r
- UINTN.\r
-\r
- This function returns a value of type UINTN by interpreting the contents\r
- of the ASCII string String as a decimal number. The format of the input\r
- ASCII string String is:\r
-\r
- [spaces] [decimal digits].\r
-\r
- The valid decimal digit character is in the range [0-9]. The function will\r
- ignore the pad space, which includes spaces or tab characters, before the digits.\r
- The running zero in the beginning of [decimal digits] will be ignored. Then, the\r
- function stops at the first character that is a not a valid decimal character or\r
- Null-terminator, whichever on comes first.\r
-\r
- If String has only pad spaces, then 0 is returned.\r
- If String has no pad spaces or valid decimal digits, then 0 is returned.\r
- If the number represented by String overflows according to the range defined by\r
- UINTN, then ASSERT().\r
- If String is NULL, then ASSERT().\r
- If PcdMaximumAsciiStringLength is not zero, and String contains more than\r
- PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
- then ASSERT().\r
-\r
- @param String A pointer to a Null-terminated ASCII string.\r
-\r
- @retval Value translated from String.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsciiStrDecimalToUintn (\r
- IN CONST CHAR8 *String\r
- )\r
-{\r
- UINTN Result;\r
- \r
- //\r
- // ASSERT Strings is less long than PcdMaximumAsciiStringLength\r
- //\r
- ASSERT (AsciiStrSize (String) != 0);\r
-\r
- //\r
- // Ignore the pad spaces (space or tab)\r
- //\r
- while ((*String == ' ') || (*String == '\t' )) {\r
- String++;\r
- }\r
-\r
- //\r
- // Ignore leading Zeros after the spaces\r
- //\r
- while (*String == '0') {\r
- String++;\r
- }\r
-\r
- Result = 0;\r
-\r
- while (InternalAsciiIsDecimalDigitCharacter (*String)) {\r
- //\r
- // If the number represented by String overflows according \r
- // to the range defined by UINTN, then ASSERT().\r
- //\r
- ASSERT (Result <= ((((UINTN) ~0) - (*String - L'0')) / 10));\r
-\r
- Result = Result * 10 + (*String - '0');\r
- String++;\r
- }\r
- \r
- return Result;\r
-}\r
-\r
-\r
-/**\r
- Convert a Null-terminated ASCII decimal string to a value of type\r
- UINT64.\r
-\r
- This function returns a value of type UINT64 by interpreting the contents\r
- of the ASCII string String as a decimal number. The format of the input\r
- ASCII string String is:\r
-\r
- [spaces] [decimal digits].\r
-\r
- The valid decimal digit character is in the range [0-9]. The function will\r
- ignore the pad space, which includes spaces or tab characters, before the digits.\r
- The running zero in the beginning of [decimal digits] will be ignored. Then, the\r
- function stops at the first character that is a not a valid decimal character or\r
- Null-terminator, whichever on comes first.\r
-\r
- If String has only pad spaces, then 0 is returned.\r
- If String has no pad spaces or valid decimal digits, then 0 is returned.\r
- If the number represented by String overflows according to the range defined by\r
- UINT64, then ASSERT().\r
- If String is NULL, then ASSERT().\r
- If PcdMaximumAsciiStringLength is not zero, and String contains more than\r
- PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
- then ASSERT().\r
-\r
- @param String A pointer to a Null-terminated ASCII string.\r
-\r
- @retval Value translated from String.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-AsciiStrDecimalToUint64 (\r
- IN CONST CHAR8 *String\r
- )\r
-{\r
- UINT64 Result;\r
- \r
- //\r
- // ASSERT Strings is less long than PcdMaximumAsciiStringLength\r
- //\r
- ASSERT (AsciiStrSize (String) != 0);\r
-\r
- //\r
- // Ignore the pad spaces (space or tab)\r
- //\r
- while ((*String == ' ') || (*String == '\t' )) {\r
- String++;\r
- }\r
-\r
- //\r
- // Ignore leading Zeros after the spaces\r
- //\r
- while (*String == '0') {\r
- String++;\r
- }\r
-\r
- Result = 0;\r
-\r
- while (InternalAsciiIsDecimalDigitCharacter (*String)) {\r
- //\r
- // If the number represented by String overflows according \r
- // to the range defined by UINTN, then ASSERT().\r
- //\r
- ASSERT (Result <= DivU64x32 (((UINT64) ~0) - (*String - L'0') , 10));\r
-\r
- Result = MultU64x32 (Result, 10) + (*String - '0');\r
- String++;\r
- }\r
- \r
- return Result;\r
-}\r
-\r
-/**\r
- Convert a Null-terminated ASCII hexadecimal string to a value of type UINTN.\r
-\r
- This function returns a value of type UINTN by interpreting the contents of\r
- the ASCII string String as a hexadecimal number. The format of the input ASCII\r
- string String is:\r
-\r
- [spaces][zeros][x][hexadecimal digits].\r
-\r
- The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].\r
- The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x"\r
- appears in the input string, it must be prefixed with at least one 0. The function\r
- will ignore the pad space, which includes spaces or tab characters, before [zeros],\r
- [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits]\r
- will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal\r
- digit. Then, the function stops at the first character that is a not a valid\r
- hexadecimal character or Null-terminator, whichever on comes first.\r
-\r
- If String has only pad spaces, then 0 is returned.\r
- If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then\r
- 0 is returned.\r
-\r
- If the number represented by String overflows according to the range defined by UINTN,\r
- then ASSERT().\r
- If String is NULL, then ASSERT().\r
- If PcdMaximumAsciiStringLength is not zero,\r
- and String contains more than PcdMaximumAsciiStringLength ASCII characters not including\r
- the Null-terminator, then ASSERT().\r
-\r
- @param String A pointer to a Null-terminated ASCII string.\r
-\r
- @retval Value translated from String.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsciiStrHexToUintn (\r
- IN CONST CHAR8 *String\r
- )\r
-{\r
- UINTN Result;\r
-\r
- //\r
- // ASSERT Strings is less long than PcdMaximumAsciiStringLength\r
- //\r
- ASSERT (AsciiStrSize (String) != 0);\r
- \r
- //\r
- // Ignore the pad spaces (space or tab) \r
- //\r
- while ((*String == ' ') || (*String == '\t' )) {\r
- String++;\r
- }\r
-\r
- //\r
- // Ignore leading Zeros after the spaces\r
- //\r
- while (*String == '0') {\r
- String++;\r
- }\r
-\r
- if (InternalBaseLibAsciiToUpper (*String) == 'X') {\r
- ASSERT (*(String - 1) == '0');\r
- if (*(String - 1) != '0') {\r
- return 0;\r
- }\r
- //\r
- // Skip the 'X'\r
- //\r
- String++;\r
- }\r
-\r
- Result = 0;\r
- \r
- while (InternalAsciiIsHexaDecimalDigitCharacter (*String)) {\r
- //\r
- // If the Hex Number represented by String overflows according \r
- // to the range defined by UINTN, then ASSERT().\r
- //\r
- ASSERT (Result <= ((((UINTN) ~0) - InternalHexCharToUintn (*String)) >> 4));\r
-\r
- Result = (Result << 4) + InternalAsciiHexCharToUintn (*String);\r
- String++;\r
- }\r
-\r
- return Result;\r
-}\r
-\r
-\r
-/**\r
- Convert a Null-terminated ASCII hexadecimal string to a value of type UINT64.\r
-\r
- This function returns a value of type UINT64 by interpreting the contents of\r
- the ASCII string String as a hexadecimal number. The format of the input ASCII\r
- string String is:\r
-\r
- [spaces][zeros][x][hexadecimal digits].\r
-\r
- The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].\r
- The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x"\r
- appears in the input string, it must be prefixed with at least one 0. The function\r
- will ignore the pad space, which includes spaces or tab characters, before [zeros],\r
- [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits]\r
- will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal\r
- digit. Then, the function stops at the first character that is a not a valid\r
- hexadecimal character or Null-terminator, whichever on comes first.\r
-\r
- If String has only pad spaces, then 0 is returned.\r
- If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then\r
- 0 is returned.\r
-\r
- If the number represented by String overflows according to the range defined by UINT64,\r
- then ASSERT().\r
- If String is NULL, then ASSERT().\r
- If PcdMaximumAsciiStringLength is not zero,\r
- and String contains more than PcdMaximumAsciiStringLength ASCII characters not including\r
- the Null-terminator, then ASSERT().\r
-\r
- @param String A pointer to a Null-terminated ASCII string.\r
-\r
- @retval Value translated from String.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-AsciiStrHexToUint64 (\r
- IN CONST CHAR8 *String\r
- )\r
-{\r
- UINT64 Result;\r
-\r
- //\r
- // ASSERT Strings is less long than PcdMaximumAsciiStringLength\r
- //\r
- ASSERT (AsciiStrSize (String) != 0);\r
- \r
- //\r
- // Ignore the pad spaces (space or tab) and leading Zeros\r
- //\r
- //\r
- // Ignore the pad spaces (space or tab) \r
- //\r
- while ((*String == ' ') || (*String == '\t' )) {\r
- String++;\r
- }\r
-\r
- //\r
- // Ignore leading Zeros after the spaces\r
- //\r
- while (*String == '0') {\r
- String++;\r
- }\r
-\r
- if (InternalBaseLibAsciiToUpper (*String) == 'X') {\r
- ASSERT (*(String - 1) == '0');\r
- if (*(String - 1) != '0') {\r
- return 0;\r
- }\r
- //\r
- // Skip the 'X'\r
- //\r
- String++;\r
- }\r
-\r
- Result = 0;\r
- \r
- while (InternalAsciiIsHexaDecimalDigitCharacter (*String)) {\r
- //\r
- // If the Hex Number represented by String overflows according \r
- // to the range defined by UINTN, then ASSERT().\r
- //\r
- ASSERT (Result <= RShiftU64 (((UINT64) ~0) - InternalHexCharToUintn (*String) , 4));\r
-\r
- Result = LShiftU64 (Result, 4);\r
- Result = Result + InternalAsciiHexCharToUintn (*String);\r
- String++;\r
- }\r
-\r
- return Result;\r
-}\r
-\r
-\r
-/**\r
- Convert one Null-terminated ASCII string to a Null-terminated\r
- Unicode string and returns the Unicode string.\r
-\r
- This function converts the contents of the ASCII string Source to the Unicode\r
- string Destination, and returns Destination. The function terminates the\r
- Unicode string Destination by appending a Null-terminator character at the end.\r
- The caller is responsible to make sure Destination points to a buffer with size\r
- equal or greater than ((AsciiStrLen (Source) + 1) * sizeof (CHAR16)) in bytes.\r
-\r
- If Destination is NULL, then ASSERT().\r
- If Destination is not aligned on a 16-bit boundary, then ASSERT().\r
- If Source is NULL, then ASSERT().\r
- If Source and Destination overlap, then ASSERT().\r
- If PcdMaximumAsciiStringLength is not zero, and Source contains more than\r
- PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
- then ASSERT().\r
- If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
- PcdMaximumUnicodeStringLength ASCII characters not including the\r
- Null-terminator, then ASSERT().\r
-\r
- @param Source A pointer to a Null-terminated ASCII string.\r
- @param Destination A pointer to a Null-terminated Unicode string.\r
-\r
- @return Destination.\r
-\r
-**/\r
-CHAR16 *\r
-EFIAPI\r
-AsciiStrToUnicodeStr (\r
- IN CONST CHAR8 *Source,\r
- OUT CHAR16 *Destination\r
- )\r
-{\r
- CHAR16 *ReturnValue;\r
-\r
- ASSERT (Destination != NULL);\r
-\r
- //\r
- // ASSERT Source is less long than PcdMaximumAsciiStringLength\r
- //\r
- ASSERT (AsciiStrSize (Source) != 0);\r
-\r
- //\r
- // Source and Destination should not overlap\r
- //\r
- ASSERT ((UINTN) ((CHAR8 *) Destination - Source) > AsciiStrLen (Source));\r
- ASSERT ((UINTN) (Source - (CHAR8 *) Destination) > (AsciiStrLen (Source) * sizeof (CHAR16)));\r
-\r
- \r
- ReturnValue = Destination;\r
- while (*Source != '\0') {\r
- *(Destination++) = (CHAR16) *(Source++);\r
- }\r
- //\r
- // End the Destination with a NULL.\r
- //\r
- *Destination = '\0';\r
-\r
- //\r
- // ASSERT Original Destination is less long than PcdMaximumUnicodeStringLength\r
- //\r
- ASSERT (StrSize (ReturnValue) != 0);\r
-\r
- return ReturnValue;\r
-}\r
-\r
-/**\r
- Converts an 8-bit value to an 8-bit BCD value.\r
-\r
- Converts the 8-bit value specified by Value to BCD. The BCD value is\r
- returned.\r
-\r
- If Value >= 100, then ASSERT().\r
-\r
- @param Value The 8-bit value to convert to BCD. Range 0..99.\r
-\r
- @return The BCD value.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-DecimalToBcd8 (\r
- IN UINT8 Value\r
- )\r
-{\r
- ASSERT (Value < 100);\r
- return (UINT8) (((Value / 10) << 4) | (Value % 10));\r
-}\r
-\r
-/**\r
- Converts an 8-bit BCD value to an 8-bit value.\r
-\r
- Converts the 8-bit BCD value specified by Value to an 8-bit value. The 8-bit\r
- value is returned.\r
-\r
- If Value >= 0xA0, then ASSERT().\r
- If (Value & 0x0F) >= 0x0A, then ASSERT().\r
-\r
- @param Value The 8-bit BCD value to convert to an 8-bit value.\r
-\r
- @return The 8-bit value is returned.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-BcdToDecimal8 (\r
- IN UINT8 Value\r
- )\r
-{\r
- ASSERT (Value < 0xa0);\r
- ASSERT ((Value & 0xf) < 0xa);\r
- return (UINT8) ((Value >> 4) * 10 + (Value & 0xf));\r
-}\r