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