/** @file
Flexible string tokens.
Copyright (c) 2022, Mike Beaton, PMheart. All rights reserved.
SPDX-License-Identifier: BSD-3-Clause
**/
#include
#include
#include
#include
#include
OC_FLEX_ARRAY *
OcStringSplit (
IN CONST VOID *String,
IN CONST CHAR16 Delim,
IN CONST OC_STRING_FORMAT StringFormat
)
{
OC_FLEX_ARRAY *Tokens;
VOID **Pointer;
UINTN AllocateSize;
VOID *NextToken;
CHAR16 Ch;
ASSERT (String != NULL);
if ((StringFormat == OcStringFormatUnicode) ? (((CHAR16 *)String)[0] == CHAR_NULL) : (((CHAR8 *)String)[0] == '\0')) {
return NULL;
}
Tokens = OcFlexArrayInit (sizeof (String), OcFlexArrayFreePointerItem);
if (Tokens == NULL) {
return NULL;
}
NextToken = NULL;
do {
Ch = (StringFormat == OcStringFormatUnicode) ? *((CHAR16 *)String) : *((CHAR8 *)String);
if ((Ch == Delim) || OcIsSpace (Ch) || (Ch == CHAR_NULL)) {
if (NextToken != NULL) {
Pointer = OcFlexArrayAddItem (Tokens);
if (Pointer == NULL) {
OcFlexArrayFree (&Tokens);
return NULL;
}
AllocateSize = (UINT8 *)String - (UINT8 *)NextToken + ((StringFormat == OcStringFormatUnicode) ? sizeof (CHAR16) : sizeof (CHAR8));
*Pointer = AllocateCopyPool (AllocateSize, NextToken);
if (*Pointer == NULL) {
OcFlexArrayFree (&Tokens);
return NULL;
}
if ((StringFormat == OcStringFormatUnicode)) {
*(CHAR16 *)((UINT8 *)(*Pointer) + ((UINT8 *)String - (UINT8 *)NextToken)) = CHAR_NULL;
} else {
*(CHAR8 *)((UINT8 *)(*Pointer) + ((UINT8 *)String - (UINT8 *)NextToken)) = '\0';
}
NextToken = NULL;
}
} else {
if (NextToken == NULL) {
NextToken = (VOID *)String;
}
}
String = (UINT8 *)String + ((StringFormat == OcStringFormatUnicode) ? sizeof (CHAR16) : sizeof (CHAR8));
} while (Ch != CHAR_NULL);
return Tokens;
}