OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
FlexString.c
Go to the documentation of this file.
1
8#include <Base.h>
9#include <Library/BaseLib.h>
10#include <Library/MemoryAllocationLib.h>
13
16 IN CONST VOID *String,
17 IN CONST CHAR16 Delim,
18 IN CONST OC_STRING_FORMAT StringFormat
19 )
20{
21 OC_FLEX_ARRAY *Tokens;
22 VOID **Pointer;
23 UINTN AllocateSize;
24 VOID *NextToken;
25 CHAR16 Ch;
26
27 ASSERT (String != NULL);
28
29 if ((StringFormat == OcStringFormatUnicode) ? (((CHAR16 *)String)[0] == CHAR_NULL) : (((CHAR8 *)String)[0] == '\0')) {
30 return NULL;
31 }
32
33 Tokens = OcFlexArrayInit (sizeof (String), OcFlexArrayFreePointerItem);
34 if (Tokens == NULL) {
35 return NULL;
36 }
37
38 NextToken = NULL;
39 do {
40 Ch = (StringFormat == OcStringFormatUnicode) ? *((CHAR16 *)String) : *((CHAR8 *)String);
41
42 if ((Ch == Delim) || OcIsSpace (Ch) || (Ch == CHAR_NULL)) {
43 if (NextToken != NULL) {
44 Pointer = OcFlexArrayAddItem (Tokens);
45 if (Pointer == NULL) {
46 OcFlexArrayFree (&Tokens);
47 return NULL;
48 }
49
50 AllocateSize = (UINT8 *)String - (UINT8 *)NextToken + ((StringFormat == OcStringFormatUnicode) ? sizeof (CHAR16) : sizeof (CHAR8));
51 *Pointer = AllocateCopyPool (AllocateSize, NextToken);
52 if (*Pointer == NULL) {
53 OcFlexArrayFree (&Tokens);
54 return NULL;
55 }
56
57 if ((StringFormat == OcStringFormatUnicode)) {
58 *(CHAR16 *)((UINT8 *)(*Pointer) + ((UINT8 *)String - (UINT8 *)NextToken)) = CHAR_NULL;
59 } else {
60 *(CHAR8 *)((UINT8 *)(*Pointer) + ((UINT8 *)String - (UINT8 *)NextToken)) = '\0';
61 }
62
63 NextToken = NULL;
64 }
65 } else {
66 if (NextToken == NULL) {
67 NextToken = (VOID *)String;
68 }
69 }
70
71 String = (UINT8 *)String + ((StringFormat == OcStringFormatUnicode) ? sizeof (CHAR16) : sizeof (CHAR8));
72 } while (Ch != CHAR_NULL);
73
74 return Tokens;
75}
OC_FLEX_ARRAY * OcStringSplit(IN CONST VOID *String, IN CONST CHAR16 Delim, IN CONST OC_STRING_FORMAT StringFormat)
Definition FlexString.c:15
VOID OcFlexArrayFree(IN OUT OC_FLEX_ARRAY **FlexArray)
OC_FLEX_ARRAY * OcFlexArrayInit(IN CONST UINTN ItemSize, IN CONST OC_FLEX_ARRAY_FREE_ITEM FreeItem OPTIONAL)
Definition FlexArray.c:31
VOID OcFlexArrayFreePointerItem(IN VOID *Item)
Definition FlexArray.c:18
VOID * OcFlexArrayAddItem(IN OUT OC_FLEX_ARRAY *FlexArray)
Definition FlexArray.c:136
BOOLEAN OcIsSpace(CHAR16 Ch)
@ OcStringFormatUnicode
Definition OcStringLib.h:51
enum _OC_STRING_FORMAT OC_STRING_FORMAT
#define ASSERT(x)
Definition coder.h:55