123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413 |
- /** @file
- Function prototypes and defines for string routines.
- Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- #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);
- }
- }
|