mirror of https://github.com/acidanthera/audk.git
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);
|
|
}
|
|
}
|
|
|
|
|