mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-11 14:28:08 +01:00
1021 lines
18 KiB
C
1021 lines
18 KiB
C
|
/** @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 ;
|
||
|
}
|