Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Yingke Liu <yingke.d.liu@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15971 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			420 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			420 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
Function prototypes and defines for string routines.
 | 
						|
 | 
						|
Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
 | 
						|
This program and the accompanying materials                          
 | 
						|
are licensed and made available under the terms and conditions of the BSD License         
 | 
						|
which accompanies this distribution.  The full text of the license may be found at        
 | 
						|
http://opensource.org/licenses/bsd-license.php                                            
 | 
						|
                                                                                          
 | 
						|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
 | 
						|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#include <string.h>
 | 
						|
#include <ctype.h>
 | 
						|
#include "StringFuncs.h"
 | 
						|
 | 
						|
//
 | 
						|
// Functions implementations
 | 
						|
//
 | 
						|
 | 
						|
CHAR8*
 | 
						|
CloneString (
 | 
						|
  IN CHAR8       *String
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Allocates a new string and copies 'String' to clone it
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  String          The string to clone
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  CHAR8* - NULL if there are not enough resources
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  CHAR8* NewString;
 | 
						|
 | 
						|
  NewString = malloc (strlen (String) + 1);
 | 
						|
  if (NewString != NULL) {
 | 
						|
    strcpy (NewString, String);
 | 
						|
  }
 | 
						|
 | 
						|
  return NewString;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
StripInfDscStringInPlace (
 | 
						|
  IN CHAR8       *String
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Remove all comments, leading and trailing whitespace from the string.
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  String          The string to 'strip'
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  EFI_STATUS
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  CHAR8 *Pos;
 | 
						|
 | 
						|
  if (String == NULL) {
 | 
						|
    return EFI_INVALID_PARAMETER;
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Remove leading whitespace
 | 
						|
  //
 | 
						|
  for (Pos = String; isspace ((int)*Pos); Pos++) {
 | 
						|
  }
 | 
						|
  if (Pos != String) {
 | 
						|
    memmove (String, Pos, strlen (Pos) + 1);
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Comment BUGBUGs!
 | 
						|
  //
 | 
						|
  // What about strings?  Comment characters are okay in strings.
 | 
						|
  // What about multiline comments?
 | 
						|
  //
 | 
						|
 | 
						|
  Pos = (CHAR8 *) strstr (String,  "//");
 | 
						|
  if (Pos != NULL) {
 | 
						|
    *Pos = '\0';
 | 
						|
  }
 | 
						|
 | 
						|
  Pos = (CHAR8 *) strchr (String, '#');
 | 
						|
  if (Pos != NULL) {
 | 
						|
    *Pos = '\0';
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Remove trailing whitespace
 | 
						|
  //
 | 
						|
  for (Pos = String + strlen (String);
 | 
						|
       ((Pos - 1) >= String) && (isspace ((int)*(Pos - 1)));
 | 
						|
       Pos--
 | 
						|
      ) {
 | 
						|
  }
 | 
						|
  *Pos = '\0';
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
STRING_LIST*
 | 
						|
SplitStringByWhitespace (
 | 
						|
  IN CHAR8       *String
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Creates and returns a 'split' STRING_LIST by splitting the string
 | 
						|
  on whitespace boundaries.
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  String          The string to 'split'
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  EFI_STATUS
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  CHAR8       *Pos;
 | 
						|
  CHAR8       *EndOfSubString;
 | 
						|
  CHAR8       *EndOfString;
 | 
						|
  STRING_LIST *Output;
 | 
						|
  UINTN       Item;
 | 
						|
 | 
						|
  String = CloneString (String);
 | 
						|
  if (String == NULL) {
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
  EndOfString = String + strlen (String);
 | 
						|
 | 
						|
  Output = NewStringList ();
 | 
						|
 | 
						|
  for (Pos = String, Item = 0; Pos < EndOfString; Item++) {
 | 
						|
    while (isspace ((int)*Pos)) {
 | 
						|
      Pos++;
 | 
						|
    }
 | 
						|
 | 
						|
    for (EndOfSubString=Pos;
 | 
						|
         (*EndOfSubString != '\0') && !isspace ((int)*EndOfSubString);
 | 
						|
         EndOfSubString++
 | 
						|
         ) {
 | 
						|
    }
 | 
						|
 | 
						|
    if (EndOfSubString == Pos) {
 | 
						|
      break;
 | 
						|
    }
 | 
						|
 | 
						|
    *EndOfSubString = '\0';
 | 
						|
 | 
						|
    AppendCopyOfStringToList (&Output, Pos);
 | 
						|
 | 
						|
    Pos = EndOfSubString + 1;
 | 
						|
  }
 | 
						|
 | 
						|
  free (String);
 | 
						|
  return Output;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
STRING_LIST*
 | 
						|
NewStringList (
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Creates a new STRING_LIST with 0 strings.
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  STRING_LIST* - Null if there is not enough resources to create the object.
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  STRING_LIST *NewList;
 | 
						|
  NewList = AllocateStringListStruct (0);
 | 
						|
  if (NewList != NULL) {
 | 
						|
    NewList->Count = 0;
 | 
						|
  }
 | 
						|
  return NewList;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
AppendCopyOfStringToList (
 | 
						|
  IN OUT STRING_LIST **StringList,
 | 
						|
  IN CHAR8       *String
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Adds String to StringList.  A new copy of String is made before it is
 | 
						|
  added to StringList.
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  EFI_STATUS
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  STRING_LIST *OldList;
 | 
						|
  STRING_LIST *NewList;
 | 
						|
  CHAR8       *NewString;
 | 
						|
 | 
						|
  OldList = *StringList;
 | 
						|
  NewList = AllocateStringListStruct (OldList->Count + 1);
 | 
						|
  if (NewList == NULL) {
 | 
						|
    return EFI_OUT_OF_RESOURCES;
 | 
						|
  }
 | 
						|
 | 
						|
  NewString = CloneString (String);
 | 
						|
  if (NewString == NULL) {
 | 
						|
    free (NewList);
 | 
						|
    return EFI_OUT_OF_RESOURCES;
 | 
						|
  }
 | 
						|
 | 
						|
  memcpy (
 | 
						|
    NewList->Strings,
 | 
						|
    OldList->Strings,
 | 
						|
    sizeof (OldList->Strings[0]) * OldList->Count
 | 
						|
    );
 | 
						|
  NewList->Count = OldList->Count + 1;
 | 
						|
  NewList->Strings[OldList->Count] = NewString;
 | 
						|
 | 
						|
  *StringList = NewList;
 | 
						|
  free (OldList);
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
RemoveLastStringFromList (
 | 
						|
  IN STRING_LIST       *StringList
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Removes the last string from StringList and frees the memory associated
 | 
						|
  with it.
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  StringList        The string list to remove the string from
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  EFI_STATUS
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  if (StringList->Count == 0) {
 | 
						|
    return EFI_INVALID_PARAMETER;
 | 
						|
  }
 | 
						|
 | 
						|
  free (StringList->Strings[StringList->Count - 1]);
 | 
						|
  StringList->Count--;
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
STRING_LIST*
 | 
						|
AllocateStringListStruct (
 | 
						|
  IN UINTN StringCount
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Allocates a STRING_LIST structure that can store StringCount strings.
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  StringCount        The number of strings that need to be stored
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  EFI_STATUS
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  return malloc (OFFSET_OF(STRING_LIST, Strings[StringCount + 1]));
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
VOID
 | 
						|
FreeStringList (
 | 
						|
  IN STRING_LIST       *StringList
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Frees all memory associated with StringList.
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  StringList        The string list to free
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  VOID
 | 
						|
--*/
 | 
						|
{
 | 
						|
  while (StringList->Count > 0) {
 | 
						|
    RemoveLastStringFromList (StringList);
 | 
						|
  }
 | 
						|
 | 
						|
  free (StringList);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
CHAR8*
 | 
						|
StringListToString (
 | 
						|
  IN STRING_LIST       *StringList
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Generates a string that represents the STRING_LIST
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  StringList        The string list to convert to a string
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  CHAR8* - The string list represented with a single string.  The returned
 | 
						|
           string must be freed by the caller.
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  UINTN Count;
 | 
						|
  UINTN Length;
 | 
						|
  CHAR8 *NewString;
 | 
						|
 | 
						|
  Length = 2;
 | 
						|
  for (Count = 0; Count < StringList->Count; Count++) {
 | 
						|
    if (Count > 0) {
 | 
						|
      Length += 2;
 | 
						|
    }
 | 
						|
    Length += strlen (StringList->Strings[Count]) + 2;
 | 
						|
  }
 | 
						|
 | 
						|
  NewString = malloc (Length + 1);
 | 
						|
  if (NewString == NULL) {
 | 
						|
    return NewString;
 | 
						|
  }
 | 
						|
  NewString[0] = '\0';
 | 
						|
 | 
						|
  strcat (NewString, "[");
 | 
						|
  for (Count = 0; Count < StringList->Count; Count++) {
 | 
						|
    if (Count > 0) {
 | 
						|
      strcat (NewString, ", ");
 | 
						|
    }
 | 
						|
    strcat (NewString, "\"");
 | 
						|
    strcat (NewString, StringList->Strings[Count]);
 | 
						|
    strcat (NewString, "\"");
 | 
						|
  }
 | 
						|
  strcat (NewString, "]");
 | 
						|
  
 | 
						|
  return NewString;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
VOID
 | 
						|
PrintStringList (
 | 
						|
  IN STRING_LIST       *StringList
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Prints out the string list
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  StringList        The string list to print
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  EFI_STATUS
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  CHAR8* String;
 | 
						|
  String = StringListToString (StringList);
 | 
						|
  if (String != NULL) {
 | 
						|
    printf ("%s", String);
 | 
						|
    free (String);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 |