1 /***********************************************************************************************************************************
2 String List Handler
3 ***********************************************************************************************************************************/
4 #ifndef COMMON_TYPE_STRINGLIST_H
5 #define COMMON_TYPE_STRINGLIST_H
6 
7 /***********************************************************************************************************************************
8 StringList object
9 ***********************************************************************************************************************************/
10 typedef struct StringList StringList;
11 
12 #include "common/memContext.h"
13 #include "common/type/list.h"
14 #include "common/type/string.h"
15 #include "common/type/variantList.h"
16 
17 /***********************************************************************************************************************************
18 Constructors
19 ***********************************************************************************************************************************/
20 // Create empty StringList
21 __attribute__((always_inline)) static inline StringList *
strLstNew(void)22 strLstNew(void)
23 {
24     return (StringList *)lstNewP(sizeof(String *), .comparator = lstComparatorStr);
25 }
26 
27 // Split a string into a string list based on a delimiter
28 StringList *strLstNewSplitZ(const String *string, const char *delimiter);
29 
30 __attribute__((always_inline)) static inline StringList *
strLstNewSplit(const String * const string,const String * const delimiter)31 strLstNewSplit(const String *const string, const String *const delimiter)
32 {
33     return strLstNewSplitZ(string, strZ(delimiter));
34 }
35 
36 // New string list from a variant list -- all variants in the list must be type string
37 StringList *strLstNewVarLst(const VariantList *sourceList);
38 
39 // Duplicate a string list
40 StringList *strLstDup(const StringList *sourceList);
41 
42 /***********************************************************************************************************************************
43 Getters/Setters
44 ***********************************************************************************************************************************/
45 // Set a new comparator
46 __attribute__((always_inline)) static inline StringList *
strLstComparatorSet(StringList * const this,ListComparator * const comparator)47 strLstComparatorSet(StringList *const this, ListComparator *const comparator)
48 {
49     return (StringList *)lstComparatorSet((List *)this, comparator);
50 }
51 
52 // List size
53 __attribute__((always_inline)) static inline unsigned int
strLstSize(const StringList * const this)54 strLstSize(const StringList *const this)
55 {
56     return lstSize((List *)this);
57 }
58 
59 // Is the list empty?
60 __attribute__((always_inline)) static inline bool
strLstEmpty(const StringList * const this)61 strLstEmpty(const StringList *const this)
62 {
63     return strLstSize(this) == 0;
64 }
65 
66 /***********************************************************************************************************************************
67 Functions
68 ***********************************************************************************************************************************/
69 // Add String to the list
70 String *strLstAdd(StringList *this, const String *string);
71 String *strLstAddZ(StringList *this, const char *string);
72 String *strLstAddIfMissing(StringList *this, const String *string);
73 
74 // Does the specified string exist in the list?
75 __attribute__((always_inline)) static inline bool
strLstExists(const StringList * const this,const String * const string)76 strLstExists(const StringList *const this, const String *const string)
77 {
78     return lstExists((List *)this, &string);
79 }
80 
81 // Insert into the list
82 String *strLstInsert(StringList *this, unsigned int listIdx, const String *string);
83 
84 // Get a string by index
85 __attribute__((always_inline)) static inline String *
strLstGet(const StringList * const this,const unsigned int listIdx)86 strLstGet(const StringList *const this, const unsigned int listIdx)
87 {
88     return *(String **)lstGet((List *)this, listIdx);
89 }
90 
91 // Join a list of strings into a single string using the specified separator and quote with specified quote character
92 String *strLstJoinQuote(const StringList *this, const char *separator, const char *quote);
93 
94 // Join a list of strings into a single string using the specified separator
95 __attribute__((always_inline)) static inline String *
strLstJoin(const StringList * const this,const char * const separator)96 strLstJoin(const StringList *const this, const char *const separator)
97 {
98     return strLstJoinQuote(this, separator, "");
99 }
100 
101 // Return all items in this list which are not in the anti list. The input lists must *both* be sorted ascending or the results will
102 // be undefined.
103 StringList *strLstMergeAnti(const StringList *this, const StringList *anti);
104 
105 // Move to a new parent mem context
106 __attribute__((always_inline)) static inline StringList *
strLstMove(StringList * const this,MemContext * const parentNew)107 strLstMove(StringList *const this, MemContext *const parentNew)
108 {
109     return (StringList *)lstMove((List *)this, parentNew);
110 }
111 
112 // Return a null-terminated array of pointers to the zero-terminated strings in this list. DO NOT override const and modify any of
113 // the strings in this array, though it is OK to modify the array itself.
114 const char **strLstPtr(const StringList *this);
115 
116 // Remove an item from the list
117 __attribute__((always_inline)) static inline bool
strLstRemove(StringList * const this,const String * const item)118 strLstRemove(StringList *const this, const String *const item)
119 {
120     return lstRemove((List *)this, &item);
121 }
122 
123 __attribute__((always_inline)) static inline StringList *
strLstRemoveIdx(StringList * const this,const unsigned int listIdx)124 strLstRemoveIdx(StringList *const this, const unsigned int listIdx)
125 {
126     return (StringList *)lstRemoveIdx((List *)this, listIdx);
127 }
128 
129 // List sort
130 __attribute__((always_inline)) static inline StringList *
strLstSort(StringList * const this,const SortOrder sortOrder)131 strLstSort(StringList *const this, const SortOrder sortOrder)
132 {
133     return (StringList *)lstSort((List *)this, sortOrder);
134 }
135 
136 /***********************************************************************************************************************************
137 Destructor
138 ***********************************************************************************************************************************/
139 __attribute__((always_inline)) static inline void
strLstFree(StringList * const this)140 strLstFree(StringList *const this)
141 {
142     lstFree((List *)this);
143 }
144 
145 /***********************************************************************************************************************************
146 Macros for function logging
147 ***********************************************************************************************************************************/
148 String *strLstToLog(const StringList *this);
149 
150 #define FUNCTION_LOG_STRING_LIST_TYPE                                                                                              \
151     StringList *
152 #define FUNCTION_LOG_STRING_LIST_FORMAT(value, buffer, bufferSize)                                                                 \
153     FUNCTION_LOG_STRING_OBJECT_FORMAT(value, strLstToLog, buffer, bufferSize)
154 
155 #endif
156