/** @file\r
Unicode and ASCII string primatives.\r
\r
- Copyright (c) 2006 - 2008, Intel Corporation<BR>\r
- All rights reserved. This program and the accompanying materials\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
+ 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
#include "BaseLibInternals.h"\r
\r
-#define QUOTIENT_MAX_UINTN_DIVIDED_BY_10 ((UINTN) -1 / 10)\r
-#define REMAINDER_MAX_UINTN_DIVIDED_BY_10 ((UINTN) -1 % 10)\r
-\r
-#define QUOTIENT_MAX_UINTN_DIVIDED_BY_16 ((UINTN) -1 / 16)\r
-#define REMAINDER_MAX_UINTN_DIVIDED_BY_16 ((UINTN) -1 % 16)\r
-\r
-#define QUOTIENT_MAX_UINT64_DIVIDED_BY_10 ((UINT64) -1 / 10)\r
-#define REMAINDER_MAX_UINT64_DIVIDED_BY_10 ((UINT64) -1 % 10)\r
-\r
-#define QUOTIENT_MAX_UINT64_DIVIDED_BY_16 ((UINT64) -1 / 16)\r
-#define REMAINDER_MAX_UINT64_DIVIDED_BY_16 ((UINT64) -1 % 16)\r
\r
/**\r
Copies one Null-terminated Unicode string to another Null-terminated Unicode\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
+ PcdMaximumUnicodeStringLength Unicode characters, not including the\r
Null-terminator, then ASSERT().\r
\r
- @param Destination Pointer to a Null-terminated Unicode string.\r
- @param Source Pointer to a Null-terminated Unicode string.\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
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 bounadry, 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\r
- Null-terminator, then ASSERT().\r
+ PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator,\r
+ then ASSERT().\r
\r
- @param Destination Pointer to a Null-terminated Unicode string.\r
- @param Source Pointer to a Null-terminated Unicode string.\r
- @param Length Maximum number of Unicode characters to copy.\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
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
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
+ PcdMaximumUnicodeStringLength Unicode characters, not including the\r
Null-terminator, then ASSERT().\r
\r
- @param String Pointer to a Null-terminated Unicode string.\r
+ @param String A pointer to a Null-terminated Unicode string.\r
\r
@return The length of 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
+ PcdMaximumUnicodeStringLength Unicode characters, not including the\r
Null-terminator, then ASSERT().\r
\r
- @param String Pointer to a Null-terminated Unicode string.\r
+ @param String A pointer to a Null-terminated Unicode string.\r
\r
@return The size of String.\r
\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
+ 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
+ than PcdMaximumUnicodeStringLength Unicode characters, not including the\r
Null-terminator, then ASSERT().\r
\r
- @param FirstString Pointer to a Null-terminated Unicode string.\r
- @param SecondString Pointer to a Null-terminated Unicode string.\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
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
+ \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
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 bounadary, 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 bounadary, 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
+ 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 Pointer to a Null-terminated Unicode string.\r
- @param SecondString Pointer to a Null-terminated Unicode string.\r
- @param Length Maximum number of Unicode characters to compare.\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
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
results are undefined.\r
\r
If Destination is NULL, then ASSERT().\r
- If Destination is not aligned on a 16-bit bounadary, 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 bounadary, 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
+ 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
+ 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
+ PcdMaximumUnicodeStringLength Unicode characters, not including the\r
Null-terminator, then ASSERT().\r
\r
- @param Destination Pointer to a Null-terminated Unicode string.\r
- @param Source Pointer to a Null-terminated Unicode string.\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
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
+ 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
+ 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
+ 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 Pointer to a Null-terminated Unicode string.\r
- @param Source Pointer to a Null-terminated Unicode string.\r
- @param Length Maximum number of Unicode characters to concatenate from\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
IN UINTN Length\r
)\r
{\r
- StrnCpy (Destination + StrLen (Destination), Source, Length);\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
\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
+ characters, not including the Null-terminator, then ASSERT().\r
\r
- @param String Pointer to a Null-terminated Unicode string.\r
- @param SearchString Pointer to a Null-terminated Unicode string to search for.\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
CHAR16 *\r
EFIAPI\r
StrStr (\r
- IN CONST CHAR16 *String,\r
- IN CONST CHAR16 *SearchString\r
+ IN CONST CHAR16 *String,\r
+ IN CONST CHAR16 *SearchString\r
)\r
{\r
CONST CHAR16 *FirstMatch;\r
ASSERT (StrSize (String) != 0);\r
ASSERT (StrSize (SearchString) != 0);\r
\r
- while (*String != '\0') {\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
- && (*SearchStringTmp != '\0') \r
- && (*String != '\0')) {\r
+ && (*String != L'\0')) {\r
String++;\r
SearchStringTmp++;\r
} \r
\r
- if (*SearchStringTmp == '\0') {\r
+ if (*SearchStringTmp == L'\0') {\r
return (CHAR16 *) FirstMatch;\r
}\r
\r
- if (SearchStringTmp == SearchString) {\r
- //\r
- // If no character from SearchString match,\r
- // move the pointer to the String under search\r
- // by one character.\r
- //\r
- String++;\r
+ if (*String == L'\0') {\r
+ return NULL;\r
}\r
+\r
+ String = FirstMatch + 1;\r
}\r
\r
return NULL;\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
+ [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
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
+ more than PcdMaximumUnicodeStringLength Unicode characters, not including\r
the Null-terminator, then ASSERT().\r
\r
- @param String Pointer to a Null-terminated Unicode string.\r
+ @param String A pointer to a Null-terminated Unicode string.\r
\r
@retval Value translated from String.\r
\r
UINTN\r
EFIAPI\r
StrDecimalToUintn (\r
- IN CONST CHAR16 *String\r
+ IN CONST CHAR16 *String\r
)\r
{\r
UINTN Result;\r
// If the number represented by String overflows according \r
// to the range defined by UINTN, then ASSERT().\r
//\r
- ASSERT ((Result < QUOTIENT_MAX_UINTN_DIVIDED_BY_10) ||\r
- ((Result == QUOTIENT_MAX_UINTN_DIVIDED_BY_10) &&\r
- (*String - L'0') <= REMAINDER_MAX_UINTN_DIVIDED_BY_10)\r
- );\r
+ ASSERT (Result <= ((((UINTN) ~0) - (*String - L'0')) / 10));\r
\r
Result = Result * 10 + (*String - L'0');\r
String++;\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
+ [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
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
+ more than PcdMaximumUnicodeStringLength Unicode characters, not including\r
the Null-terminator, then ASSERT().\r
\r
- @param String Pointer to a Null-terminated Unicode string.\r
+ @param String A pointer to a Null-terminated Unicode string.\r
\r
@retval Value translated from String.\r
\r
UINT64\r
EFIAPI\r
StrDecimalToUint64 (\r
- IN CONST CHAR16 *String\r
+ IN CONST CHAR16 *String\r
)\r
{\r
UINT64 Result;\r
// If the number represented by String overflows according \r
// to the range defined by UINTN, then ASSERT().\r
//\r
- ASSERT ((Result < QUOTIENT_MAX_UINT64_DIVIDED_BY_10) || \r
- ((Result == QUOTIENT_MAX_UINT64_DIVIDED_BY_10) && \r
- (*String - L'0') <= REMAINDER_MAX_UINT64_DIVIDED_BY_10)\r
- );\r
+ ASSERT (Result <= DivU64x32 (((UINT64) ~0) - (*String - L'0') , 10));\r
\r
Result = MultU64x32 (Result, 10) + (*String - L'0');\r
String++;\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
+ PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator,\r
then ASSERT().\r
\r
- @param String Pointer to a Null-terminated Unicode string.\r
+ @param String A pointer to a Null-terminated Unicode string.\r
\r
@retval Value translated from String.\r
\r
UINTN\r
EFIAPI\r
StrHexToUintn (\r
- IN CONST CHAR16 *String\r
+ IN CONST CHAR16 *String\r
)\r
{\r
UINTN Result;\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
// If the Hex Number represented by String overflows according \r
// to the range defined by UINTN, then ASSERT().\r
//\r
- ASSERT ((Result < QUOTIENT_MAX_UINTN_DIVIDED_BY_16) ||\r
- ((Result == QUOTIENT_MAX_UINTN_DIVIDED_BY_16) && \r
- (InternalHexCharToUintn (*String) <= REMAINDER_MAX_UINTN_DIVIDED_BY_16))\r
- );\r
+ ASSERT (Result <= ((((UINTN) ~0) - InternalHexCharToUintn (*String)) >> 4));\r
\r
Result = (Result << 4) + InternalHexCharToUintn (*String);\r
String++;\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
+ PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator,\r
then ASSERT().\r
\r
- @param String Pointer to a Null-terminated Unicode string.\r
+ @param String A pointer to a Null-terminated Unicode string.\r
\r
@retval Value translated from String.\r
\r
- **/\r
+**/\r
UINT64\r
EFIAPI\r
StrHexToUint64 (\r
- IN CONST CHAR16 *String\r
+ IN CONST CHAR16 *String\r
)\r
{\r
UINT64 Result;\r
// If the Hex Number represented by String overflows according \r
// to the range defined by UINTN, then ASSERT().\r
//\r
- ASSERT ((Result < QUOTIENT_MAX_UINT64_DIVIDED_BY_16)|| \r
- ((Result == QUOTIENT_MAX_UINT64_DIVIDED_BY_16) && \r
- (InternalHexCharToUintn (*String) <= REMAINDER_MAX_UINT64_DIVIDED_BY_16))\r
- );\r
+ ASSERT (Result <= RShiftU64 (((UINT64) ~0) - InternalHexCharToUintn (*String) , 4));\r
\r
Result = LShiftU64 (Result, 4);\r
Result = Result + InternalHexCharToUintn (*String);\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
+ 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
+ than PcdMaximumAsciiStringLength Unicode characters, not including the\r
Null-terminator, then ASSERT().\r
\r
- @param Source Pointer to a Null-terminated Unicode string.\r
- @param Destination Pointer to a Null-terminated ASCII string.\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
CHAR8 *\r
EFIAPI\r
UnicodeStrToAsciiStr (\r
- IN CONST CHAR16 *Source,\r
- OUT CHAR8 *Destination\r
+ IN CONST CHAR16 *Source,\r
+ OUT CHAR8 *Destination\r
)\r
{\r
CHAR8 *ReturnValue;\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
+ PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,\r
then ASSERT().\r
\r
- @param Destination Pointer to a Null-terminated ASCII string.\r
- @param Source Pointer to a Null-terminated ASCII string.\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
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
+ PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,\r
then ASSERT().\r
\r
- @param Destination Pointer to a Null-terminated ASCII string.\r
- @param Source Pointer to a Null-terminated ASCII string.\r
- @param Length Maximum number of ASCII characters to copy.\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
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
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
+ PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,\r
then ASSERT().\r
\r
- @param String Pointer to a Null-terminated ASCII string.\r
+ @param String A pointer to a Null-terminated ASCII string.\r
\r
@return The length of String.\r
\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
+ PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,\r
then ASSERT().\r
\r
- @param String Pointer to a Null-terminated ASCII string.\r
+ @param String A pointer to a Null-terminated ASCII string.\r
\r
@return The size of String.\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
+ 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
+ than PcdMaximumAsciiStringLength ASCII characters, not including the\r
Null-terminator, then ASSERT().\r
\r
- @param FirstString Pointer to a Null-terminated ASCII string.\r
- @param SecondString Pointer to a Null-terminated ASCII string.\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
CHAR8\r
EFIAPI\r
-AsciiToUpper (\r
+InternalBaseLibAsciiToUpper (\r
IN CHAR8 Chr\r
)\r
{\r
return Char - '0';\r
}\r
\r
- return (UINTN) (10 + AsciiToUpper (Char) - 'A');\r
+ return (UINTN) (10 + InternalBaseLibAsciiToUpper (Char) - 'A');\r
}\r
\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
+ 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
+ than PcdMaximumAsciiStringLength ASCII characters, not including the\r
Null-terminator, then ASSERT().\r
\r
- @param FirstString Pointer to a Null-terminated ASCII string.\r
- @param SecondString Pointer to a Null-terminated ASCII string.\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
ASSERT (AsciiStrSize (FirstString));\r
ASSERT (AsciiStrSize (SecondString));\r
\r
- UpperFirstString = AsciiToUpper (*FirstString);\r
- UpperSecondString = AsciiToUpper (*SecondString);\r
+ UpperFirstString = InternalBaseLibAsciiToUpper (*FirstString);\r
+ UpperSecondString = InternalBaseLibAsciiToUpper (*SecondString);\r
while ((*FirstString != '\0') && (UpperFirstString == UpperSecondString)) {\r
FirstString++;\r
SecondString++;\r
- UpperFirstString = AsciiToUpper (*FirstString);\r
- UpperSecondString = AsciiToUpper (*SecondString);\r
+ UpperFirstString = InternalBaseLibAsciiToUpper (*FirstString);\r
+ UpperSecondString = InternalBaseLibAsciiToUpper (*SecondString);\r
}\r
\r
return UpperFirstString - UpperSecondString;\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 FirstString contains more than\r
- PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\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
+ 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 Pointer to a Null-terminated ASCII string.\r
- @param SecondString Pointer to a Null-terminated ASCII string.\r
- @param Length Maximum number of ASCII characters for compare.\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
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
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
+ 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
+ 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 Pointer to a Null-terminated ASCII string.\r
- @param Source Pointer to a Null-terminated ASCII string.\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
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
+ 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
+ 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
+ ASCII characters, not including the Null-terminator, then ASSERT().\r
\r
- @param Destination Pointer to a Null-terminated ASCII string.\r
- @param Source Pointer to a Null-terminated ASCII string.\r
- @param Length Maximum number of ASCII characters to concatenate from\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
IN UINTN Length\r
)\r
{\r
- AsciiStrnCpy (Destination + AsciiStrLen (Destination), Source, Length);\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
String contains more than PcdMaximumAsciiStringLength Unicode characters\r
not including the Null-terminator, then ASSERT().\r
\r
- @param String Pointer to a Null-terminated ASCII string.\r
- @param SearchString Pointer to a Null-terminated ASCII string to search for.\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
CHAR8 *\r
EFIAPI\r
AsciiStrStr (\r
- IN CONST CHAR8 *String,\r
- IN CONST CHAR8 *SearchString\r
+ IN CONST CHAR8 *String,\r
+ IN CONST CHAR8 *SearchString\r
)\r
{\r
CONST CHAR8 *FirstMatch;\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
- && (*SearchStringTmp != '\0') \r
&& (*String != '\0')) {\r
String++;\r
SearchStringTmp++;\r
return (CHAR8 *) FirstMatch;\r
}\r
\r
- if (SearchStringTmp == SearchString) {\r
- //\r
- // If no character from SearchString match,\r
- // move the pointer to the String under search\r
- // by one character.\r
- //\r
- String++;\r
+ if (*String == '\0') {\r
+ return NULL;\r
}\r
\r
+ String = FirstMatch + 1;\r
}\r
\r
return NULL;\r
PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
then ASSERT().\r
\r
- @param String Pointer to a Null-terminated ASCII string.\r
+ @param String A pointer to a Null-terminated ASCII string.\r
\r
@retval Value translated from String.\r
\r
// If the number represented by String overflows according \r
// to the range defined by UINTN, then ASSERT().\r
//\r
- ASSERT ((Result < QUOTIENT_MAX_UINTN_DIVIDED_BY_10) ||\r
- ((Result == QUOTIENT_MAX_UINTN_DIVIDED_BY_10) && \r
- (*String - '0') <= REMAINDER_MAX_UINTN_DIVIDED_BY_10)\r
- );\r
+ ASSERT (Result <= ((((UINTN) ~0) - (*String - L'0')) / 10));\r
\r
Result = Result * 10 + (*String - '0');\r
String++;\r
PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
then ASSERT().\r
\r
- @param String Pointer to a Null-terminated ASCII string.\r
+ @param String A pointer to a Null-terminated ASCII string.\r
\r
@retval Value translated from String.\r
\r
UINT64\r
EFIAPI\r
AsciiStrDecimalToUint64 (\r
- IN CONST CHAR8 *String\r
+ IN CONST CHAR8 *String\r
)\r
{\r
UINT64 Result;\r
// If the number represented by String overflows according \r
// to the range defined by UINTN, then ASSERT().\r
//\r
- ASSERT ((Result < QUOTIENT_MAX_UINT64_DIVIDED_BY_10) || \r
- ((Result == QUOTIENT_MAX_UINT64_DIVIDED_BY_10) && \r
- (*String - '0') <= REMAINDER_MAX_UINT64_DIVIDED_BY_10)\r
- );\r
+ ASSERT (Result <= DivU64x32 (((UINT64) ~0) - (*String - L'0') , 10));\r
\r
Result = MultU64x32 (Result, 10) + (*String - '0');\r
String++;\r
and String contains more than PcdMaximumAsciiStringLength ASCII characters not including\r
the Null-terminator, then ASSERT().\r
\r
- @param String Pointer to a Null-terminated ASCII string.\r
+ @param String A pointer to a Null-terminated ASCII string.\r
\r
@retval Value translated from String.\r
\r
UINTN\r
EFIAPI\r
AsciiStrHexToUintn (\r
- IN CONST CHAR8 *String\r
+ IN CONST CHAR8 *String\r
)\r
{\r
UINTN Result;\r
String++;\r
}\r
\r
- if (AsciiToUpper (*String) == 'X') {\r
+ if (InternalBaseLibAsciiToUpper (*String) == 'X') {\r
ASSERT (*(String - 1) == '0');\r
if (*(String - 1) != '0') {\r
return 0;\r
// If the Hex Number represented by String overflows according \r
// to the range defined by UINTN, then ASSERT().\r
//\r
- ASSERT ((Result < QUOTIENT_MAX_UINTN_DIVIDED_BY_16) ||\r
- ((Result == QUOTIENT_MAX_UINTN_DIVIDED_BY_16) && \r
- (InternalAsciiHexCharToUintn (*String) <= REMAINDER_MAX_UINTN_DIVIDED_BY_16))\r
- );\r
+ ASSERT (Result <= ((((UINTN) ~0) - InternalHexCharToUintn (*String)) >> 4));\r
\r
Result = (Result << 4) + InternalAsciiHexCharToUintn (*String);\r
String++;\r
and String contains more than PcdMaximumAsciiStringLength ASCII characters not including\r
the Null-terminator, then ASSERT().\r
\r
- @param String Pointer to a Null-terminated ASCII string.\r
+ @param String A pointer to a Null-terminated ASCII string.\r
\r
@retval Value translated from String.\r
\r
UINT64\r
EFIAPI\r
AsciiStrHexToUint64 (\r
- IN CONST CHAR8 *String\r
+ IN CONST CHAR8 *String\r
)\r
{\r
UINT64 Result;\r
String++;\r
}\r
\r
- if (AsciiToUpper (*String) == 'X') {\r
+ if (InternalBaseLibAsciiToUpper (*String) == 'X') {\r
ASSERT (*(String - 1) == '0');\r
if (*(String - 1) != '0') {\r
return 0;\r
// If the Hex Number represented by String overflows according \r
// to the range defined by UINTN, then ASSERT().\r
//\r
- ASSERT ((Result < QUOTIENT_MAX_UINT64_DIVIDED_BY_16) ||\r
- ((Result == QUOTIENT_MAX_UINT64_DIVIDED_BY_16) && \r
- (InternalAsciiHexCharToUintn (*String) <= REMAINDER_MAX_UINT64_DIVIDED_BY_16))\r
- );\r
+ ASSERT (Result <= RShiftU64 (((UINT64) ~0) - InternalHexCharToUintn (*String) , 4));\r
\r
Result = LShiftU64 (Result, 4);\r
Result = Result + InternalAsciiHexCharToUintn (*String);\r
PcdMaximumUnicodeStringLength ASCII characters not including the\r
Null-terminator, then ASSERT().\r
\r
- @param Source Pointer to a Null-terminated ASCII string.\r
- @param Destination Pointer to a Null-terminated Unicode string.\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