/** @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 BOOLEAN IsUnicode
)
{
OC_FLEX_ARRAY *Tokens;
VOID **Pointer;
UINTN AllocateSize;
VOID *NextToken;
CHAR16 Ch;
ASSERT (String != NULL);
if (IsUnicode ? ((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 = IsUnicode ? *((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 + (IsUnicode ? sizeof (CHAR16) : sizeof (CHAR8));
*Pointer = AllocateCopyPool (AllocateSize, NextToken);
if (*Pointer == NULL) {
OcFlexArrayFree (&Tokens);
return NULL;
}
if (IsUnicode) {
*(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 + (IsUnicode ? sizeof (CHAR16) : sizeof (CHAR8));
} while (Ch != CHAR_NULL);
return Tokens;
}