https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Hao Wu <hao.a.wu@intel.com> Reviewed-by: Jian J Wang <jian.j.wang@intel.com>
		
			
				
	
	
		
			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 ;
 | 
						|
}
 |