]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSupportString.c
MdeModulePkg/EbcDxe: add EBC Debugger
[mirror_edk2.git] / MdeModulePkg / Universal / EbcDxe / EbcDebugger / EdbSupportString.c
diff --git a/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSupportString.c b/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSupportString.c
new file mode 100644 (file)
index 0000000..558fe91
--- /dev/null
@@ -0,0 +1,991 @@
+/*++\r
+\r
+Copyright (c) 2007, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+Module Name:\r
+\r
+  EdbSupportString.c\r
+\r
+Abstract:\r
+\r
+\r
+--*/\r
+\r
+#include "Edb.h"\r
+\r
+UINTN\r
+EFIAPI\r
+Xtoi (\r
+  CHAR16  *str\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Convert hex string to uint\r
+\r
+Arguments:\r
+\r
+  Str  -  The string\r
+\r
+Returns:\r
+\r
+--*/\r
+{\r
+  UINTN   u;\r
+  CHAR16  c;\r
+  UINTN   m;\r
+\r
+  ASSERT (str != NULL);\r
+\r
+  m = (UINTN) -1 >> 4;\r
+  //\r
+  // skip preceeding white space\r
+  //\r
+  while (*str && *str == ' ') {\r
+    str += 1;\r
+  }\r
+  //\r
+  // skip preceeding zeros\r
+  //\r
+  while (*str && *str == '0') {\r
+    str += 1;\r
+  }\r
+  //\r
+  // skip preceeding white space\r
+  //\r
+  if (*str && (*str == 'x' || *str == 'X')) {\r
+    str += 1;\r
+  }\r
+  //\r
+  // convert hex digits\r
+  //\r
+  u = 0;\r
+  c = *(str++);\r
+  while (c) {\r
+    if (c >= 'a' && c <= 'f') {\r
+      c -= 'a' - 'A';\r
+    }\r
+\r
+    if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F')) {\r
+      if (u > m) {\r
+        return (UINTN) -1;\r
+      }\r
+\r
+      u = (u << 4) | (c - (c >= 'A' ? 'A' - 10 : '0'));\r
+    } else {\r
+      break;\r
+    }\r
+\r
+    c = *(str++);\r
+  }\r
+\r
+  return u;\r
+}\r
+\r
+UINT64\r
+EFIAPI\r
+LXtoi (\r
+  CHAR16  *str\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Convert hex string to uint\r
+\r
+Arguments:\r
+\r
+  Str  -  The string\r
+\r
+Returns:\r
+\r
+--*/\r
+{\r
+  UINT64  u;\r
+  CHAR16  c;\r
+  UINT64  m;\r
+\r
+  ASSERT (str != NULL);\r
+\r
+  m = RShiftU64 ((UINT64) -1, 4);\r
+  //\r
+  // skip preceeding white space\r
+  //\r
+  while (*str && *str == ' ') {\r
+    str += 1;\r
+  }\r
+  //\r
+  // skip preceeding zeros\r
+  //\r
+  while (*str && *str == '0') {\r
+    str += 1;\r
+  }\r
+  //\r
+  // skip preceeding white space\r
+  //\r
+  if (*str && (*str == 'x' || *str == 'X')) {\r
+    str += 1;\r
+  }\r
+  //\r
+  // convert hex digits\r
+  //\r
+  u = 0;\r
+  c = *(str++);\r
+  while (c) {\r
+    if (c >= 'a' && c <= 'f') {\r
+      c -= 'a' - 'A';\r
+    }\r
+\r
+    if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F')) {\r
+      if (u > m) {\r
+        return (UINT64) -1;\r
+      }\r
+\r
+      u = LShiftU64 (u, 4);\r
+      u = u + (c - (c >= 'A' ? 'A' - 10 : '0'));\r
+    } else {\r
+      break;\r
+    }\r
+\r
+    c = *(str++);\r
+  }\r
+\r
+  return u;\r
+}\r
+\r
+UINTN\r
+EFIAPI\r
+Atoi (\r
+  CHAR16  *str\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Convert hex string to uint\r
+\r
+Arguments:\r
+\r
+  Str  -  The string\r
+\r
+Returns:\r
+\r
+--*/\r
+{\r
+  UINTN   u;\r
+  CHAR16  c;\r
+  UINTN   m;\r
+  UINTN   n;\r
+\r
+  ASSERT (str != NULL);\r
+\r
+  m = (UINTN) -1 / 10;\r
+  n = (UINTN) -1 % 10;\r
+  //\r
+  // skip preceeding white space\r
+  //\r
+  while (*str && *str == ' ') {\r
+    str += 1;\r
+  }\r
+  //\r
+  // convert digits\r
+  //\r
+  u = 0;\r
+  c = *(str++);\r
+  while (c) {\r
+    if (c >= '0' && c <= '9') {\r
+      if (u > m || (u == m && c - '0' > (INTN) n)) {\r
+        return (UINTN) -1;\r
+      }\r
+\r
+      u = (u * 10) + c - '0';\r
+    } else {\r
+      break;\r
+    }\r
+\r
+    c = *(str++);\r
+  }\r
+\r
+  return u;\r
+}\r
+\r
+UINTN\r
+EFIAPI\r
+AsciiXtoi (\r
+  CHAR8  *str\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Convert hex string to uint\r
+\r
+Arguments:\r
+\r
+  Str  -  The string\r
+\r
+Returns:\r
+\r
+--*/\r
+{\r
+  UINTN   u;\r
+  CHAR8   c;\r
+  UINTN   m;\r
+\r
+  ASSERT (str != NULL);\r
+\r
+  m = (UINTN) -1 >> 4;\r
+  //\r
+  // skip preceeding white space\r
+  //\r
+  while (*str && *str == ' ') {\r
+    str += 1;\r
+  }\r
+  //\r
+  // skip preceeding zeros\r
+  //\r
+  while (*str && *str == '0') {\r
+    str += 1;\r
+  }\r
+  //\r
+  // skip preceeding white space\r
+  //\r
+  if (*str && (*str == 'x' || *str == 'X')) {\r
+    str += 1;\r
+  }\r
+  //\r
+  // convert hex digits\r
+  //\r
+  u = 0;\r
+  c = *(str++);\r
+  while (c) {\r
+    if (c >= 'a' && c <= 'f') {\r
+      c -= 'a' - 'A';\r
+    }\r
+\r
+    if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F')) {\r
+      if (u > m) {\r
+        return (UINTN) -1;\r
+      }\r
+\r
+      u = (u << 4) | (c - (c >= 'A' ? 'A' - 10 : '0'));\r
+    } else {\r
+      break;\r
+    }\r
+\r
+    c = *(str++);\r
+  }\r
+\r
+  return u;\r
+}\r
+\r
+UINTN\r
+EFIAPI\r
+AsciiAtoi (\r
+  CHAR8  *str\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Convert hex string to uint\r
+\r
+Arguments:\r
+\r
+  Str  -  The string\r
+\r
+Returns:\r
+\r
+--*/\r
+{\r
+  UINTN   u;\r
+  CHAR8   c;\r
+  UINTN   m;\r
+  UINTN   n;\r
+\r
+  ASSERT (str != NULL);\r
+\r
+  m = (UINTN) -1 / 10;\r
+  n = (UINTN) -1 % 10;\r
+  //\r
+  // skip preceeding white space\r
+  //\r
+  while (*str && *str == ' ') {\r
+    str += 1;\r
+  }\r
+  //\r
+  // convert digits\r
+  //\r
+  u = 0;\r
+  c = *(str++);\r
+  while (c) {\r
+    if (c >= '0' && c <= '9') {\r
+      if (u > m || (u == m && c - '0' > (INTN) n)) {\r
+        return (UINTN) -1;\r
+      }\r
+\r
+      u = (u * 10) + c - '0';\r
+    } else {\r
+      break;\r
+    }\r
+\r
+    c = *(str++);\r
+  }\r
+\r
+  return u;\r
+}\r
+\r
+STATIC\r
+CHAR16\r
+UnicodeToUpper (\r
+  IN      CHAR16                    Chr\r
+  )\r
+{\r
+  return (Chr >= L'a' && Chr <= L'z') ? Chr - (L'a' - L'A') : Chr;\r
+}\r
+\r
+STATIC\r
+CHAR8\r
+AsciiToUpper (\r
+  IN      CHAR8                     Chr\r
+  )\r
+{\r
+  return (Chr >= 'a' && Chr <= 'z') ? Chr - ('a' - 'A') : Chr;\r
+}\r
+\r
+INTN\r
+EFIAPI\r
+StrCmpUnicodeAndAscii (\r
+  IN CHAR16   *String,\r
+  IN CHAR8    *String2\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+  Compare the Unicode and Ascii string pointed by String to the string pointed by String2.\r
+\r
+Arguments:\r
+  String - Unicode String to process\r
+\r
+  String2 - Ascii string to process\r
+\r
+Returns:\r
+  Return a positive integer if String is lexicall greater than String2; Zero if\r
+  the two strings are identical; and a negative interger if String is lexically\r
+  less than String2.\r
+\r
+--*/\r
+{\r
+  while (*String) {\r
+    if (*String != (CHAR16)*String2) {\r
+      break;\r
+    }\r
+\r
+    String += 1;\r
+    String2 += 1;\r
+  }\r
+\r
+  return (*String - (CHAR16)*String2);\r
+}\r
+\r
+INTN\r
+EFIAPI\r
+StriCmp (\r
+  IN CHAR16   *String,\r
+  IN CHAR16   *String2\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+  Compare the Unicode string pointed by String to the string pointed by String2.\r
+\r
+Arguments:\r
+  String - Unicode String to process\r
+  String2 - Unicode string to process\r
+\r
+Returns:\r
+  Return a positive integer if String is lexically greater than String2; Zero if\r
+  the two strings are identical; and a negative integer if String is lexically\r
+  less than String2.\r
+\r
+--*/\r
+{\r
+  while ((*String != L'\0') &&\r
+         (UnicodeToUpper (*String) == UnicodeToUpper (*String2))) {\r
+    String++;\r
+    String2++;\r
+  }\r
+\r
+  return UnicodeToUpper (*String) - UnicodeToUpper (*String2);\r
+}\r
+\r
+INTN\r
+EFIAPI\r
+StriCmpUnicodeAndAscii (\r
+  IN CHAR16   *String,\r
+  IN CHAR8    *String2\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+  Compare the Unicode and Ascii string pointed by String to the string pointed by String2.\r
+\r
+Arguments:\r
+  String - Unicode String to process\r
+\r
+  String2 - Ascii string to process\r
+\r
+Returns:\r
+  Return a positive integer if String is lexically greater than String2; Zero if\r
+  the two strings are identical; and a negative integer if String is lexically\r
+  less than String2.\r
+\r
+--*/\r
+{\r
+  while ((*String != L'\0') &&\r
+         (UnicodeToUpper (*String) == (CHAR16)AsciiToUpper (*String2))) {\r
+    String++;\r
+    String2++;\r
+  }\r
+\r
+  return UnicodeToUpper (*String) - (CHAR16)AsciiToUpper (*String2);\r
+}\r
+\r
+BOOLEAN\r
+EFIAPI\r
+StrEndWith (\r
+  IN CHAR16                       *Str,\r
+  IN CHAR16                       *SubStr\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Verify if the string is end with the sub string.\r
+\r
+--*/\r
+{\r
+  CHAR16  *Temp;\r
+\r
+  if ((Str == NULL) || (SubStr == NULL) || (StrLen(Str) < StrLen(SubStr))) {\r
+    return FALSE;\r
+  }\r
+\r
+  Temp = Str + StrLen(Str) - StrLen(SubStr);\r
+\r
+  //\r
+  // Compare\r
+  //\r
+  if (StriCmp (Temp, SubStr) == 0) {\r
+    return TRUE;\r
+  } else {\r
+    return FALSE;\r
+  }\r
+}\r
+\r
+CHAR16 *\r
+EFIAPI\r
+StrDuplicate (\r
+  IN CHAR16   *Src\r
+  )\r
+// duplicate a string\r
+{\r
+  CHAR16      *Dest;\r
+  UINTN       Size;\r
+\r
+  Size = (StrLen(Src) + 1) * sizeof(CHAR16);\r
+  Dest = AllocateZeroPool (Size);\r
+  if (Dest) {\r
+    CopyMem (Dest, Src, Size);\r
+  }\r
+  return Dest;\r
+}\r
+\r
+\r
+CHAR16  *mLineBuffer          = NULL;\r
+CHAR16  *mFieldBuffer         = NULL;\r
+\r
+UINTN\r
+EFIAPI\r
+StrSpn (\r
+  IN CHAR16                       *String,\r
+  IN CHAR16                       *CharSet\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Find the first substring.\r
+\r
+--*/\r
+{\r
+  UINTN   Count;\r
+  CHAR16  *Str1;\r
+  CHAR16  *Str2;\r
+\r
+  Count = 0;\r
+\r
+  for (Str1 = String; *Str1 != L'\0'; Str1 ++) {\r
+    for (Str2 = CharSet; *Str2 != L'\0'; Str2 ++) {\r
+      if (*Str1 == *Str2) {\r
+        break;\r
+      }\r
+    }\r
+\r
+    if (*Str2 == L'\0') {\r
+      return Count;\r
+    }\r
+\r
+    Count ++;\r
+  }\r
+\r
+  return Count;\r
+}\r
+\r
+\r
+CHAR16 *\r
+EFIAPI\r
+StrBrk (\r
+  IN CHAR16                       *String,\r
+  IN CHAR16                       *CharSet\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Searches a string for the first occurrence of a character contained in a\r
+  specified buffer.\r
+\r
+--*/\r
+{\r
+  CHAR16  *Str1;\r
+  CHAR16  *Str2;\r
+\r
+  for (Str1 = String; *Str1 != L'\0'; Str1 ++) {\r
+    for (Str2 = CharSet; *Str2 != L'\0'; Str2 ++) {\r
+      if (*Str1 == *Str2) {\r
+        return (CHAR16 *) Str1;\r
+      }\r
+    }\r
+  }\r
+\r
+  return NULL;\r
+}\r
+\r
+CHAR16 *\r
+EFIAPI\r
+StrTokenLine (\r
+  IN CHAR16                       *String OPTIONAL,\r
+  IN CHAR16                       *CharSet\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Find the next token after one or more specified characters.\r
+\r
+--*/\r
+{\r
+  CHAR16  *Begin;\r
+  CHAR16  *End;\r
+\r
+  Begin = (String == NULL) ? mLineBuffer : String;\r
+  if (Begin == NULL) {\r
+    return NULL;\r
+  }\r
+\r
+  Begin += StrSpn (Begin, CharSet);\r
+  if (*Begin == L'\0') {\r
+    mLineBuffer = NULL;\r
+    return NULL;\r
+  }\r
+\r
+  End = StrBrk (Begin, CharSet);\r
+  if ((End != NULL) && (*End != L'\0')) {\r
+    *End = L'\0';\r
+    End ++;\r
+  }\r
+\r
+  mLineBuffer = End;\r
+  return Begin;\r
+}\r
+\r
+\r
+CHAR16 *\r
+EFIAPI\r
+StrTokenField (\r
+  IN CHAR16                       *String OPTIONAL,\r
+  IN CHAR16                       *CharSet\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Find the next token after one specificed characters.\r
+\r
+--*/\r
+{\r
+  CHAR16  *Begin;\r
+  CHAR16  *End;\r
+\r
+\r
+  Begin = (String == NULL) ? mFieldBuffer : String;\r
+  if (Begin == NULL) {\r
+    return NULL;\r
+  }\r
+\r
+  if (*Begin == L'\0') {\r
+    mFieldBuffer = NULL;\r
+    return NULL;\r
+  }\r
+\r
+  End = StrBrk (Begin, CharSet);\r
+  if ((End != NULL) && (*End != L'\0')) {\r
+    *End = L'\0';\r
+    End ++;\r
+  }\r
+\r
+  mFieldBuffer = End;\r
+  return Begin;\r
+}\r
+\r
+CHAR16 *\r
+EFIAPI\r
+StrGetNewTokenLine (\r
+  IN CHAR16                       *String,\r
+  IN CHAR16                       *CharSet\r
+  )\r
+{\r
+  return StrTokenLine (String, CharSet);\r
+}\r
+\r
+CHAR16 *\r
+EFIAPI\r
+StrGetNextTokenLine (\r
+  IN CHAR16                       *CharSet\r
+  )\r
+{\r
+  return StrTokenLine (NULL, CharSet);\r
+}\r
+\r
+CHAR16 *\r
+EFIAPI\r
+StrGetNewTokenField (\r
+  IN CHAR16                       *String,\r
+  IN CHAR16                       *CharSet\r
+  )\r
+{\r
+  return StrTokenField (String, CharSet);\r
+}\r
+\r
+CHAR16 *\r
+EFIAPI\r
+StrGetNextTokenField (\r
+  IN CHAR16                       *CharSet\r
+  )\r
+{\r
+  return StrTokenField (NULL, CharSet);\r
+}\r
+\r
+VOID\r
+EFIAPI\r
+PatchForStrTokenAfter (\r
+  IN CHAR16    *Buffer,\r
+  IN CHAR16    Patch\r
+  )\r
+{\r
+  CHAR16 *Str;\r
+\r
+  if (Buffer == NULL) {\r
+    return ;\r
+  }\r
+\r
+  Str = Buffer;\r
+  while (*Str != 0) {\r
+    Str ++;\r
+  }\r
+  *Str = Patch;\r
+\r
+  while (*(Str ++)) {\r
+    if (*Str == 0) {\r
+      *Str = Patch;\r
+    } else {\r
+      break;\r
+    }\r
+  }\r
+\r
+  return ;\r
+}\r
+\r
+VOID\r
+EFIAPI\r
+PatchForStrTokenBefore (\r
+  IN CHAR16    *Buffer,\r
+  IN CHAR16    Patch\r
+  )\r
+{\r
+  CHAR16 *Str;\r
+\r
+  if (Buffer == NULL) {\r
+    return ;\r
+  }\r
+\r
+  Str = Buffer;\r
+  while (*(Str --)) {\r
+    if ((*Str == 0) || (*Str == Patch)) {\r
+      *Str = Patch;\r
+    } else {\r
+      break;\r
+    }\r
+  }\r
+\r
+  return ;\r
+}\r
+\r
+CHAR8  *mAsciiLineBuffer          = NULL;\r
+CHAR8  *mAsciiFieldBuffer         = NULL;\r
+\r
+UINTN\r
+EFIAPI\r
+AsciiStrSpn (\r
+  IN CHAR8                       *String,\r
+  IN CHAR8                       *CharSet\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Find the first substring.\r
+\r
+--*/\r
+{\r
+  UINTN   Count;\r
+  CHAR8  *Str1;\r
+  CHAR8  *Str2;\r
+\r
+  Count = 0;\r
+\r
+  for (Str1 = String; *Str1 != '\0'; Str1 ++) {\r
+    for (Str2 = CharSet; *Str2 != '\0'; Str2 ++) {\r
+      if (*Str1 == *Str2) {\r
+        break;\r
+      }\r
+    }\r
+\r
+    if (*Str2 == '\0') {\r
+      return Count;\r
+    }\r
+\r
+    Count ++;\r
+  }\r
+\r
+  return Count;\r
+}\r
+\r
+\r
+CHAR8 *\r
+EFIAPI\r
+AsciiStrBrk (\r
+  IN CHAR8                       *String,\r
+  IN CHAR8                       *CharSet\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Searches a string for the first occurrence of a character contained in a\r
+  specified buffer.\r
+\r
+--*/\r
+{\r
+  CHAR8  *Str1;\r
+  CHAR8  *Str2;\r
+\r
+  for (Str1 = String; *Str1 != '\0'; Str1 ++) {\r
+    for (Str2 = CharSet; *Str2 != '\0'; Str2 ++) {\r
+      if (*Str1 == *Str2) {\r
+        return (CHAR8 *) Str1;\r
+      }\r
+    }\r
+  }\r
+\r
+  return NULL;\r
+}\r
+\r
+CHAR8 *\r
+EFIAPI\r
+AsciiStrTokenLine (\r
+  IN CHAR8                       *String OPTIONAL,\r
+  IN CHAR8                       *CharSet\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Find the next token after one or more specified characters.\r
+\r
+--*/\r
+{\r
+  CHAR8  *Begin;\r
+  CHAR8  *End;\r
+\r
+  Begin = (String == NULL) ? mAsciiLineBuffer : String;\r
+  if (Begin == NULL) {\r
+    return NULL;\r
+  }\r
+\r
+  Begin += AsciiStrSpn (Begin, CharSet);\r
+  if (*Begin == '\0') {\r
+    mAsciiLineBuffer = NULL;\r
+    return NULL;\r
+  }\r
+\r
+  End = AsciiStrBrk (Begin, CharSet);\r
+  if ((End != NULL) && (*End != '\0')) {\r
+    *End = '\0';\r
+    End ++;\r
+  }\r
+\r
+  mAsciiLineBuffer = End;\r
+  return Begin;\r
+}\r
+\r
+\r
+CHAR8 *\r
+EFIAPI\r
+AsciiStrTokenField (\r
+  IN CHAR8                       *String OPTIONAL,\r
+  IN CHAR8                       *CharSet\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Find the next token after one specificed characters.\r
+\r
+--*/\r
+{\r
+  CHAR8  *Begin;\r
+  CHAR8  *End;\r
+\r
+\r
+  Begin = (String == NULL) ? mAsciiFieldBuffer : String;\r
+  if (Begin == NULL) {\r
+    return NULL;\r
+  }\r
+\r
+  if (*Begin == L'\0') {\r
+    mAsciiFieldBuffer = NULL;\r
+    return NULL;\r
+  }\r
+\r
+  End = AsciiStrBrk (Begin, CharSet);\r
+  if ((End != NULL) && (*End != '\0')) {\r
+    *End = '\0';\r
+    End ++;\r
+  }\r
+\r
+  mAsciiFieldBuffer = End;\r
+  return Begin;\r
+}\r
+\r
+CHAR8 *\r
+EFIAPI\r
+AsciiStrGetNewTokenLine (\r
+  IN CHAR8                       *String,\r
+  IN CHAR8                       *CharSet\r
+  )\r
+{\r
+  return AsciiStrTokenLine (String, CharSet);\r
+}\r
+\r
+CHAR8 *\r
+EFIAPI\r
+AsciiStrGetNextTokenLine (\r
+  IN CHAR8                       *CharSet\r
+  )\r
+{\r
+  return AsciiStrTokenLine (NULL, CharSet);\r
+}\r
+\r
+CHAR8 *\r
+EFIAPI\r
+AsciiStrGetNewTokenField (\r
+  IN CHAR8                       *String,\r
+  IN CHAR8                       *CharSet\r
+  )\r
+{\r
+  return AsciiStrTokenField (String, CharSet);\r
+}\r
+\r
+CHAR8 *\r
+EFIAPI\r
+AsciiStrGetNextTokenField (\r
+  IN CHAR8                       *CharSet\r
+  )\r
+{\r
+  return AsciiStrTokenField (NULL, CharSet);\r
+}\r
+\r
+VOID\r
+EFIAPI\r
+PatchForAsciiStrTokenAfter (\r
+  IN CHAR8    *Buffer,\r
+  IN CHAR8    Patch\r
+  )\r
+{\r
+  CHAR8 *Str;\r
+\r
+  if (Buffer == NULL) {\r
+    return ;\r
+  }\r
+\r
+  Str = Buffer;\r
+  while (*Str != 0) {\r
+    Str ++;\r
+  }\r
+  *Str = Patch;\r
+\r
+  while (*(Str ++)) {\r
+    if (*Str == 0) {\r
+      *Str = Patch;\r
+    } else {\r
+      break;\r
+    }\r
+  }\r
+\r
+  return ;\r
+}\r
+\r
+VOID\r
+EFIAPI\r
+PatchForAsciiStrTokenBefore (\r
+  IN CHAR8    *Buffer,\r
+  IN CHAR8    Patch\r
+  )\r
+{\r
+  CHAR8 *Str;\r
+\r
+  if (Buffer == NULL) {\r
+    return ;\r
+  }\r
+\r
+  Str = Buffer;\r
+  while (*(Str --)) {\r
+    if ((*Str == 0) || (*Str == Patch)) {\r
+      *Str = Patch;\r
+    } else {\r
+      break;\r
+    }\r
+  }\r
+\r
+  return ;\r
+}\r