X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=MdePkg%2FLibrary%2FBaseLib%2FString.c;h=e7fe513aeca185d02dd6fcb2036fe1e34250dab6;hp=1c8fc227ea57ef1d87b724393eeabfda1517aed3;hb=d7634dc0c5a83360b3b6c155df29c078ad9c77ce;hpb=f734a10ab104f1072f94cab66a5489e0fd8fce8a diff --git a/MdePkg/Library/BaseLib/String.c b/MdePkg/Library/BaseLib/String.c index 1c8fc227ea..e7fe513aec 100644 --- a/MdePkg/Library/BaseLib/String.c +++ b/MdePkg/Library/BaseLib/String.c @@ -1,27 +1,24 @@ /** @file - Unicode and ASCII string primatives. + Unicode and ASCII string primitives. - Copyright (c) 2006 - 2007, Intel Corporation
- All rights reserved. This program and the accompanying materials + Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php + http://opensource.org/licenses/bsd-license.php. THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - Module Name: String.c - **/ -// -// Include common header file for this module. -// - - #include "BaseLibInternals.h" +#ifndef DISABLE_NEW_DEPRECATED_INTERFACES + /** + [ATTENTION] This function will be deprecated for security reason. + Copies one Null-terminated Unicode string to another Null-terminated Unicode string and returns the new Unicode string. @@ -35,13 +32,13 @@ If Source is not aligned on a 16-bit boundary, then ASSERT(). If Source and Destination overlap, then ASSERT(). If PcdMaximumUnicodeStringLength is not zero, and Source contains more than - PcdMaximumUnicodeStringLength Unicode characters not including the + PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator, then ASSERT(). - @param Destination Pointer to a Null-terminated Unicode string. - @param Source Pointer to a Null-terminated Unicode string. + @param Destination A pointer to a Null-terminated Unicode string. + @param Source A pointer to a Null-terminated Unicode string. - @return Destiantion + @return Destination. **/ CHAR16 * @@ -57,7 +54,7 @@ StrCpy ( // Destination cannot be NULL // ASSERT (Destination != NULL); - ASSERT (((UINTN) Destination & 0x01) == 0); + ASSERT (((UINTN) Destination & BIT0) == 0); // // Destination and source cannot overlap @@ -66,7 +63,7 @@ StrCpy ( ASSERT ((UINTN)(Source - Destination) > StrLen (Source)); ReturnValue = Destination; - while (*Source) { + while (*Source != 0) { *(Destination++) = *(Source++); } *Destination = 0; @@ -74,9 +71,10 @@ StrCpy ( } /** - Copies one Null-terminated Unicode string with a maximum length to another - Null-terminated Unicode string with a maximum length and returns the new - Unicode string. + [ATTENTION] This function will be deprecated for security reason. + + Copies up to a specified length from one Null-terminated Unicode string to + another Null-terminated Unicode string and returns the new Unicode string. This function copies the contents of the Unicode string Source to the Unicode string Destination, and returns Destination. At most, Length Unicode @@ -89,17 +87,19 @@ StrCpy ( If Length > 0 and Destination is NULL, then ASSERT(). If Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT(). If Length > 0 and Source is NULL, then ASSERT(). - If Length > 0 and Source is not aligned on a 16-bit bounadry, then ASSERT(). + If Length > 0 and Source is not aligned on a 16-bit boundary, then ASSERT(). If Source and Destination overlap, then ASSERT(). + If PcdMaximumUnicodeStringLength is not zero, and Length is greater than + PcdMaximumUnicodeStringLength, then ASSERT(). If PcdMaximumUnicodeStringLength is not zero, and Source contains more than - PcdMaximumUnicodeStringLength Unicode characters not including the - Null-terminator, then ASSERT(). + PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator, + then ASSERT(). - @param Destination Pointer to a Null-terminated Unicode string. - @param Source Pointer to a Null-terminated Unicode string. - @param Length Maximum number of Unicode characters to copy. + @param Destination A pointer to a Null-terminated Unicode string. + @param Source A pointer to a Null-terminated Unicode string. + @param Length The maximum number of Unicode characters to copy. - @return Destination + @return Destination. **/ CHAR16 * @@ -120,15 +120,18 @@ StrnCpy ( // Destination cannot be NULL if Length is not zero // ASSERT (Destination != NULL); - ASSERT (((UINTN) Destination & 0x01) == 0); + ASSERT (((UINTN) Destination & BIT0) == 0); // // Destination and source cannot overlap - // Q: Does Source have to be NULL-terminated? // ASSERT ((UINTN)(Destination - Source) > StrLen (Source)); ASSERT ((UINTN)(Source - Destination) >= Length); + if (PcdGet32 (PcdMaximumUnicodeStringLength) != 0) { + ASSERT (Length <= PcdGet32 (PcdMaximumUnicodeStringLength)); + } + ReturnValue = Destination; while ((*Source != L'\0') && (Length > 0)) { @@ -139,6 +142,7 @@ StrnCpy ( ZeroMem (Destination, Length * sizeof (*Destination)); return ReturnValue; } +#endif /** Returns the length of a Null-terminated Unicode string. @@ -149,10 +153,10 @@ StrnCpy ( If String is NULL, then ASSERT(). If String is not aligned on a 16-bit boundary, then ASSERT(). If PcdMaximumUnicodeStringLength is not zero, and String contains more than - PcdMaximumUnicodeStringLength Unicode characters not including the + PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator, then ASSERT(). - @param String Pointer to a Null-terminated Unicode string. + @param String A pointer to a Null-terminated Unicode string. @return The length of String. @@ -166,7 +170,7 @@ StrLen ( UINTN Length; ASSERT (String != NULL); - ASSERT (((UINTN) String & 0x01) == 0); + ASSERT (((UINTN) String & BIT0) == 0); for (Length = 0; *String != L'\0'; String++, Length++) { // @@ -184,16 +188,16 @@ StrLen ( Returns the size of a Null-terminated Unicode string in bytes, including the Null terminator. - This function returns the size, in bytes, of the Null-terminated Unicode - string specified by String. + This function returns the size, in bytes, of the Null-terminated Unicode string + specified by String. If String is NULL, then ASSERT(). If String is not aligned on a 16-bit boundary, then ASSERT(). If PcdMaximumUnicodeStringLength is not zero, and String contains more than - PcdMaximumUnicodeStringLength Unicode characters not including the + PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator, then ASSERT(). - @param String Pointer to a Null-terminated Unicode string. + @param String A pointer to a Null-terminated Unicode string. @return The size of String. @@ -222,17 +226,17 @@ StrSize ( If SecondString is NULL, then ASSERT(). If SecondString is not aligned on a 16-bit boundary, then ASSERT(). If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more - than PcdMaximumUnicodeStringLength Unicode characters not including the + than PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator, then ASSERT(). If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more - than PcdMaximumUnicodeStringLength Unicode characters not including the + than PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator, then ASSERT(). - @param FirstString Pointer to a Null-terminated Unicode string. - @param SecondString Pointer to a Null-terminated Unicode string. + @param FirstString A pointer to a Null-terminated Unicode string. + @param SecondString A pointer to a Null-terminated Unicode string. - @retval 0 FirstString is identical to SecondString. - @retval !=0 FirstString is not identical to SecondString. + @retval 0 FirstString is identical to SecondString. + @return others FirstString is not identical to SecondString. **/ INTN @@ -256,8 +260,8 @@ StrCmp ( } /** - Compares two Null-terminated Unicode strings with maximum lengths, and - returns the difference between the first mismatched Unicode characters. + Compares up to a specified length the contents of two Null-terminated Unicode strings, + and returns the difference between the first mismatched Unicode characters. This function compares the Null-terminated Unicode string FirstString to the Null-terminated Unicode string SecondString. At most, Length Unicode @@ -267,22 +271,24 @@ StrCmp ( subtracted from the first mismatched Unicode character in FirstString. If Length > 0 and FirstString is NULL, then ASSERT(). - If Length > 0 and FirstString is not aligned on a 16-bit bounadary, then ASSERT(). + If Length > 0 and FirstString is not aligned on a 16-bit boundary, then ASSERT(). If Length > 0 and SecondString is NULL, then ASSERT(). - If Length > 0 and SecondString is not aligned on a 16-bit bounadary, then ASSERT(). - If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more - than PcdMaximumUnicodeStringLength Unicode characters not including the - Null-terminator, then ASSERT(). - If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more - than PcdMaximumUnicodeStringLength Unicode characters not including the - Null-terminator, then ASSERT(). + If Length > 0 and SecondString is not aligned on a 16-bit boundary, then ASSERT(). + If PcdMaximumUnicodeStringLength is not zero, and Length is greater than + PcdMaximumUnicodeStringLength, then ASSERT(). + If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more than + PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator, + then ASSERT(). + If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more than + PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator, + then ASSERT(). - @param FirstString Pointer to a Null-terminated Unicode string. - @param SecondString Pointer to a Null-terminated Unicode string. - @param Length Maximum number of Unicode characters to compare. + @param FirstString A pointer to a Null-terminated Unicode string. + @param SecondString A pointer to a Null-terminated Unicode string. + @param Length The maximum number of Unicode characters to compare. - @retval 0 FirstString is identical to SecondString. - @retval !=0 FirstString is not identical to SecondString. + @retval 0 FirstString is identical to SecondString. + @return others FirstString is not identical to SecondString. **/ INTN @@ -304,7 +310,12 @@ StrnCmp ( ASSERT (StrSize (FirstString) != 0); ASSERT (StrSize (SecondString) != 0); + if (PcdGet32 (PcdMaximumUnicodeStringLength) != 0) { + ASSERT (Length <= PcdGet32 (PcdMaximumUnicodeStringLength)); + } + while ((*FirstString != L'\0') && + (*SecondString != L'\0') && (*FirstString == *SecondString) && (Length > 1)) { FirstString++; @@ -315,7 +326,11 @@ StrnCmp ( return *FirstString - *SecondString; } +#ifndef DISABLE_NEW_DEPRECATED_INTERFACES + /** + [ATTENTION] This function will be deprecated for security reason. + Concatenates one Null-terminated Unicode string to another Null-terminated Unicode string, and returns the concatenated Unicode string. @@ -326,23 +341,25 @@ StrnCmp ( results are undefined. If Destination is NULL, then ASSERT(). + If Destination is not aligned on a 16-bit boundary, then ASSERT(). If Source is NULL, then ASSERT(). + If Source is not aligned on a 16-bit boundary, then ASSERT(). If Source and Destination overlap, then ASSERT(). If PcdMaximumUnicodeStringLength is not zero, and Destination contains more - than PcdMaximumUnicodeStringLength Unicode characters not including the + than PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator, then ASSERT(). If PcdMaximumUnicodeStringLength is not zero, and Source contains more than - PcdMaximumUnicodeStringLength Unicode characters not including the + PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator, then ASSERT(). If PcdMaximumUnicodeStringLength is not zero, and concatenating Destination and Source results in a Unicode string with more than - PcdMaximumUnicodeStringLength Unicode characters not including the + PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator, then ASSERT(). - @param Destination Pointer to a Null-terminated Unicode string. - @param Source Pointer to a Null-terminated Unicode string. + @param Destination A pointer to a Null-terminated Unicode string. + @param Source A pointer to a Null-terminated Unicode string. - @return Destination + @return Destination. **/ CHAR16 * @@ -363,8 +380,10 @@ StrCat ( } /** - Concatenates one Null-terminated Unicode string with a maximum length to the - end of another Null-terminated Unicode string, and returns the concatenated + [ATTENTION] This function will be deprecated for security reason. + + Concatenates up to a specified length one Null-terminated Unicode to the end + of another Null-terminated Unicode string, and returns the concatenated Unicode string. This function concatenates two Null-terminated Unicode strings. The contents @@ -380,23 +399,24 @@ StrCat ( If Length > 0 and Source is NULL, then ASSERT(). If Length > 0 and Source is not aligned on a 16-bit boundary, then ASSERT(). If Source and Destination overlap, then ASSERT(). + If PcdMaximumUnicodeStringLength is not zero, and Length is greater than + PcdMaximumUnicodeStringLength, then ASSERT(). If PcdMaximumUnicodeStringLength is not zero, and Destination contains more - than PcdMaximumUnicodeStringLength Unicode characters not including the + than PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator, then ASSERT(). If PcdMaximumUnicodeStringLength is not zero, and Source contains more than - PcdMaximumUnicodeStringLength Unicode characters not including the + PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator, then ASSERT(). If PcdMaximumUnicodeStringLength is not zero, and concatenating Destination - and Source results in a Unicode string with more than - PcdMaximumUnicodeStringLength Unicode characters not including the - Null-terminator, then ASSERT(). + and Source results in a Unicode string with more than PcdMaximumUnicodeStringLength + Unicode characters, not including the Null-terminator, then ASSERT(). - @param Destination Pointer to a Null-terminated Unicode string. - @param Source Pointer to a Null-terminated Unicode string. - @param Length Maximum number of Unicode characters to concatenate from + @param Destination A pointer to a Null-terminated Unicode string. + @param Source A pointer to a Null-terminated Unicode string. + @param Length The maximum number of Unicode characters to concatenate from Source. - @return Destination + @return Destination. **/ CHAR16 * @@ -407,7 +427,11 @@ StrnCat ( IN UINTN Length ) { - StrnCpy (Destination + StrLen (Destination), Source, Length); + UINTN DestinationLen; + + DestinationLen = StrLen (Destination); + StrnCpy (Destination + DestinationLen, Source, Length); + Destination[DestinationLen + Length] = L'\0'; // // Size of the resulting string should never be zero. @@ -416,87 +440,74 @@ StrnCat ( ASSERT (StrSize (Destination) != 0); return Destination; } +#endif /** - Returns the first occurance of a Null-terminated Unicode sub-string + Returns the first occurrence of a Null-terminated Unicode sub-string in a Null-terminated Unicode string. - This function scans the contents of the Null-terminated Unicode string - specified by String and returns the first occurrence of SearchString. - If SearchString is not found in String, then NULL is returned. If - the length of SearchString is zero, then String is + This function scans the contents of the Null-terminated Unicode string + specified by String and returns the first occurrence of SearchString. + If SearchString is not found in String, then NULL is returned. If + the length of SearchString is zero, then String is returned. - + If String is NULL, then ASSERT(). If String is not aligned on a 16-bit boundary, then ASSERT(). If SearchString is NULL, then ASSERT(). If SearchString is not aligned on a 16-bit boundary, then ASSERT(). - If PcdMaximumUnicodeStringLength is not zero, and SearchString - or String contains more than PcdMaximumUnicodeStringLength Unicode - characters not including the Null-terminator, then ASSERT(). + If PcdMaximumUnicodeStringLength is not zero, and SearchString + or String contains more than PcdMaximumUnicodeStringLength Unicode + characters, not including the Null-terminator, then ASSERT(). - @param String Pointer to a Null-terminated Unicode string. - @param SearchString Pointer to a Null-terminated Unicode string to search for. + @param String A pointer to a Null-terminated Unicode string. + @param SearchString A pointer to a Null-terminated Unicode string to search for. @retval NULL If the SearchString does not appear in String. - @retval !NULL If there is a match. + @return others If there is a match. **/ CHAR16 * EFIAPI StrStr ( - IN CONST CHAR16 *String, - IN CONST CHAR16 *SearchString + IN CONST CHAR16 *String, + IN CONST CHAR16 *SearchString ) { CONST CHAR16 *FirstMatch; CONST CHAR16 *SearchStringTmp; - ASSERT (String != NULL); - ASSERT (((UINTN) String & 0x01) == 0); - ASSERT (SearchString != NULL); - ASSERT (((UINTN) SearchString & 0x01) == 0); - // - // If PcdMaximumUnicodeStringLength is not zero, - // length of String should not more than PcdMaximumUnicodeStringLength + // ASSERT both strings are less long than PcdMaximumUnicodeStringLength. + // Length tests are performed inside StrLen(). // - if (PcdGet32 (PcdMaximumUnicodeStringLength) != 0) { - ASSERT (StrLen (String) < PcdGet32 (PcdMaximumUnicodeStringLength)); - } + ASSERT (StrSize (String) != 0); + ASSERT (StrSize (SearchString) != 0); - // - // If PcdMaximumUnicodeStringLength is not zero, - // length of SearchString should not more than PcdMaximumUnicodeStringLength - // - if (PcdGet32 (PcdMaximumUnicodeStringLength) != 0) { - ASSERT (StrLen (SearchString) < PcdGet32 (PcdMaximumAsciiStringLength)); + if (*SearchString == L'\0') { + return (CHAR16 *) String; } - while (*String != '\0') { + while (*String != L'\0') { SearchStringTmp = SearchString; FirstMatch = String; - - while ((*String == *SearchStringTmp) - && (*SearchStringTmp != '\0') - && (*String != '\0')) { + + while ((*String == *SearchStringTmp) + && (*String != L'\0')) { String++; SearchStringTmp++; - } - - if (*SearchStringTmp == '\0') { + } + + if (*SearchStringTmp == L'\0') { return (CHAR16 *) FirstMatch; } - if (SearchStringTmp == SearchString) { - // - // If no character from SearchString match, - // move the pointer to the String under search - // by one character. - // - String++; + if (*String == L'\0') { + return NULL; } + + String = FirstMatch + 1; } return NULL; @@ -505,19 +516,18 @@ StrStr ( /** Check if a Unicode character is a decimal character. - This internal function checks if a Unicode character is a + This internal function checks if a Unicode character is a decimal character. The valid decimal character is from L'0' to L'9'. - @param Char The character to check against. @retval TRUE If the Char is a decmial character. - @retval FALSE Otherwise. + @retval FALSE If the Char is not a decmial character. **/ -STATIC BOOLEAN +EFIAPI InternalIsDecimalDigitCharacter ( IN CHAR16 Char ) @@ -526,23 +536,22 @@ InternalIsDecimalDigitCharacter ( } /** - Convert a Unicode character to upper case only if + Convert a Unicode character to upper case only if it maps to a valid small-case ASCII character. This internal function only deal with Unicode character - which maps to a valid small-case ASII character, i.e. + which maps to a valid small-case ASCII character, i.e. L'a' to L'z'. For other Unicode character, the input character is returned directly. - @param Char The character to convert. @retval LowerCharacter If the Char is with range L'a' to L'z'. @retval Unchanged Otherwise. **/ -STATIC CHAR16 +EFIAPI InternalCharToUpper ( IN CHAR16 Char ) @@ -559,16 +568,16 @@ InternalCharToUpper ( This internal function only deal with Unicode character which maps to a valid hexadecimal ASII character, i.e. - L'0' to L'9', L'a' to L'f' or L'A' to L'F'. For other + L'0' to L'9', L'a' to L'f' or L'A' to L'F'. For other Unicode character, the value returned does not make sense. @param Char The character to convert. - @retval UINTN The numerical value converted. + @return The numerical value converted. **/ -STATIC UINTN +EFIAPI InternalHexCharToUintn ( IN CHAR16 Char ) @@ -577,25 +586,25 @@ InternalHexCharToUintn ( return Char - L'0'; } - return (UINTN) (10 + InternalCharToUpper (Char) - L'A'); + return (10 + InternalCharToUpper (Char) - L'A'); } /** Check if a Unicode character is a hexadecimal character. - This internal function checks if a Unicode character is a - decimal character. The valid hexadecimal character is + This internal function checks if a Unicode character is a + decimal character. The valid hexadecimal character is L'0' to L'9', L'a' to L'f', or L'A' to L'F'. @param Char The character to check against. @retval TRUE If the Char is a hexadecmial character. - @retval FALSE Otherwise. + @retval FALSE If the Char is not a hexadecmial character. **/ -STATIC BOOLEAN +EFIAPI InternalIsHexaDecimalDigitCharacter ( IN CHAR16 Char ) @@ -607,252 +616,142 @@ InternalIsHexaDecimalDigitCharacter ( } /** - Convert a Null-terminated Unicode decimal string to a value of + Convert a Null-terminated Unicode decimal string to a value of type UINTN. - This function returns a value of type UINTN by interpreting the contents - of the Unicode string specified by String as a decimal number. The format + This function returns a value of type UINTN by interpreting the contents + of the Unicode string specified by String as a decimal number. The format of the input Unicode string String is: - + [spaces] [decimal digits]. - - The valid decimal digit character is in the range [0-9]. The - function will ignore the pad space, which includes spaces or - tab characters, before [decimal digits]. The running zero in the - beginning of [decimal digits] will be ignored. Then, the function - stops at the first character that is a not a valid decimal character - or a Null-terminator, whichever one comes first. - + + The valid decimal digit character is in the range [0-9]. The + function will ignore the pad space, which includes spaces or + tab characters, before [decimal digits]. The running zero in the + beginning of [decimal digits] will be ignored. Then, the function + stops at the first character that is a not a valid decimal character + or a Null-terminator, whichever one comes first. + If String is NULL, then ASSERT(). - If String is not aligned in a 16-bit boundary, then ASSERT(). + If String is not aligned in a 16-bit boundary, then ASSERT(). If String has only pad spaces, then 0 is returned. - If String has no pad spaces or valid decimal digits, + If String has no pad spaces or valid decimal digits, then 0 is returned. - If the number represented by String overflows according - to the range defined by UINTN, then ASSERT(). - - If PcdMaximumUnicodeStringLength is not zero, and String contains - more than PcdMaximumUnicodeStringLength Unicode characters not including + If the number represented by String overflows according + to the range defined by UINTN, then MAX_UINTN is returned. + + If PcdMaximumUnicodeStringLength is not zero, and String contains + more than PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator, then ASSERT(). - @param String Pointer to a Null-terminated Unicode string. + @param String A pointer to a Null-terminated Unicode string. - @retval UINTN + @retval Value translated from String. **/ UINTN EFIAPI StrDecimalToUintn ( - IN CONST CHAR16 *String + IN CONST CHAR16 *String ) { UINTN Result; - - ASSERT (String != NULL); - ASSERT (((UINTN) String & 0x01) == 0); - ASSERT (StrLen (String) < PcdGet32 (PcdMaximumUnicodeStringLength)); - - // - // Ignore the pad spaces (space or tab) - // - while ((*String == L' ') || (*String == L'\t')) { - String++; - } - - // - // Ignore leading Zeros after the spaces - // - while (*String == L'0') { - String++; - } - - Result = 0; - while (InternalIsDecimalDigitCharacter (*String)) { - // - // If the number represented by String overflows according - // to the range defined by UINTN, then ASSERT(). - // - ASSERT ((Result < QUIENT_MAX_UINTN_DIVIDED_BY_10) || - ((Result == QUIENT_MAX_UINTN_DIVIDED_BY_10) && - (*String - L'0') <= REMINDER_MAX_UINTN_DIVIDED_BY_10) - ); - - Result = Result * 10 + (*String - L'0'); - String++; - } - + StrDecimalToUintnS (String, (CHAR16 **) NULL, &Result); return Result; } /** - Convert a Null-terminated Unicode decimal string to a value of + Convert a Null-terminated Unicode decimal string to a value of type UINT64. - This function returns a value of type UINT64 by interpreting the contents - of the Unicode string specified by String as a decimal number. The format + This function returns a value of type UINT64 by interpreting the contents + of the Unicode string specified by String as a decimal number. The format of the input Unicode string String is: - + [spaces] [decimal digits]. - - The valid decimal digit character is in the range [0-9]. The - function will ignore the pad space, which includes spaces or - tab characters, before [decimal digits]. The running zero in the - beginning of [decimal digits] will be ignored. Then, the function - stops at the first character that is a not a valid decimal character - or a Null-terminator, whichever one comes first. - + + The valid decimal digit character is in the range [0-9]. The + function will ignore the pad space, which includes spaces or + tab characters, before [decimal digits]. The running zero in the + beginning of [decimal digits] will be ignored. Then, the function + stops at the first character that is a not a valid decimal character + or a Null-terminator, whichever one comes first. + If String is NULL, then ASSERT(). - If String is not aligned in a 16-bit boundary, then ASSERT(). + If String is not aligned in a 16-bit boundary, then ASSERT(). If String has only pad spaces, then 0 is returned. - If String has no pad spaces or valid decimal digits, + If String has no pad spaces or valid decimal digits, then 0 is returned. - If the number represented by String overflows according - to the range defined by UINT64, then ASSERT(). - - If PcdMaximumUnicodeStringLength is not zero, and String contains - more than PcdMaximumUnicodeStringLength Unicode characters not including + If the number represented by String overflows according + to the range defined by UINT64, then MAX_UINT64 is returned. + + If PcdMaximumUnicodeStringLength is not zero, and String contains + more than PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator, then ASSERT(). - @param String Pointer to a Null-terminated Unicode string. + @param String A pointer to a Null-terminated Unicode string. - @retval UINT64 + @retval Value translated from String. **/ UINT64 EFIAPI StrDecimalToUint64 ( - IN CONST CHAR16 *String + IN CONST CHAR16 *String ) { UINT64 Result; - - ASSERT (String != NULL); - ASSERT (((UINTN) String & 0x01) == 0); - ASSERT (StrLen (String) < PcdGet32 (PcdMaximumUnicodeStringLength)); - - // - // Ignore the pad spaces (space or tab) - // - while ((*String == L' ') || (*String == L'\t')) { - String++; - } - // - // Ignore leading Zeros after the spaces - // - while (*String == L'0') { - String++; - } - - Result = 0; - - while (InternalIsDecimalDigitCharacter (*String)) { - // - // If the number represented by String overflows according - // to the range defined by UINTN, then ASSERT(). - // - ASSERT ((Result < QUIENT_MAX_UINT64_DIVIDED_BY_10) || - ((Result == QUIENT_MAX_UINT64_DIVIDED_BY_10) && - (*String - L'0') <= REMINDER_MAX_UINT64_DIVIDED_BY_10) - ); - - Result = MultU64x32 (Result, 10) + (*String - L'0'); - String++; - } - + StrDecimalToUint64S (String, (CHAR16 **) NULL, &Result); return Result; } /** Convert a Null-terminated Unicode hexadecimal string to a value of type UINTN. - This function returns a value of type UINTN by interpreting the contents - of the Unicode string specified by String as a hexadecimal number. + This function returns a value of type UINTN by interpreting the contents + of the Unicode string specified by String as a hexadecimal number. The format of the input Unicode string String is: - - [spaces][zeros][x][hexadecimal digits]. - - The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F]. - The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. - If "x" appears in the input string, it must be prefixed with at least one 0. - The function will ignore the pad space, which includes spaces or tab characters, - before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or - [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the - first valid hexadecimal digit. Then, the function stops at the first character that is + + [spaces][zeros][x][hexadecimal digits]. + + The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F]. + The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. + If "x" appears in the input string, it must be prefixed with at least one 0. + The function will ignore the pad space, which includes spaces or tab characters, + before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or + [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the + first valid hexadecimal digit. Then, the function stops at the first character that is a not a valid hexadecimal character or NULL, whichever one comes first. If String is NULL, then ASSERT(). If String is not aligned in a 16-bit boundary, then ASSERT(). If String has only pad spaces, then zero is returned. - If String has no leading pad spaces, leading zeros or valid hexadecimal digits, + If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then zero is returned. - If the number represented by String overflows according to the range defined by - UINTN, then ASSERT(). + If the number represented by String overflows according to the range defined by + UINTN, then MAX_UINTN is returned. - If PcdMaximumUnicodeStringLength is not zero, and String contains more than - PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, + If PcdMaximumUnicodeStringLength is not zero, and String contains more than + PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator, then ASSERT(). - @param String Pointer to a Null-terminated Unicode string. + @param String A pointer to a Null-terminated Unicode string. - @retval UINTN + @retval Value translated from String. **/ UINTN EFIAPI StrHexToUintn ( - IN CONST CHAR16 *String + IN CONST CHAR16 *String ) { UINTN Result; - ASSERT (String != NULL); - ASSERT (((UINTN) String & 0x01) == 0); - ASSERT (StrLen (String) < PcdGet32 (PcdMaximumUnicodeStringLength)); - - // - // Ignore the pad spaces (space or tab) - // - while ((*String == L' ') || (*String == L'\t')) { - String++; - } - - // - // Ignore leading Zeros after the spaces - // - while (*String == L'0') { - String++; - } - - if (InternalCharToUpper (*String) == L'X') { - ASSERT (*(String - 1) == L'0'); - if (*(String - 1) != L'0') { - return 0; - } - // - // Skip the 'X' - // - String++; - } - - Result = 0; - - while (InternalIsHexaDecimalDigitCharacter (*String)) { - // - // If the Hex Number represented by String overflows according - // to the range defined by UINTN, then ASSERT(). - // - ASSERT ((Result < QUIENT_MAX_UINTN_DIVIDED_BY_16) || - ((Result == QUIENT_MAX_UINTN_DIVIDED_BY_16) && - (InternalHexCharToUintn (*String) <= REMINDER_MAX_UINTN_DIVIDED_BY_16)) - ); - - Result = (Result << 4) + InternalHexCharToUintn (*String); - String++; - } - + StrHexToUintnS (String, (CHAR16 **) NULL, &Result); return Result; } @@ -860,110 +759,65 @@ StrHexToUintn ( /** Convert a Null-terminated Unicode hexadecimal string to a value of type UINT64. - This function returns a value of type UINT64 by interpreting the contents - of the Unicode string specified by String as a hexadecimal number. - The format of the input Unicode string String is - - [spaces][zeros][x][hexadecimal digits]. - - The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F]. - The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. - If "x" appears in the input string, it must be prefixed with at least one 0. - The function will ignore the pad space, which includes spaces or tab characters, - before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or - [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the - first valid hexadecimal digit. Then, the function stops at the first character that is + This function returns a value of type UINT64 by interpreting the contents + of the Unicode string specified by String as a hexadecimal number. + The format of the input Unicode string String is + + [spaces][zeros][x][hexadecimal digits]. + + The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F]. + The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. + If "x" appears in the input string, it must be prefixed with at least one 0. + The function will ignore the pad space, which includes spaces or tab characters, + before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or + [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the + first valid hexadecimal digit. Then, the function stops at the first character that is a not a valid hexadecimal character or NULL, whichever one comes first. If String is NULL, then ASSERT(). If String is not aligned in a 16-bit boundary, then ASSERT(). If String has only pad spaces, then zero is returned. - If String has no leading pad spaces, leading zeros or valid hexadecimal digits, + If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then zero is returned. - If the number represented by String overflows according to the range defined by - UINT64, then ASSERT(). + If the number represented by String overflows according to the range defined by + UINT64, then MAX_UINT64 is returned. - If PcdMaximumUnicodeStringLength is not zero, and String contains more than - PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, + If PcdMaximumUnicodeStringLength is not zero, and String contains more than + PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator, then ASSERT(). - @param String Pointer to a Null-terminated Unicode string. + @param String A pointer to a Null-terminated Unicode string. - @retval UINT64 + @retval Value translated from String. **/ UINT64 EFIAPI StrHexToUint64 ( - IN CONST CHAR16 *String + IN CONST CHAR16 *String ) { UINT64 Result; - ASSERT (String != NULL); - ASSERT (((UINTN) String & 0x01) == 0); - ASSERT (StrLen (String) < PcdGet32 (PcdMaximumUnicodeStringLength)); - - // - // Ignore the pad spaces (space or tab) - // - while ((*String == L' ') || (*String == L'\t')) { - String++; - } - - // - // Ignore leading Zeros after the spaces - // - while (*String == L'0') { - String++; - } - - if (InternalCharToUpper (*String) == L'X') { - ASSERT (*(String - 1) == L'0'); - if (*(String - 1) != L'0') { - return 0; - } - // - // Skip the 'X' - // - String++; - } - - Result = 0; - - while (InternalIsHexaDecimalDigitCharacter (*String)) { - // - // If the Hex Number represented by String overflows according - // to the range defined by UINTN, then ASSERT(). - // - ASSERT ((Result < QUIENT_MAX_UINT64_DIVIDED_BY_16)|| - ((Result == QUIENT_MAX_UINT64_DIVIDED_BY_16) && - (InternalHexCharToUintn (*String) <= REMINDER_MAX_UINT64_DIVIDED_BY_16)) - ); - - Result = LShiftU64 (Result, 4); - Result = Result + InternalHexCharToUintn (*String); - String++; - } - + StrHexToUint64S (String, (CHAR16 **) NULL, &Result); return Result; } /** Check if a ASCII character is a decimal character. - This internal function checks if a Unicode character is a + This internal function checks if a Unicode character is a decimal character. The valid decimal character is from '0' to '9'. @param Char The character to check against. @retval TRUE If the Char is a decmial character. - @retval FALSE Otherwise. + @retval FALSE If the Char is not a decmial character. **/ -STATIC BOOLEAN +EFIAPI InternalAsciiIsDecimalDigitCharacter ( IN CHAR8 Char ) @@ -974,19 +828,19 @@ InternalAsciiIsDecimalDigitCharacter ( /** Check if a ASCII character is a hexadecimal character. - This internal function checks if a ASCII character is a - decimal character. The valid hexadecimal character is + This internal function checks if a ASCII character is a + decimal character. The valid hexadecimal character is L'0' to L'9', L'a' to L'f', or L'A' to L'F'. @param Char The character to check against. @retval TRUE If the Char is a hexadecmial character. - @retval FALSE Otherwise. + @retval FALSE If the Char is not a hexadecmial character. **/ -STATIC BOOLEAN +EFIAPI InternalAsciiIsHexaDecimalDigitCharacter ( IN CHAR8 Char ) @@ -997,67 +851,71 @@ InternalAsciiIsHexaDecimalDigitCharacter ( (Char >= 'a' && Char <= 'f')); } +#ifndef DISABLE_NEW_DEPRECATED_INTERFACES + /** - Convert a Null-terminated Unicode string to a Null-terminated + [ATTENTION] This function is deprecated for security reason. + + Convert a Null-terminated Unicode string to a Null-terminated ASCII string and returns the ASCII string. - - This function converts the content of the Unicode string Source - to the ASCII string Destination by copying the lower 8 bits of - each Unicode character. It returns Destination. The function terminates - the ASCII string Destination by appending a Null-terminator character - at the end. The caller is responsible to make sure Destination points - to a buffer with size equal or greater than (StrLen (Source) + 1) in bytes. + + This function converts the content of the Unicode string Source + to the ASCII string Destination by copying the lower 8 bits of + each Unicode character. It returns Destination. + + The caller is responsible to make sure Destination points to a buffer with size + equal or greater than ((StrLen (Source) + 1) * sizeof (CHAR8)) in bytes. + + If any Unicode characters in Source contain non-zero value in + the upper 8 bits, then ASSERT(). If Destination is NULL, then ASSERT(). If Source is NULL, then ASSERT(). If Source is not aligned on a 16-bit boundary, then ASSERT(). If Source and Destination overlap, then ASSERT(). - If any Unicode characters in Source contain non-zero value in - the upper 8 bits, then ASSERT(). - - If PcdMaximumUnicodeStringLength is not zero, and Source contains - more than PcdMaximumUnicodeStringLength Unicode characters not including + If PcdMaximumUnicodeStringLength is not zero, and Source contains + more than PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator, then ASSERT(). - - If PcdMaximumAsciiStringLength is not zero, and Source contains more - than PcdMaximumAsciiStringLength Unicode characters not including the + + If PcdMaximumAsciiStringLength is not zero, and Source contains more + than PcdMaximumAsciiStringLength Unicode characters, not including the Null-terminator, then ASSERT(). - @param Source Pointer to a Null-terminated Unicode string. - @param Destination Pointer to a Null-terminated ASCII string. + @param Source A pointer to a Null-terminated Unicode string. + @param Destination A pointer to a Null-terminated ASCII string. - @reture Destination + @return Destination. **/ CHAR8 * EFIAPI UnicodeStrToAsciiStr ( - IN CONST CHAR16 *Source, - OUT CHAR8 *Destination + IN CONST CHAR16 *Source, + OUT CHAR8 *Destination ) { + CHAR8 *ReturnValue; + ASSERT (Destination != NULL); - ASSERT (Source != NULL); - ASSERT (((UINTN) Source & 0x01) == 0); // - // Source and Destination should not overlap + // ASSERT if Source is long than PcdMaximumUnicodeStringLength. + // Length tests are performed inside StrLen(). // - ASSERT ((UINTN) ((CHAR16 *) Destination - Source) > StrLen (Source)); - ASSERT ((UINTN) ((CHAR8 *) Source - Destination) > StrLen (Source)); + ASSERT (StrSize (Source) != 0); // - // If PcdMaximumUnicodeStringLength is not zero, - // length of Source should not more than PcdMaximumUnicodeStringLength + // Source and Destination should not overlap // - if (PcdGet32 (PcdMaximumUnicodeStringLength) != 0) { - ASSERT (StrLen (Source) < PcdGet32 (PcdMaximumUnicodeStringLength)); - } + ASSERT ((UINTN) (Destination - (CHAR8 *) Source) >= StrSize (Source)); + ASSERT ((UINTN) ((CHAR8 *) Source - Destination) > StrLen (Source)); + + ReturnValue = Destination; while (*Source != '\0') { // - // If any Unicode characters in Source contain + // If any Unicode characters in Source contain // non-zero value in the upper 8 bits, then ASSERT(). // ASSERT (*Source < 0x100); @@ -1065,12 +923,19 @@ UnicodeStrToAsciiStr ( } *Destination = '\0'; - - return Destination; -} + // + // ASSERT Original Destination is less long than PcdMaximumAsciiStringLength. + // Length tests are performed inside AsciiStrLen(). + // + ASSERT (AsciiStrSize (ReturnValue) != 0); + + return ReturnValue; +} /** + [ATTENTION] This function will be deprecated for security reason. + Copies one Null-terminated ASCII string to another Null-terminated ASCII string and returns the new ASCII string. @@ -1082,11 +947,11 @@ UnicodeStrToAsciiStr ( If Source is NULL, then ASSERT(). If Source and Destination overlap, then ASSERT(). If PcdMaximumAsciiStringLength is not zero and Source contains more than - PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, + PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator, then ASSERT(). - @param Destination Pointer to a Null-terminated ASCII string. - @param Source Pointer to a Null-terminated ASCII string. + @param Destination A pointer to a Null-terminated ASCII string. + @param Source A pointer to a Null-terminated ASCII string. @return Destination @@ -1112,7 +977,7 @@ AsciiStrCpy ( ASSERT ((UINTN)(Source - Destination) > AsciiStrLen (Source)); ReturnValue = Destination; - while (*Source) { + while (*Source != 0) { *(Destination++) = *(Source++); } *Destination = 0; @@ -1120,9 +985,10 @@ AsciiStrCpy ( } /** - Copies one Null-terminated ASCII string with a maximum length to another - Null-terminated ASCII string with a maximum length and returns the new ASCII - string. + [ATTENTION] This function will be deprecated for security reason. + + Copies up to a specified length one Null-terminated ASCII string to another + Null-terminated ASCII string and returns the new ASCII string. This function copies the contents of the ASCII string Source to the ASCII string Destination, and returns Destination. At most, Length ASCII characters @@ -1134,13 +1000,15 @@ AsciiStrCpy ( If Destination is NULL, then ASSERT(). If Source is NULL, then ASSERT(). If Source and Destination overlap, then ASSERT(). + If PcdMaximumAsciiStringLength is not zero, and Length is greater than + PcdMaximumAsciiStringLength, then ASSERT(). If PcdMaximumAsciiStringLength is not zero, and Source contains more than - PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, + PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator, then ASSERT(). - @param Destination Pointer to a Null-terminated ASCII string. - @param Source Pointer to a Null-terminated ASCII string. - @param Length Maximum number of ASCII characters to copy. + @param Destination A pointer to a Null-terminated ASCII string. + @param Source A pointer to a Null-terminated ASCII string. + @param Length The maximum number of ASCII characters to copy. @return Destination @@ -1170,9 +1038,13 @@ AsciiStrnCpy ( ASSERT ((UINTN)(Destination - Source) > AsciiStrLen (Source)); ASSERT ((UINTN)(Source - Destination) >= Length); + if (PcdGet32 (PcdMaximumAsciiStringLength) != 0) { + ASSERT (Length <= PcdGet32 (PcdMaximumAsciiStringLength)); + } + ReturnValue = Destination; - while (*Source && Length > 0) { + while (*Source != 0 && Length > 0) { *(Destination++) = *(Source++); Length--; } @@ -1180,6 +1052,7 @@ AsciiStrnCpy ( ZeroMem (Destination, Length * sizeof (*Destination)); return ReturnValue; } +#endif /** Returns the length of a Null-terminated ASCII string. @@ -1187,12 +1060,13 @@ AsciiStrnCpy ( This function returns the number of ASCII characters in the Null-terminated ASCII string specified by String. - If String is NULL, then ASSERT(). + If Length > 0 and Destination is NULL, then ASSERT(). + If Length > 0 and Source is NULL, then ASSERT(). If PcdMaximumAsciiStringLength is not zero and String contains more than - PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, + PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator, then ASSERT(). - @param String Pointer to a Null-terminated ASCII string. + @param String A pointer to a Null-terminated ASCII string. @return The length of String. @@ -1228,10 +1102,10 @@ AsciiStrLen ( If String is NULL, then ASSERT(). If PcdMaximumAsciiStringLength is not zero and String contains more than - PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, + PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator, then ASSERT(). - @param String Pointer to a Null-terminated ASCII string. + @param String A pointer to a Null-terminated ASCII string. @return The size of String. @@ -1258,17 +1132,17 @@ AsciiStrSize ( If FirstString is NULL, then ASSERT(). If SecondString is NULL, then ASSERT(). If PcdMaximumAsciiStringLength is not zero and FirstString contains more than - PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, + PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator, then ASSERT(). If PcdMaximumAsciiStringLength is not zero and SecondString contains more - than PcdMaximumAsciiStringLength ASCII characters not including the + than PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator, then ASSERT(). - @param FirstString Pointer to a Null-terminated ASCII string. - @param SecondString Pointer to a Null-terminated ASCII string. + @param FirstString A pointer to a Null-terminated ASCII string. + @param SecondString A pointer to a Null-terminated ASCII string. - @retval 0 FirstString is identical to SecondString. - @retval !=0 FirstString is not identical to SecondString. + @retval ==0 FirstString is identical to SecondString. + @retval !=0 FirstString is not identical to SecondString. **/ INTN @@ -1293,21 +1167,21 @@ AsciiStrCmp ( } /** - Converts a lowercase Ascii character to upper one + Converts a lowercase Ascii character to upper one. If Chr is lowercase Ascii character, then converts it to upper one. If Value >= 0xA0, then ASSERT(). If (Value & 0x0F) >= 0x0A, then ASSERT(). - @param chr one Ascii character + @param Chr one Ascii character - @return The uppercase value of Ascii character + @return The uppercase value of Ascii character **/ -STATIC CHAR8 -AsciiToUpper ( +EFIAPI +InternalBaseLibAsciiToUpper ( IN CHAR8 Chr ) { @@ -1319,16 +1193,16 @@ AsciiToUpper ( This internal function only deal with Unicode character which maps to a valid hexadecimal ASII character, i.e. - '0' to '9', 'a' to 'f' or 'A' to 'F'. For other + '0' to '9', 'a' to 'f' or 'A' to 'F'. For other ASCII character, the value returned does not make sense. @param Char The character to convert. - @retval UINTN The numerical value converted. + @return The numerical value converted. **/ -STATIC UINTN +EFIAPI InternalAsciiHexCharToUintn ( IN CHAR8 Char ) @@ -1337,7 +1211,7 @@ InternalAsciiHexCharToUintn ( return Char - '0'; } - return (UINTN) (10 + AsciiToUpper (Char) - 'A'); + return (10 + InternalBaseLibAsciiToUpper (Char) - 'A'); } @@ -1355,19 +1229,19 @@ InternalAsciiHexCharToUintn ( If FirstString is NULL, then ASSERT(). If SecondString is NULL, then ASSERT(). If PcdMaximumAsciiStringLength is not zero and FirstString contains more than - PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, + PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator, then ASSERT(). If PcdMaximumAsciiStringLength is not zero and SecondString contains more - than PcdMaximumAsciiStringLength ASCII characters not including the + than PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator, then ASSERT(). - @param FirstString Pointer to a Null-terminated ASCII string. - @param SecondString Pointer to a Null-terminated ASCII string. + @param FirstString A pointer to a Null-terminated ASCII string. + @param SecondString A pointer to a Null-terminated ASCII string. - @retval 0 FirstString is identical to SecondString using case insensitive - comparisons. - @retval !=0 FirstString is not identical to SecondString using case - insensitive comparisons. + @retval ==0 FirstString is identical to SecondString using case insensitive + comparisons. + @retval !=0 FirstString is not identical to SecondString using case + insensitive comparisons. **/ INTN @@ -1386,13 +1260,13 @@ AsciiStriCmp ( ASSERT (AsciiStrSize (FirstString)); ASSERT (AsciiStrSize (SecondString)); - UpperFirstString = AsciiToUpper (*FirstString); - UpperSecondString = AsciiToUpper (*SecondString); + UpperFirstString = InternalBaseLibAsciiToUpper (*FirstString); + UpperSecondString = InternalBaseLibAsciiToUpper (*SecondString); while ((*FirstString != '\0') && (UpperFirstString == UpperSecondString)) { FirstString++; SecondString++; - UpperFirstString = AsciiToUpper (*FirstString); - UpperSecondString = AsciiToUpper (*SecondString); + UpperFirstString = InternalBaseLibAsciiToUpper (*FirstString); + UpperSecondString = InternalBaseLibAsciiToUpper (*SecondString); } return UpperFirstString - UpperSecondString; @@ -1409,20 +1283,23 @@ AsciiStriCmp ( is the first mismatched ASCII character in SecondString subtracted from the first mismatched ASCII character in FirstString. - If FirstString is NULL, then ASSERT(). - If SecondString is NULL, then ASSERT(). - If PcdMaximumAsciiStringLength is not zero and FirstString contains more than - PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, + If Length > 0 and FirstString is NULL, then ASSERT(). + If Length > 0 and SecondString is NULL, then ASSERT(). + If PcdMaximumAsciiStringLength is not zero, and Length is greater than + PcdMaximumAsciiStringLength, then ASSERT(). + If PcdMaximumAsciiStringLength is not zero, and FirstString contains more than + PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator, then ASSERT(). - If PcdMaximumAsciiStringLength is not zero and SecondString contains more than - PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, + If PcdMaximumAsciiStringLength is not zero, and SecondString contains more than + PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator, then ASSERT(). - @param FirstString Pointer to a Null-terminated ASCII string. - @param SecondString Pointer to a Null-terminated ASCII string. + @param FirstString A pointer to a Null-terminated ASCII string. + @param SecondString A pointer to a Null-terminated ASCII string. + @param Length The maximum number of ASCII characters for compare. - @retval 0 FirstString is identical to SecondString. - @retval !=0 FirstString is not identical to SecondString. + @retval ==0 FirstString is identical to SecondString. + @retval !=0 FirstString is not identical to SecondString. **/ INTN @@ -1443,7 +1320,12 @@ AsciiStrnCmp ( ASSERT (AsciiStrSize (FirstString)); ASSERT (AsciiStrSize (SecondString)); + if (PcdGet32 (PcdMaximumAsciiStringLength) != 0) { + ASSERT (Length <= PcdGet32 (PcdMaximumAsciiStringLength)); + } + while ((*FirstString != '\0') && + (*SecondString != '\0') && (*FirstString == *SecondString) && (Length > 1)) { FirstString++; @@ -1453,7 +1335,11 @@ AsciiStrnCmp ( return *FirstString - *SecondString; } +#ifndef DISABLE_NEW_DEPRECATED_INTERFACES + /** + [ATTENTION] This function will be deprecated for security reason. + Concatenates one Null-terminated ASCII string to another Null-terminated ASCII string, and returns the concatenated ASCII string. @@ -1465,17 +1351,17 @@ AsciiStrnCmp ( If Destination is NULL, then ASSERT(). If Source is NULL, then ASSERT(). If PcdMaximumAsciiStringLength is not zero and Destination contains more than - PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, + PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator, then ASSERT(). If PcdMaximumAsciiStringLength is not zero and Source contains more than - PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, + PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator, then ASSERT(). If PcdMaximumAsciiStringLength is not zero and concatenating Destination and Source results in a ASCII string with more than PcdMaximumAsciiStringLength ASCII characters, then ASSERT(). - @param Destination Pointer to a Null-terminated ASCII string. - @param Source Pointer to a Null-terminated ASCII string. + @param Destination A pointer to a Null-terminated ASCII string. + @param Source A pointer to a Null-terminated ASCII string. @return Destination @@ -1498,9 +1384,11 @@ AsciiStrCat ( } /** - Concatenates one Null-terminated ASCII string with a maximum length to the - end of another Null-terminated ASCII string, and returns the concatenated - ASCII string. + [ATTENTION] This function will be deprecated for security reason. + + Concatenates up to a specified length one Null-terminated ASCII string to + the end of another Null-terminated ASCII string, and returns the + concatenated ASCII string. This function concatenates two Null-terminated ASCII strings. The contents of Null-terminated ASCII string Source are concatenated to the end of Null- @@ -1510,22 +1398,24 @@ AsciiStrCat ( Destination is returned unmodified. If Source and Destination overlap, then the results are undefined. - If Destination is NULL, then ASSERT(). - If Source is NULL, then ASSERT(). + If Length > 0 and Destination is NULL, then ASSERT(). + If Length > 0 and Source is NULL, then ASSERT(). If Source and Destination overlap, then ASSERT(). + If PcdMaximumAsciiStringLength is not zero, and Length is greater than + PcdMaximumAsciiStringLength, then ASSERT(). If PcdMaximumAsciiStringLength is not zero, and Destination contains more than - PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, + PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator, then ASSERT(). If PcdMaximumAsciiStringLength is not zero, and Source contains more than - PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, + PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator, then ASSERT(). If PcdMaximumAsciiStringLength is not zero, and concatenating Destination and Source results in a ASCII string with more than PcdMaximumAsciiStringLength - ASCII characters not including the Null-terminator, then ASSERT(). + ASCII characters, not including the Null-terminator, then ASSERT(). - @param Destination Pointer to a Null-terminated ASCII string. - @param Source Pointer to a Null-terminated ASCII string. - @param Length Maximum number of ASCII characters to concatenate from + @param Destination A pointer to a Null-terminated ASCII string. + @param Source A pointer to a Null-terminated ASCII string. + @param Length The maximum number of ASCII characters to concatenate from Source. @return Destination @@ -1539,7 +1429,11 @@ AsciiStrnCat ( IN UINTN Length ) { - AsciiStrnCpy (Destination + AsciiStrLen (Destination), Source, Length); + UINTN DestinationLen; + + DestinationLen = AsciiStrLen (Destination); + AsciiStrnCpy (Destination + DestinationLen, Source, Length); + Destination[DestinationLen + Length] = '\0'; // // Size of the resulting string should never be zero. @@ -1548,323 +1442,204 @@ AsciiStrnCat ( ASSERT (AsciiStrSize (Destination) != 0); return Destination; } +#endif /** - Returns the first occurance of a Null-terminated ASCII sub-string + Returns the first occurrence of a Null-terminated ASCII sub-string in a Null-terminated ASCII string. - This function scans the contents of the ASCII string specified by String - and returns the first occurrence of SearchString. If SearchString is not - found in String, then NULL is returned. If the length of SearchString is zero, + This function scans the contents of the ASCII string specified by String + and returns the first occurrence of SearchString. If SearchString is not + found in String, then NULL is returned. If the length of SearchString is zero, then String is returned. - + If String is NULL, then ASSERT(). If SearchString is NULL, then ASSERT(). - If PcdMaximumAsciiStringLength is not zero, and SearchString or - String contains more than PcdMaximumAsciiStringLength Unicode characters + If PcdMaximumAsciiStringLength is not zero, and SearchString or + String contains more than PcdMaximumAsciiStringLength Unicode characters not including the Null-terminator, then ASSERT(). - @param String Pointer to a Null-terminated ASCII string. - @param SearchString Pointer to a Null-terminated ASCII string to search for. + @param String A pointer to a Null-terminated ASCII string. + @param SearchString A pointer to a Null-terminated ASCII string to search for. @retval NULL If the SearchString does not appear in String. - @retval !NULL If there is a match. + @retval others If there is a match return the first occurrence of SearchingString. + If the length of SearchString is zero,return String. **/ CHAR8 * EFIAPI AsciiStrStr ( - IN CONST CHAR8 *String, - IN CONST CHAR8 *SearchString + IN CONST CHAR8 *String, + IN CONST CHAR8 *SearchString ) { CONST CHAR8 *FirstMatch; CONST CHAR8 *SearchStringTmp; - ASSERT (String != NULL); - ASSERT (SearchString != NULL); - // - // If PcdMaximumUnicodeStringLength is not zero, - // length of String should not more than PcdMaximumUnicodeStringLength + // ASSERT both strings are less long than PcdMaximumAsciiStringLength // - if (PcdGet32 (PcdMaximumAsciiStringLength) != 0) { - ASSERT (AsciiStrLen (String) < PcdGet32 (PcdMaximumAsciiStringLength)); - } + ASSERT (AsciiStrSize (String) != 0); + ASSERT (AsciiStrSize (SearchString) != 0); - // - // If PcdMaximumUnicodeStringLength is not zero, - // length of SearchString should not more than PcdMaximumUnicodeStringLength - // - if (PcdGet32 (PcdMaximumAsciiStringLength) != 0) { - ASSERT (AsciiStrLen (SearchString) < PcdGet32 (PcdMaximumAsciiStringLength)); + if (*SearchString == '\0') { + return (CHAR8 *) String; } while (*String != '\0') { SearchStringTmp = SearchString; FirstMatch = String; - - while ((*String == *SearchStringTmp) - && (*SearchStringTmp != '\0') + + while ((*String == *SearchStringTmp) && (*String != '\0')) { String++; SearchStringTmp++; - } - + } + if (*SearchStringTmp == '\0') { return (CHAR8 *) FirstMatch; } - if (SearchStringTmp == SearchString) { - // - // If no character from SearchString match, - // move the pointer to the String under search - // by one character. - // - String++; + if (*String == '\0') { + return NULL; } + String = FirstMatch + 1; } return NULL; } /** - Convert a Null-terminated ASCII decimal string to a value of type + Convert a Null-terminated ASCII decimal string to a value of type UINTN. - This function returns a value of type UINTN by interpreting the contents - of the ASCII string String as a decimal number. The format of the input + This function returns a value of type UINTN by interpreting the contents + of the ASCII string String as a decimal number. The format of the input ASCII string String is: - + [spaces] [decimal digits]. - - The valid decimal digit character is in the range [0-9]. The function will - ignore the pad space, which includes spaces or tab characters, before the digits. - The running zero in the beginning of [decimal digits] will be ignored. Then, the - function stops at the first character that is a not a valid decimal character or + + The valid decimal digit character is in the range [0-9]. The function will + ignore the pad space, which includes spaces or tab characters, before the digits. + The running zero in the beginning of [decimal digits] will be ignored. Then, the + function stops at the first character that is a not a valid decimal character or Null-terminator, whichever on comes first. - + If String has only pad spaces, then 0 is returned. If String has no pad spaces or valid decimal digits, then 0 is returned. - If the number represented by String overflows according to the range defined by - UINTN, then ASSERT(). + If the number represented by String overflows according to the range defined by + UINTN, then MAX_UINTN is returned. If String is NULL, then ASSERT(). - If PcdMaximumAsciiStringLength is not zero, and String contains more than - PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, + If PcdMaximumAsciiStringLength is not zero, and String contains more than + PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then ASSERT(). - @param String Pointer to a Null-terminated ASCII string. + @param String A pointer to a Null-terminated ASCII string. - @retval UINTN + @retval Value translated from String. **/ UINTN EFIAPI AsciiStrDecimalToUintn ( - IN CONST CHAR8 *String + IN CONST CHAR8 *String ) { UINTN Result; - - ASSERT (String != NULL); - ASSERT (AsciiStrLen (String) < PcdGet32 (PcdMaximumAsciiStringLength)); - // - // Ignore the pad spaces (space or tab) - // - while ((*String == ' ') || (*String == '\t')) { - String++; - } - - // - // Ignore leading Zeros after the spaces - // - while (*String == '0') { - String++; - } - - Result = 0; - - while (InternalAsciiIsDecimalDigitCharacter (*String)) { - // - // If the number represented by String overflows according - // to the range defined by UINTN, then ASSERT(). - // - ASSERT ((Result < QUIENT_MAX_UINTN_DIVIDED_BY_10) || - ((Result == QUIENT_MAX_UINTN_DIVIDED_BY_10) && - (*String - '0') <= REMINDER_MAX_UINTN_DIVIDED_BY_10) - ); - - Result = Result * 10 + (*String - '0'); - String++; - } - + AsciiStrDecimalToUintnS (String, (CHAR8 **) NULL, &Result); return Result; } /** - Convert a Null-terminated ASCII decimal string to a value of type + Convert a Null-terminated ASCII decimal string to a value of type UINT64. - This function returns a value of type UINT64 by interpreting the contents - of the ASCII string String as a decimal number. The format of the input + This function returns a value of type UINT64 by interpreting the contents + of the ASCII string String as a decimal number. The format of the input ASCII string String is: - + [spaces] [decimal digits]. - - The valid decimal digit character is in the range [0-9]. The function will - ignore the pad space, which includes spaces or tab characters, before the digits. - The running zero in the beginning of [decimal digits] will be ignored. Then, the - function stops at the first character that is a not a valid decimal character or + + The valid decimal digit character is in the range [0-9]. The function will + ignore the pad space, which includes spaces or tab characters, before the digits. + The running zero in the beginning of [decimal digits] will be ignored. Then, the + function stops at the first character that is a not a valid decimal character or Null-terminator, whichever on comes first. - + If String has only pad spaces, then 0 is returned. If String has no pad spaces or valid decimal digits, then 0 is returned. - If the number represented by String overflows according to the range defined by - UINT64, then ASSERT(). + If the number represented by String overflows according to the range defined by + UINT64, then MAX_UINT64 is returned. If String is NULL, then ASSERT(). - If PcdMaximumAsciiStringLength is not zero, and String contains more than - PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, + If PcdMaximumAsciiStringLength is not zero, and String contains more than + PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then ASSERT(). - @param String Pointer to a Null-terminated ASCII string. + @param String A pointer to a Null-terminated ASCII string. - @retval UINT64 + @retval Value translated from String. **/ UINT64 EFIAPI AsciiStrDecimalToUint64 ( - IN CONST CHAR8 *String + IN CONST CHAR8 *String ) { UINT64 Result; - - ASSERT (String != NULL); - ASSERT (AsciiStrLen (String) < PcdGet32 (PcdMaximumAsciiStringLength)); - - // - // Ignore the pad spaces (space or tab) - // - while ((*String == ' ') || (*String == '\t')) { - String++; - } - - // - // Ignore leading Zeros after the spaces - // - while (*String == '0') { - String++; - } - Result = 0; - - while (InternalAsciiIsDecimalDigitCharacter (*String)) { - // - // If the number represented by String overflows according - // to the range defined by UINTN, then ASSERT(). - // - ASSERT ((Result < QUIENT_MAX_UINT64_DIVIDED_BY_10) || - ((Result == QUIENT_MAX_UINT64_DIVIDED_BY_10) && - (*String - '0') <= REMINDER_MAX_UINT64_DIVIDED_BY_10) - ); - - Result = MultU64x32 (Result, 10) + (*String - '0'); - String++; - } - + AsciiStrDecimalToUint64S (String, (CHAR8 **) NULL, &Result); return Result; } /** Convert a Null-terminated ASCII hexadecimal string to a value of type UINTN. - This function returns a value of type UINTN by interpreting the contents of - the ASCII string String as a hexadecimal number. The format of the input ASCII + This function returns a value of type UINTN by interpreting the contents of + the ASCII string String as a hexadecimal number. The format of the input ASCII string String is: - + [spaces][zeros][x][hexadecimal digits]. - - The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F]. - The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x" - appears in the input string, it must be prefixed with at least one 0. The function - will ignore the pad space, which includes spaces or tab characters, before [zeros], - [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits] - will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal - digit. Then, the function stops at the first character that is a not a valid + + The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F]. + The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x" + appears in the input string, it must be prefixed with at least one 0. The function + will ignore the pad space, which includes spaces or tab characters, before [zeros], + [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits] + will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal + digit. Then, the function stops at the first character that is a not a valid hexadecimal character or Null-terminator, whichever on comes first. - + If String has only pad spaces, then 0 is returned. If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then 0 is returned. - If the number represented by String overflows according to the range defined by UINTN, - then ASSERT(). + If the number represented by String overflows according to the range defined by UINTN, + then MAX_UINTN is returned. If String is NULL, then ASSERT(). - If PcdMaximumAsciiStringLength is not zero, - and String contains more than PcdMaximumAsciiStringLength ASCII characters not including + If PcdMaximumAsciiStringLength is not zero, + and String contains more than PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then ASSERT(). - @param String Pointer to a Null-terminated ASCII string. + @param String A pointer to a Null-terminated ASCII string. - @retval UINTN + @retval Value translated from String. **/ UINTN EFIAPI AsciiStrHexToUintn ( - IN CONST CHAR8 *String + IN CONST CHAR8 *String ) { UINTN Result; - ASSERT (String != NULL); - ASSERT (AsciiStrLen (String) < PcdGet32 (PcdMaximumAsciiStringLength)); - - // - // Ignore the pad spaces (space or tab) - // - while ((*String == ' ') || (*String == '\t')) { - String++; - } - - // - // Ignore leading Zeros after the spaces - // - while (*String == '0') { - String++; - } - - if (AsciiToUpper (*String) == 'X') { - ASSERT (*(String - 1) == '0'); - if (*(String - 1) != '0') { - return 0; - } - // - // Skip the 'X' - // - String++; - } - - Result = 0; - - while (InternalAsciiIsHexaDecimalDigitCharacter (*String)) { - // - // If the Hex Number represented by String overflows according - // to the range defined by UINTN, then ASSERT(). - // - ASSERT ((Result < QUIENT_MAX_UINTN_DIVIDED_BY_16) || - ((Result == QUIENT_MAX_UINTN_DIVIDED_BY_16) && - (InternalAsciiHexCharToUintn (*String) <= REMINDER_MAX_UINTN_DIVIDED_BY_16)) - ); - - Result = (Result << 4) + InternalAsciiHexCharToUintn (*String); - String++; - } - + AsciiStrHexToUintnS (String, (CHAR8 **) NULL, &Result); return Result; } @@ -1872,148 +1647,104 @@ AsciiStrHexToUintn ( /** Convert a Null-terminated ASCII hexadecimal string to a value of type UINT64. - This function returns a value of type UINT64 by interpreting the contents of - the ASCII string String as a hexadecimal number. The format of the input ASCII + This function returns a value of type UINT64 by interpreting the contents of + the ASCII string String as a hexadecimal number. The format of the input ASCII string String is: - + [spaces][zeros][x][hexadecimal digits]. - - The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F]. - The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x" - appears in the input string, it must be prefixed with at least one 0. The function - will ignore the pad space, which includes spaces or tab characters, before [zeros], - [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits] - will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal - digit. Then, the function stops at the first character that is a not a valid + + The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F]. + The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x" + appears in the input string, it must be prefixed with at least one 0. The function + will ignore the pad space, which includes spaces or tab characters, before [zeros], + [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits] + will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal + digit. Then, the function stops at the first character that is a not a valid hexadecimal character or Null-terminator, whichever on comes first. - + If String has only pad spaces, then 0 is returned. If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then 0 is returned. - If the number represented by String overflows according to the range defined by UINT64, - then ASSERT(). + If the number represented by String overflows according to the range defined by UINT64, + then MAX_UINT64 is returned. If String is NULL, then ASSERT(). - If PcdMaximumAsciiStringLength is not zero, - and String contains more than PcdMaximumAsciiStringLength ASCII characters not including + If PcdMaximumAsciiStringLength is not zero, + and String contains more than PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then ASSERT(). - @param String Pointer to a Null-terminated ASCII string. + @param String A pointer to a Null-terminated ASCII string. - @retval UINT64 + @retval Value translated from String. **/ UINT64 EFIAPI AsciiStrHexToUint64 ( - IN CONST CHAR8 *String + IN CONST CHAR8 *String ) { UINT64 Result; - ASSERT (String != NULL); - ASSERT (AsciiStrLen (String) < PcdGet32 (PcdMaximumUnicodeStringLength)); - - // - // Ignore the pad spaces (space or tab) and leading Zeros - // - // - // Ignore the pad spaces (space or tab) - // - while ((*String == ' ') || (*String == '\t')) { - String++; - } - - // - // Ignore leading Zeros after the spaces - // - while (*String == '0') { - String++; - } - - if (AsciiToUpper (*String) == 'X') { - ASSERT (*(String - 1) == '0'); - if (*(String - 1) != '0') { - return 0; - } - // - // Skip the 'X' - // - String++; - } - - Result = 0; - - while (InternalAsciiIsHexaDecimalDigitCharacter (*String)) { - // - // If the Hex Number represented by String overflows according - // to the range defined by UINTN, then ASSERT(). - // - ASSERT ((Result < QUIENT_MAX_UINT64_DIVIDED_BY_16) || - ((Result == QUIENT_MAX_UINT64_DIVIDED_BY_16) && - (InternalAsciiHexCharToUintn (*String) <= REMINDER_MAX_UINT64_DIVIDED_BY_16)) - ); - - Result = LShiftU64 (Result, 4); - Result = Result + InternalAsciiHexCharToUintn (*String); - String++; - } - + AsciiStrHexToUint64S (String, (CHAR8 **) NULL, &Result); return Result; } +#ifndef DISABLE_NEW_DEPRECATED_INTERFACES /** - Convert one Null-terminated ASCII string to a Null-terminated + [ATTENTION] This function is deprecated for security reason. + + Convert one Null-terminated ASCII string to a Null-terminated Unicode string and returns the Unicode string. - This function converts the contents of the ASCII string Source to the Unicode - string Destination, and returns Destination. The function terminates the - Unicode string Destination by appending a Null-terminator character at the end. - The caller is responsible to make sure Destination points to a buffer with size + This function converts the contents of the ASCII string Source to the Unicode + string Destination, and returns Destination. The function terminates the + Unicode string Destination by appending a Null-terminator character at the end. + The caller is responsible to make sure Destination points to a buffer with size equal or greater than ((AsciiStrLen (Source) + 1) * sizeof (CHAR16)) in bytes. - + If Destination is NULL, then ASSERT(). If Destination is not aligned on a 16-bit boundary, then ASSERT(). If Source is NULL, then ASSERT(). If Source and Destination overlap, then ASSERT(). - If PcdMaximumAsciiStringLength is not zero, and Source contains more than - PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, + If PcdMaximumAsciiStringLength is not zero, and Source contains more than + PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then ASSERT(). - If PcdMaximumUnicodeStringLength is not zero, and Source contains more than - PcdMaximumUnicodeStringLength ASCII characters not including the + If PcdMaximumUnicodeStringLength is not zero, and Source contains more than + PcdMaximumUnicodeStringLength ASCII characters not including the Null-terminator, then ASSERT(). - @param Source Pointer to a Null-terminated ASCII string. - @param Destination Pointer to a Null-terminated Unicode string. + @param Source A pointer to a Null-terminated ASCII string. + @param Destination A pointer to a Null-terminated Unicode string. - @reture Destination + @return Destination. **/ CHAR16 * EFIAPI AsciiStrToUnicodeStr ( - IN CONST CHAR8 *Source, - OUT CHAR16 *Destination + IN CONST CHAR8 *Source, + OUT CHAR16 *Destination ) { + CHAR16 *ReturnValue; + ASSERT (Destination != NULL); - ASSERT (Source != NULL); // - // Source and Destination should not overlap + // ASSERT Source is less long than PcdMaximumAsciiStringLength // - ASSERT ((UINTN) ((CHAR8 *) Destination - Source) > AsciiStrLen (Source)); - ASSERT ((UINTN) (Source - (CHAR8 *) Destination) > (AsciiStrLen (Source) * sizeof (CHAR16))); + ASSERT (AsciiStrSize (Source) != 0); // - // If PcdMaximumAsciiStringLength is not zero, - // length of Source should not more than PcdMaximumUnicodeStringLength + // Source and Destination should not overlap // - if (PcdGet32 (PcdMaximumAsciiStringLength) != 0) { - ASSERT (AsciiStrLen (Source) < PcdGet32 (PcdMaximumAsciiStringLength)); - } + ASSERT ((UINTN) ((CHAR8 *) Destination - Source) > AsciiStrLen (Source)); + ASSERT ((UINTN) (Source - (CHAR8 *) Destination) >= (AsciiStrSize (Source) * sizeof (CHAR16))); + + ReturnValue = Destination; while (*Source != '\0') { *(Destination++) = (CHAR16) *(Source++); } @@ -2022,9 +1753,16 @@ AsciiStrToUnicodeStr ( // *Destination = '\0'; - return Destination; + // + // ASSERT Original Destination is less long than PcdMaximumUnicodeStringLength + // + ASSERT (StrSize (ReturnValue) != 0); + + return ReturnValue; } +#endif + /** Converts an 8-bit value to an 8-bit BCD value. @@ -2035,7 +1773,7 @@ AsciiStrToUnicodeStr ( @param Value The 8-bit value to convert to BCD. Range 0..99. - @return The BCD value + @return The BCD value. **/ UINT8 @@ -2072,5 +1810,3 @@ BcdToDecimal8 ( ASSERT ((Value & 0xf) < 0xa); return (UINT8) ((Value >> 4) * 10 + (Value & 0xf)); } - -