--- /dev/null
+/*++\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