summaryrefslogtreecommitdiff
path: root/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSupportString.c
diff options
context:
space:
mode:
Diffstat (limited to 'MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSupportString.c')
-rw-r--r--MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSupportString.c2064
1 files changed, 1032 insertions, 1032 deletions
diff --git a/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSupportString.c b/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSupportString.c
index e450e57662..67f3b8a99d 100644
--- a/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSupportString.c
+++ b/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSupportString.c
@@ -1,1032 +1,1032 @@
-/** @file
-
-Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
-
-**/
-
-#include "Edb.h"
-
-/**
-
- Convert hex string to uint.
-
- @param Str - The string
-
-**/
-UINTN
-EFIAPI
-Xtoi (
- CHAR16 *Str
- )
-{
- UINTN RetVal;
- CHAR16 TempChar;
- UINTN MaxVal;
-
- ASSERT (Str != NULL);
-
- MaxVal = (UINTN)-1 >> 4;
- //
- // skip preceeding white space
- //
- while (*Str != '\0' && *Str == ' ') {
- Str += 1;
- }
-
- //
- // skip preceeding zeros
- //
- while (*Str != '\0' && *Str == '0') {
- Str += 1;
- }
-
- //
- // skip preceeding white space
- //
- if ((*Str != '\0') && ((*Str == 'x') || (*Str == 'X'))) {
- Str += 1;
- }
-
- //
- // convert hex digits
- //
- RetVal = 0;
- TempChar = *(Str++);
- while (TempChar != '\0') {
- if ((TempChar >= 'a') && (TempChar <= 'f')) {
- TempChar -= 'a' - 'A';
- }
-
- if (((TempChar >= '0') && (TempChar <= '9')) || ((TempChar >= 'A') && (TempChar <= 'F'))) {
- if (RetVal > MaxVal) {
- return (UINTN)-1;
- }
-
- RetVal = (RetVal << 4) | (TempChar - (TempChar >= 'A' ? 'A' - 10 : '0'));
- } else {
- break;
- }
-
- TempChar = *(Str++);
- }
-
- return RetVal;
-}
-
-/**
-
- Convert hex string to uint.
-
- @param Str - The string
-
-**/
-UINT64
-EFIAPI
-LXtoi (
- CHAR16 *Str
- )
-{
- UINT64 RetVal;
- CHAR16 TempChar;
- UINT64 MaxVal;
-
- ASSERT (Str != NULL);
-
- MaxVal = RShiftU64 ((UINT64)-1, 4);
- //
- // skip preceeding white space
- //
- while (*Str != '\0' && *Str == ' ') {
- Str += 1;
- }
-
- //
- // skip preceeding zeros
- //
- while (*Str != '\0' && *Str == '0') {
- Str += 1;
- }
-
- //
- // skip preceeding white space
- //
- if ((*Str != '\0') && ((*Str == 'x') || (*Str == 'X'))) {
- Str += 1;
- }
-
- //
- // convert hex digits
- //
- RetVal = 0;
- TempChar = *(Str++);
- while (TempChar != '\0') {
- if ((TempChar >= 'a') && (TempChar <= 'f')) {
- TempChar -= 'a' - 'A';
- }
-
- if (((TempChar >= '0') && (TempChar <= '9')) || ((TempChar >= 'A') && (TempChar <= 'F'))) {
- if (RetVal > MaxVal) {
- return (UINT64)-1;
- }
-
- RetVal = LShiftU64 (RetVal, 4);
- RetVal = RetVal + (TempChar - (TempChar >= 'A' ? 'A' - 10 : '0'));
- } else {
- break;
- }
-
- TempChar = *(Str++);
- }
-
- return RetVal;
-}
-
-/**
-
- Convert hex string to uint.
-
- @param Str - The string
-
-**/
-UINTN
-EFIAPI
-Atoi (
- CHAR16 *Str
- )
-{
- UINTN RetVal;
- CHAR16 TempChar;
- UINTN MaxVal;
- UINTN ResteVal;
-
- ASSERT (Str != NULL);
-
- MaxVal = (UINTN)-1 / 10;
- ResteVal = (UINTN)-1 % 10;
- //
- // skip preceeding white space
- //
- while (*Str != '\0' && *Str == ' ') {
- Str += 1;
- }
-
- //
- // convert digits
- //
- RetVal = 0;
- TempChar = *(Str++);
- while (TempChar != '\0') {
- if ((TempChar >= '0') && (TempChar <= '9')) {
- if ((RetVal > MaxVal) || ((RetVal == MaxVal) && (TempChar - '0' > (INTN)ResteVal))) {
- return (UINTN)-1;
- }
-
- RetVal = (RetVal * 10) + TempChar - '0';
- } else {
- break;
- }
-
- TempChar = *(Str++);
- }
-
- return RetVal;
-}
-
-/**
-
- Convert hex string to uint.
-
- @param Str - The string
-
-**/
-UINTN
-EFIAPI
-AsciiXtoi (
- CHAR8 *Str
- )
-{
- UINTN RetVal;
- CHAR8 TempChar;
- UINTN MaxVal;
-
- ASSERT (Str != NULL);
-
- MaxVal = (UINTN)-1 >> 4;
- //
- // skip preceeding white space
- //
- while (*Str != '\0' && *Str == ' ') {
- Str += 1;
- }
-
- //
- // skip preceeding zeros
- //
- while (*Str != '\0' && *Str == '0') {
- Str += 1;
- }
-
- //
- // skip preceeding white space
- //
- if ((*Str != '\0') && ((*Str == 'x') || (*Str == 'X'))) {
- Str += 1;
- }
-
- //
- // convert hex digits
- //
- RetVal = 0;
- TempChar = *(Str++);
- while (TempChar != '\0') {
- if ((TempChar >= 'a') && (TempChar <= 'f')) {
- TempChar -= 'a' - 'A';
- }
-
- if (((TempChar >= '0') && (TempChar <= '9')) || ((TempChar >= 'A') && (TempChar <= 'F'))) {
- if (RetVal > MaxVal) {
- return (UINTN)-1;
- }
-
- RetVal = (RetVal << 4) | (TempChar - (TempChar >= 'A' ? 'A' - 10 : '0'));
- } else {
- break;
- }
-
- TempChar = *(Str++);
- }
-
- return RetVal;
-}
-
-/**
-
- Convert hex string to uint.
-
- @param Str - The string
-
-**/
-UINTN
-EFIAPI
-AsciiAtoi (
- CHAR8 *Str
- )
-{
- UINTN RetVal;
- CHAR8 TempChar;
- UINTN MaxVal;
- UINTN ResteVal;
-
- ASSERT (Str != NULL);
-
- MaxVal = (UINTN)-1 / 10;
- ResteVal = (UINTN)-1 % 10;
- //
- // skip preceeding white space
- //
- while (*Str != '\0' && *Str == ' ') {
- Str += 1;
- }
-
- //
- // convert digits
- //
- RetVal = 0;
- TempChar = *(Str++);
- while (TempChar != '\0') {
- if ((TempChar >= '0') && (TempChar <= '9')) {
- if ((RetVal > MaxVal) || ((RetVal == MaxVal) && (TempChar - '0' > (INTN)ResteVal))) {
- return (UINTN)-1;
- }
-
- RetVal = (RetVal * 10) + TempChar - '0';
- } else {
- break;
- }
-
- TempChar = *(Str++);
- }
-
- return RetVal;
-}
-
-/**
- Compare the Unicode and Ascii string pointed by String to the string pointed by String2.
-
- @param String - Unicode String to process
-
- @param String2 - Ascii string to process
-
- @return Return a positive integer if String is lexicall greater than String2; Zero if
- the two strings are identical; and a negative interger if String is lexically
- less than String2.
-
-**/
-INTN
-EFIAPI
-StrCmpUnicodeAndAscii (
- IN CHAR16 *String,
- IN CHAR8 *String2
- )
-{
- while (*String != '\0') {
- if (*String != (CHAR16)*String2) {
- break;
- }
-
- String += 1;
- String2 += 1;
- }
-
- return (*String - (CHAR16)*String2);
-}
-
-/**
-
- Compare the Unicode string pointed by String to the string pointed by String2.
-
- @param String - Unicode String to process
- @param String2 - Unicode string to process
-
- @return Return a positive integer if String is lexically greater than String2; Zero if
- the two strings are identical; and a negative integer if String is lexically
- less than String2.
-
-**/
-INTN
-EFIAPI
-StriCmp (
- IN CHAR16 *String,
- IN CHAR16 *String2
- )
-{
- while ((*String != L'\0') &&
- (CharToUpper (*String) == CharToUpper (*String2)))
- {
- String++;
- String2++;
- }
-
- return CharToUpper (*String) - CharToUpper (*String2);
-}
-
-/**
-
- Compare the Unicode and Ascii string pointed by String to the string pointed by String2.
-
- @param String - Unicode String to process
- @param String2 - Ascii string to process
-
- @return Return a positive integer if String is lexically greater than String2; Zero if
- the two strings are identical; and a negative integer if String is lexically
- less than String2.
-
-**/
-INTN
-EFIAPI
-StriCmpUnicodeAndAscii (
- IN CHAR16 *String,
- IN CHAR8 *String2
- )
-{
- while ((*String != L'\0') &&
- (CharToUpper (*String) == (CHAR16)AsciiCharToUpper (*String2)))
- {
- String++;
- String2++;
- }
-
- return CharToUpper (*String) - (CHAR16)AsciiCharToUpper (*String2);
-}
-
-/**
-
- Verify if the string is end with the sub string.
-
- @param Str - The string where to search the sub string
- @param SubStr - The substring.
-
-**/
-BOOLEAN
-EFIAPI
-StrEndWith (
- IN CHAR16 *Str,
- IN CHAR16 *SubStr
- )
-{
- CHAR16 *Temp;
-
- if ((Str == NULL) || (SubStr == NULL) || (StrLen (Str) < StrLen (SubStr))) {
- return FALSE;
- }
-
- Temp = Str + StrLen (Str) - StrLen (SubStr);
-
- //
- // Compare
- //
- if (StriCmp (Temp, SubStr) == 0) {
- return TRUE;
- } else {
- return FALSE;
- }
-}
-
-/**
- Duplicate a string.
-
- @param Src The string to be duplicated.
-
-**/
-CHAR16 *
-EFIAPI
-StrDuplicate (
- IN CHAR16 *Src
- )
-{
- CHAR16 *Dest;
- UINTN Size;
-
- Size = (StrLen (Src) + 1) * sizeof (CHAR16);
- Dest = AllocateZeroPool (Size);
- if (Dest != NULL) {
- CopyMem (Dest, Src, Size);
- }
-
- return Dest;
-}
-
-CHAR16 *mLineBuffer = NULL;
-CHAR16 *mFieldBuffer = NULL;
-
-/**
-
- Find the first substring.
-
- @param String Point to the string where to find the substring.
- @param CharSet Point to the string to be found.
-
-**/
-UINTN
-EFIAPI
-StrSpn (
- IN CHAR16 *String,
- IN CHAR16 *CharSet
- )
-{
- UINTN Count;
- CHAR16 *Str1;
- CHAR16 *Str2;
-
- Count = 0;
-
- for (Str1 = String; *Str1 != L'\0'; Str1++) {
- for (Str2 = CharSet; *Str2 != L'\0'; Str2++) {
- if (*Str1 == *Str2) {
- break;
- }
- }
-
- if (*Str2 == L'\0') {
- return Count;
- }
-
- Count++;
- }
-
- return Count;
-}
-
-/**
-
- Searches a string for the first occurrence of a character contained in a
- specified buffer.
-
- @param String Point to the string where to find the substring.
- @param CharSet Point to the string to be found.
-
-**/
-CHAR16 *
-EFIAPI
-StrBrk (
- IN CHAR16 *String,
- IN CHAR16 *CharSet
- )
-{
- CHAR16 *Str1;
- CHAR16 *Str2;
-
- for (Str1 = String; *Str1 != L'\0'; Str1++) {
- for (Str2 = CharSet; *Str2 != L'\0'; Str2++) {
- if (*Str1 == *Str2) {
- return (CHAR16 *)Str1;
- }
- }
- }
-
- return NULL;
-}
-
-/**
-
- Find the next token after one or more specified characters.
-
- @param String Point to the string where to find the substring.
- @param CharSet Point to the string to be found.
-
-**/
-CHAR16 *
-EFIAPI
-StrTokenLine (
- IN CHAR16 *String OPTIONAL,
- IN CHAR16 *CharSet
- )
-{
- CHAR16 *Begin;
- CHAR16 *End;
-
- Begin = (String == NULL) ? mLineBuffer : String;
- if (Begin == NULL) {
- return NULL;
- }
-
- Begin += StrSpn (Begin, CharSet);
- if (*Begin == L'\0') {
- mLineBuffer = NULL;
- return NULL;
- }
-
- End = StrBrk (Begin, CharSet);
- if ((End != NULL) && (*End != L'\0')) {
- *End = L'\0';
- End++;
- }
-
- mLineBuffer = End;
- return Begin;
-}
-
-/**
-
- Find the next token after one specificed characters.
-
- @param String Point to the string where to find the substring.
- @param CharSet Point to the string to be found.
-
-**/
-CHAR16 *
-EFIAPI
-StrTokenField (
- IN CHAR16 *String OPTIONAL,
- IN CHAR16 *CharSet
- )
-{
- CHAR16 *Begin;
- CHAR16 *End;
-
- Begin = (String == NULL) ? mFieldBuffer : String;
- if (Begin == NULL) {
- return NULL;
- }
-
- if (*Begin == L'\0') {
- mFieldBuffer = NULL;
- return NULL;
- }
-
- End = StrBrk (Begin, CharSet);
- if ((End != NULL) && (*End != L'\0')) {
- *End = L'\0';
- End++;
- }
-
- mFieldBuffer = End;
- return Begin;
-}
-
-/**
-
- Find the next token after one or more specified characters.
-
- @param String Point to the string where to find the substring.
- @param CharSet Point to the string to be found.
-
-**/
-CHAR16 *
-EFIAPI
-StrGetNewTokenLine (
- IN CHAR16 *String,
- IN CHAR16 *CharSet
- )
-{
- return StrTokenLine (String, CharSet);
-}
-
-/**
-
- Find the next token after one or more specified characters.
-
- @param CharSet Point to the string to be found.
-
-**/
-CHAR16 *
-EFIAPI
-StrGetNextTokenLine (
- IN CHAR16 *CharSet
- )
-{
- return StrTokenLine (NULL, CharSet);
-}
-
-/**
-
- Find the next token after one specificed characters.
-
- @param String Point to the string where to find the substring.
- @param CharSet Point to the string to be found.
-
-**/
-CHAR16 *
-EFIAPI
-StrGetNewTokenField (
- IN CHAR16 *String,
- IN CHAR16 *CharSet
- )
-{
- return StrTokenField (String, CharSet);
-}
-
-/**
-
- Find the next token after one specificed characters.
-
- @param CharSet Point to the string to be found.
-
-**/
-CHAR16 *
-EFIAPI
-StrGetNextTokenField (
- IN CHAR16 *CharSet
- )
-{
- return StrTokenField (NULL, CharSet);
-}
-
-/**
-
- Patch a character to the end of a string.
-
- @param Buffer The string to be patched.
- @param Patch The patch character.
-
-**/
-VOID
-EFIAPI
-PatchForStrTokenAfter (
- IN CHAR16 *Buffer,
- IN CHAR16 Patch
- )
-{
- CHAR16 *Str;
-
- if (Buffer == NULL) {
- return;
- }
-
- Str = Buffer;
- while (*Str != 0) {
- Str++;
- }
-
- *Str = Patch;
-
- while (*(Str++) != '\0') {
- if (*Str == 0) {
- *Str = Patch;
- } else {
- break;
- }
- }
-
- return;
-}
-
-/**
- Patch a character at the beginning of a string.
-
- @param Buffer The string to be patched.
- @param Patch The patch character.
-
-**/
-VOID
-EFIAPI
-PatchForStrTokenBefore (
- IN CHAR16 *Buffer,
- IN CHAR16 Patch
- )
-{
- CHAR16 *Str;
-
- if (Buffer == NULL) {
- return;
- }
-
- Str = Buffer;
- while (*(Str--) != '\0') {
- if ((*Str == 0) || (*Str == Patch)) {
- *Str = Patch;
- } else {
- break;
- }
- }
-
- return;
-}
-
-CHAR8 *mAsciiLineBuffer = NULL;
-CHAR8 *mAsciiFieldBuffer = NULL;
-
-/**
-
- Find the first substring.
-
- @param String Point to the string where to find the substring.
- @param CharSet Point to the string to be found.
-
-**/
-UINTN
-EFIAPI
-AsciiStrSpn (
- IN CHAR8 *String,
- IN CHAR8 *CharSet
- )
-{
- UINTN Count;
- CHAR8 *Str1;
- CHAR8 *Str2;
-
- Count = 0;
-
- for (Str1 = String; *Str1 != '\0'; Str1++) {
- for (Str2 = CharSet; *Str2 != '\0'; Str2++) {
- if (*Str1 == *Str2) {
- break;
- }
- }
-
- if (*Str2 == '\0') {
- return Count;
- }
-
- Count++;
- }
-
- return Count;
-}
-
-/**
- Searches a string for the first occurrence of a character contained in a
- specified buffer.
-
- @param String Point to the string where to find the substring.
- @param CharSet Point to the string to be found.
-
-**/
-CHAR8 *
-EFIAPI
-AsciiStrBrk (
- IN CHAR8 *String,
- IN CHAR8 *CharSet
- )
-{
- CHAR8 *Str1;
- CHAR8 *Str2;
-
- for (Str1 = String; *Str1 != '\0'; Str1++) {
- for (Str2 = CharSet; *Str2 != '\0'; Str2++) {
- if (*Str1 == *Str2) {
- return (CHAR8 *)Str1;
- }
- }
- }
-
- return NULL;
-}
-
-/**
-
- Find the next token after one or more specified characters.
-
- @param String Point to the string where to find the substring.
- @param CharSet Point to the string to be found.
-
-**/
-CHAR8 *
-EFIAPI
-AsciiStrTokenLine (
- IN CHAR8 *String OPTIONAL,
- IN CHAR8 *CharSet
- )
-{
- CHAR8 *Begin;
- CHAR8 *End;
-
- Begin = (String == NULL) ? mAsciiLineBuffer : String;
- if (Begin == NULL) {
- return NULL;
- }
-
- Begin += AsciiStrSpn (Begin, CharSet);
- if (*Begin == '\0') {
- mAsciiLineBuffer = NULL;
- return NULL;
- }
-
- End = AsciiStrBrk (Begin, CharSet);
- if ((End != NULL) && (*End != '\0')) {
- *End = '\0';
- End++;
- }
-
- mAsciiLineBuffer = End;
- return Begin;
-}
-
-/**
-
- Find the next token after one specificed characters.
-
- @param String Point to the string where to find the substring.
- @param CharSet Point to the string to be found.
-
-**/
-CHAR8 *
-EFIAPI
-AsciiStrTokenField (
- IN CHAR8 *String OPTIONAL,
- IN CHAR8 *CharSet
- )
-{
- CHAR8 *Begin;
- CHAR8 *End;
-
- Begin = (String == NULL) ? mAsciiFieldBuffer : String;
- if (Begin == NULL) {
- return NULL;
- }
-
- if (*Begin == '\0') {
- mAsciiFieldBuffer = NULL;
- return NULL;
- }
-
- End = AsciiStrBrk (Begin, CharSet);
- if ((End != NULL) && (*End != '\0')) {
- *End = '\0';
- End++;
- }
-
- mAsciiFieldBuffer = End;
- return Begin;
-}
-
-/**
-
- Find the next token after one or more specified characters.
-
- @param String Point to the string where to find the substring.
- @param CharSet Point to the string to be found.
-
-**/
-CHAR8 *
-EFIAPI
-AsciiStrGetNewTokenLine (
- IN CHAR8 *String,
- IN CHAR8 *CharSet
- )
-{
- return AsciiStrTokenLine (String, CharSet);
-}
-
-/**
-
- Find the next token after one or more specified characters.
-
- @param CharSet Point to the string to be found.
-
-**/
-CHAR8 *
-EFIAPI
-AsciiStrGetNextTokenLine (
- IN CHAR8 *CharSet
- )
-{
- return AsciiStrTokenLine (NULL, CharSet);
-}
-
-/**
-
- Find the next token after one specificed characters.
-
- @param String Point to the string where to find the substring.
- @param CharSet Point to the string to be found.
-
-**/
-CHAR8 *
-EFIAPI
-AsciiStrGetNewTokenField (
- IN CHAR8 *String,
- IN CHAR8 *CharSet
- )
-{
- return AsciiStrTokenField (String, CharSet);
-}
-
-/**
-
- Find the next token after one specificed characters.
-
- @param CharSet Point to the string to be found.
-
-**/
-CHAR8 *
-EFIAPI
-AsciiStrGetNextTokenField (
- IN CHAR8 *CharSet
- )
-{
- return AsciiStrTokenField (NULL, CharSet);
-}
-
-/**
-
- Patch a character to the end of a string.
-
- @param Buffer The string to be patched.
- @param Patch The patch character.
-
-**/
-VOID
-EFIAPI
-PatchForAsciiStrTokenAfter (
- IN CHAR8 *Buffer,
- IN CHAR8 Patch
- )
-{
- CHAR8 *Str;
-
- if (Buffer == NULL) {
- return;
- }
-
- Str = Buffer;
- while (*Str != 0) {
- Str++;
- }
-
- *Str = Patch;
-
- while (*(Str++) != '\0') {
- if (*Str == 0) {
- *Str = Patch;
- } else {
- break;
- }
- }
-
- return;
-}
-
-/**
- Patch a character at the beginning of a string.
-
- @param Buffer The string to be patched.
- @param Patch The patch character.
-
-**/
-VOID
-EFIAPI
-PatchForAsciiStrTokenBefore (
- IN CHAR8 *Buffer,
- IN CHAR8 Patch
- )
-{
- CHAR8 *Str;
-
- if (Buffer == NULL) {
- return;
- }
-
- Str = Buffer;
- while (*(Str--) != '\0') {
- if ((*Str == 0) || (*Str == Patch)) {
- *Str = Patch;
- } else {
- break;
- }
- }
-
- return;
-}
+/** @file
+
+Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+
+**/
+
+#include "Edb.h"
+
+/**
+
+ Convert hex string to uint.
+
+ @param Str - The string
+
+**/
+UINTN
+EFIAPI
+Xtoi (
+ CHAR16 *Str
+ )
+{
+ UINTN RetVal;
+ CHAR16 TempChar;
+ UINTN MaxVal;
+
+ ASSERT (Str != NULL);
+
+ MaxVal = (UINTN)-1 >> 4;
+ //
+ // skip preceeding white space
+ //
+ while (*Str != '\0' && *Str == ' ') {
+ Str += 1;
+ }
+
+ //
+ // skip preceeding zeros
+ //
+ while (*Str != '\0' && *Str == '0') {
+ Str += 1;
+ }
+
+ //
+ // skip preceeding white space
+ //
+ if ((*Str != '\0') && ((*Str == 'x') || (*Str == 'X'))) {
+ Str += 1;
+ }
+
+ //
+ // convert hex digits
+ //
+ RetVal = 0;
+ TempChar = *(Str++);
+ while (TempChar != '\0') {
+ if ((TempChar >= 'a') && (TempChar <= 'f')) {
+ TempChar -= 'a' - 'A';
+ }
+
+ if (((TempChar >= '0') && (TempChar <= '9')) || ((TempChar >= 'A') && (TempChar <= 'F'))) {
+ if (RetVal > MaxVal) {
+ return (UINTN)-1;
+ }
+
+ RetVal = (RetVal << 4) | (TempChar - (TempChar >= 'A' ? 'A' - 10 : '0'));
+ } else {
+ break;
+ }
+
+ TempChar = *(Str++);
+ }
+
+ return RetVal;
+}
+
+/**
+
+ Convert hex string to uint.
+
+ @param Str - The string
+
+**/
+UINT64
+EFIAPI
+LXtoi (
+ CHAR16 *Str
+ )
+{
+ UINT64 RetVal;
+ CHAR16 TempChar;
+ UINT64 MaxVal;
+
+ ASSERT (Str != NULL);
+
+ MaxVal = RShiftU64 ((UINT64)-1, 4);
+ //
+ // skip preceeding white space
+ //
+ while (*Str != '\0' && *Str == ' ') {
+ Str += 1;
+ }
+
+ //
+ // skip preceeding zeros
+ //
+ while (*Str != '\0' && *Str == '0') {
+ Str += 1;
+ }
+
+ //
+ // skip preceeding white space
+ //
+ if ((*Str != '\0') && ((*Str == 'x') || (*Str == 'X'))) {
+ Str += 1;
+ }
+
+ //
+ // convert hex digits
+ //
+ RetVal = 0;
+ TempChar = *(Str++);
+ while (TempChar != '\0') {
+ if ((TempChar >= 'a') && (TempChar <= 'f')) {
+ TempChar -= 'a' - 'A';
+ }
+
+ if (((TempChar >= '0') && (TempChar <= '9')) || ((TempChar >= 'A') && (TempChar <= 'F'))) {
+ if (RetVal > MaxVal) {
+ return (UINT64)-1;
+ }
+
+ RetVal = LShiftU64 (RetVal, 4);
+ RetVal = RetVal + (TempChar - (TempChar >= 'A' ? 'A' - 10 : '0'));
+ } else {
+ break;
+ }
+
+ TempChar = *(Str++);
+ }
+
+ return RetVal;
+}
+
+/**
+
+ Convert hex string to uint.
+
+ @param Str - The string
+
+**/
+UINTN
+EFIAPI
+Atoi (
+ CHAR16 *Str
+ )
+{
+ UINTN RetVal;
+ CHAR16 TempChar;
+ UINTN MaxVal;
+ UINTN ResteVal;
+
+ ASSERT (Str != NULL);
+
+ MaxVal = (UINTN)-1 / 10;
+ ResteVal = (UINTN)-1 % 10;
+ //
+ // skip preceeding white space
+ //
+ while (*Str != '\0' && *Str == ' ') {
+ Str += 1;
+ }
+
+ //
+ // convert digits
+ //
+ RetVal = 0;
+ TempChar = *(Str++);
+ while (TempChar != '\0') {
+ if ((TempChar >= '0') && (TempChar <= '9')) {
+ if ((RetVal > MaxVal) || ((RetVal == MaxVal) && (TempChar - '0' > (INTN)ResteVal))) {
+ return (UINTN)-1;
+ }
+
+ RetVal = (RetVal * 10) + TempChar - '0';
+ } else {
+ break;
+ }
+
+ TempChar = *(Str++);
+ }
+
+ return RetVal;
+}
+
+/**
+
+ Convert hex string to uint.
+
+ @param Str - The string
+
+**/
+UINTN
+EFIAPI
+AsciiXtoi (
+ CHAR8 *Str
+ )
+{
+ UINTN RetVal;
+ CHAR8 TempChar;
+ UINTN MaxVal;
+
+ ASSERT (Str != NULL);
+
+ MaxVal = (UINTN)-1 >> 4;
+ //
+ // skip preceeding white space
+ //
+ while (*Str != '\0' && *Str == ' ') {
+ Str += 1;
+ }
+
+ //
+ // skip preceeding zeros
+ //
+ while (*Str != '\0' && *Str == '0') {
+ Str += 1;
+ }
+
+ //
+ // skip preceeding white space
+ //
+ if ((*Str != '\0') && ((*Str == 'x') || (*Str == 'X'))) {
+ Str += 1;
+ }
+
+ //
+ // convert hex digits
+ //
+ RetVal = 0;
+ TempChar = *(Str++);
+ while (TempChar != '\0') {
+ if ((TempChar >= 'a') && (TempChar <= 'f')) {
+ TempChar -= 'a' - 'A';
+ }
+
+ if (((TempChar >= '0') && (TempChar <= '9')) || ((TempChar >= 'A') && (TempChar <= 'F'))) {
+ if (RetVal > MaxVal) {
+ return (UINTN)-1;
+ }
+
+ RetVal = (RetVal << 4) | (TempChar - (TempChar >= 'A' ? 'A' - 10 : '0'));
+ } else {
+ break;
+ }
+
+ TempChar = *(Str++);
+ }
+
+ return RetVal;
+}
+
+/**
+
+ Convert hex string to uint.
+
+ @param Str - The string
+
+**/
+UINTN
+EFIAPI
+AsciiAtoi (
+ CHAR8 *Str
+ )
+{
+ UINTN RetVal;
+ CHAR8 TempChar;
+ UINTN MaxVal;
+ UINTN ResteVal;
+
+ ASSERT (Str != NULL);
+
+ MaxVal = (UINTN)-1 / 10;
+ ResteVal = (UINTN)-1 % 10;
+ //
+ // skip preceeding white space
+ //
+ while (*Str != '\0' && *Str == ' ') {
+ Str += 1;
+ }
+
+ //
+ // convert digits
+ //
+ RetVal = 0;
+ TempChar = *(Str++);
+ while (TempChar != '\0') {
+ if ((TempChar >= '0') && (TempChar <= '9')) {
+ if ((RetVal > MaxVal) || ((RetVal == MaxVal) && (TempChar - '0' > (INTN)ResteVal))) {
+ return (UINTN)-1;
+ }
+
+ RetVal = (RetVal * 10) + TempChar - '0';
+ } else {
+ break;
+ }
+
+ TempChar = *(Str++);
+ }
+
+ return RetVal;
+}
+
+/**
+ Compare the Unicode and Ascii string pointed by String to the string pointed by String2.
+
+ @param String - Unicode String to process
+
+ @param String2 - Ascii string to process
+
+ @return Return a positive integer if String is lexicall greater than String2; Zero if
+ the two strings are identical; and a negative interger if String is lexically
+ less than String2.
+
+**/
+INTN
+EFIAPI
+StrCmpUnicodeAndAscii (
+ IN CHAR16 *String,
+ IN CHAR8 *String2
+ )
+{
+ while (*String != '\0') {
+ if (*String != (CHAR16)*String2) {
+ break;
+ }
+
+ String += 1;
+ String2 += 1;
+ }
+
+ return (*String - (CHAR16)*String2);
+}
+
+/**
+
+ Compare the Unicode string pointed by String to the string pointed by String2.
+
+ @param String - Unicode String to process
+ @param String2 - Unicode string to process
+
+ @return Return a positive integer if String is lexically greater than String2; Zero if
+ the two strings are identical; and a negative integer if String is lexically
+ less than String2.
+
+**/
+INTN
+EFIAPI
+StriCmp (
+ IN CHAR16 *String,
+ IN CHAR16 *String2
+ )
+{
+ while ((*String != L'\0') &&
+ (CharToUpper (*String) == CharToUpper (*String2)))
+ {
+ String++;
+ String2++;
+ }
+
+ return CharToUpper (*String) - CharToUpper (*String2);
+}
+
+/**
+
+ Compare the Unicode and Ascii string pointed by String to the string pointed by String2.
+
+ @param String - Unicode String to process
+ @param String2 - Ascii string to process
+
+ @return Return a positive integer if String is lexically greater than String2; Zero if
+ the two strings are identical; and a negative integer if String is lexically
+ less than String2.
+
+**/
+INTN
+EFIAPI
+StriCmpUnicodeAndAscii (
+ IN CHAR16 *String,
+ IN CHAR8 *String2
+ )
+{
+ while ((*String != L'\0') &&
+ (CharToUpper (*String) == (CHAR16)AsciiCharToUpper (*String2)))
+ {
+ String++;
+ String2++;
+ }
+
+ return CharToUpper (*String) - (CHAR16)AsciiCharToUpper (*String2);
+}
+
+/**
+
+ Verify if the string is end with the sub string.
+
+ @param Str - The string where to search the sub string
+ @param SubStr - The substring.
+
+**/
+BOOLEAN
+EFIAPI
+StrEndWith (
+ IN CHAR16 *Str,
+ IN CHAR16 *SubStr
+ )
+{
+ CHAR16 *Temp;
+
+ if ((Str == NULL) || (SubStr == NULL) || (StrLen (Str) < StrLen (SubStr))) {
+ return FALSE;
+ }
+
+ Temp = Str + StrLen (Str) - StrLen (SubStr);
+
+ //
+ // Compare
+ //
+ if (StriCmp (Temp, SubStr) == 0) {
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+
+/**
+ Duplicate a string.
+
+ @param Src The string to be duplicated.
+
+**/
+CHAR16 *
+EFIAPI
+StrDuplicate (
+ IN CHAR16 *Src
+ )
+{
+ CHAR16 *Dest;
+ UINTN Size;
+
+ Size = (StrLen (Src) + 1) * sizeof (CHAR16);
+ Dest = AllocateZeroPool (Size);
+ if (Dest != NULL) {
+ CopyMem (Dest, Src, Size);
+ }
+
+ return Dest;
+}
+
+CHAR16 *mLineBuffer = NULL;
+CHAR16 *mFieldBuffer = NULL;
+
+/**
+
+ Find the first substring.
+
+ @param String Point to the string where to find the substring.
+ @param CharSet Point to the string to be found.
+
+**/
+UINTN
+EFIAPI
+StrSpn (
+ IN CHAR16 *String,
+ IN CHAR16 *CharSet
+ )
+{
+ UINTN Count;
+ CHAR16 *Str1;
+ CHAR16 *Str2;
+
+ Count = 0;
+
+ for (Str1 = String; *Str1 != L'\0'; Str1++) {
+ for (Str2 = CharSet; *Str2 != L'\0'; Str2++) {
+ if (*Str1 == *Str2) {
+ break;
+ }
+ }
+
+ if (*Str2 == L'\0') {
+ return Count;
+ }
+
+ Count++;
+ }
+
+ return Count;
+}
+
+/**
+
+ Searches a string for the first occurrence of a character contained in a
+ specified buffer.
+
+ @param String Point to the string where to find the substring.
+ @param CharSet Point to the string to be found.
+
+**/
+CHAR16 *
+EFIAPI
+StrBrk (
+ IN CHAR16 *String,
+ IN CHAR16 *CharSet
+ )
+{
+ CHAR16 *Str1;
+ CHAR16 *Str2;
+
+ for (Str1 = String; *Str1 != L'\0'; Str1++) {
+ for (Str2 = CharSet; *Str2 != L'\0'; Str2++) {
+ if (*Str1 == *Str2) {
+ return (CHAR16 *)Str1;
+ }
+ }
+ }
+
+ return NULL;
+}
+
+/**
+
+ Find the next token after one or more specified characters.
+
+ @param String Point to the string where to find the substring.
+ @param CharSet Point to the string to be found.
+
+**/
+CHAR16 *
+EFIAPI
+StrTokenLine (
+ IN CHAR16 *String OPTIONAL,
+ IN CHAR16 *CharSet
+ )
+{
+ CHAR16 *Begin;
+ CHAR16 *End;
+
+ Begin = (String == NULL) ? mLineBuffer : String;
+ if (Begin == NULL) {
+ return NULL;
+ }
+
+ Begin += StrSpn (Begin, CharSet);
+ if (*Begin == L'\0') {
+ mLineBuffer = NULL;
+ return NULL;
+ }
+
+ End = StrBrk (Begin, CharSet);
+ if ((End != NULL) && (*End != L'\0')) {
+ *End = L'\0';
+ End++;
+ }
+
+ mLineBuffer = End;
+ return Begin;
+}
+
+/**
+
+ Find the next token after one specificed characters.
+
+ @param String Point to the string where to find the substring.
+ @param CharSet Point to the string to be found.
+
+**/
+CHAR16 *
+EFIAPI
+StrTokenField (
+ IN CHAR16 *String OPTIONAL,
+ IN CHAR16 *CharSet
+ )
+{
+ CHAR16 *Begin;
+ CHAR16 *End;
+
+ Begin = (String == NULL) ? mFieldBuffer : String;
+ if (Begin == NULL) {
+ return NULL;
+ }
+
+ if (*Begin == L'\0') {
+ mFieldBuffer = NULL;
+ return NULL;
+ }
+
+ End = StrBrk (Begin, CharSet);
+ if ((End != NULL) && (*End != L'\0')) {
+ *End = L'\0';
+ End++;
+ }
+
+ mFieldBuffer = End;
+ return Begin;
+}
+
+/**
+
+ Find the next token after one or more specified characters.
+
+ @param String Point to the string where to find the substring.
+ @param CharSet Point to the string to be found.
+
+**/
+CHAR16 *
+EFIAPI
+StrGetNewTokenLine (
+ IN CHAR16 *String,
+ IN CHAR16 *CharSet
+ )
+{
+ return StrTokenLine (String, CharSet);
+}
+
+/**
+
+ Find the next token after one or more specified characters.
+
+ @param CharSet Point to the string to be found.
+
+**/
+CHAR16 *
+EFIAPI
+StrGetNextTokenLine (
+ IN CHAR16 *CharSet
+ )
+{
+ return StrTokenLine (NULL, CharSet);
+}
+
+/**
+
+ Find the next token after one specificed characters.
+
+ @param String Point to the string where to find the substring.
+ @param CharSet Point to the string to be found.
+
+**/
+CHAR16 *
+EFIAPI
+StrGetNewTokenField (
+ IN CHAR16 *String,
+ IN CHAR16 *CharSet
+ )
+{
+ return StrTokenField (String, CharSet);
+}
+
+/**
+
+ Find the next token after one specificed characters.
+
+ @param CharSet Point to the string to be found.
+
+**/
+CHAR16 *
+EFIAPI
+StrGetNextTokenField (
+ IN CHAR16 *CharSet
+ )
+{
+ return StrTokenField (NULL, CharSet);
+}
+
+/**
+
+ Patch a character to the end of a string.
+
+ @param Buffer The string to be patched.
+ @param Patch The patch character.
+
+**/
+VOID
+EFIAPI
+PatchForStrTokenAfter (
+ IN CHAR16 *Buffer,
+ IN CHAR16 Patch
+ )
+{
+ CHAR16 *Str;
+
+ if (Buffer == NULL) {
+ return;
+ }
+
+ Str = Buffer;
+ while (*Str != 0) {
+ Str++;
+ }
+
+ *Str = Patch;
+
+ while (*(Str++) != '\0') {
+ if (*Str == 0) {
+ *Str = Patch;
+ } else {
+ break;
+ }
+ }
+
+ return;
+}
+
+/**
+ Patch a character at the beginning of a string.
+
+ @param Buffer The string to be patched.
+ @param Patch The patch character.
+
+**/
+VOID
+EFIAPI
+PatchForStrTokenBefore (
+ IN CHAR16 *Buffer,
+ IN CHAR16 Patch
+ )
+{
+ CHAR16 *Str;
+
+ if (Buffer == NULL) {
+ return;
+ }
+
+ Str = Buffer;
+ while (*(Str--) != '\0') {
+ if ((*Str == 0) || (*Str == Patch)) {
+ *Str = Patch;
+ } else {
+ break;
+ }
+ }
+
+ return;
+}
+
+CHAR8 *mAsciiLineBuffer = NULL;
+CHAR8 *mAsciiFieldBuffer = NULL;
+
+/**
+
+ Find the first substring.
+
+ @param String Point to the string where to find the substring.
+ @param CharSet Point to the string to be found.
+
+**/
+UINTN
+EFIAPI
+AsciiStrSpn (
+ IN CHAR8 *String,
+ IN CHAR8 *CharSet
+ )
+{
+ UINTN Count;
+ CHAR8 *Str1;
+ CHAR8 *Str2;
+
+ Count = 0;
+
+ for (Str1 = String; *Str1 != '\0'; Str1++) {
+ for (Str2 = CharSet; *Str2 != '\0'; Str2++) {
+ if (*Str1 == *Str2) {
+ break;
+ }
+ }
+
+ if (*Str2 == '\0') {
+ return Count;
+ }
+
+ Count++;
+ }
+
+ return Count;
+}
+
+/**
+ Searches a string for the first occurrence of a character contained in a
+ specified buffer.
+
+ @param String Point to the string where to find the substring.
+ @param CharSet Point to the string to be found.
+
+**/
+CHAR8 *
+EFIAPI
+AsciiStrBrk (
+ IN CHAR8 *String,
+ IN CHAR8 *CharSet
+ )
+{
+ CHAR8 *Str1;
+ CHAR8 *Str2;
+
+ for (Str1 = String; *Str1 != '\0'; Str1++) {
+ for (Str2 = CharSet; *Str2 != '\0'; Str2++) {
+ if (*Str1 == *Str2) {
+ return (CHAR8 *)Str1;
+ }
+ }
+ }
+
+ return NULL;
+}
+
+/**
+
+ Find the next token after one or more specified characters.
+
+ @param String Point to the string where to find the substring.
+ @param CharSet Point to the string to be found.
+
+**/
+CHAR8 *
+EFIAPI
+AsciiStrTokenLine (
+ IN CHAR8 *String OPTIONAL,
+ IN CHAR8 *CharSet
+ )
+{
+ CHAR8 *Begin;
+ CHAR8 *End;
+
+ Begin = (String == NULL) ? mAsciiLineBuffer : String;
+ if (Begin == NULL) {
+ return NULL;
+ }
+
+ Begin += AsciiStrSpn (Begin, CharSet);
+ if (*Begin == '\0') {
+ mAsciiLineBuffer = NULL;
+ return NULL;
+ }
+
+ End = AsciiStrBrk (Begin, CharSet);
+ if ((End != NULL) && (*End != '\0')) {
+ *End = '\0';
+ End++;
+ }
+
+ mAsciiLineBuffer = End;
+ return Begin;
+}
+
+/**
+
+ Find the next token after one specificed characters.
+
+ @param String Point to the string where to find the substring.
+ @param CharSet Point to the string to be found.
+
+**/
+CHAR8 *
+EFIAPI
+AsciiStrTokenField (
+ IN CHAR8 *String OPTIONAL,
+ IN CHAR8 *CharSet
+ )
+{
+ CHAR8 *Begin;
+ CHAR8 *End;
+
+ Begin = (String == NULL) ? mAsciiFieldBuffer : String;
+ if (Begin == NULL) {
+ return NULL;
+ }
+
+ if (*Begin == '\0') {
+ mAsciiFieldBuffer = NULL;
+ return NULL;
+ }
+
+ End = AsciiStrBrk (Begin, CharSet);
+ if ((End != NULL) && (*End != '\0')) {
+ *End = '\0';
+ End++;
+ }
+
+ mAsciiFieldBuffer = End;
+ return Begin;
+}
+
+/**
+
+ Find the next token after one or more specified characters.
+
+ @param String Point to the string where to find the substring.
+ @param CharSet Point to the string to be found.
+
+**/
+CHAR8 *
+EFIAPI
+AsciiStrGetNewTokenLine (
+ IN CHAR8 *String,
+ IN CHAR8 *CharSet
+ )
+{
+ return AsciiStrTokenLine (String, CharSet);
+}
+
+/**
+
+ Find the next token after one or more specified characters.
+
+ @param CharSet Point to the string to be found.
+
+**/
+CHAR8 *
+EFIAPI
+AsciiStrGetNextTokenLine (
+ IN CHAR8 *CharSet
+ )
+{
+ return AsciiStrTokenLine (NULL, CharSet);
+}
+
+/**
+
+ Find the next token after one specificed characters.
+
+ @param String Point to the string where to find the substring.
+ @param CharSet Point to the string to be found.
+
+**/
+CHAR8 *
+EFIAPI
+AsciiStrGetNewTokenField (
+ IN CHAR8 *String,
+ IN CHAR8 *CharSet
+ )
+{
+ return AsciiStrTokenField (String, CharSet);
+}
+
+/**
+
+ Find the next token after one specificed characters.
+
+ @param CharSet Point to the string to be found.
+
+**/
+CHAR8 *
+EFIAPI
+AsciiStrGetNextTokenField (
+ IN CHAR8 *CharSet
+ )
+{
+ return AsciiStrTokenField (NULL, CharSet);
+}
+
+/**
+
+ Patch a character to the end of a string.
+
+ @param Buffer The string to be patched.
+ @param Patch The patch character.
+
+**/
+VOID
+EFIAPI
+PatchForAsciiStrTokenAfter (
+ IN CHAR8 *Buffer,
+ IN CHAR8 Patch
+ )
+{
+ CHAR8 *Str;
+
+ if (Buffer == NULL) {
+ return;
+ }
+
+ Str = Buffer;
+ while (*Str != 0) {
+ Str++;
+ }
+
+ *Str = Patch;
+
+ while (*(Str++) != '\0') {
+ if (*Str == 0) {
+ *Str = Patch;
+ } else {
+ break;
+ }
+ }
+
+ return;
+}
+
+/**
+ Patch a character at the beginning of a string.
+
+ @param Buffer The string to be patched.
+ @param Patch The patch character.
+
+**/
+VOID
+EFIAPI
+PatchForAsciiStrTokenBefore (
+ IN CHAR8 *Buffer,
+ IN CHAR8 Patch
+ )
+{
+ CHAR8 *Str;
+
+ if (Buffer == NULL) {
+ return;
+ }
+
+ Str = Buffer;
+ while (*(Str--) != '\0') {
+ if ((*Str == 0) || (*Str == Patch)) {
+ *Str = Patch;
+ } else {
+ break;
+ }
+ }
+
+ return;
+}