libsheepy
libsheepyCSmallString.c
Go to the documentation of this file.
1 // MIT License
2 //
3 // Copyright (c) 2023 Remy Noulin
4 //
5 // Permission is hereby granted, free of charge, to any person obtaining a copy
6 // of this software and associated documentation files (the "Software"), to deal
7 // in the Software without restriction, including without limitation the rights
8 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 // copies of the Software, and to permit persons to whom the Software is
10 // furnished to do so, subject to the following conditions:
11 //
12 // The above copyright notice and this permission notice shall be included in all
13 // copies or substantial portions of the Software.
14 //
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 // SOFTWARE.
22 
23 #include "../libsheepyObject.h"
24 #include "libsheepyCSmallString.h"
26 
27 #define internal static
28 
29 #include <ctype.h>
30 #include <stdio.h>
31 #include <stdarg.h>
32 #include <stdbool.h>
33 #include <string.h>
34 #include <stdlib.h>
35 #include <stdint.h>
36 
40 void finalizeRecycleSmallString(void *arg UNUSED);
41 void finalizeSmallString(void);
42 smallStringt* allocSmallString(const char *string);
47 smallStringt* createSF(const char *paramType, ...);
48 internal void freeSmallString(smallStringt *self);
49 internal void terminateSmallString(smallStringt **self);
50 internal char* toStringSmallString(smallStringt *self);
52 internal void smashSmallString(smallStringt **self);
53 #if (NFreeStackCheck)
54 internal void finishSmallString(smallStringt **self);
55 #else
56 internal void finishSmallString(smallStringt **self);
57 #endif
58 internal const char* helpSmallString(smallStringt UNUSED *self);
59 internal char* escapeSmallString(smallStringt *self);
60 internal char* getSmallString(smallStringt *self);
61 internal smallStringt* setSmallString(smallStringt *self, const char *string);
62 internal smallStringt* setCharSmallString(smallStringt *self, char c);
63 internal smallStringt* setBoolSmallString(smallStringt* self, bool p2);
64 internal smallStringt* setDoubleSmallString(smallStringt* self, double p2);
65 internal smallStringt* setInt64SmallString(smallStringt* self, int64_t p2);
66 internal smallStringt* setInt32SmallString(smallStringt* self, int32_t p2);
67 internal smallStringt* setUint32SmallString(smallStringt* self, uint32_t p2);
68 internal smallStringt* setUint64SmallString(smallStringt* self, uint64_t p2);
77 internal smallStringt* setNFreeSmallString(smallStringt *self, char *string);
81 internal smallStringt* appendSSmallString(smallStringt *self, const char *string);
82 internal smallStringt* appendCharSmallString(smallStringt *self, char c);
84 internal smallStringt* appendNSmashSSmallString(smallStringt *self, char *string);
89 internal smallStringt* prependSSmallString(smallStringt *self, const char *string);
90 internal smallStringt* prependCharSmallString(smallStringt *self, char c);
91 internal smallStringt* prependNSmashSSmallString(smallStringt *self, char *string);
92 internal smallStringt* catSmallString(smallStringt *self, ...);
93 internal smallStringt* catSSmallString(smallStringt *self, ...);
96 internal smallStringt* replaceSmallString(smallStringt *self, const char *olds, const char *news, size_t max);
97 internal smallStringt* replaceCharSSmallString(smallStringt *self, char olds, const char *news, size_t max);
98 internal smallStringt* replaceSCharSmallString(smallStringt *self, const char *olds, char news, size_t max);
99 internal smallStringt* replaceCharCharSmallString(smallStringt *self, char olds, char news, size_t max);
100 internal smallStringt* replaceSmallJsonSmallJsonSmallString(smallStringt *self, smallJsont *olds, smallJsont *news, size_t max);
102 internal smallStringt* replaceSmallJsonSSmallString(smallStringt *self, smallJsont *olds, const char *news, size_t max);
103 internal smallStringt* replaceSmallJsonCharSmallString(smallStringt *self, smallJsont *olds, char news, size_t max);
106 internal smallStringt* replaceSmallStringSSmallString(smallStringt *self, smallStringt *olds, const char *news, size_t max);
107 internal smallStringt* replaceSmallStringCharSmallString(smallStringt *self, smallStringt *olds, char news, size_t max);
108 internal smallStringt* replaceSSmallJsonSmallString(smallStringt *self, const char *olds, smallJsont *news, size_t max);
109 internal smallStringt* replaceSSmallStringSmallString(smallStringt *self, const char *olds, smallStringt *news, size_t max);
110 internal smallStringt* replaceCharSmallJsonSmallString(smallStringt *self, char olds, smallJsont *news, size_t max);
111 internal smallStringt* replaceCharSmallStringSmallString(smallStringt *self, char olds, smallStringt *news, size_t max);
112 internal smallStringt* replaceManySmallString(smallStringt *self, const char *paramType, ...);
113 internal smallStringt* icReplaceSmallString(smallStringt *self, const char *olds, const char *news, size_t max);
114 internal smallStringt* icReplaceCharSSmallString(smallStringt *self, char olds, const char *news, size_t max);
115 internal smallStringt* icReplaceSCharSmallString(smallStringt *self, const char *olds, char news, size_t max);
116 internal smallStringt* icReplaceCharCharSmallString(smallStringt *self, char olds, char news, size_t max);
119 internal smallStringt* icReplaceSmallJsonSSmallString(smallStringt *self, smallJsont *olds, const char *news, size_t max);
120 internal smallStringt* icReplaceSmallJsonCharSmallString(smallStringt *self, smallJsont *olds, char news, size_t max);
123 internal smallStringt* icReplaceSmallStringSSmallString(smallStringt *self, smallStringt *olds, const char *news, size_t max);
124 internal smallStringt* icReplaceSmallStringCharSmallString(smallStringt *self, smallStringt *olds, char news, size_t max);
125 internal smallStringt* icReplaceSSmallJsonSmallString(smallStringt *self, const char *olds, smallJsont *news, size_t max);
126 internal smallStringt* icReplaceSSmallStringSmallString(smallStringt *self, const char *olds, smallStringt *news, size_t max);
127 internal smallStringt* icReplaceCharSmallJsonSmallString(smallStringt *self, char olds, smallJsont *news, size_t max);
128 internal smallStringt* icReplaceCharSmallStringSmallString(smallStringt *self, char olds, smallStringt *news, size_t max);
129 internal smallStringt* icReplaceManySmallString(smallStringt *self, const char *paramType, ...);
130 internal bool equalSmallString(smallStringt *self, smallStringt *string);
131 internal bool equalSSmallString(smallStringt *self, const char *string);
132 internal bool equalCharSmallString(smallStringt *self, char c);
133 internal bool equalSmallStringBase(smallStringt* self, baset* p2);
134 internal bool equalSmallStringBool(smallStringt* self, bool p2);
135 internal bool equalSmallStringDouble(smallStringt* self, double p2);
136 internal bool equalSmallStringInt64(smallStringt* self, int64_t p2);
137 internal bool equalSmallStringInt32(smallStringt* self, int32_t p2);
138 internal bool equalSmallStringUint32(smallStringt* self, uint32_t p2);
139 internal bool equalSmallStringUint64(smallStringt* self, uint64_t p2);
140 internal bool equalSmallStringSmallBool(smallStringt* self, smallBoolt* p2);
141 internal bool equalSmallStringSmallBytes(smallStringt* self, smallBytest* p2);
142 internal bool equalSmallStringSmallDouble(smallStringt* self, smallDoublet* p2);
143 internal bool equalSmallStringSmallInt(smallStringt* self, smallIntt* p2);
144 internal bool equalSmallStringSmallJson(smallStringt* self, smallJsont* p2);
145 internal bool icEqualSmallString(smallStringt *self, smallStringt *string);
146 internal bool icEqualSSmallString(smallStringt *self, const char *string);
147 internal bool icEqualCharSmallString(smallStringt *self, char c);
148 internal bool icEqualSmallStringBase(smallStringt* self, baset* p2);
149 internal bool icEqualSmallStringSmallJson(smallStringt* self, smallJsont* p2);
150 internal bool equalISSmallString(smallStringt *self, const char *string, int64_t index);
151 internal bool equalICharSmallString(smallStringt *self, char c, int64_t index);
152 internal bool equalISmallJsonSmallString(smallStringt *self, smallJsont *string, int64_t index);
153 internal bool equalISmallStringSmallString(smallStringt *self, smallStringt *string, int64_t index);
154 internal bool startsWithSSmallString(smallStringt *self, const char *string);
155 internal bool startsWithCharSmallString(smallStringt *self, char c);
156 internal bool startsWithSmallJsonSmallString(smallStringt *self, smallJsont *string);
157 internal bool startsWithSmallStringSmallString(smallStringt *self, smallStringt *string);
158 internal bool endsWithSSmallString(smallStringt *self, const char *string);
159 internal bool endsWithCharSmallString(smallStringt *self, char c);
160 internal bool endsWithSmallJsonSmallString(smallStringt *self, smallJsont *string);
161 internal bool endsWithSmallStringSmallString(smallStringt *self, smallStringt *string);
162 internal ssize_t countSSmallString(smallStringt *self, const char *string);
163 internal ssize_t countCharSmallString(smallStringt *self, char c);
164 internal ssize_t countSmallJsonSmallString(smallStringt *self, smallJsont *string);
165 internal ssize_t countSmallStringSmallString(smallStringt *self, smallStringt *string);
166 internal bool icStartsWithSSmallString(smallStringt *self, const char *string);
167 internal bool icStartsWithCharSmallString(smallStringt *self, char c);
168 internal bool icStartsWithSmallJsonSmallString(smallStringt *self, smallJsont *string);
169 internal bool icStartsWithSmallStringSmallString(smallStringt *self, smallStringt *string);
170 internal bool icEndsWithSSmallString(smallStringt *self, const char *string);
171 internal bool icEndsWithCharSmallString(smallStringt *self, char c);
172 internal bool icEndsWithSmallJsonSmallString(smallStringt *self, smallJsont *string);
173 internal bool icEndsWithSmallStringSmallString(smallStringt *self, smallStringt *string);
174 internal ssize_t icCountSSmallString(smallStringt *self, const char *string);
175 internal ssize_t icCountCharSmallString(smallStringt *self, char c);
176 internal ssize_t icCountSmallJsonSmallString(smallStringt *self, smallJsont *string);
177 internal ssize_t icCountSmallStringSmallString(smallStringt *self, smallStringt *string);
178 internal bool isNumberSmallString(smallStringt *self);
179 internal bool isIntSmallString(smallStringt *self);
180 internal int64_t parseIntSmallString(smallStringt *self);
181 internal double parseDoubleSmallString(smallStringt *self);
182 internal smallStringt* intToSmallString(smallStringt *self, int64_t n);
183 internal smallStringt* doubleToSmallString(smallStringt *self, double n);
184 internal size_t lenSmallString(smallStringt *self);
187 internal smallStringt* trimSmallString(smallStringt *self);
190 internal smallStringt* uniqSmallString(smallStringt *self, char c);
191 internal smallStringt* icUniqSmallString(smallStringt *self, char c);
192 internal char getAtSmallString(smallStringt *self, int64_t index);
193 internal smallStringt* setAtSmallString(smallStringt *self, int64_t index, char c);
194 internal smallStringt* sliceSmallString(smallStringt *self, int64_t start, int64_t end);
195 internal smallStringt* cropSmallString(smallStringt *self, int64_t start, int64_t end);
196 internal char* cropSSmallString(smallStringt *self, int64_t start, int64_t end);
197 internal smallJsont* cropSmallJsonSmallString(smallStringt *self, int64_t start, int64_t end);
198 internal char cropElemSmallString(smallStringt *self, int64_t index);
199 internal smallStringt* copySmallString(smallStringt *self, int64_t start, int64_t end);
200 internal smallStringt* insertSmallString(smallStringt *self, int64_t index, smallStringt *toInsert);
201 internal smallStringt* insertSmallJsonSmallString(smallStringt *self, int64_t index, smallJsont *toInsert);
202 internal smallStringt* insertSSmallString(smallStringt *self, int64_t index, const char *toInsert);
203 internal smallStringt* insertNFreeSmallString(smallStringt *self, int64_t index, smallStringt *toInsert);
204 internal smallStringt* insertNFreeSmallJsonSmallString(smallStringt *self, int64_t index, smallJsont *toInsert);
205 internal smallStringt* insertSNFreeSmallString(smallStringt *self, int64_t index, char *toInsert);
206 internal smallStringt* injectSmallString(smallStringt *self, int64_t index, char toInject);
207 internal smallStringt* delSmallString(smallStringt *self, int64_t start, int64_t end);
208 internal smallStringt* delElemSmallString(smallStringt *self, int64_t index);
209 internal char* hasSmallString(smallStringt *self, const char *needle);
210 internal char* hasCharSmallString(smallStringt *self, char c);
211 internal char* hasSmallJsonSmallString(smallStringt *self, smallJsont *needle);
212 internal char* hasSmallStringSmallString(smallStringt *self, smallStringt *needle);
213 internal smallStringt* findSmallString(smallStringt *self, const char *needle);
214 internal smallStringt* findCharSmallString(smallStringt *self, char c);
217 internal ssize_t indexOfSmallString(smallStringt *self, const char *needle);
218 internal ssize_t indexOfCharSmallString(smallStringt *self, char c);
219 internal ssize_t indexOfSmallJsonSmallString(smallStringt *self, smallJsont *needle);
220 internal ssize_t indexOfSmallStringSmallString(smallStringt *self, smallStringt *needle);
221 internal char* icHasSmallString(smallStringt *self, const char *needle);
222 internal char* icHasCharSmallString(smallStringt *self, char c);
223 internal char* icHasSmallJsonSmallString(smallStringt *self, smallJsont *needle);
224 internal char* icHasSmallStringSmallString(smallStringt *self, smallStringt *needle);
225 internal smallStringt* icFindSmallString(smallStringt *self, const char *needle);
226 internal smallStringt* icFindCharSmallString(smallStringt *self, char c);
229 internal ssize_t icIndexOfSmallString(smallStringt *self, const char *needle);
230 internal ssize_t icIndexOfCharSmallString(smallStringt *self, char c);
231 internal ssize_t icIndexOfSmallJsonSmallString(smallStringt *self, smallJsont *needle);
232 internal ssize_t icIndexOfSmallStringSmallString(smallStringt *self, smallStringt *needle);
234 internal bool isEmptySmallString(smallStringt *self);
235 internal bool isBlankSmallString(smallStringt *self);
236 internal smallArrayt* splitSmallString(smallStringt *self, const char *delim);
237 internal smallArrayt* splitCharSmallString(smallStringt *self, char c);
240 internal char** splitSSmallString(smallStringt *self, const char *delim);
241 internal char** splitCharSSmallString(smallStringt *self, char c);
242 internal char** splitSmallJsonSSmallString(smallStringt *self, smallJsont *delim);
243 internal char** splitSmallStringSSmallString(smallStringt *self, smallStringt *delim);
244 internal smallArrayt* extractSmallString(smallStringt *self, const char* delim1, const char* delim2);
245 internal smallArrayt* extractCharSSmallString(smallStringt *self, char delim1, const char* delim2);
246 internal smallArrayt* extractSCharSmallString(smallStringt *self, const char* delim1, char delim2);
247 internal smallArrayt* extractCharCharSmallString(smallStringt *self, char delim1, char delim2);
250 internal smallArrayt* extractSmallJsonSSmallString(smallStringt *self, smallJsont* delim1, const char* delim2);
251 internal smallArrayt* extractSmallJsonCharSmallString(smallStringt *self, smallJsont* delim1, char delim2);
254 internal smallArrayt* extractSmallStringSSmallString(smallStringt *self, smallStringt* delim1, const char* delim2);
255 internal smallArrayt* extractSmallStringCharSmallString(smallStringt *self, smallStringt* delim1, char delim2);
256 internal smallArrayt* extractSSmallJsonSmallString(smallStringt *self, const char* delim1, smallJsont* delim2);
257 internal smallArrayt* extractSSmallStringSmallString(smallStringt *self, const char* delim1, smallStringt* delim2);
258 internal smallArrayt* extractCharSmallJsonSmallString(smallStringt *self, char delim1, smallJsont* delim2);
259 internal smallArrayt* extractCharSmallStringSmallString(smallStringt *self, char delim1, smallStringt* delim2);
260 internal smallArrayt* icSplitSmallString(smallStringt *self, const char *delim);
261 internal smallArrayt* icSplitCharSmallString(smallStringt *self, char c);
264 internal char** icSplitSSmallString(smallStringt *self, const char *delim);
265 internal char** icSplitCharSSmallString(smallStringt *self, char c);
266 internal char** icSplitSmallJsonSSmallString(smallStringt *self, smallJsont *delim);
267 internal char** icSplitSmallStringSSmallString(smallStringt *self, smallStringt *delim);
268 internal smallArrayt* icExtractSmallString(smallStringt *self, const char* delim1, const char* delim2);
269 internal smallArrayt* icExtractCharSSmallString(smallStringt *self, char delim1, const char* delim2);
270 internal smallArrayt* icExtractSCharSmallString(smallStringt *self, const char* delim1, char delim2);
271 internal smallArrayt* icExtractCharCharSmallString(smallStringt *self, char delim1, char delim2);
274 internal smallArrayt* icExtractSmallJsonSSmallString(smallStringt *self, smallJsont* delim1, const char* delim2);
275 internal smallArrayt* icExtractSmallJsonCharSmallString(smallStringt *self, smallJsont* delim1, char delim2);
278 internal smallArrayt* icExtractSmallStringSSmallString(smallStringt *self, smallStringt* delim1, const char* delim2);
279 internal smallArrayt* icExtractSmallStringCharSmallString(smallStringt *self, smallStringt* delim1, char delim2);
280 internal smallArrayt* icExtractSSmallJsonSmallString(smallStringt *self, const char* delim1, smallJsont* delim2);
281 internal smallArrayt* icExtractSSmallStringSmallString(smallStringt *self, const char* delim1, smallStringt* delim2);
282 internal smallArrayt* icExtractCharSmallJsonSmallString(smallStringt *self, char delim1, smallJsont* delim2);
283 internal smallArrayt* icExtractCharSmallStringSmallString(smallStringt *self, char delim1, smallStringt* delim2);
284 internal smallStringt* colorSmallString(smallStringt *self, const char *colr);
285 internal char* colordSmallString(smallStringt *self, const char *color);
286 internal smallStringt* readFileSmallString(smallStringt *self, const char *filePath);
289 internal smallStringt* readStreamSmallString(smallStringt *self, FILE *fp);
290 internal int writeFileSmallString(smallStringt *self, const char *filePath);
291 internal int writeFileSmallJsonSmallString(smallStringt *self, smallJsont *filePath);
292 internal int writeFileSmallStringSmallString(smallStringt *self, smallStringt *filePath);
293 internal int writeStreamSmallString(smallStringt *self, FILE *fp);
294 internal int appendFileSmallString(smallStringt *self, const char *filePath);
295 internal int appendFileSmallStringSmallString(smallStringt *self, smallStringt *filePath);
301 smallStringt* setUint32SmallStringG(smallStringt* self, uint32_t p2);
302 smallStringt* setUint64SmallStringG(smallStringt* self, uint64_t p2);
303 smallStringt* setSmallStringG(smallStringt* self, const char* p2);
313 char getAtSmallStringG(smallStringt *self, char retType UNUSED, int64_t index);
314 smallStringt* setAtSmallStringG(smallStringt *self, int64_t index, char c);
317 smallStringt* appendSSmallStringG (smallStringt *self, const char *string);
324 smallStringt* prependSSmallStringG (smallStringt *self, const char *string);
329 smallStringt* replaceSmallStringG (smallStringt *self, const char *olds, const char *news, size_t max);
330 smallStringt* replaceCharSSmallStringG(smallStringt *self, char olds, const char *news, size_t max);
331 smallStringt* replaceSCharSmallStringG(smallStringt *self, const char *olds, char news, size_t max);
332 smallStringt* replaceCharCharSmallStringG(smallStringt *self, char olds, char news, size_t max);
335 smallStringt* replaceSmallJsonSSmallStringG(smallStringt *self, smallJsont *olds, const char *news, size_t max);
336 smallStringt* replaceSmallJsonCharSmallStringG(smallStringt *self, smallJsont *olds, char news, size_t max);
339 smallStringt* replaceSmallStringSSmallStringG(smallStringt *self, smallStringt *olds, const char *news, size_t max);
340 smallStringt* replaceSmallStringCharSmallStringG(smallStringt *self, smallStringt *olds, char news, size_t max);
341 smallStringt* replaceSSmallJsonSmallStringG(smallStringt *self, const char *olds, smallJsont *news, size_t max);
342 smallStringt* replaceSSmallStringSmallStringG(smallStringt *self, const char *olds, smallStringt *news, size_t max);
343 smallStringt* replaceCharSmallJsonSmallStringG(smallStringt *self, char olds, smallJsont *news, size_t max);
344 smallStringt* replaceCharSmallStringSmallStringG(smallStringt *self, char olds, smallStringt *news, size_t max);
345 smallStringt* icReplaceSmallStringG (smallStringt *self, const char *olds, const char *news, size_t max);
346 smallStringt* icReplaceCharSSmallStringG(smallStringt *self, char olds, const char *news, size_t max);
347 smallStringt* icReplaceSCharSmallStringG(smallStringt *self, const char *olds, char news, size_t max);
348 smallStringt* icReplaceCharCharSmallStringG(smallStringt *self, char olds, char news, size_t max);
351 smallStringt* icReplaceSmallJsonSSmallStringG(smallStringt *self, smallJsont *olds, const char *news, size_t max);
352 smallStringt* icReplaceSmallJsonCharSmallStringG(smallStringt *self, smallJsont *olds, char news, size_t max);
355 smallStringt* icReplaceSmallStringSSmallStringG(smallStringt *self, smallStringt *olds, const char *news, size_t max);
356 smallStringt* icReplaceSmallStringCharSmallStringG(smallStringt *self, smallStringt *olds, char news, size_t max);
357 smallStringt* icReplaceSSmallJsonSmallStringG(smallStringt *self, const char *olds, smallJsont *news, size_t max);
358 smallStringt* icReplaceSSmallStringSmallStringG(smallStringt *self, const char *olds, smallStringt *news, size_t max);
359 smallStringt* icReplaceCharSmallJsonSmallStringG(smallStringt *self, char olds, smallJsont *news, size_t max);
360 smallStringt* icReplaceCharSmallStringSmallStringG(smallStringt *self, char olds, smallStringt *news, size_t max);
362 bool equalCharSmallStringG(smallStringt *self, char c);
363 bool equalSSmallStringG (smallStringt *self, const char *string);
364 bool equalSmallStringBaseG(smallStringt* self, baset* p2);
365 bool equalSmallStringBoolG(smallStringt* self, bool p2);
366 bool equalSmallStringDoubleG(smallStringt* self, double p2);
367 bool equalSmallStringInt64G(smallStringt* self, int64_t p2);
368 bool equalSmallStringInt32G(smallStringt* self, int32_t p2);
369 bool equalSmallStringUint32G(smallStringt* self, uint32_t p2);
370 bool equalSmallStringUint64G(smallStringt* self, uint64_t p2);
377 bool icEqualCharSmallStringG(smallStringt *self, char c);
378 bool icEqualSSmallStringG (smallStringt *self, const char *string);
381 bool equalISSmallStringG (smallStringt *self, const char *string, int64_t index);
382 bool equalICharSmallStringG(smallStringt *self, char c, int64_t index);
383 bool equalISmallJsonSmallStringG(smallStringt *self, smallJsont *string, int64_t index);
384 bool equalISmallStringSmallStringG(smallStringt *self, smallStringt *string, int64_t index);
385 bool startsWithSSmallStringG (smallStringt *self, const char *string);
386 bool startsWithCharSmallStringG(smallStringt *self, char c);
389 bool endsWithSSmallStringG (smallStringt *self, const char *string);
390 bool endsWithCharSmallStringG(smallStringt *self, char c);
393 ssize_t countSSmallStringG (smallStringt *self, const char *string);
394 ssize_t countCharSmallStringG(smallStringt *self, char c);
395 ssize_t countSmallJsonSmallStringG (smallStringt *self, smallJsont *string);
397 bool icStartsWithSSmallStringG (smallStringt *self, const char *string);
401 bool icEndsWithSSmallStringG (smallStringt *self, const char *string);
402 bool icEndsWithCharSmallStringG(smallStringt *self, char c);
405 ssize_t icCountSSmallStringG (smallStringt *self, const char *string);
406 ssize_t icCountCharSmallStringG(smallStringt *self, char c);
407 ssize_t icCountSmallJsonSmallStringG (smallStringt *self, smallJsont *string);
410 bool isIntSmallStringG(smallStringt *self);
411 int64_t parseIntSmallStringG (smallStringt *self);
412 smallStringt* intToSmallStringG (smallStringt *self, int64_t n);
415 size_t lenSmallStringG (smallStringt *self);
423 smallStringt* sliceSmallStringG (smallStringt *self, int64_t start, int64_t end);
424 smallStringt* cropSmallStringG (smallStringt *self, int64_t start, int64_t end);
425 char* cropSSmallStringG (smallStringt *self, int64_t start, int64_t end);
426 smallJsont* cropSmallJsonSmallStringG(smallStringt *self, int64_t start, int64_t end);
427 char cropElemSmallStringG (smallStringt *self, int64_t index);
428 smallStringt* copySmallStringG(smallStringt *self, int64_t start, int64_t end);
429 smallStringt* insertSmallStringG (smallStringt *self, int64_t index, smallStringt *toInsert);
430 smallStringt* insertSmallJsonSmallStringG (smallStringt *self, int64_t index, smallJsont *toInsert);
431 smallStringt* insertSSmallStringG (smallStringt *self, int64_t index, const char *toInsert);
432 smallStringt* insertNFreeSmallStringG(smallStringt *self, int64_t index, smallStringt *toInsert);
433 smallStringt* insertNFreeSmallJsonSmallStringG(smallStringt *self, int64_t index, smallJsont *toInsert);
434 smallStringt* insertSNFreeSmallStringG(smallStringt *self, int64_t index, char *toInsert);
435 smallStringt* injectSmallStringG (smallStringt *self, int64_t index, char toInject);
436 smallStringt* delSmallStringG (smallStringt *self, int64_t start, int64_t end);
437 smallStringt* delElemSmallStringG (smallStringt *self, int64_t index);
438 char* hasSmallStringG (smallStringt *self, const char *needle);
439 char* hasCharSmallStringG(smallStringt *self, char c);
440 char* hasSmallJsonSmallStringG(smallStringt *self, smallJsont *needle);
442 smallStringt* findSmallStringG(smallStringt *self, const char *needle);
446 ssize_t indexOfSmallStringG(smallStringt *self, const char *needle);
447 ssize_t indexOfCharSmallStringG(smallStringt *self, char c);
448 ssize_t indexOfSmallJsonSmallStringG (smallStringt *self, smallJsont *needle);
450 char* icHasSmallStringG (smallStringt *self, const char *needle);
451 char* icHasCharSmallStringG(smallStringt *self, char c);
454 smallStringt* icFindSmallStringG(smallStringt *self, const char *needle);
458 ssize_t icIndexOfSmallStringG(smallStringt *self, const char *needle);
459 ssize_t icIndexOfCharSmallStringG(smallStringt *self, char c);
463 bool isEmptySmallStringG (smallStringt *self);
464 bool isBlankSmallStringG (smallStringt *self);
465 smallArrayt* splitSmallStringG(smallStringt *self, const char *delim);
469 char** splitCharPSSmallStringG(smallStringt *self, const char* delim);
470 char** splitCharSSmallStringG(smallStringt *self, char c);
473 smallArrayt* extractSmallStringG(smallStringt *self, const char* delim1, const char* delim2);
474 smallArrayt* extractCharSSmallStringG(smallStringt *self, char delim1, const char* delim2);
475 smallArrayt* extractSCharSmallStringG(smallStringt *self, const char* delim1, char delim2);
476 smallArrayt* extractCharCharSmallStringG(smallStringt *self, char delim1, char delim2);
479 smallArrayt* extractSmallJsonSSmallStringG(smallStringt *self, smallJsont* delim1, const char* delim2);
483 smallArrayt* extractSmallStringSSmallStringG(smallStringt *self, smallStringt* delim1, const char* delim2);
485 smallArrayt* extractSSmallJsonSmallStringG(smallStringt *self, const char* delim1, smallJsont* delim2);
486 smallArrayt* extractSSmallStringSmallStringG(smallStringt *self, const char* delim1, smallStringt* delim2);
489 smallArrayt* icSplitSmallStringG (smallStringt *self, const char *delim);
493 char** icSplitCharPSSmallStringG (smallStringt *self, char *delim);
494 char** icSplitCharSSmallStringG (smallStringt *self, char c);
497 smallArrayt* icExtractSmallStringG(smallStringt *self, const char* delim1, const char* delim2);
498 smallArrayt* icExtractCharSSmallStringG (smallStringt *self, char delim1, const char* delim2);
499 smallArrayt* icExtractSCharSmallStringG (smallStringt *self, const char* delim1, char delim2);
500 smallArrayt* icExtractCharCharSmallStringG (smallStringt *self, char delim1, char delim2);
503 smallArrayt* icExtractSmallJsonSSmallStringG (smallStringt *self, smallJsont* delim1, const char* delim2);
507 smallArrayt* icExtractSmallStringSSmallStringG (smallStringt *self, smallStringt* delim1, const char* delim2);
509 smallArrayt* icExtractSSmallJsonSmallStringG (smallStringt *self, const char* delim1, smallJsont* delim2);
510 smallArrayt* icExtractSSmallStringSmallStringG (smallStringt *self, const char* delim1, smallStringt* delim2);
513 smallStringt* readFileSmallStringG (smallStringt *self, const char *filePath);
517 int writeFileSmallStringG (smallStringt *self, const char *filePath);
520 int writeStreamSmallStringG (smallStringt *self, FILE *fp);
521 int appendFileSmallStringFG (smallStringt *self, const char *filePath);
523 
525 
526  self->type = "smallString";
527  if (!smallStringF) {
528  isError(smallStringF, malloc(sizeof(smallStringFunctionst))) {
529  self->f = NULL;
530  return;
531  }
532  registerMethodsSmallString(smallStringF);
533  }
534  self->f = smallStringF;
535 
536  self->data = NULL;
537  self->_len = 0;
538 }
539 
541 
542  f->free = freeSmallString;
546 
547  f->smash = smashSmallString;
549  f->help = helpSmallString;
550  f->escape = escapeSmallString;
551  f->get = getSmallString;
552  f->set = setSmallString;
553  f->setChar = setCharSmallString;
554  f->setBool = setBoolSmallString;
555  f->setDouble = setDoubleSmallString;
556  f->setInt64 = setInt64SmallString;
557  f->setInt32 = setInt32SmallString;
558  f->setUint32 = setUint32SmallString;
559  f->setUint64 = setUint64SmallString;
560  f->setSmallArray = setSmallArraySmallString;
561  f->setFromSmallDict = setFromSmallDictSmallString;
562  f->setFromSmallJson = setFromSmallJsonSmallString;
563  f->setSmallBool = setSmallBoolSmallString;
564  f->setSmallDouble = setSmallDoubleSmallString;
565  f->setSmallInt = setSmallIntSmallString;
566  f->setSmallJson = setSmallJsonSmallString;
567  f->setSmallString = setSmallStringSmallString;
568  f->setNFree = setNFreeSmallString;
569  f->append = appendSmallString;
570  f->appendSmallJson = appendSmallJsonSmallString;
571  f->appendS = appendSSmallString;
572  f->appendChar = appendCharSmallString;
573  f->appendNSmash = appendNSmashSmallString;
574  f->appendNSmashSmallJson = appendNSmashSmallJsonSmallString;
575  f->appendNSmashS = appendNSmashSSmallString;
576  f->push = appendSSmallString;
577  f->pushMany = catSmallString;
578  f->pushManyS = catSSmallString;
579  f->pushNFreeMany = pushNFreeManySmallString;
580  f->pushNFreeManyS = pushNFreeManySSmallString;
581  f->prepend = prependSmallString;
582  f->prependSmallJson = prependSmallJsonSmallString;
583  f->prependNSmash = prependNSmashSmallString;
584  f->prependNSmashSmallJson = prependNSmashSmallJsonSmallString;
585  f->prependNSmashS = prependNSmashSSmallString;
586  f->prependS = prependSSmallString;
587  f->prependChar = prependCharSmallString;
588  f->cat = catSmallString;
589  f->catSt = catSSmallString;
590  f->replace = replaceSmallString;
591  f->replaceCharS = replaceCharSSmallString;
592  f->replaceSChar = replaceSCharSmallString;
593  f->replaceCharChar = replaceCharCharSmallString;
594  f->replaceSmallJsonSmallJson = replaceSmallJsonSmallJsonSmallString;
595  f->replaceSmallJsonSmallString = replaceSmallJsonSmallStringSmallString;
596  f->replaceSmallJsonS = replaceSmallJsonSSmallString;
597  f->replaceSmallJsonChar = replaceSmallJsonCharSmallString;
598  f->replaceSmallStringSmallJson = replaceSmallStringSmallJsonSmallString;
599  f->replaceSmallStringSmallString = replaceSmallStringSmallStringSmallString;
600  f->replaceSmallStringS = replaceSmallStringSSmallString;
601  f->replaceSmallStringChar = replaceSmallStringCharSmallString;
602  f->replaceSSmallJson = replaceSSmallJsonSmallString;
603  f->replaceSSmallString = replaceSSmallStringSmallString;
604  f->replaceCharSmallJson = replaceCharSmallJsonSmallString;
605  f->replaceCharSmallString = replaceCharSmallStringSmallString;
606  f->replaceMany = replaceManySmallString;
607  f->icReplace = icReplaceSmallString;
608  f->icReplaceCharS = icReplaceCharSSmallString;
609  f->icReplaceSChar = icReplaceSCharSmallString;
610  f->icReplaceCharChar = icReplaceCharCharSmallString;
611  f->icReplaceSmallJsonSmallJson = icReplaceSmallJsonSmallJsonSmallString;
612  f->icReplaceSmallJsonSmallString = icReplaceSmallJsonSmallStringSmallString;
613  f->icReplaceSmallJsonS = icReplaceSmallJsonSSmallString;
614  f->icReplaceSmallJsonChar = icReplaceSmallJsonCharSmallString;
615  f->icReplaceSmallStringSmallJson = icReplaceSmallStringSmallJsonSmallString;
616  f->icReplaceSmallStringSmallString = icReplaceSmallStringSmallStringSmallString;
617  f->icReplaceSmallStringS = icReplaceSmallStringSSmallString;
618  f->icReplaceSmallStringChar = icReplaceSmallStringCharSmallString;
619  f->icReplaceSSmallJson = icReplaceSSmallJsonSmallString;
620  f->icReplaceSSmallString = icReplaceSSmallStringSmallString;
621  f->icReplaceCharSmallJson = icReplaceCharSmallJsonSmallString;
622  f->icReplaceCharSmallString = icReplaceCharSmallStringSmallString;
623  f->icReplaceMany = icReplaceManySmallString;
624  f->equal = equalSmallString;
625  f->equalS = equalSSmallString;
626  f->equalChar = equalCharSmallString;
627  f->equalBase = equalSmallStringBase;
628  f->equalBool = equalSmallStringBool;
629  f->equalDouble = equalSmallStringDouble;
630  f->equalInt64 = equalSmallStringInt64;
631  f->equalInt32 = equalSmallStringInt32;
632  f->equalUint32 = equalSmallStringUint32;
633  f->equalUint64 = equalSmallStringUint64;
634  f->equalSmallBool = equalSmallStringSmallBool;
635  f->equalSmallBytes = equalSmallStringSmallBytes;
636  f->equalSmallDouble = equalSmallStringSmallDouble;
637  f->equalSmallInt = equalSmallStringSmallInt;
638  f->equalSmallJson = equalSmallStringSmallJson;
639  f->icEqual = icEqualSmallString;
640  f->icEqualS = icEqualSSmallString;
641  f->icEqualChar = icEqualCharSmallString;
642  f->icEqualBase = icEqualSmallStringBase;
643  f->icEqualSmallJson = icEqualSmallStringSmallJson;
644  f->equalIS = equalISSmallString;
645  f->equalIChar = equalICharSmallString;
646  f->equalISmallJson = equalISmallJsonSmallString;
647  f->equalISmallString = equalISmallStringSmallString;
648  f->startsWithS = startsWithSSmallString;
649  f->startsWithChar = startsWithCharSmallString;
650  f->startsWithSmallJson = startsWithSmallJsonSmallString;
651  f->startsWithSmallString = startsWithSmallStringSmallString;
652  f->endsWithS = endsWithSSmallString;
653  f->endsWithChar = endsWithCharSmallString;
654  f->endsWithSmallJson = endsWithSmallJsonSmallString;
655  f->endsWithSmallString = endsWithSmallStringSmallString;
656  f->countS = countSSmallString;
657  f->countChar = countCharSmallString;
658  f->countSmallJson = countSmallJsonSmallString;
659  f->countSmallString = countSmallStringSmallString;
660  f->icStartsWithS = icStartsWithSSmallString;
661  f->icStartsWithChar = icStartsWithCharSmallString;
662  f->icStartsWithSmallJson = icStartsWithSmallJsonSmallString;
663  f->icStartsWithSmallString = icStartsWithSmallStringSmallString;
664  f->icEndsWithS = icEndsWithSSmallString;
665  f->icEndsWithChar = icEndsWithCharSmallString;
666  f->icEndsWithSmallJson = icEndsWithSmallJsonSmallString;
667  f->icEndsWithSmallString = icEndsWithSmallStringSmallString;
668  f->icCountS = icCountSSmallString;
669  f->icCountChar = icCountCharSmallString;
670  f->icCountSmallJson = icCountSmallJsonSmallString;
671  f->icCountSmallString = icCountSmallStringSmallString;
672  f->isNumber = isNumberSmallString;
673  f->isInt = isIntSmallString;
674  f->parseInt = parseIntSmallString;
675  f->parseDouble = parseDoubleSmallString;
676  f->intTo = intToSmallString;
677  f->doubleTo = doubleToSmallString;
678  f->len = lenSmallString;
679  f->upper = upperSmallString;
680  f->lower = lowerSmallString;
681  f->trim = trimSmallString;
682  f->lTrim = lTrimSmallString;
683  f->rTrim = rTrimSmallString;
684  f->uniq = uniqSmallString;
685  f->icUniq = icUniqSmallString;
686  f->getAt = getAtSmallString;
687  f->setAt = setAtSmallString;
688  f->slice = sliceSmallString;
689  f->crop = cropSmallString;
690  f->cropS = cropSSmallString;
691  f->cropSmallJson = cropSmallJsonSmallString;
692  f->cropElem = cropElemSmallString;
693  f->copy = copySmallString;
694  f->insert = insertSmallString;
695  f->insertSmallJson = insertSmallJsonSmallString;
696  f->insertS = insertSSmallString;
697  f->insertNFree = insertNFreeSmallString;
698  f->insertNFreeSmallJson = insertNFreeSmallJsonSmallString;
699  f->insertSNFree = insertSNFreeSmallString;
700  f->inject = injectSmallString;
701  f->del = delSmallString;
702  f->delElem = delElemSmallString;
703  f->has = hasSmallString;
704  f->hasChar = hasCharSmallString;
705  f->hasSmallJson = hasSmallJsonSmallString;
706  f->hasSmallString = hasSmallStringSmallString;
707  f->find = findSmallString;
708  f->findChar = findCharSmallString;
709  f->findSmallJson = findSmallJsonSmallString;
710  f->findSmallString = findSmallStringSmallString;
711  f->indexOf = indexOfSmallString;
712  f->indexOfChar = indexOfCharSmallString;
713  f->indexOfSmallJson = indexOfSmallJsonSmallString;
714  f->indexOfSmallString = indexOfSmallStringSmallString;
715  f->icHas = icHasSmallString;
716  f->icHasChar = icHasCharSmallString;
717  f->icHasSmallJson = icHasSmallJsonSmallString;
718  f->icHasSmallString = icHasSmallStringSmallString;
719  f->icFind = icFindSmallString;
720  f->icFindChar = icFindCharSmallString;
721  f->icFindSmallJson = icFindSmallJsonSmallString;
722  f->icFindSmallString = icFindSmallStringSmallString;
723  f->icIndexOf = icIndexOfSmallString;
724  f->icIndexOfChar = icIndexOfCharSmallString;
725  f->icIndexOfSmallJson = icIndexOfSmallJsonSmallString;
726  f->icIndexOfSmallString = icIndexOfSmallStringSmallString;
727  f->empty = emptySmallString;
728  f->isEmpty = isEmptySmallString;
729  f->isBlank = isBlankSmallString;
730  f->split = splitSmallString;
731  f->splitChar = splitCharSmallString;
732  f->splitSmallJson = splitSmallJsonSmallString;
733  f->splitSmallString = splitSmallStringSmallString;
734  f->splitS = splitSSmallString;
735  f->splitCharS = splitCharSSmallString;
736  f->splitSmallJsonS = splitSmallJsonSSmallString;
737  f->splitSmallStringS = splitSmallStringSSmallString;
738  f->extract = extractSmallString;
739  f->extractCharS = extractCharSSmallString;
740  f->extractSChar = extractSCharSmallString;
741  f->extractCharChar = extractCharCharSmallString;
742  f->extractSmallJsonSmallJson = extractSmallJsonSmallJsonSmallString;
743  f->extractSmallJsonSmallString = extractSmallJsonSmallStringSmallString;
744  f->extractSmallJsonS = extractSmallJsonSSmallString;
745  f->extractSmallJsonChar = extractSmallJsonCharSmallString;
746  f->extractSmallStringSmallJson = extractSmallStringSmallJsonSmallString;
747  f->extractSmallStringSmallString = extractSmallStringSmallStringSmallString;
748  f->extractSmallStringS = extractSmallStringSSmallString;
749  f->extractSmallStringChar = extractSmallStringCharSmallString;
750  f->extractSSmallJson = extractSSmallJsonSmallString;
751  f->extractSSmallString = extractSSmallStringSmallString;
752  f->extractCharSmallJson = extractCharSmallJsonSmallString;
753  f->extractCharSmallString = extractCharSmallStringSmallString;
754  f->icSplit = icSplitSmallString;
755  f->icSplitChar = icSplitCharSmallString;
756  f->icSplitSmallJson = icSplitSmallJsonSmallString;
757  f->icSplitSmallString = icSplitSmallStringSmallString;
758  f->icSplitS = icSplitSSmallString;
759  f->icSplitCharS = icSplitCharSSmallString;
760  f->icSplitSmallJsonS = icSplitSmallJsonSSmallString;
761  f->icSplitSmallStringS = icSplitSmallStringSSmallString;
762  f->icExtract = icExtractSmallString;
763  f->icExtractCharS = icExtractCharSSmallString;
764  f->icExtractSChar = icExtractSCharSmallString;
765  f->icExtractCharChar = icExtractCharCharSmallString;
766  f->icExtractSmallJsonSmallJson = icExtractSmallJsonSmallJsonSmallString;
767  f->icExtractSmallJsonSmallString = icExtractSmallJsonSmallStringSmallString;
768  f->icExtractSmallJsonS = icExtractSmallJsonSSmallString;
769  f->icExtractSmallJsonChar = icExtractSmallJsonCharSmallString;
770  f->icExtractSmallStringSmallJson = icExtractSmallStringSmallJsonSmallString;
771  f->icExtractSmallStringSmallString = icExtractSmallStringSmallStringSmallString;
772  f->icExtractSmallStringS = icExtractSmallStringSSmallString;
773  f->icExtractSmallStringChar = icExtractSmallStringCharSmallString;
774  f->icExtractSSmallJson = icExtractSSmallJsonSmallString;
775  f->icExtractSSmallString = icExtractSSmallStringSmallString;
776  f->icExtractCharSmallJson = icExtractCharSmallJsonSmallString;
777  f->icExtractCharSmallString = icExtractCharSmallStringSmallString;
778  f->color = colorSmallString;
779  f->colord = colordSmallString;
780  f->readFile = readFileSmallString;
781  f->readFileSmallJson = readFileSmallJsonSmallString;
782  f->readFileSmallString = readFileSmallStringSmallString;
783  f->readStream = readStreamSmallString;
784  f->writeFile = writeFileSmallString;
785  f->writeFileSmallJson = writeFileSmallJsonSmallString;
786  f->writeFileSmallString = writeFileSmallStringSmallString;
787  f->writeStream = writeStreamSmallString;
788  f->appendFile = appendFileSmallString;
789  f->appendFileSmallString = appendFileSmallStringSmallString;
790 }
791 
793 
794  if (self) {
795  #if (recycleContainers)
796  initAllocateRecycle(smallStringt);
797  #else
798  isError(*self, malloc(sizeof(smallStringt)))
799  return;
800  #endif
801  if (*self) {
802  initiateSmallString(*self);
803  if (!(*self)->f) {
804  finishSmallString(self);
805 }
806  }
807  }
808  }
809 
811 
812  #if (recycleContainers)
813  finalizeRecycle
814  #endif
815  // recycleContainers
816 }
817 
819 
820  if (smallStringF) {
821  free(smallStringF);
822  smallStringF = NULL;
823  }
825 }
826 
827 smallStringt* allocSmallString(const char *string) {
828  smallStringt *r = NULL;
829 
831  if (!r) {
832  return(NULL);
833  }
834  r->f->set(r, string);
835  return(r);
836 }
837 
839 
840  terminateO(*val);
841 }
842 
844 
845  freeO(val);
846 }
847 
849 
850  freeO(*val);
851 }
852 
854 
855  finishO(*val);
856 }
857 
858 smallStringt* createSF(const char *paramType, ...) {
859  va_list pl;
860  smallStringt *r = NULL;
861 
863  if (!l.f) {
864  return(NULL);
865  }
866 
867  // add arguments to a list
868  va_start(pl, paramType);
869  paramType = va_arg(pl, const char *);
870  while (paramType) {
871  l.f->pushS(&l, paramType);
872  paramType = va_arg(pl, const char *);
873  }
874  va_end(pl);
875  // join list with empty delimiter
876  r = l.f->join(&l, "");
877  freeO(&l);
878  return(r);
879 }
880 
881 internal void freeSmallString(smallStringt *self) {
882 
883  if (self->data) {
884  free(self->data);
885  self->data = NULL;
886  self->_len = 0;
887 }
888  }
889 
890 internal void terminateSmallString(smallStringt **self) {
891 
892  freeSmallString(*self);
893  finishSmallString(self);
894 }
895 
896 internal char* toStringSmallString(smallStringt *self) {
897 
898  if (!self->data) {
899  return(NULL);
900  }
901  return(sStringToStringTiny(self->data));
902 }
903 
905 
907  if (!dup) {
908  return(NULL);
909  }
910  if (!self->data) {
911  return(dup);
912  }
913  isError(dup->data, (sStringt *)strdup((char *)self->data)) {
914  terminateO(dup);
915  return(NULL);
916  }
917  dup->_len = self->_len;
918  return(dup);
919 }
920 
921 internal void smashSmallString(smallStringt **self) {
922 
923  finishSmallString(self);
924 }
925 
926 #if (NFreeStackCheck)
927 internal void finishSmallString(smallStringt **self) {
928 
929  register u64 rsp asm("rsp");
930  if ((u64)*self > rsp) {
931  logW("Probably trying to free a smallString on stack: "BLD PRIx64 RST" sp: "BLD PRIx64 RST, *self, rsp);
932  logBtrace;
933  }
934  else {
935  #if (recycleContainers)
936  finishRecycle
937  #else
938  free(*self);
939  #endif
940  // recycleContainers
941  *self = NULL;
942 }
943  }
944 
945 #else
946 // #if NFreeStackCheck
947 internal void finishSmallString(smallStringt **self) {
948 
949  #if (recycleContainers)
950  finishRecycle
951  #else
952  free(*self);
953  #endif
954  // recycleContainers
955  *self = NULL;
956 }
957 
958 #endif
959 // #if NFreeStackCheck
960 
961 internal const char* helpSmallString(smallStringt UNUSED *self) {
962 
963  return(helpTextSmallString);
964 }
965 
966 internal char* escapeSmallString(smallStringt *self) {
967 
968  if (!self->data) {
969  return(NULL);
970  }
971  return(sStringEscapeTiny(self->data));
972 }
973 
974 internal char* getSmallString(smallStringt *self) {
975 
976  if (!self->data) {
977  // return NULL when there is no string
978  return(NULL);
979  }
980  return(sStringGetTiny(self->data));
981 }
982 
983 internal smallStringt* setSmallString(smallStringt *self, const char *string) {
984 
985  if (!string) {
986  return(NULL);
987  }
988  sStringSetTiny(&self->data, string);
989  self->_len = strlen(string);
990  return(self);
991 }
992 
994 
995  charToS(s, c);
996  return(setSmallString(self, s));
997 }
998 
999 internal smallStringt* setBoolSmallString(smallStringt* self, bool p2) {
1000 
1001  if (p2) {
1002  sStringSetTiny(&self->data, "true");
1003  self->_len = strlen("true");
1004  }
1005  else {
1006  sStringSetTiny(&self->data, "false");
1007  self->_len = strlen("false");
1008  }
1009  return(self);
1010 }
1011 
1012 internal smallStringt* setDoubleSmallString(smallStringt* self, double p2) {
1013 
1014  doubleToSmallString(self, p2);
1015  return(self);
1016 }
1017 
1018 internal smallStringt* setInt64SmallString(smallStringt* self, int64_t p2) {
1019 
1020  intToSmallString(self, p2);
1021  return(self);
1022 }
1023 
1024 internal smallStringt* setInt32SmallString(smallStringt* self, int32_t p2) {
1025 
1026  intToSmallString(self, p2);
1027  return(self);
1028 }
1029 
1030 internal smallStringt* setUint32SmallString(smallStringt* self, uint32_t p2) {
1031 
1032  intToSmallString(self, p2);
1033  return(self);
1034 }
1035 
1036 internal smallStringt* setUint64SmallString(smallStringt* self, uint64_t p2) {
1037 
1038  intToSmallString(self, (int64_t)p2);
1039  return(self);
1040 }
1041 
1043 
1044  if (!p2) {
1045  return(NULL);
1046  }
1047 
1048  if (checkObjectTypes && !isOSmallArray(p2)) {
1049  return(NULL);
1050  }
1051 
1052  char *s = toStringO(p2);
1053  smallStringt *r = setNFreeSmallString(self, s);
1054  if (!r) {
1055  free(s);
1056  }
1057  return(self);
1058 }
1059 
1061 
1062  if (!p2) {
1063  return(NULL);
1064  }
1065  if (checkObjectTypes && !isOSmallDict(p2)) {
1066  return(NULL);
1067  }
1068 
1069  char *s = toStringO(p2);
1070  smallStringt *r = setNFreeSmallString(self, s);
1071  if (!r) {
1072  free(s);
1073  }
1074  return(self);
1075 }
1076 
1078 
1079  if (!p2) {
1080  return(NULL);
1081  }
1082  if (checkObjectTypes && !isOSmallJson(p2)) {
1083  return(NULL);
1084  }
1085 
1086  char *s = toStringO(p2);
1087  smallStringt *r = setNFreeSmallString(self, s);
1088  if (!r) {
1089  free(s);
1090  }
1091  return(self);
1092 }
1093 
1095 
1096  if (!p2) {
1097  return(NULL);
1098  }
1099  if (checkObjectTypes && !isOSmallBool(p2)) {
1100  return(NULL);
1101  }
1102 
1103  char *s = toStringO(p2);
1104  smallStringt *r = setNFreeSmallString(self, s);
1105  if (!r) {
1106  free(s);
1107  }
1108  return(self);
1109 }
1110 
1112 
1113  if (!p2) {
1114  return(NULL);
1115  }
1116  if (checkObjectTypes && !isOSmallDouble(p2)) {
1117  return(NULL);
1118  }
1119 
1120  char *s = toStringO(p2);
1121  smallStringt *r = setNFreeSmallString(self, s);
1122  if (!r) {
1123  free(s);
1124  }
1125  return(self);
1126 }
1127 
1129 
1130  if (!p2) {
1131  return(NULL);
1132  }
1133  if (checkObjectTypes && !isOSmallInt(p2)) {
1134  return(NULL);
1135  }
1136 
1137  char *s = toStringO(p2);
1138  smallStringt *r = setNFreeSmallString(self, s);
1139  if (!r) {
1140  free(s);
1141  }
1142  return(self);
1143 }
1144 
1146 
1147  if (!p2) {
1148  return(NULL);
1149  }
1150  if (checkObjectTypes && !isOSmallJson(p2)) {
1151  return(NULL);
1152  }
1153 
1154 
1155  const char *type = getTopTypeO(p2);
1156 
1157  if (!type || eqS(type, "undefined")) {
1158  return(self);
1159  }
1160 
1161  if (eqS(type, "bool")) {
1162  return(setBoolSmallString(self, getTopBoolO(p2)));
1163  }
1164  else if (eqS(type, "double")) {
1165  return(setDoubleSmallString(self, getTopDoubleO(p2)));
1166  }
1167  else if (eqS(type, "int")) {
1168  return(setInt64SmallString(self, getTopIntO(p2)));
1169  }
1170  else if (eqS(type, "string")) {
1171  return(setSmallString(self, getTopSO(p2)));
1172  }
1173  else if (eqS(type, "dict")) {
1174  smallDictt *d = getTopDictO(p2);
1175  setFromSmallDictSmallString(self, d);
1176  finishO(d);
1177  return(self);
1178  }
1179  else if (eqS(type, "array")) {
1180  smallArrayt *a = getTopArrayO(p2);
1181  setSmallArraySmallString(self, a);
1182  finishO(a);
1183  return(self);
1184  }
1185 
1186  return(self);
1187 }
1188 
1190 
1191  if (!p2) {
1192  return(NULL);
1193  }
1194  if (checkObjectTypes && !isOSmallString(p2)) {
1195  return(NULL);
1196  }
1197 
1198  setSmallString(self, ssGet(p2));
1199  return(self);
1200 }
1201 
1202 internal smallStringt* setNFreeSmallString(smallStringt *self, char *string) {
1203 
1204  if (!string) {
1205  return(NULL);
1206  }
1207  smallStringt *r = setSmallString(self, string);;
1208  if (r) {
1209  free(string);
1210  }
1211  return(r);
1212 }
1213 
1215 
1216  // sanity
1217  if (!string) {
1218  return(NULL);
1219  }
1220  if (checkObjectTypes && !isOSmallString(string)) {
1221  return(NULL);
1222  }
1223 
1224  if (!string->data) {
1225  return(self);
1226  }
1227 
1228  if (!self->data) {
1229  self->data = (sStringt *)strdup((char *)string->data);
1230  self->_len = string->_len;
1231  return(self);
1232  }
1233 
1234  if (!string->_len) {
1235  // empty string
1236  return(self);
1237  }
1238 
1239  char *tmp;
1240  // +1 for 0 at the end +1 for sType at the start
1241  tmp = realloc(self->data, self->_len + string->_len + 2);
1242  if (!tmp) {
1243  return(NULL);
1244  }
1245 
1246  self->data = (sStringt *)tmp;
1247  strcat((char *)self->data, sStringGetTiny(string->data));
1248  self->_len += string->_len;
1249  return(self);
1250 }
1251 
1253 
1254  if (!string) {
1255  return(NULL);
1256  }
1257  if (checkObjectTypes && !isOSmallJson(string)) {
1258  return(NULL);
1259  }
1260 
1261 
1262  const char *type = getTopTypeO(string);
1263 
1264  if (!type || !eqS(type, "string")) {
1265  return(NULL);
1266  }
1267 
1268  return(appendSSmallString(self, getTopSO(string)));
1269 }
1270 
1272 
1273  // sanity
1274  if (!string) {
1275  return(NULL);
1276  }
1277  if (checkObjectTypes && !isOSmallString(string)) {
1278  return(NULL);
1279  }
1280 
1281  if (!string->data) {
1282  terminateO(string);
1283  return(self);
1284  }
1285 
1286  if (!self->data) {
1287  self->data = string->data;
1288  self->_len = string->_len;
1289  finishO(string);
1290  return(self);
1291  }
1292 
1293  if (!string->_len) {
1294  // empty string
1295  terminateO(string);
1296  return(self);
1297  }
1298 
1299  char *tmp;
1300  // +1 for 0 at the end +1 for sType at the start
1301  tmp = realloc(self->data, self->_len + string->_len + 2);
1302  if (!tmp) {
1303  return(NULL);
1304  }
1305 
1306  self->data = (sStringt *)tmp;
1307  strcat((char *)self->data, sStringGetTiny(string->data));
1308  self->_len += string->_len;
1309  terminateO(string);
1310  return(self);
1311 }
1312 
1313 internal smallStringt* appendSSmallString(smallStringt *self, const char *string) {
1314 
1315  // sanity
1316  if (!string) {
1317  return(NULL);
1318  }
1319  if (!*string) {
1320  return(self);
1321  }
1322 
1323  size_t len = strlen(string);
1324 
1325  if (!self->data) {
1326  sStringSetTiny(&self->data, string);
1327  self->_len = len;
1328  return(self);
1329  }
1330 
1331  char *tmp;
1332 
1333  // +1 for 0 at the end +1 for sType at the start
1334  tmp = realloc(self->data, self->_len + len + 2);
1335  if (!tmp) {
1336  return(self);
1337  }
1338 
1339  self->data = (sStringt *)tmp;
1340  strcat((char *)self->data, string);
1341  self->_len += len;
1342  return(self);
1343 }
1344 
1346 
1347  charToS(s, c);
1348  return(appendSSmallString(self, s));
1349 }
1350 
1352 
1353  if (!string) {
1354  return(NULL);
1355  }
1356  if (checkObjectTypes && !isOSmallJson(string)) {
1357  return(NULL);
1358  }
1359 
1360 
1361  const char *type = getTopTypeO(string);
1362 
1363  if (!type || !eqS(type, "string")) {
1364  return(NULL);
1365  }
1366 
1367  char *s = getTopSO(string);
1368 
1369  smallStringt *r = appendSSmallString(self, s);
1370  if (r) {
1371  terminateO(string);
1372  }
1373  return(r);
1374 }
1375 
1376 
1377 internal smallStringt* appendNSmashSSmallString(smallStringt *self, char *string) {
1378 
1379  smallStringt *r = appendSSmallString(self, string);
1380  if (r) {
1381  free(string);
1382  }
1383  return(r);
1384 }
1385 
1387 
1388  // sanity
1389  if (!string) {
1390  return(NULL);
1391  }
1392  if (checkObjectTypes && !isOSmallString(string)) {
1393  return(NULL);
1394  }
1395 
1396  if (!string->data) {
1397  return(self);
1398  }
1399 
1400  if (!self->data) {
1401  self->data = (sStringt *)strdup((char *)string->data);
1402  self->_len = string->_len;
1403  return(self);
1404  }
1405 
1406  if (!string->_len) {
1407  // empty string
1408  return(self);
1409  }
1410 
1411  insertSmallString(self, 0, string);
1412  return(self);
1413 }
1414 
1416 
1417  // sanity
1418  if (!json) {
1419  return(NULL);
1420  }
1421  if (checkObjectTypes && !isOSmallJson(json)) {
1422  return(NULL);
1423  }
1424 
1425 
1426  const char *type = getTopTypeO(json);
1427 
1428  if (!type || !eqS(type, "string")) {
1429  return(NULL);
1430  }
1431 
1432  return(prependSSmallString(self, getTopSO(json)));
1433 }
1434 
1436 
1437  // sanity
1438  if (!string) {
1439  return(NULL);
1440  }
1441  if (checkObjectTypes && !isOSmallString(string)) {
1442  return(NULL);
1443  }
1444 
1445  if (!string->data) {
1446  terminateO(string);
1447  return(self);
1448  }
1449 
1450  if (!self->data) {
1451  self->data = (sStringt *)strdup((char *)string->data);
1452  self->_len = string->_len;
1453  terminateO(string);
1454  return(self);
1455  }
1456 
1457  if (!string->_len) {
1458  // empty string
1459  terminateO(string);
1460  return(self);
1461  }
1462 
1463  insertSmallString(self, 0, string);
1464  terminateO(string);
1465  return(self);
1466 }
1467 
1469 
1470  // sanity
1471  if (!json) {
1472  return(NULL);
1473  }
1474  if (checkObjectTypes && !isOSmallJson(json)) {
1475  return(NULL);
1476  }
1477 
1478 
1479  const char *type = getTopTypeO(json);
1480 
1481  if (!type || !eqS(type, "string")) {
1482  return(NULL);
1483  }
1484 
1485  smallStringt* r = prependSSmallString(self, getTopSO(json));
1486  terminateO(json);
1487  return(r);
1488 }
1489 
1490 internal smallStringt* prependSSmallString(smallStringt *self, const char *string) {
1491 
1492  // sanity
1493  if (!string) {
1494  return(NULL);
1495  }
1496 
1497  size_t len = strlen(string);
1498 
1499  if (!self->data) {
1500  sStringSetTiny(&self->data, string);
1501  self->_len = len;
1502  return(self);
1503  }
1504 
1505  if (!len) {
1506  // empty string
1507  return(self);
1508  }
1509 
1510  insertSSmallString(self, 0, string);
1511  return(self);
1512 }
1513 
1515 
1516  charToS(s, c);
1517  return(prependSSmallString(self, s));
1518 }
1519 
1520 internal smallStringt* prependNSmashSSmallString(smallStringt *self, char *string) {
1521 
1522  smallStringt *r = prependSSmallString(self, string);
1523  free(string);
1524  return(r);
1525 }
1526 
1528  va_list pl;
1529  smallStringt *paramType = NULL;
1530 
1532  if (!l.f) {
1533  return(NULL);
1534  }
1535 
1536  if (self->data) {
1537  // add self to result
1538  l.f->pushSmallString(&l, self);
1539  }
1540 
1541  // add arguments to a list
1542  va_start(pl, self);
1543  paramType = va_arg(pl, smallStringt*);
1544  while (paramType) {
1545  if (checkObjectTypes && !isOSmallString(paramType)) {
1546  disposeO(&l);
1547  va_end(pl);
1548  return(NULL);
1549  }
1550  l.f->pushSmallString(&l, paramType);
1551  paramType = va_arg(pl, smallStringt*);
1552  }
1553  va_end(pl);
1554  // join list with empty delimiter
1555  smallStringt *r = l.f->join(&l, "");
1556  free(self->data);
1557  self->data = r->data;
1558  self->_len = r->_len;
1559  finishO(r);
1560  disposeO(&l);
1561  return(self);
1562 }
1563 
1565  va_list pl;
1566  char *paramType = NULL;
1567 
1569  if (!l.f) {
1570  return(NULL);
1571  }
1572 
1573  if (self->data) {
1574  // add self to result
1575  l.f->pushS(&l, sStringGetTiny(self->data));
1576  }
1577 
1578  // add arguments to a list
1579  va_start(pl, self);
1580  paramType = va_arg(pl, char *);
1581  while (paramType) {
1582  l.f->pushS(&l, (char *)paramType);
1583  paramType = va_arg(pl, char *);
1584  }
1585  va_end(pl);
1586  // join list with empty delimiter
1587  smallStringt *r = l.f->join(&l, "");
1588  free(self->data);
1589  self->data = r->data;
1590  self->_len = r->_len;
1591  finishO(r);
1592  freeO(&l);
1593  return(self);
1594 }
1595 
1597  va_list pl;
1598  smallStringt *paramType = NULL;
1599 
1601  if (!l.f) {
1602  return(NULL);
1603  }
1604 
1605  if (self->data) {
1606  // add self to result
1607  l.f->pushSmallString(&l, self);
1608  }
1609 
1610  // TODO free parameters after all have been added to the l array without error
1611  // add arguments to a list
1612  va_start(pl, self);
1613  paramType = va_arg(pl, smallStringt*);
1614  while (paramType) {
1615  if (checkObjectTypes && !isOSmallString(paramType)) {
1616  delO(&l, 1, 0);
1617  disposeO(&l);
1618  return(NULL);
1619  }
1620  l.f->pushNFreeSmallString(&l, paramType);
1621  paramType = va_arg(pl, smallStringt*);
1622  }
1623  va_end(pl);
1624  // join list with empty delimiter
1625  smallStringt *r = l.f->join(&l, "");
1626  freeO(&l);
1627  self->data = r->data;
1628  self->_len = r->_len;
1629  finishO(r);
1630  return(self);
1631 }
1632 
1634  va_list pl;
1635  char *paramType = NULL;
1636 
1638  if (!l.f) {
1639  return(NULL);
1640  }
1641 
1642  if (self->data) {
1643  // add self to result
1644  l.f->pushSmallString(&l, self);
1645  }
1646 
1647  // add arguments to a list
1648  va_start(pl, self);
1649  paramType = va_arg(pl, char *);
1650  while (paramType) {
1651  l.f->pushNFreeS(&l, (char *)paramType);
1652  paramType = va_arg(pl, char *);
1653  }
1654  va_end(pl);
1655  // join list with empty delimiter
1656  smallStringt *r = l.f->join(&l, "");
1657  self->data = r->data;
1658  self->_len = r->_len;
1659  finishO(r);
1660  freeO(&l);
1661  return(self);
1662 }
1663 
1664 
1665 internal smallStringt* replaceSmallString(smallStringt *self, const char *olds, const char *news, size_t max) {
1666  char *r = NULL;
1667  char *tmp = NULL;
1668  char *workingS = NULL;
1669  // ins is next insert point
1670  char *ins = NULL;
1671  size_t count;
1672  size_t lfront;
1673 
1674  // sanity checks and initialization
1675  // count the number of replacements needed
1676  // allocate result
1677  // replace olds with news
1678  // copy end of smallString
1679 
1680  // sanity checks and initialization
1681  if (!self->data) {
1682  return(NULL);
1683  }
1684  if (!self->_len) {
1685  // s is empty, do nothing
1686  return(self);
1687  }
1688  if (!olds) {
1689  return(NULL);
1690  }
1691  size_t lolds;
1692  lolds = strlen(olds);
1693  if (!lolds) {
1694  // empty olds causes infinite loop
1695  return(NULL);
1696  }
1697  if (!news) {
1698  // empty string for NULL
1699  news = "";
1700  }
1701 
1702  // count the number of replacements needed
1703  ins = sStringGetTiny(self->data);
1704  for (count = 0 ; (tmp = strstr(ins, olds)) ; ++count) {
1705  ins = tmp + lolds;
1706  if (max && (count == max)) {
1707  // the maximum number is replacements is reached, stop
1708  break;
1709  }
1710  }
1711 
1712 
1713  size_t lnews;
1714  lnews = strlen(news);
1715 
1716  // allocate result
1717  // +1 for 0 at the end +1 for sType at the start
1718  size_t rLen = self->_len + (lnews - lolds) * count + 2;;
1719  tmp = r = malloc(rLen);
1720  if (!r) {
1721  return(NULL);
1722  }
1723 
1724  // include sType in workingS
1725  workingS = (char *)self->data;
1726  // replace olds with news
1727  // ins points to the start of olds in s
1728  // tmp is the front of s, tmp points the end of s front in r
1729  // copy news to tmp, tmp points the end of news in r
1730  // s is the remainder of s after end of olds
1731  while (count--) {
1732  ins = strstr(workingS, olds);
1733  lfront = (size_t)(ins - workingS);
1734  tmp = strncpy(tmp, workingS, lfront) + lfront;
1735  tmp = strcpy(tmp, news) + lnews;
1736  workingS += lfront + lolds;
1737  }
1738 
1739  // copy end of smallString
1740  strcpy(tmp, workingS);
1741 
1742  free(self->data);
1743  self->data = (sStringt *)r;
1744  self->_len = strlen(r)-1;
1745  return(self);
1746 }
1747 
1748 internal smallStringt* replaceCharSSmallString(smallStringt *self, char olds, const char *news, size_t max) {
1749 
1750  charToS(s, olds);
1751  return(replaceSmallString(self, s, news, max));
1752 }
1753 
1754 internal smallStringt* replaceSCharSmallString(smallStringt *self, const char *olds, char news, size_t max) {
1755 
1756  charToS(s, news);
1757  return(replaceSmallString(self, olds, s, max));
1758 }
1759 
1760 internal smallStringt* replaceCharCharSmallString(smallStringt *self, char olds, char news, size_t max) {
1761 
1762  charToS(s, olds);
1763  charToS(t, news);
1764  return(replaceSmallString(self, s, t , max));
1765 }
1766 
1768 
1769  if (!self->data) {
1770  return(NULL);
1771  }
1772  if (!self->_len) {
1773  // s is empty, do nothing
1774  return(self);
1775  }
1776 
1777  if (!olds) {
1778  return(NULL);
1779  }
1780 
1781  if (checkObjectTypes && !isOSmallJson(olds)) {
1782  return(NULL);
1783  }
1784 
1785  if (!news) {
1786  return(replaceSmallJsonSSmallString(self, olds, "", max));
1787  }
1788 
1789  if (checkObjectTypes && !isOSmallJson(news)) {
1790  return(NULL);
1791  }
1792 
1793  const char *type = getTopTypeO(olds);
1794 
1795  if (!eqS(type,"string")) {
1796  return(NULL);
1797  }
1798 
1799  type = getTopTypeO(news);
1800 
1801  if (!eqS(type,"string")) {
1802  return(NULL);
1803  }
1804 
1805  return(replaceSmallString(self, getTopSO(olds), getTopSO(news), max));
1806 }
1807 
1809 
1810  if (!self->data) {
1811  return(NULL);
1812  }
1813  if (!self->_len) {
1814  // s is empty, do nothing
1815  return(self);
1816  }
1817 
1818  if (!olds) {
1819  return(NULL);
1820  }
1821 
1822  if (checkObjectTypes && !isOSmallJson(olds)) {
1823  return(NULL);
1824  }
1825 
1826  if (!news) {
1827  return(replaceSmallJsonSSmallString(self, olds, "", max));
1828  }
1829 
1830  if (checkObjectTypes && !isOSmallString(news)) {
1831  return(NULL);
1832  }
1833 
1834  const char *type = getTopTypeO(olds);
1835 
1836  if (!eqS(type,"string")) {
1837  return(NULL);
1838  }
1839 
1840  return(replaceSmallString(self, getTopSO(olds), ssGet(news), max));
1841 }
1842 
1843 internal smallStringt* replaceSmallJsonSSmallString(smallStringt *self, smallJsont *olds, const char *news, size_t max) {
1844 
1845  if (!self->data) {
1846  return(NULL);
1847  }
1848  if (!self->_len) {
1849  // s is empty, do nothing
1850  return(self);
1851  }
1852 
1853  if (!olds) {
1854  return(NULL);
1855  }
1856 
1857  if (checkObjectTypes && !isOSmallJson(olds)) {
1858  return(NULL);
1859  }
1860 
1861  const char *type = getTopTypeO(olds);
1862 
1863  if (!eqS(type,"string")) {
1864  return(NULL);
1865  }
1866 
1867  return(replaceSmallString(self, getTopSO(olds), news, max));
1868 }
1869 
1870 internal smallStringt* replaceSmallJsonCharSmallString(smallStringt *self, smallJsont *olds, char news, size_t max) {
1871 
1872  if (!self->data) {
1873  return(NULL);
1874  }
1875  if (!self->_len) {
1876  // s is empty, do nothing
1877  return(self);
1878  }
1879 
1880  if (!olds) {
1881  return(NULL);
1882  }
1883 
1884  if (checkObjectTypes && !isOSmallJson(olds)) {
1885  return(NULL);
1886  }
1887 
1888  const char *type = getTopTypeO(olds);
1889 
1890  if (!eqS(type,"string")) {
1891  return(NULL);
1892  }
1893 
1894  charToS(t, news);
1895  return(replaceSmallString(self, getTopSO(olds), t, max));
1896 }
1897 
1899 
1900  if (!self->data) {
1901  return(NULL);
1902  }
1903  if (!self->_len) {
1904  // s is empty, do nothing
1905  return(self);
1906  }
1907 
1908  if (!olds) {
1909  return(NULL);
1910  }
1911 
1912  if (checkObjectTypes && !isOSmallString(olds)) {
1913  return(NULL);
1914  }
1915 
1916  if (!news) {
1917  return(replaceSmallStringSSmallString(self, olds, "", max));
1918  }
1919 
1920  if (checkObjectTypes && !isOSmallJson(news)) {
1921  return(NULL);
1922  }
1923 
1924  const char *type = getTopTypeO(news);
1925 
1926  if (!eqS(type,"string")) {
1927  return(NULL);
1928  }
1929 
1930  return(replaceSmallString(self, ssGet(olds), getTopSO(news), max));
1931 }
1932 
1934 
1935  if (!self->data) {
1936  return(NULL);
1937  }
1938  if (!self->_len) {
1939  // s is empty, do nothing
1940  return(self);
1941  }
1942 
1943  if (!olds) {
1944  return(NULL);
1945  }
1946 
1947  if (checkObjectTypes && !isOSmallString(olds)) {
1948  return(NULL);
1949  }
1950 
1951  if (!news) {
1952  return(replaceSmallStringSSmallString(self, olds, "", max));
1953  }
1954 
1955  if (checkObjectTypes && !isOSmallString(news)) {
1956  return(NULL);
1957  }
1958 
1959  return(replaceSmallString(self, ssGet(olds), ssGet(news), max));
1960 }
1961 
1962 internal smallStringt* replaceSmallStringSSmallString(smallStringt *self, smallStringt *olds, const char *news, size_t max) {
1963 
1964  if (!self->data) {
1965  return(NULL);
1966  }
1967  if (!self->_len) {
1968  // s is empty, do nothing
1969  return(self);
1970  }
1971 
1972  if (!olds) {
1973  return(NULL);
1974  }
1975  if (checkObjectTypes && !isOSmallString(olds)) {
1976  return(NULL);
1977  }
1978 
1979  return(replaceSmallString(self, ssGet(olds), news, max));
1980 }
1981 
1982 internal smallStringt* replaceSmallStringCharSmallString(smallStringt *self, smallStringt *olds, char news, size_t max) {
1983 
1984  if (!self->data) {
1985  return(NULL);
1986  }
1987  if (!self->_len) {
1988  // s is empty, do nothing
1989  return(self);
1990  }
1991 
1992  if (!olds) {
1993  return(NULL);
1994  }
1995  if (checkObjectTypes && !isOSmallString(olds)) {
1996  return(NULL);
1997  }
1998 
1999  charToS(s, news);
2000  return(replaceSmallString(self, ssGet(olds), s, max));
2001 }
2002 
2003 internal smallStringt* replaceSSmallJsonSmallString(smallStringt *self, const char *olds, smallJsont *news, size_t max) {
2004 
2005  if (!self->data) {
2006  return(NULL);
2007  }
2008  if (!self->_len) {
2009  // s is empty, do nothing
2010  return(self);
2011  }
2012 
2013  if (!olds) {
2014  return(NULL);
2015  }
2016 
2017  if (!news) {
2018  return(replaceSmallString(self, olds, "", max));
2019  }
2020 
2021  if (checkObjectTypes && !isOSmallJson(news)) {
2022  return(NULL);
2023  }
2024 
2025  const char *type = getTopTypeO(news);
2026 
2027  if (!eqS(type,"string")) {
2028  return(NULL);
2029  }
2030 
2031  return(replaceSmallString(self, olds, getTopSO(news), max));
2032 }
2033 
2034 internal smallStringt* replaceSSmallStringSmallString(smallStringt *self, const char *olds, smallStringt *news, size_t max) {
2035 
2036  if (!self->data) {
2037  return(NULL);
2038  }
2039  if (!self->_len) {
2040  // s is empty, do nothing
2041  return(self);
2042  }
2043 
2044  if (!news) {
2045  return(replaceSmallString(self, olds, "", max));
2046  }
2047 
2048  if (checkObjectTypes && !isOSmallString(news)) {
2049  return(NULL);
2050  }
2051 
2052  return(replaceSmallString(self, olds, ssGet(news), max));
2053 }
2054 
2055 internal smallStringt* replaceCharSmallJsonSmallString(smallStringt *self, char olds, smallJsont *news, size_t max) {
2056 
2057  if (!self->data) {
2058  return(NULL);
2059  }
2060  if (!self->_len) {
2061  // s is empty, do nothing
2062  return(self);
2063  }
2064 
2065  if (!news) {
2066  charToS(s, olds);
2067  return(replaceSmallString(self, s, "", max));
2068  }
2069 
2070  if (checkObjectTypes && !isOSmallJson(news)) {
2071  return(NULL);
2072  }
2073 
2074  const char *type = getTopTypeO(news);
2075 
2076  if (!eqS(type,"string")) {
2077  return(NULL);
2078  }
2079 
2080  charToS(s, olds);
2081  return(replaceSmallString(self, s, getTopSO(news), max));
2082 }
2083 
2084 internal smallStringt* replaceCharSmallStringSmallString(smallStringt *self, char olds, smallStringt *news, size_t max) {
2085 
2086  if (!self->data) {
2087  return(NULL);
2088  }
2089  if (!self->_len) {
2090  // s is empty, do nothing
2091  return(self);
2092  }
2093 
2094  if (!news) {
2095  charToS(s, olds);
2096  return(replaceSmallString(self, s, "", max));
2097  }
2098 
2099  if (checkObjectTypes && !isOSmallString(news)) {
2100  return(NULL);
2101  }
2102 
2103  charToS(s, olds);
2104  return(replaceSmallString(self, s, ssGet(news), max));
2105 }
2106 
2107 internal smallStringt* replaceManySmallString(smallStringt *self, const char *paramType, ...) {
2108  va_list pl;
2109  const char *olds = NULL;
2110  const char *news = NULL;
2111 
2112  // sanity checks
2113  if (!self->data) {
2114  return(NULL);
2115  }
2116  if (!self->_len) {
2117  // s is empty, do nothing
2118  return(self);
2119  }
2120 
2121  olds = paramType;;
2122 
2123  // add arguments to a list
2124  va_start(pl, paramType);
2125  paramType = va_arg(pl, const char *);
2126  if (!paramType) {
2127  // missing news
2128  va_end(pl);
2129  return(NULL);
2130  }
2131  while (paramType) {
2132  if (!olds) {
2133  olds = paramType;
2134  }
2135  else if (!news) {
2136  news = paramType;
2137  smallStringt *r = replaceSmallString(self, olds, news, 0);
2138  if (!r) {
2139  // replace error
2140  va_end(pl);
2141  return(NULL);
2142  }
2143  olds = NULL;
2144  news = NULL;
2145  }
2146 
2147  paramType = va_arg(pl, const char *);
2148  }
2149  va_end(pl);
2150  return(self);
2151 }
2152 
2153 internal smallStringt* icReplaceSmallString(smallStringt *self, const char *olds, const char *news, size_t max) {
2154  char *r = NULL;
2155  char *tmp = NULL;
2156  char *workingS = NULL;
2157  // ins is next insert point
2158  char *ins = NULL;
2159  size_t count;
2160  size_t lfront;
2161 
2162  // sanity checks and initialization
2163  // count the number of replacements needed
2164  // allocate result
2165  // replace olds with news
2166  // copy end of smallString
2167 
2168  // sanity checks and initialization
2169  if (!self->data) {
2170  return(NULL);
2171  }
2172  if (!self->_len) {
2173  // s is empty, do nothing
2174  return(self);
2175  }
2176  if (!olds) {
2177  return(NULL);
2178  }
2179  size_t lolds;
2180  lolds = strlen(olds);
2181  if (!lolds) {
2182  // empty olds causes infinite loop
2183  return(NULL);
2184  }
2185  if (!news) {
2186  // empty string for NULL
2187  news = "";
2188  }
2189 
2190  // count the number of replacements needed
2191  ins = sStringGetTiny(self->data);
2192  for (count = 0 ; (tmp = strcasestr(ins, olds)) ; ++count) {
2193  ins = tmp + lolds;
2194  if (max && (count == max)) {
2195  // the maximum number is replacements is reached, stop
2196  break;
2197  }
2198  }
2199 
2200 
2201  size_t lnews;
2202  lnews = strlen(news);
2203 
2204  // allocate result
2205  // +1 for 0 at the end +1 for sType at the start
2206  size_t rLen = self->_len + (lnews - lolds) * count + 2;;
2207  tmp = r = malloc(rLen);
2208  if (!r) {
2209  return(NULL);
2210  }
2211 
2212  // include sType in workingS
2213  workingS = (char *)self->data;
2214  // replace olds with news
2215  // ins points to the start of olds in s
2216  // tmp is the front of s, tmp points the end of s front in r
2217  // copy news to tmp, tmp points the end of news in r
2218  // s is the remainder of s after end of olds
2219  while (count--) {
2220  ins = strcasestr(workingS, olds);
2221  lfront = (size_t)(ins - workingS);
2222  tmp = strncpy(tmp, workingS, lfront) + lfront;
2223  tmp = strcpy(tmp, news) + lnews;
2224  workingS += lfront + lolds;
2225  }
2226 
2227  // copy end of smallString
2228  strcpy(tmp, workingS);
2229 
2230  free(self->data);
2231  self->data = (sStringt *)r;
2232  self->_len = strlen(r)-1;
2233  return(self);
2234 }
2235 
2236 internal smallStringt* icReplaceCharSSmallString(smallStringt *self, char olds, const char *news, size_t max) {
2237 
2238  charToS(s, olds);
2239  return(icReplaceSmallString(self, s, news, max));
2240 }
2241 
2242 internal smallStringt* icReplaceSCharSmallString(smallStringt *self, const char *olds, char news, size_t max) {
2243 
2244  charToS(s, news);
2245  return(icReplaceSmallString(self, olds, s, max));
2246 }
2247 
2248 internal smallStringt* icReplaceCharCharSmallString(smallStringt *self, char olds, char news, size_t max) {
2249 
2250  charToS(s, olds);
2251  charToS(t, news);
2252  return(icReplaceSmallString(self, s, t , max));
2253 }
2254 
2256 
2257  if (!self->data) {
2258  return(NULL);
2259  }
2260  if (!self->_len) {
2261  // s is empty, do nothing
2262  return(self);
2263  }
2264 
2265  if (!olds) {
2266  return(NULL);
2267  }
2268 
2269  if (checkObjectTypes && !isOSmallJson(olds)) {
2270  return(NULL);
2271  }
2272 
2273  if (!news) {
2274  return(icReplaceSmallJsonSSmallString(self, olds, "", max));
2275  }
2276 
2277  if (checkObjectTypes && !isOSmallJson(news)) {
2278  return(NULL);
2279  }
2280 
2281  const char *type = getTopTypeO(olds);
2282 
2283  if (!eqS(type,"string")) {
2284  return(NULL);
2285  }
2286 
2287  type = getTopTypeO(news);
2288 
2289  if (!eqS(type,"string")) {
2290  return(NULL);
2291  }
2292 
2293  return(icReplaceSmallString(self, getTopSO(olds), getTopSO(news), max));
2294 }
2295 
2297 
2298  if (!self->data) {
2299  return(NULL);
2300  }
2301  if (!self->_len) {
2302  // s is empty, do nothing
2303  return(self);
2304  }
2305 
2306  if (!olds) {
2307  return(NULL);
2308  }
2309 
2310  if (checkObjectTypes && !isOSmallJson(olds)) {
2311  return(NULL);
2312  }
2313 
2314  if (!news) {
2315  return(icReplaceSmallJsonSSmallString(self, olds, "", max));
2316  }
2317 
2318  if (checkObjectTypes && !isOSmallString(news)) {
2319  return(NULL);
2320  }
2321 
2322  const char *type = getTopTypeO(olds);
2323 
2324  if (!eqS(type,"string")) {
2325  return(NULL);
2326  }
2327 
2328  return(icReplaceSmallString(self, getTopSO(olds), ssGet(news), max));
2329 }
2330 
2331 internal smallStringt* icReplaceSmallJsonSSmallString(smallStringt *self, smallJsont *olds, const char *news, size_t max) {
2332 
2333  if (!self->data) {
2334  return(NULL);
2335  }
2336  if (!self->_len) {
2337  // s is empty, do nothing
2338  return(self);
2339  }
2340 
2341  if (!olds) {
2342  return(NULL);
2343  }
2344 
2345  if (checkObjectTypes && !isOSmallJson(olds)) {
2346  return(NULL);
2347  }
2348 
2349  const char *type = getTopTypeO(olds);
2350 
2351  if (!eqS(type,"string")) {
2352  return(NULL);
2353  }
2354 
2355  return(icReplaceSmallString(self, getTopSO(olds), news, max));
2356 }
2357 
2358 internal smallStringt* icReplaceSmallJsonCharSmallString(smallStringt *self, smallJsont *olds, char news, size_t max) {
2359 
2360  if (!self->data) {
2361  return(NULL);
2362  }
2363  if (!self->_len) {
2364  // s is empty, do nothing
2365  return(self);
2366  }
2367 
2368  if (!olds) {
2369  return(NULL);
2370  }
2371 
2372  if (checkObjectTypes && !isOSmallJson(olds)) {
2373  return(NULL);
2374  }
2375 
2376  const char *type = getTopTypeO(olds);
2377 
2378  if (!eqS(type,"string")) {
2379  return(NULL);
2380  }
2381 
2382  charToS(t, news);
2383  return(icReplaceSmallString(self, getTopSO(olds), t, max));
2384 }
2385 
2387 
2388  if (!self->data) {
2389  return(NULL);
2390  }
2391  if (!self->_len) {
2392  // s is empty, do nothing
2393  return(self);
2394  }
2395 
2396  if (!olds) {
2397  return(NULL);
2398  }
2399 
2400  if (checkObjectTypes && !isOSmallString(olds)) {
2401  return(NULL);
2402  }
2403 
2404  if (!news) {
2405  return(icReplaceSmallStringSSmallString(self, olds, "", max));
2406  }
2407 
2408  if (checkObjectTypes && !isOSmallJson(news)) {
2409  return(NULL);
2410  }
2411 
2412  const char *type = getTopTypeO(news);
2413 
2414  if (!eqS(type,"string")) {
2415  return(NULL);
2416  }
2417 
2418  return(icReplaceSmallString(self, ssGet(olds), getTopSO(news), max));
2419 }
2420 
2422 
2423  if (!self->data) {
2424  return(NULL);
2425  }
2426  if (!self->_len) {
2427  // s is empty, do nothing
2428  return(self);
2429  }
2430 
2431  if (!olds) {
2432  return(NULL);
2433  }
2434 
2435  if (checkObjectTypes && !isOSmallString(olds)) {
2436  return(NULL);
2437  }
2438 
2439  if (!news) {
2440  return(icReplaceSmallStringSSmallString(self, olds, "", max));
2441  }
2442 
2443  if (checkObjectTypes && !isOSmallString(news)) {
2444  return(NULL);
2445  }
2446 
2447  return(icReplaceSmallString(self, ssGet(olds), ssGet(news), max));
2448 }
2449 
2450 internal smallStringt* icReplaceSmallStringSSmallString(smallStringt *self, smallStringt *olds, const char *news, size_t max) {
2451 
2452  if (!self->data) {
2453  return(NULL);
2454  }
2455  if (!self->_len) {
2456  // s is empty, do nothing
2457  return(self);
2458  }
2459 
2460  if (!olds) {
2461  return(NULL);
2462  }
2463  if (checkObjectTypes && !isOSmallString(olds)) {
2464  return(NULL);
2465  }
2466 
2467  return(icReplaceSmallString(self, ssGet(olds), news, max));
2468 }
2469 
2470 internal smallStringt* icReplaceSmallStringCharSmallString(smallStringt *self, smallStringt *olds, char news, size_t max) {
2471 
2472  if (!self->data) {
2473  return(NULL);
2474  }
2475  if (!self->_len) {
2476  // s is empty, do nothing
2477  return(self);
2478  }
2479 
2480  if (!olds) {
2481  return(NULL);
2482  }
2483  if (checkObjectTypes && !isOSmallString(olds)) {
2484  return(NULL);
2485  }
2486 
2487  charToS(s, news);
2488  return(icReplaceSmallString(self, ssGet(olds), s, max));
2489 }
2490 
2491 internal smallStringt* icReplaceSSmallJsonSmallString(smallStringt *self, const char *olds, smallJsont *news, size_t max) {
2492 
2493  if (!self->data) {
2494  return(NULL);
2495  }
2496  if (!self->_len) {
2497  // s is empty, do nothing
2498  return(self);
2499  }
2500 
2501  if (!olds) {
2502  return(NULL);
2503  }
2504 
2505  if (!news) {
2506  return(icReplaceSmallString(self, olds, "", max));
2507  }
2508 
2509  if (checkObjectTypes && !isOSmallJson(news)) {
2510  return(NULL);
2511  }
2512 
2513  const char *type = getTopTypeO(news);
2514 
2515  if (!eqS(type,"string")) {
2516  return(NULL);
2517  }
2518 
2519  return(icReplaceSmallString(self, olds, getTopSO(news), max));
2520 }
2521 
2522 internal smallStringt* icReplaceSSmallStringSmallString(smallStringt *self, const char *olds, smallStringt *news, size_t max) {
2523 
2524  if (!self->data) {
2525  return(NULL);
2526  }
2527  if (!self->_len) {
2528  // s is empty, do nothing
2529  return(self);
2530  }
2531 
2532  if (!news) {
2533  return(icReplaceSmallString(self, olds, "", max));
2534  }
2535 
2536  if (checkObjectTypes && !isOSmallString(news)) {
2537  return(NULL);
2538  }
2539 
2540  return(icReplaceSmallString(self, olds, ssGet(news), max));
2541 }
2542 
2543 internal smallStringt* icReplaceCharSmallJsonSmallString(smallStringt *self, char olds, smallJsont *news, size_t max) {
2544 
2545  if (!self->data) {
2546  return(NULL);
2547  }
2548  if (!self->_len) {
2549  // s is empty, do nothing
2550  return(self);
2551  }
2552 
2553  if (!news) {
2554  charToS(s, olds);
2555  return(icReplaceSmallString(self, s, "", max));
2556  }
2557 
2558  if (checkObjectTypes && !isOSmallJson(news)) {
2559  return(NULL);
2560  }
2561 
2562  const char *type = getTopTypeO(news);
2563 
2564  if (!eqS(type,"string")) {
2565  return(NULL);
2566  }
2567 
2568  charToS(s, olds);
2569  return(icReplaceSmallString(self, s, getTopSO(news), max));
2570 }
2571 
2572 internal smallStringt* icReplaceCharSmallStringSmallString(smallStringt *self, char olds, smallStringt *news, size_t max) {
2573 
2574  if (!self->data) {
2575  return(NULL);
2576  }
2577  if (!self->_len) {
2578  // s is empty, do nothing
2579  return(self);
2580  }
2581 
2582  if (!news) {
2583  charToS(s, olds);
2584  return(icReplaceSmallString(self, s, "", max));
2585  }
2586 
2587  if (checkObjectTypes && !isOSmallString(news)) {
2588  return(NULL);
2589  }
2590 
2591  charToS(s, olds);
2592  return(icReplaceSmallString(self, s, ssGet(news), max));
2593 }
2594 
2595 internal smallStringt* icReplaceManySmallString(smallStringt *self, const char *paramType, ...) {
2596  va_list pl;
2597  const char *olds = NULL;
2598  const char *news = NULL;
2599 
2600  // sanity checks
2601  if (!self->data) {
2602  return(NULL);
2603  }
2604  if (!self->_len) {
2605  // s is empty, do nothing
2606  return(self);
2607  }
2608 
2609  olds = paramType;;
2610 
2611  // add arguments to a list
2612  va_start(pl, paramType);
2613  paramType = va_arg(pl, const char *);
2614  if (!paramType) {
2615  // missing news
2616  va_end(pl);
2617  return(NULL);
2618  }
2619  while (paramType) {
2620  if (!olds) {
2621  olds = paramType;
2622  }
2623  else if (!news) {
2624  news = paramType;
2625  smallStringt *r = icReplaceSmallString(self, olds, news, 0);;
2626  if (!r) {
2627  // replace error
2628  va_end(pl);
2629  return(NULL);
2630  }
2631  olds = NULL;
2632  news = NULL;
2633  }
2634 
2635  paramType = va_arg(pl, const char *);
2636  }
2637  va_end(pl);
2638  return(self);
2639 }
2640 
2641 internal bool equalSmallString(smallStringt *self, smallStringt *string) {
2642 
2643  if (!self->data) {
2644  return(false);
2645  }
2646 
2647  if (!string) {
2648  return(false);
2649  }
2650 
2651  if (checkObjectTypes && !isOSmallString(string)) {
2652  return(false);
2653  }
2654 
2655  if (!string->data) {
2656  return(false);
2657  }
2658 
2659  if (self->_len != string->_len) {
2660  return(false);
2661  }
2662 
2663  return(strcmp(sStringGetTiny(self->data),sStringGetTiny(string->data)) == 0);;
2664 }
2665 
2666 internal bool equalSSmallString(smallStringt *self, const char *string) {
2667 
2668  if (!self->data || !string) {
2669  return(false);
2670  }
2671 
2672  if (self->_len != strlen(string)) {
2673  return(false);
2674  }
2675 
2676  return(strcmp(sStringGetTiny(self->data),string) == 0);;
2677 }
2678 
2679 internal bool equalCharSmallString(smallStringt *self, char c) {
2680 
2681  charToS(s, c);
2682  return(equalSSmallString(self, s));
2683 }
2684 
2685 internal bool equalSmallStringBase(smallStringt* self, baset* p2) {
2686 
2687  if (!self->data || !p2) {
2688  return(false);
2689  }
2690 
2691  char *s = sStringGetTiny(self->data);
2692  char *p2s = toStringO(p2);
2693 
2694  bool r = strEq(s, p2s);
2695  free(p2s);
2696  return(r);
2697 }
2698 
2699 internal bool equalSmallStringBool(smallStringt* self, bool p2) {
2700 
2701  if (!self->data) {
2702  return(false);
2703  }
2704 
2705  char *s = sStringGetTiny(self->data);
2706  if (strEq(s, "true") || strEq(s, "TRUE")) {
2707  return(p2);
2708  }
2709  else if (strEq(s, "false") || strEq(s, "FALSE")) {
2710  return(!p2);
2711  }
2712  return(false);
2713 }
2714 
2715 internal bool equalSmallStringDouble(smallStringt* self, double p2) {
2716 
2717  if (!self->data) {
2718  return(false);
2719  }
2720 
2721  char *s = sStringGetTiny(self->data);
2722 
2723  if (isInt(s) || !isNumber(s)) {
2724  return(false);
2725  }
2726 
2727  double selfValue = parseDoubleSmallString(self);
2728 
2729  return(selfValue == p2);;
2730 }
2731 
2732 internal bool equalSmallStringInt64(smallStringt* self, int64_t p2) {
2733 
2734  if (!self->data) {
2735  return(false);
2736  }
2737 
2738  char *s = sStringGetTiny(self->data);
2739 
2740  if (!isInt(s)) {
2741  return(false);
2742  }
2743 
2744  int64_t selfValue = parseIntSmallString(self);
2745 
2746  return(selfValue == p2);;
2747 }
2748 
2749 internal bool equalSmallStringInt32(smallStringt* self, int32_t p2) {
2750 
2751  if (!self->data) {
2752  return(false);
2753  }
2754 
2755  char *s = sStringGetTiny(self->data);
2756 
2757  if (!isInt(s)) {
2758  return(false);
2759  }
2760 
2761  int32_t selfValue = (int32_t)parseIntSmallString(self);
2762 
2763  return(selfValue == p2);;
2764 }
2765 
2766 internal bool equalSmallStringUint32(smallStringt* self, uint32_t p2) {
2767 
2768  if (!self->data) {
2769  return(false);
2770  }
2771 
2772  char *s = sStringGetTiny(self->data);
2773 
2774  if (!isInt(s)) {
2775  return(false);
2776  }
2777 
2778  uint32_t selfValue = (uint32_t)parseIntSmallString(self);
2779 
2780  return(selfValue == p2);;
2781 }
2782 
2783 internal bool equalSmallStringUint64(smallStringt* self, uint64_t p2) {
2784 
2785  if (!self->data) {
2786  return(false);
2787  }
2788 
2789  char *s = sStringGetTiny(self->data);
2790 
2791  if (!isInt(s)) {
2792  return(false);
2793  }
2794 
2795  uint64_t selfValue = (uint64_t)parseIntSmallString(self);
2796 
2797  return(selfValue == p2);;
2798 }
2799 
2801 
2802  if (!self->data) {
2803  return(false);
2804  }
2805  if (!p2) {
2806  return(false);
2807  }
2808  if (checkObjectTypes && !isOSmallBool(p2)) {
2809  return(false);
2810  }
2811  if (!p2->value) {
2812  return(false);
2813  }
2814 
2815 
2816  char *s = sStringGetTiny(self->data);
2817  if (strEq(s, "true") || strEq(s, "TRUE")) {
2818  return(p2->value->value);
2819  }
2820  else if (strEq(s, "false") || strEq(s, "FALSE")) {
2821  return(!p2->value->value);
2822  }
2823  return(false);
2824 }
2825 
2827 
2828  if (!self->data) {
2829  return(false);
2830  }
2831  if (!p2) {
2832  return(false);
2833  }
2834  if (checkObjectTypes && !isOSmallBytes(p2)) {
2835  return(false);
2836  }
2837  if (!p2->B) {
2838  return(false);
2839  }
2840 
2841  if ((self->_len+1) != p2->B->count) {
2842  return(false);
2843  }
2844 
2845  return(equalSmallStringO(p2, self));
2846 }
2847 
2848 
2850 
2851  if (!self->data) {
2852  return(false);
2853  }
2854  if (!p2) {
2855  return(false);
2856  }
2857  if (checkObjectTypes && !isOSmallDouble(p2)) {
2858  return(false);
2859  }
2860  if (!p2->value) {
2861  return(false);
2862  }
2863 
2864  char *s = sStringGetTiny(self->data);
2865 
2866  if (isInt(s) || !isNumber(s)) {
2867  return(false);
2868  }
2869 
2870  double selfValue = parseDoubleSmallString(self);
2871 
2872  return(selfValue == p2->value->value);;
2873 }
2874 
2876 
2877  if (!self->data) {
2878  return(false);
2879  }
2880  if (!p2) {
2881  return(false);
2882  }
2883  if (checkObjectTypes && !isOSmallInt(p2)) {
2884  return(false);
2885  }
2886  if (!p2->value) {
2887  return(false);
2888  }
2889 
2890  char *s = sStringGetTiny(self->data);
2891 
2892  if (!isInt(s)) {
2893  return(false);
2894  }
2895 
2896  int64_t selfValue = parseIntSmallString(self);
2897 
2898  return(selfValue == p2->value->value);;
2899 }
2900 
2902 
2903  // sanity checks
2904  if (!p2) {
2905  return(false);
2906  }
2907 
2908  if (checkObjectTypes && !isOSmallJson(p2)) {
2909  return(false);
2910  }
2911 
2912  return(p2->f->equalSmallString(p2, self));
2913 }
2914 
2915 internal bool icEqualSmallString(smallStringt *self, smallStringt *string) {
2916 
2917  if (!self->data || !string) {
2918  return(false);
2919  }
2920 
2921  if (checkObjectTypes && !isOSmallString(string)) {
2922  return(false);
2923  }
2924 
2925  if (!string->data) {
2926  return(false);
2927  }
2928 
2929  if (self->_len != string->_len) {
2930  return(false);
2931  }
2932 
2933  return(strcasecmp(sStringGetTiny(self->data),sStringGetTiny(string->data)) == 0);;
2934 }
2935 
2936 internal bool icEqualSSmallString(smallStringt *self, const char *string) {
2937 
2938  if (!self->data || !string) {
2939  return(false);
2940  }
2941 
2942  if (self->_len != strlen(string)) {
2943  return(false);
2944  }
2945 
2946  return(strcasecmp(sStringGetTiny(self->data),string) == 0);;
2947 }
2948 
2949 internal bool icEqualCharSmallString(smallStringt *self, char c) {
2950 
2951  charToS(s, c);
2952  return(icEqualSSmallString(self, s));
2953 }
2954 
2955 internal bool icEqualSmallStringBase(smallStringt* self, baset* p2) {
2956 
2957  if (!self->data || !p2) {
2958  return(false);
2959  }
2960 
2961  char *s = sStringGetTiny(self->data);
2962  char *p2s = toStringO(p2);
2963 
2964  bool r = icEqS(s, p2s);
2965  free(p2s);
2966  return(r);
2967 }
2968 
2970 
2971  // sanity checks
2972  if (!p2) {
2973  return(false);
2974  }
2975 
2976  if (checkObjectTypes && !isOSmallJson(p2)) {
2977  return(false);
2978  }
2979 
2980  return(p2->f->icEqualSmallString(p2, self));
2981 }
2982 
2983 internal bool equalISSmallString(smallStringt *self, const char *string, int64_t index) {
2984 
2985  if (!self->data || !string) {
2986  return(false);
2987  }
2988 
2989  if (index >= (int64_t)self->_len && self->_len) {
2990  return(false);
2991  }
2992  if (index < -(int64_t)self->_len) {
2993  return(false);
2994  }
2995  if (index < 0) {
2996  index = (int64_t)self->_len + index;
2997  }
2998 
2999  if (index > (int64_t)(self->_len - strlen(string))) {
3000  return(false);
3001  }
3002 
3003  if (!string[0] && !self->_len) {
3004  return(true);
3005  }
3006 
3007  if (!string[0]) {
3008  return(false);
3009  }
3010 
3011  return(strncmp(sStringGetTiny(self->data) + index, string, strlen(string)) == 0);;
3012 }
3013 
3014 internal bool equalICharSmallString(smallStringt *self, char c, int64_t index) {
3015 
3016  charToS(s, c);
3017  return(equalISSmallString(self, s, index));
3018 }
3019 
3020 internal bool equalISmallJsonSmallString(smallStringt *self, smallJsont *string, int64_t index) {
3021 
3022  // sanity checks
3023  if (!string) {
3024  return(false);
3025  }
3026 
3027  if (checkObjectTypes && !isOSmallJson(string)) {
3028  return(false);
3029  }
3030 
3031  const char *type = getTopTypeO(string);
3032 
3033  if (!eqS(type,"string")) {
3034  return(false);
3035  }
3036 
3037  return(equalISSmallString(self, getTopSO(string), index));
3038 }
3039 
3040 internal bool equalISmallStringSmallString(smallStringt *self, smallStringt *string, int64_t index) {
3041 
3042  if (!string) {
3043  return(false);
3044  }
3045  if (checkObjectTypes && !isOSmallString(string)) {
3046  return(false);
3047  }
3048 
3049  return(equalISSmallString(self, ssGet(string), index));
3050 }
3051 
3052 internal bool startsWithSSmallString(smallStringt *self, const char *string) {
3053 
3054  if (!self->data || !string) {
3055  return(false);
3056  }
3057 
3058  return(strncmp(sStringGetTiny(self->data), string, strlen(string)) == 0);;
3059 }
3060 
3061 internal bool startsWithCharSmallString(smallStringt *self, char c) {
3062 
3063  if (!self->data) {
3064  return(false);
3065  }
3066 
3067  return(self->data->data == c);;
3068 }
3069 
3071 
3072  // sanity checks
3073  if (!string) {
3074  return(false);
3075  }
3076 
3077  if (checkObjectTypes && !isOSmallJson(string)) {
3078  return(false);
3079  }
3080 
3081  const char *type = getTopTypeO(string);
3082 
3083  if (!eqS(type,"string")) {
3084  return(false);
3085  }
3086 
3087  return(startsWithSSmallString(self, getTopSO(string)));
3088 }
3089 
3091 
3092  if (!string) {
3093  return(false);
3094  }
3095  if (checkObjectTypes && !isOSmallString(string)) {
3096  return(false);
3097  }
3098 
3099  return(startsWithSSmallString(self, ssGet(string)));
3100 }
3101 
3102 internal bool endsWithSSmallString(smallStringt *self, const char *string) {
3103 
3104  if (!self->data || !string) {
3105  return(false);
3106  }
3107 
3108  if (self->_len < strlen(string)) {
3109  return(false);
3110  }
3111  return(strcmp(sStringGetTiny(self->data) + self->_len - strlen(string), string) == 0);;
3112 }
3113 
3114 internal bool endsWithCharSmallString(smallStringt *self, char c) {
3115 
3116  if (!self->data) {
3117  return(false);
3118  }
3119 
3120  if (!self->_len && !c) {
3121  // self is empty and c is 0
3122  return(true);
3123  }
3124  if (!self->_len) {
3125  return(false);
3126  }
3127  return(*(sStringGetTiny(self->data) + self->_len-1) == c);;
3128 }
3129 
3131 
3132  // sanity checks
3133  if (!string) {
3134  return(false);
3135  }
3136 
3137  if (checkObjectTypes && !isOSmallJson(string)) {
3138  return(false);
3139  }
3140 
3141  const char *type = getTopTypeO(string);
3142 
3143  if (!eqS(type,"string")) {
3144  return(false);
3145  }
3146 
3147  return(endsWithSSmallString(self, getTopSO(string)));
3148 }
3149 
3151 
3152  if (!string) {
3153  return(false);
3154  }
3155  if (checkObjectTypes && !isOSmallString(string)) {
3156  return(false);
3157  }
3158 
3159  return(endsWithSSmallString(self, ssGet(string)));
3160 }
3161 
3162 internal ssize_t countSSmallString(smallStringt *self, const char *string) {
3163 
3164  if (!self->data || !string || !string[0]) {
3165  return(-1);
3166  }
3167 
3168  ssize_t r = 0;
3169  size_t len = strlen(string);
3170  char *s = sStringGetTiny(self->data);
3171 
3172  while (s != NULL) {
3173  s = strstr(s, string);
3174  if (s != NULL) {
3175  r++;
3176  s += len;
3177  }
3178  else {
3179  break;
3180  }
3181  }
3182 
3183  return(r);
3184 }
3185 
3186 internal ssize_t countCharSmallString(smallStringt *self, char c) {
3187 
3188  charToS(s, c);
3189  return(countSSmallString(self, s));
3190 }
3191 
3192 internal ssize_t countSmallJsonSmallString(smallStringt *self, smallJsont *string) {
3193 
3194  // sanity checks
3195  if (!string) {
3196  return(-1);
3197  }
3198 
3199  if (checkObjectTypes && !isOSmallJson(string)) {
3200  return(-1);
3201  }
3202 
3203  const char *type = getTopTypeO(string);
3204 
3205  if (!eqS(type,"string")) {
3206  return(-1);
3207  }
3208 
3209  return(countSSmallString(self, getTopSO(string)));
3210 }
3211 
3212 internal ssize_t countSmallStringSmallString(smallStringt *self, smallStringt *string) {
3213 
3214  if (!string) {
3215  return(-1);
3216  }
3217  if (checkObjectTypes && !isOSmallString(string)) {
3218  return(-1);
3219  }
3220 
3221  return(countSSmallString(self, ssGet(string)));
3222 }
3223 
3224 internal bool icStartsWithSSmallString(smallStringt *self, const char *string) {
3225 
3226  if (!self->data || !string) {
3227  return(false);
3228  }
3229 
3230  return(strncasecmp(sStringGetTiny(self->data), string, strlen(string)) == 0);;
3231 }
3232 
3233 internal bool icStartsWithCharSmallString(smallStringt *self, char c) {
3234 
3235  if (!self->data) {
3236  return(false);
3237  }
3238  return(toupper(self->data->data) == toupper(c));;
3239 }
3240 
3242 
3243  // sanity checks
3244  if (!string) {
3245  return(false);
3246  }
3247 
3248  if (checkObjectTypes && !isOSmallJson(string)) {
3249  return(false);
3250  }
3251 
3252  const char *type = getTopTypeO(string);
3253 
3254  if (!eqS(type,"string")) {
3255  return(false);
3256  }
3257 
3258  return(icStartsWithSSmallString(self, getTopSO(string)));
3259 }
3260 
3262 
3263  if (!string) {
3264  return(false);
3265  }
3266  if (checkObjectTypes && !isOSmallString(string)) {
3267  return(false);
3268  }
3269 
3270  return(icStartsWithSSmallString(self, ssGet(string)));
3271 }
3272 
3273 internal bool icEndsWithSSmallString(smallStringt *self, const char *string) {
3274 
3275  if (!self->data || !string) {
3276  return(false);
3277  }
3278 
3279  if (self->_len < strlen(string)) {
3280  return(false);
3281  }
3282  return(strcasecmp(sStringGetTiny(self->data) + self->_len - strlen(string), string) == 0);;
3283 }
3284 
3285 internal bool icEndsWithCharSmallString(smallStringt *self, char c) {
3286 
3287  if (!self->data) {
3288  return(false);
3289  }
3290 
3291  if (!self->_len && !c) {
3292  // self is empty and c is 0
3293  return(true);
3294  }
3295  if (!self->_len) {
3296  return(false);
3297  }
3298  return(toupper(*(sStringGetTiny(self->data) + self->_len-1)) == toupper(c));;
3299 }
3300 
3302 
3303  // sanity checks
3304  if (!string) {
3305  return(false);
3306  }
3307 
3308  if (checkObjectTypes && !isOSmallJson(string)) {
3309  return(false);
3310  }
3311 
3312  const char *type = getTopTypeO(string);
3313 
3314  if (!eqS(type,"string")) {
3315  return(false);
3316  }
3317 
3318  return(icEndsWithSSmallString(self, getTopSO(string)));
3319 }
3320 
3322 
3323  if (!string) {
3324  return(false);
3325  }
3326  if (checkObjectTypes && !isOSmallString(string)) {
3327  return(false);
3328  }
3329 
3330  return(icEndsWithSSmallString(self, ssGet(string)));
3331 }
3332 
3333 internal ssize_t icCountSSmallString(smallStringt *self, const char *string) {
3334 
3335  if (!self->data || !string || !string[0]) {
3336  return(-1);
3337  }
3338 
3339  ssize_t r = 0;
3340  size_t len = strlen(string);
3341  char *s = sStringGetTiny(self->data);
3342 
3343  while (s != NULL) {
3344  s = strcasestr(s, string);
3345  if (s != NULL) {
3346  r++;
3347  s += len;
3348  }
3349  else {
3350  break;
3351  }
3352  }
3353 
3354  return(r);
3355 }
3356 
3357 internal ssize_t icCountCharSmallString(smallStringt *self, char c) {
3358 
3359  charToS(s, c);
3360  return(icCountSSmallString(self, s));
3361 }
3362 
3363 internal ssize_t icCountSmallJsonSmallString(smallStringt *self, smallJsont *string) {
3364 
3365  // sanity checks
3366  if (!string) {
3367  return(-1);
3368  }
3369 
3370  if (checkObjectTypes && !isOSmallJson(string)) {
3371  return(-1);
3372  }
3373 
3374  const char *type = getTopTypeO(string);
3375 
3376  if (!eqS(type,"string")) {
3377  return(-1);
3378  }
3379 
3380  return(icCountSSmallString(self, getTopSO(string)));
3381 }
3382 
3383 internal ssize_t icCountSmallStringSmallString(smallStringt *self, smallStringt *string) {
3384 
3385  if (!string) {
3386  return(-1);
3387  }
3388  if (checkObjectTypes && !isOSmallString(string)) {
3389  return(-1);
3390  }
3391 
3392  return(icCountSSmallString(self, ssGet(string)));
3393 }
3394 
3395 internal bool isNumberSmallString(smallStringt *self) {
3396 
3397  if (!self->data || !self->_len) {
3398  return(false);
3399  }
3400 
3401  char *string = sStringGetTiny(self->data);
3402  // . not allowed in first position
3403  // first position can be digit, '.' or '-' but not "-" and not "."
3404  if (!isdigit(*string) && (*string != '-') && (*string != '.')) {
3405  return(false);
3406  }
3407 
3408  // save pointer to first char to verify if there is a leader . and an exponent
3409  const char *firstChar = string;
3410  string++;
3411 
3412  bool r = false;
3413  int dots = 0;
3414  int exponents = 0;
3415  if (*(string-1) == '.') {
3416  // count first '.'
3417  dots++;
3418  }
3419  while ((isdigit(*string) || (*string == '.') || (*string == 'e') || (*string == 'E') || (((*string == '-') || (*string == '+')) && ((*(string-1) == 'E') || (*(string-1) == 'e')))) && *string != 0) {
3420  if (*string == '.') {
3421  dots++;
3422  if (*firstChar == '-') {
3423  // -.234 allowed
3424  firstChar = string;
3425  }
3426  if ((dots > 1) || (exponents > 0)) {
3427  // only one '.' allowed but not after exponent
3428  break;
3429  }
3430  }
3431  if ((*string == 'e') || (*string == 'E')) {
3432  exponents++;
3433  if ((exponents > 1) || (*firstChar == '.')) {
3434  // only one 'e' or 'E' allowed
3435  break;
3436  }
3437  }
3438  string++;
3439  }
3440 
3441  // strings ending with '.', '-', 'e' and 'E' are not numbers
3442  if ((*string == 0) && (*(string-1) != '.') && (*(string-1) != '-') && (*(string-1) != 'e') && (*(string-1) != 'E')) {
3443  r = true;
3444  }
3445  return(r);
3446 }
3447 
3448 internal bool isIntSmallString(smallStringt *self) {
3449 
3450  if (!self->data || !self->_len) {
3451  return(false);
3452  }
3453 
3454  char *string = sStringGetTiny(self->data);
3455 
3456  // . not allowed in first position
3457  // first position can be digit or - but not "-"
3458  if (!isdigit(*string) && (*string != '-')) {
3459  return(false);
3460  }
3461  string++;
3462 
3463  bool r = false;
3464  while (isdigit(*string) && *string != 0) {
3465  string++;
3466  }
3467 
3468  // strings ending with '-' are not integers
3469  if ((*string == 0) && (*(string-1) != '-')) {
3470  r = true;
3471  }
3472  return(r);
3473 }
3474 
3475 internal int64_t parseIntSmallString(smallStringt *self) {
3476 
3477  if (!self->data || !self->_len) {
3478  return(0);
3479  }
3480 
3481  char *string = sStringGetTiny(self->data);
3482  while (!isdigit(*string) && *string != '-' && *string != 0) {
3483  string++;
3484  }
3485  int64_t r = strtoll(string, NULL, 10);
3486  if (r == INT64_MAX || r == INT64_MIN) {
3487  pStrError("parseInt error");
3488  }
3489  return(r);
3490 }
3491 
3492 internal double parseDoubleSmallString(smallStringt *self) {
3493 
3494  if (!self->data || !self->_len) {
3495  return(0);
3496  }
3497 
3498  char *string = sStringGetTiny(self->data);
3499  while (!isdigit(*string) && *string != '-' && *string != 0) {
3500  string++;
3501  }
3502  double r = strtod(string, NULL);
3503  return(r);
3504 }
3505 
3506 internal smallStringt* intToSmallString(smallStringt *self, int64_t n) {
3507  char s[50];
3508 
3509  sprintf(s, "%" PRIiMAX, n);
3510  setSmallString(self, s);
3511  return(self);
3512 }
3513 
3514 internal smallStringt* doubleToSmallString(smallStringt *self, double n) {
3515  char s[256];
3516 
3517  sprintf(s, "%e", n);
3518  setSmallString(self, s);
3519  return(self);
3520 }
3521 
3522 internal size_t lenSmallString(smallStringt *self) {
3523 
3524  return(self->_len);
3525 }
3526 
3528 
3529  if (!self->data) {
3530  return(NULL);
3531  }
3532 
3533  char *string = sStringGetTiny(self->data);
3534  while (*string != 0) {
3535  *string = (char)toupper(*string);
3536  string++;
3537  }
3538  return(self);
3539 }
3540 
3542 
3543  if (!self->data) {
3544  return(NULL);
3545  }
3546 
3547  char *string = sStringGetTiny(self->data);
3548  while (*string != 0) {
3549  *string = (char)tolower(*string);
3550  string++;
3551  }
3552  return(self);
3553 }
3554 
3556  char *workingS = NULL;
3557  char *r = NULL;
3558  char *end = NULL;
3559  size_t len;
3560 
3561  // sanity checks
3562  if (!self->data) {
3563  return(NULL);
3564  }
3565 
3566  if (!self->_len) {
3567  return(self);
3568  }
3569 
3570  workingS = sStringGetTiny(self->data);
3571 
3572  // remove heading spaces
3573  while (isspace(*workingS)) {
3574  workingS++;
3575  }
3576 
3577  if (!*workingS) {
3578  // all spaces
3579  setSmallString(self, "");
3580  return(self);
3581  }
3582 
3583  // remove trailing spaces
3584  end = workingS + strlen(workingS) - 1;
3585  while (isspace(*end)) {
3586  end--;
3587  }
3588 
3589  // copy range to new smallString
3590  len = (size_t)(end - workingS + 2);
3591  isError(r, malloc(len)) return(NULL);
3592  r = strncpy(r, workingS, len - 1);
3593  r[len - 1] = 0;
3594 
3595  setNFreeSmallString(self, r);
3596  return(self);
3597 }
3598 
3600  char *workingS = NULL;
3601  char *r = NULL;
3602 
3603  // sanity checks
3604  if (!self->data) {
3605  return(NULL);
3606  }
3607 
3608  if (!self->_len) {
3609  return(self);
3610  }
3611 
3612  workingS = sStringGetTiny(self->data);
3613 
3614  // remove heading spaces
3615  while (isspace(*workingS)) {
3616  workingS++;
3617  }
3618 
3619  r = strdup(workingS);;
3620 
3621  setNFreeSmallString(self, r);
3622  return(self);
3623 }
3624 
3626  char *workingS = NULL;
3627  char *end = NULL;
3628 
3629  // sanity checks
3630  if (!self->data) {
3631  return(NULL);
3632  }
3633 
3634  if (!self->_len) {
3635  return(self);
3636  }
3637 
3638  workingS = sStringGetTiny(self->data);
3639 
3640  // remove trailing spaces
3641  end = workingS + strlen(workingS) - 1;
3642  while ((end >= workingS) && isspace(*end)) {
3643  end--;
3644  }
3645 
3646  *(end+1) = 0;;
3647  return(self);
3648 }
3649 
3650 internal smallStringt* uniqSmallString(smallStringt *self, char c) {
3651 
3652  // sanity checks
3653  if (!self->data) {
3654  return(NULL);
3655  }
3656 
3657  if (self->_len < 2) {
3658  // string is too short to have repetitions
3659  return(self);
3660  }
3661 
3662  char *string = sStringGetTiny(self->data);
3663  // index in r
3664  size_t j = 1;;
3665  rangeFrom(i, 1, self->_len)
3666  if (string[i-1] == c && string[i] == c) {
3667  // skip
3668  continue;
3669  }
3670  else {
3671  string[j] = string[i];
3672  j++;
3673  }
3674 
3675  string[j] = 0;
3676 
3677  return(self);
3678 }
3679 
3681 
3682  // sanity checks
3683  if (!self->data) {
3684  return(NULL);
3685  }
3686 
3687  if (self->_len < 2) {
3688  // string is too short to have repetitions
3689  return(self);
3690  }
3691 
3692  char *string = sStringGetTiny(self->data);
3693 
3694  c = (char)tolower(c);
3695 
3696  // index in r
3697  size_t j = 1;;
3698  rangeFrom(i, 1, self->_len)
3699  if (tolower(string[i-1]) == c && tolower(string[i]) == c) {
3700  // skip
3701  continue;
3702  }
3703  else {
3704  string[j] = string[i];
3705  j++;
3706  }
3707 
3708  string[j] = 0;
3709 
3710  return(self);
3711 }
3712 
3713 internal char getAtSmallString(smallStringt *self, int64_t index) {
3714 
3715  if (!self->data || !self->_len) {
3716  return(0);
3717  }
3718 
3719  if (index >= (int64_t)self->_len) {
3720  return(0);
3721  }
3722  if (index < -(int64_t)self->_len) {
3723  return(0);
3724  }
3725  if (index < 0) {
3726  index = (int64_t)self->_len + index;
3727  }
3728 
3729  return(*(sStringGetTiny(self->data)+index));
3730 }
3731 
3732 internal smallStringt* setAtSmallString(smallStringt *self, int64_t index, char c) {
3733 
3734  if (!self->data || !self->_len) {
3735  return(NULL);
3736  }
3737 
3738  if (index >= (int64_t)self->_len) {
3739  return(NULL);
3740  }
3741  if (index < -(int64_t)self->_len) {
3742  return(NULL);
3743  }
3744  if (index < 0) {
3745  index = (int64_t)self->_len + index;
3746  }
3747 
3748  *(sStringGetTiny(self->data)+index) = c;
3749  return(self);
3750 }
3751 
3752 internal smallStringt* sliceSmallString(smallStringt *self, int64_t start, int64_t end) {
3753  char *s = NULL;
3754 
3755  // sanity checks
3756  if (!self->data) {
3757  return(NULL);
3758  }
3759 
3760  if (start > (int64_t)self->_len) {
3761  emptySmallString(self);
3762  return(NULL);
3763  }
3764  if (end > (int64_t)self->_len) {
3765  end = (int64_t)self->_len;
3766  }
3767  if (start <= -(int64_t)self->_len) {
3768  start = -(int64_t)self->_len;
3769  }
3770  if (end <= -(int64_t)self->_len) {
3771  emptySmallString(self);
3772  return(NULL);
3773  }
3774  if (start < 0) {
3775  start = (int64_t)self->_len + start;
3776  }
3777  if (end <= 0) {
3778  end = (int64_t)self->_len + end;
3779  }
3780  if (end < start) {
3781  emptySmallString(self);
3782  return(NULL);
3783  }
3784 
3785  int64_t n;
3786  if (start == end) {
3787  emptyS(s);
3788  }
3789  else {
3790  // start < end < len
3791  // copy range to a new smallString
3792  n = end - start;
3793  s = malloc((size_t)n+1);
3794  if (!s) {
3795  return(NULL);
3796  }
3797  s = strncpy(s, sStringGetTiny(self->data) + start, (size_t)n);
3798  s[n] = 0;
3799  }
3800 
3801  setSmallString(self, s);
3802  free(s);
3803  return(self);
3804 }
3805 
3806 internal smallStringt* cropSmallString(smallStringt *self, int64_t start, int64_t end) {
3807 
3808  char *cropped = cropSSmallString(self, start, end);
3809 
3810  if (!cropped) {
3811  return(NULL);
3812  }
3813 
3814  smallStringt *r = allocSmallString(cropped);
3815  free(cropped);
3816  if (!r) {
3817  return(NULL);
3818  }
3819  return(r);
3820 }
3821 
3822 internal char* cropSSmallString(smallStringt *self, int64_t start, int64_t end) {
3823  char *l = NULL;
3824  int64_t len;
3825 
3826  // sanity checks
3827  if (!self->data) {
3828  return(NULL);
3829  }
3830 
3831  len = (int64_t)self->_len;
3832 
3833  if (start > len) {
3834  return(NULL);
3835  }
3836  if (end > len) {
3837  end = len;
3838  }
3839  if (start <= -len) {
3840  start = -len;
3841  }
3842  if (end <= -len) {
3843  return(NULL);
3844  }
3845  if (start < 0) {
3846  start = len + start;
3847  }
3848  if (end <= 0) {
3849  end = len + end;
3850  }
3851  if (end < start) {
3852  return(NULL);
3853  }
3854 
3855  if (start < end) {
3856  // start < end < len
3857  int64_t n;
3858  n = end - start;
3859  l = malloc((size_t)(n+1) * sizeof(char));
3860  if (!l) {
3861  return(NULL);
3862  }
3863  char *string = sStringGetTiny(self->data);
3864  pErrorNULL(strLCpy(l, (size_t)(n+1) * sizeof(char), string+start));
3865  memmove(string+start, string+end, (size_t)(len-end+1));
3866  self->_len -= (size_t)n;
3867  }
3868  else {
3869  // start = end, return empty string
3870  l = strdup("");
3871  }
3872 
3873  return(l);
3874 }
3875 
3876 
3877 
3878 internal smallJsont* cropSmallJsonSmallString(smallStringt *self, int64_t start, int64_t end) {
3879 
3880  char *cropped = cropSSmallString(self, start, end);
3881 
3882  if (!cropped) {
3883  return(NULL);
3884  }
3885 
3887  if (!r) {
3888  return(NULL);
3889  }
3890  setTopStringO(r, cropped);
3891  free(cropped);
3892  return(r);
3893 }
3894 
3895 
3896 
3897 
3898 internal char cropElemSmallString(smallStringt *self, int64_t index) {
3899  int64_t len;
3900 
3901  // sanity checks
3902  if (!self->data) {
3903  return(0);
3904  }
3905 
3906  len = (int64_t)self->_len;
3907  if (index >= len) {
3908  return(0);
3909  }
3910  if (index < -len) {
3911  return(0);
3912  }
3913  if (index < 0) {
3914  index = len + index;
3915  }
3916 
3917  char *string = sStringGetTiny(self->data);
3918 
3919  char r = *(string+index);
3920 
3921  if (index == len-1) {
3922  string[len-1] = 0;
3923  }
3924  else {
3925  memmove(string+index, string+index+1, (size_t)(len - index));
3926  }
3927 
3928  self->_len--;
3929 
3930  return(r);
3931 }
3932 
3933 
3934 
3935 internal smallStringt* copySmallString(smallStringt *self, int64_t start, int64_t end) {
3936  char *s = NULL;
3937 
3938  // sanity checks
3939  if (!self->data) {
3940  return(NULL);
3941  }
3942 
3943  if (start >= (int64_t)self->_len) {
3944  return(NULL);
3945  }
3946  if (end > (int64_t)self->_len) {
3947  end = (int64_t)self->_len;
3948  }
3949  if (start <= -(int64_t)self->_len) {
3950  start = -(int64_t)self->_len;
3951  }
3952  if (end <= -(int64_t)self->_len) {
3953  return(NULL);
3954  }
3955  if (start < 0) {
3956  start = (int64_t)self->_len + start;
3957  }
3958  if (end <= 0) {
3959  end = (int64_t)self->_len + end;
3960  }
3961  if (end < start) {
3962  return(NULL);
3963  }
3964 
3965  int64_t n;
3966  if (start == end) {
3967  emptyS(s);
3968  }
3969  else {
3970  // start < end < len
3971  // copy range to a new smallString
3972  n = end - start;
3973  s = malloc((size_t)n+1);
3974  if (!s) {
3975  return(NULL);
3976  }
3977  s = strncpy(s, sStringGetTiny(self->data) + start, (size_t)n);
3978  s[n] = 0;
3979  }
3980 
3982  if (!r) {
3983  return(NULL);
3984  }
3985  free(s);
3986  return(r);
3987 }
3988 
3989 internal smallStringt* insertSmallString(smallStringt *self, int64_t index, smallStringt *toInsert) {
3990  char *r = NULL;
3991 
3992  // sanity checks
3993  if (!toInsert) {
3994  return(NULL);
3995  }
3996  if (checkObjectTypes && !isOSmallString(toInsert)) {
3997  return(NULL);
3998  }
3999 
4000  if (!self->data) {
4001  if (index) {
4002  return(NULL);
4003  }
4004  if (toInsert->data) {
4005  self->data = (sStringt*)sDuplicateTiny((smallt*)toInsert->data);
4006  self->_len = toInsert->_len;
4007  }
4008  return(self);
4009  }
4010 
4011  if (!self->_len && index == -1) {
4012  // empty string, index -1 is equal to 0
4013  index = 0;
4014  }
4015  bool neg = false;
4016  if (index < 0) {
4017  neg = true;
4018  }
4019 
4020  if (index > (int64_t)self->_len) {
4021  return(NULL);
4022  }
4023  if (neg) {
4024  index++;
4025  }
4026  if (index < -(int64_t)self->_len) {
4027  return(NULL);
4028  }
4029  if (neg) {
4030  index = (int64_t)self->_len + index;
4031  }
4032 
4033  if (!toInsert->data || !toInsert->_len) {
4034  return(self);
4035  }
4036 
4037  if (index == 0) {
4038  // insert at beginning
4039  r = catS(toInsert->data, sStringGetTiny(self->data));
4040  }
4041  else {
4042  // include sType in s1 (index+1)
4043  char *s1 = sliceS((char *)self->data, 0, index+1);
4044  char *s2 = sliceS((char *)self->data, index+1, 0);
4045  r = catS(s1, sStringGetTiny(toInsert->data), s2);
4046  freeManyS(s1,s2);
4047  }
4048 
4049  free(self->data);
4050  self->data = (sStringt *)r;
4051  self->_len += toInsert->_len;
4052  return(self);
4053 }
4054 
4055 internal smallStringt* insertSmallJsonSmallString(smallStringt *self, int64_t index, smallJsont *toInsert) {
4056 
4057  if (!toInsert) {
4058  return(NULL);
4059  }
4060 
4061  if (checkObjectTypes && toInsert && !isOSmallJson(toInsert)) {
4062  return(NULL);
4063  }
4064 
4065  const char *type = getTopTypeO(toInsert);
4066 
4067  if (!type) {
4068  // this provides a behavior similar to insertSmallString and insertS
4069  // when toInsert is empty, self is unchanged and no error is returned
4070  return(self);
4071  }
4072 
4073  if (!eqS(type,"string")) {
4074  return(NULL);
4075  }
4076 
4077  return(insertSSmallString(self, index, getTopSO(toInsert)));
4078 }
4079 
4080 internal smallStringt* insertSSmallString(smallStringt *self, int64_t index, const char *toInsert) {
4081  char *r = NULL;
4082 
4083  // sanity checks
4084  if (!toInsert) {
4085  return(self);
4086  }
4087  if (!self->data) {
4088  if (index) {
4089  return(NULL);
4090  }
4091  char header[2] = {STRING ,0};
4092  self->data = (sStringt*) catS(header, toInsert);
4093  self->_len = strlen(toInsert);
4094  return(self);
4095  }
4096 
4097  if (!self->_len && index == -1) {
4098  // empty string, index -1 is equal to 0
4099  index = 0;
4100  }
4101  bool neg = false;
4102  if (index < 0) {
4103  neg = true;
4104  }
4105 
4106  if (index > (int64_t)self->_len) {
4107  return(NULL);
4108  }
4109  if (neg) {
4110  index++;
4111  }
4112  if (index < -(int64_t)self->_len) {
4113  return(NULL);
4114  }
4115  if (neg) {
4116  index = (int64_t)self->_len + index;
4117  }
4118 
4119  if (!*toInsert) {
4120  return(self);
4121  }
4122 
4123  if (index == 0) {
4124  // insert at beginning
4125  char header[2] = {STRING ,0};
4126  r = catS(header, toInsert, sStringGetTiny(self->data));
4127  }
4128  else {
4129  // include sType in s1 (index+1)
4130  char *s1 = sliceS((char *)self->data, 0, index+1);
4131  char *s2 = sliceS((char *)self->data, index+1, 0);
4132  r = catS(s1, toInsert, s2);
4133  freeManyS(s1,s2);
4134  }
4135 
4136  free(self->data);
4137  self->data = (sStringt *)r;
4138  self->_len += strlen(toInsert);
4139  return(self);
4140 }
4141 
4142 internal smallStringt* insertNFreeSmallString(smallStringt *self, int64_t index, smallStringt *toInsert) {
4143 
4144  smallStringt *r = insertSmallString(self, index, toInsert);
4145  if (r) {
4146  terminateO(toInsert);
4147  }
4148  return(r);
4149 }
4150 
4151 internal smallStringt* insertNFreeSmallJsonSmallString(smallStringt *self, int64_t index, smallJsont *toInsert) {
4152 
4153  smallStringt *r = insertSmallJsonSmallString(self, index, toInsert);
4154  if (r) {
4155  terminateO(toInsert);
4156  }
4157  return(r);
4158 }
4159 
4160 internal smallStringt* insertSNFreeSmallString(smallStringt *self, int64_t index, char *toInsert) {
4161 
4162  smallStringt *r = insertSSmallString(self, index, toInsert);
4163  if (r) {
4164  free(toInsert);
4165  }
4166  return(r);
4167 }
4168 
4169 internal smallStringt* injectSmallString(smallStringt *self, int64_t index, char toInject) {
4170  char *r = NULL;
4171 
4172  // sanity checks
4173  if (!self->data) {
4174  if (index) {
4175  return(NULL);
4176  }
4177  char tmp[3] = {STRING, toInject, 0};
4178  self->data = (sStringt*) strdup(tmp);
4179  self->_len = 1;
4180  return(self);
4181  }
4182 
4183  if (!self->_len && index == -1) {
4184  // empty string, index -1 is equal to 0
4185  index = 0;
4186  }
4187  bool neg = false;
4188  if (index < 0) {
4189  neg = true;
4190  }
4191 
4192  if (index > (int64_t)self->_len) {
4193  return(NULL);
4194  }
4195  if (neg) {
4196  index++;
4197  }
4198  if (index < -(int64_t)self->_len) {
4199  return(NULL);
4200  }
4201  if (neg) {
4202  index = (int64_t)self->_len + index;
4203  }
4204 
4205 
4206  charToS(inject, toInject);
4207 
4208  if (index == 0) {
4209  // inject at beginning
4210  char header[2] = {STRING ,0};
4211  r = catS(header, inject, sStringGetTiny(self->data));
4212  }
4213  else {
4214  // include sType in s1 (index+1)
4215  char *s1 = sliceS((char *)self->data, 0, index+1);
4216  char *s2 = sliceS((char *)self->data, index+1, 0);
4217  r = catS(s1, inject, s2);
4218  freeManyS(s1,s2);
4219  }
4220 
4221  free(self->data);
4222  self->data = (sStringt *)r;
4223  self->_len++;
4224  return(self);
4225 }
4226 
4227 internal smallStringt* delSmallString(smallStringt *self, int64_t start, int64_t end) {
4228  char *s = NULL;
4229 
4230  // sanity checks
4231  if (!self->data || !self->_len) {
4232  return(NULL);
4233  }
4234 
4235  if (start >= (int64_t)self->_len) {
4236  start = (int64_t)self->_len;
4237  }
4238  if (end > (int64_t)self->_len) {
4239  end = (int64_t)self->_len;
4240  }
4241  if (start <= -(int64_t)self->_len) {
4242  start = -(int64_t)self->_len;
4243  }
4244  if (end <= -(int64_t)self->_len) {
4245  end = -(int64_t)self->_len;
4246  }
4247  if (start < 0) {
4248  start = (int64_t)self->_len + start;
4249  }
4250  if (end <= 0) {
4251  end = (int64_t)self->_len + end;
4252  }
4253  if (end < start) {
4254  return(NULL);
4255  }
4256 
4257  if (start == end) {
4258  return(self);
4259  }
4260 
4261  // start < end < self->_len
4262  // copy range to a new smallString
4263  int64_t n;
4264  n = end - start;
4265  // +2 for sType at the beginning
4266  s = malloc(self->_len - (size_t)n +2);
4267  if (!s) {
4268  return(NULL);
4269  }
4270  // +1 for sType
4271  strncpy(s, (char *)self->data, (size_t)start+1);
4272  strncpy(s+start+1, (char *)self->data + end +1, self->_len - (size_t)end);
4273  s[self->_len - (size_t)n +1] = 0;
4274 
4275  free(self->data);
4276  self->data = (sStringt *)s;
4277  self->_len -= (size_t)n;
4278  return(self);
4279 }
4280 
4281 internal smallStringt* delElemSmallString(smallStringt *self, int64_t index) {
4282  char *s = NULL;
4283 
4284  // sanity checks
4285  if (!self->data || !self->_len) {
4286  return(NULL);
4287  }
4288 
4289  if (index >= (int64_t)self->_len) {
4290  return(0);
4291  }
4292  if (index < -(int64_t)self->_len) {
4293  return(0);
4294  }
4295  if (index < 0) {
4296  index = (int64_t)self->_len + index;
4297  }
4298 
4299  // copy range to a new smallString
4300  // +2 for sType at the beginning
4301  s = malloc(self->_len - 1 +2);
4302  if (!s) {
4303  return(NULL);
4304  }
4305  // +1 for sType
4306  strncpy(s, (char *)self->data, (size_t)index+1);
4307  strncpy(s+index+1, (char *)self->data + index+1 +1, self->_len - (size_t)(index+1));
4308  s[self->_len - 1 +1] = 0;
4309 
4310  free(self->data);
4311  self->data = (sStringt *)s;
4312  self->_len--;
4313  return(self);
4314 }
4315 
4316 internal char* hasSmallString(smallStringt *self, const char *needle) {
4317 
4318  // sanity checks
4319  if (!self->data || !needle || !self->_len) {
4320  return(NULL);
4321  }
4322  return(strstr(sStringGetTiny(self->data), needle));
4323 }
4324 
4325 internal char* hasCharSmallString(smallStringt *self, char c) {
4326 
4327  // sanity checks
4328  if (!self->data || !self->_len) {
4329  return(NULL);
4330  }
4331  return(strchr(sStringGetTiny(self->data), c));
4332 }
4333 
4334 internal char* hasSmallJsonSmallString(smallStringt *self, smallJsont *needle) {
4335 
4336  if (!needle) {
4337  return(NULL);
4338  }
4339 
4340  if (checkObjectTypes && !isOSmallJson(needle)) {
4341  return(NULL);
4342  }
4343 
4344  const char *type = getTopTypeO(needle);
4345 
4346  if (!eqS(type,"string")) {
4347  return(NULL);
4348  }
4349 
4350  return(hasSmallString(self, getTopSO(needle)));
4351 }
4352 
4353 internal char* hasSmallStringSmallString(smallStringt *self, smallStringt *needle) {
4354 
4355  if (!needle) {
4356  return(NULL);
4357  }
4358  if (checkObjectTypes && !isOSmallString(needle)) {
4359  return(NULL);
4360  }
4361 
4362  return(hasSmallString(self, ssGet(needle)));
4363 }
4364 
4365 internal smallStringt* findSmallString(smallStringt *self, const char *needle) {
4366 
4367  // sanity checks
4368  if (!self->data || !needle || !self->_len) {
4369  return(NULL);
4370  }
4371 
4372  char *s = strstr(sStringGetTiny(self->data), needle);
4373  if (!s) {
4374  return(NULL);
4375  }
4377  if (!r) {
4378  return(NULL);
4379  }
4380  r->f->set(r, s);
4381  return(r);
4382 }
4383 
4385 
4386  // sanity checks
4387  if (!self->data || !self->_len) {
4388  return(NULL);
4389  }
4390 
4391  char *s = strchr(sStringGetTiny(self->data), c);
4392  if (!s) {
4393  return(NULL);
4394  }
4396  if (!r) {
4397  return(NULL);
4398  }
4399  r->f->set(r, s);
4400  return(r);
4401 }
4402 
4404 
4405  if (!needle) {
4406  return(NULL);
4407  }
4408 
4409  if (checkObjectTypes && !isOSmallJson(needle)) {
4410  return(NULL);
4411  }
4412 
4413  const char *type = getTopTypeO(needle);
4414 
4415  if (!eqS(type,"string")) {
4416  return(NULL);
4417  }
4418 
4419  return(findSmallString(self, getTopSO(needle)));
4420 }
4421 
4423 
4424  if (!needle) {
4425  return(NULL);
4426  }
4427  if (checkObjectTypes && !isOSmallString(needle)) {
4428  return(NULL);
4429  }
4430 
4431  return(findSmallString(self, ssGet(needle)));
4432 }
4433 
4434 internal ssize_t indexOfSmallString(smallStringt *self, const char *needle) {
4435 
4436  char *s = getSmallString(self);
4437  return(indexOfS(s, needle));
4438 }
4439 
4440 internal ssize_t indexOfCharSmallString(smallStringt *self, char c) {
4441 
4442  char *s = getSmallString(self);
4443  return(indexOfCharS(s, c));
4444 }
4445 
4446 internal ssize_t indexOfSmallJsonSmallString(smallStringt *self, smallJsont *needle) {
4447 
4448  if (!needle) {
4449  return(-1);
4450  }
4451 
4452  if (checkObjectTypes && !isOSmallJson(needle)) {
4453  return(-1);
4454  }
4455 
4456  const char *type = getTopTypeO(needle);
4457 
4458  if (!eqS(type,"string")) {
4459  return(-1);
4460  }
4461 
4462  char *s = getSmallString(self);
4463  return(indexOfS(s, getTopSO(needle)));
4464 }
4465 
4466 internal ssize_t indexOfSmallStringSmallString(smallStringt *self, smallStringt *needle) {
4467 
4468  if (!needle) {
4469  return(-1);
4470  }
4471 
4472  if (checkObjectTypes && !isOSmallString(needle)) {
4473  return(-1);
4474  }
4475 
4476  char *s = getSmallString(self);
4477  return(indexOfS(s, ssGet(needle)));
4478 }
4479 
4480 internal char* icHasSmallString(smallStringt *self, const char *needle) {
4481 
4482  // sanity checks
4483  if (!self->data || !needle || !self->_len) {
4484  return(NULL);
4485  }
4486  return(strcasestr(sStringGetTiny(self->data), needle));
4487 }
4488 
4489 internal char* icHasCharSmallString(smallStringt *self, char c) {
4490 
4491  if (c == 0) {
4492  // include terminating '\0' in comparison
4493  // like findCharS
4494  // sanity checks
4495  if (!self->data || !self->_len) {
4496  return(NULL);
4497  }
4498  return(strchr(sStringGetTiny(self->data), c));
4499  }
4500  charToS(s, c);
4501  return(icHasSmallString(self, s));
4502 }
4503 
4504 internal char* icHasSmallJsonSmallString(smallStringt *self, smallJsont *needle) {
4505 
4506  if (!needle) {
4507  return(NULL);
4508  }
4509 
4510  if (checkObjectTypes && !isOSmallJson(needle)) {
4511  return(NULL);
4512  }
4513 
4514  const char *type = getTopTypeO(needle);
4515 
4516  if (!eqS(type,"string")) {
4517  return(NULL);
4518  }
4519 
4520  return(icHasSmallString(self, getTopSO(needle)));
4521 }
4522 
4524 
4525  if (!needle) {
4526  return(NULL);
4527  }
4528  if (checkObjectTypes && !isOSmallString(needle)) {
4529  return(NULL);
4530  }
4531 
4532  return(icHasSmallString(self, ssGet(needle)));
4533 }
4534 
4535 internal smallStringt* icFindSmallString(smallStringt *self, const char *needle) {
4536 
4537  // sanity checks
4538  if (!self->data || !needle || !self->_len) {
4539  return(NULL);
4540  }
4541 
4542  char *s = strcasestr(sStringGetTiny(self->data), needle);
4543  if (!s) {
4544  return(NULL);
4545  }
4547  if (!r) {
4548  return(NULL);
4549  }
4550  r->f->set(r, s);
4551  return(r);
4552 }
4553 
4555 
4556  if (c == 0) {
4557  // include terminating '\0' in comparison
4558  // like findCharS
4559  // sanity checks
4560  if (!self->data || !self->_len) {
4561  return(NULL);
4562  }
4563  char *s = strchr(sStringGetTiny(self->data), c);
4564  if (!s) {
4565  return(NULL);
4566  }
4568  if (!r) {
4569  return(NULL);
4570  }
4571  r->f->set(r, s);
4572  return(r);
4573  }
4574  charToS(s, c);
4575  return(icFindSmallString(self, s));
4576 }
4577 
4579 
4580  if (!needle) {
4581  return(NULL);
4582  }
4583 
4584  if (checkObjectTypes && !isOSmallJson(needle)) {
4585  return(NULL);
4586  }
4587 
4588  const char *type = getTopTypeO(needle);
4589 
4590  if (!eqS(type,"string")) {
4591  return(NULL);
4592  }
4593 
4594  return(icFindSmallString(self, getTopSO(needle)));
4595 }
4596 
4598 
4599  if (!needle) {
4600  return(NULL);
4601  }
4602  if (checkObjectTypes && !isOSmallString(needle)) {
4603  return(NULL);
4604  }
4605 
4606  return(icFindSmallString(self, ssGet(needle)));
4607 }
4608 
4609 internal ssize_t icIndexOfSmallString(smallStringt *self, const char *needle) {
4610 
4611  char *s = getSmallString(self);
4612  return(icIndexOfS(s, needle));
4613 }
4614 
4615 internal ssize_t icIndexOfCharSmallString(smallStringt *self, char c) {
4616 
4617  char *s = getSmallString(self);
4618  return(icIndexOfCharS(s, c));
4619 }
4620 
4621 internal ssize_t icIndexOfSmallJsonSmallString(smallStringt *self, smallJsont *needle) {
4622 
4623  if (!needle) {
4624  return(-1);
4625  }
4626 
4627  if (checkObjectTypes && !isOSmallJson(needle)) {
4628  return(-1);
4629  }
4630 
4631  const char *type = getTopTypeO(needle);
4632 
4633  if (!eqS(type,"string")) {
4634  return(-1);
4635  }
4636 
4637  char *s = getSmallString(self);
4638  return(icIndexOfS(s, getTopSO(needle)));
4639 }
4640 
4642 
4643  if (!needle) {
4644  return(-1);
4645  }
4646 
4647  if (checkObjectTypes && !isOSmallString(needle)) {
4648  return(-1);
4649  }
4650 
4651  char *s = getSmallString(self);
4652  return(icIndexOfS(s, ssGet(needle)));
4653 }
4654 
4656 
4657  setSmallString(self, "");
4658  return(self);
4659 }
4660 
4661 internal bool isEmptySmallString(smallStringt *self) {
4662 
4663  if (!self->data || !*sStringGetTiny(self->data)) {
4664  return(true);
4665  }
4666  return(false);
4667 }
4668 
4669 internal bool isBlankSmallString(smallStringt *self) {
4670 
4671  // sanity checks
4672  if (!self->data || !*sStringGetTiny(self->data)) {
4673  return(true);
4674  }
4675 
4676  char *s = trimS(sStringGetTiny(self->data));
4677  if (!s || !*s) {
4678  free(s);
4679  return(true);
4680  }
4681  free(s);
4682  return(false);
4683 }
4684 
4685 internal smallArrayt* splitSmallString(smallStringt *self, const char *delim) {
4686 
4687  // sanity checks
4688  if (!self->data || !delim) {
4689  return(NULL);
4690  }
4691 
4693  if (!r) {
4694  return(NULL);
4695  }
4696 
4697  char **list = splitSSmallString(self, delim);
4698  r->f->fromArray(r, list, 0);
4699  listFreeS(list);
4700  return(r);
4701 }
4702 
4704 
4705  charToS(s, c);
4706  return(splitSmallString(self, s));
4707 }
4708 
4710 
4711  if (!delim) {
4712  return(NULL);
4713  }
4714 
4715  if (checkObjectTypes && !isOSmallJson(delim)) {
4716  return(NULL);
4717  }
4718 
4719  const char *type = getTopTypeO(delim);
4720 
4721  if (!eqS(type,"string")) {
4722  return(NULL);
4723  }
4724 
4725  return(splitSmallString(self, sjGet(delim)));
4726 }
4727 
4729 
4730  if (!delim) {
4731  return(NULL);
4732  }
4733  if (checkObjectTypes && !isOSmallString(delim)) {
4734  return(NULL);
4735  }
4736 
4737  return(splitSmallString(self, ssGet(delim)));
4738 }
4739 
4740 internal char** splitSSmallString(smallStringt *self, const char *delim) {
4741  char *startSmallString = NULL;
4742  char *workingSmallString = NULL;
4743  char *line = NULL;
4744  char *token = NULL;
4745  char **r = NULL;
4746 
4747  // sanity checks
4748  if (!self->data || !delim) {
4749  return(NULL);
4750  }
4751 
4752  if (!*delim || !*sStringGetTiny(self->data)) {
4753  // empty delimiter or empty string
4754  pErrorNULL(listPushS(&r, sStringGetTiny(self->data)));
4755  return(r);
4756  }
4757 
4758  // split using strtok_r
4759  startSmallString = strdup(sStringGetTiny(self->data));
4760  workingSmallString = startSmallString;
4761  line = workingSmallString;
4762  while (strlen(workingSmallString) != 0) {
4763  token = tokS(line, delim, &workingSmallString);
4764  pErrorNULL(listPushS(&r, token));
4765  // mac os sets workingSmallString to NULL at the end
4766  if (!workingSmallString) {
4767  break; //LCOV_EXCL_LINE
4768  }
4769  // first parameter should be NULL in next strtok_r calls
4770  line = NULL;
4771  }
4772  free(startSmallString);
4773 
4774  // check if delim is at the end of smallString
4775  // if yes, add an empty smallString in the result
4776  // ["one",""] = split "one/" "/"
4777  size_t lenD = strlen(delim);
4778  // +1 for sType
4779  if (strEq(sStringGetTiny(self->data)+(self->_len-lenD), delim)) {
4780  pErrorNULL(listPushS(&r, ""));
4781  }
4782 
4783  return(r);
4784 }
4785 
4786 internal char** splitCharSSmallString(smallStringt *self, char c) {
4787 
4788  charToS(s, c);
4789  return(splitSSmallString(self, s));
4790 }
4791 
4792 internal char** splitSmallJsonSSmallString(smallStringt *self, smallJsont *delim) {
4793 
4794  if (!delim) {
4795  return(NULL);
4796  }
4797 
4798  if (checkObjectTypes && !isOSmallJson(delim)) {
4799  return(NULL);
4800  }
4801 
4802  const char *type = getTopTypeO(delim);
4803 
4804  if (!eqS(type,"string")) {
4805  return(NULL);
4806  }
4807 
4808  return(splitSSmallString(self, sjGet(delim)));
4809 }
4810 
4812 
4813  if (!delim) {
4814  return(NULL);
4815  }
4816  if (checkObjectTypes && !isOSmallString(delim)) {
4817  return(NULL);
4818  }
4819 
4820  return(splitSSmallString(self, ssGet(delim)));
4821 }
4822 
4823 internal smallArrayt* extractSmallString(smallStringt *self, const char* delim1, const char* delim2) {
4824  char **tmp = NULL;
4825  char **r = NULL;
4826 
4827  // sanity checks
4828  if (!self->data || !delim1 || !delim2) {
4829  return(NULL);
4830  }
4831 
4832  if (strEq(delim1, delim2)) {
4833  return(NULL);
4834  }
4835 
4836  tmp = splitSSmallString(self, delim1);
4837 
4838  if (listLengthS(tmp) < 2) {
4839  // delim1 not found
4840  listFreeS(tmp);
4841  return(NULL);
4842  }
4843 
4844  // remove first element
4845  pErrorNULL(iListSliceS(&tmp, 1, 0));
4846 
4847  forEachCharP(tmp, e) {
4848  char **tmp2 = split(*e, delim2);
4849  if (listLengthS(tmp2) > 1) {
4850  pErrorNULL(listPushS(&r, tmp2[0]));
4851  }
4852  listFreeS(tmp2);
4853  }
4854 
4855  listFreeS(tmp);
4856 
4857  if (!r) {
4858  return(NULL);
4859  }
4860 
4862  if (!a) {
4863  listFreeS(r);
4864  return(NULL);
4865  }
4866  a->f->fromArrayNFree(a, r, 0);
4867  return(a);
4868 }
4869 
4870 internal smallArrayt* extractCharSSmallString(smallStringt *self, char delim1, const char* delim2) {
4871 
4872  charToS(d1, delim1);
4873  return(extractSmallString(self, d1, delim2));
4874 }
4875 
4876 internal smallArrayt* extractSCharSmallString(smallStringt *self, const char* delim1, char delim2) {
4877 
4878  charToS(d2, delim2);
4879  return(extractSmallString(self, delim1, d2));
4880 }
4881 
4882 internal smallArrayt* extractCharCharSmallString(smallStringt *self, char delim1, char delim2) {
4883 
4884  charToS(d1, delim1);
4885  charToS(d2, delim2);
4886  return(extractSmallString(self, d1, d2));
4887 }
4888 
4890 
4891  if (!delim1 || !delim2) {
4892  return(NULL);
4893  }
4894 
4895  if (checkObjectTypes && !isOSmallJson(delim1)) {
4896  return(NULL);
4897  }
4898 
4899  if (checkObjectTypes && !isOSmallJson(delim2)) {
4900  return(NULL);
4901  }
4902 
4903  const char *type = getTopTypeO(delim1);
4904 
4905  if (!eqS(type,"string")) {
4906  return(NULL);
4907  }
4908 
4909  type = getTopTypeO(delim2);
4910 
4911  if (!eqS(type,"string")) {
4912  return(NULL);
4913  }
4914 
4915  return(extractSmallString(self, sjGet(delim1), sjGet(delim2)));
4916 }
4917 
4919 
4920  if (!delim1 || !delim2) {
4921  return(NULL);
4922  }
4923 
4924  if (checkObjectTypes && !isOSmallJson(delim1)) {
4925  return(NULL);
4926  }
4927 
4928  if (checkObjectTypes && !isOSmallString(delim2)) {
4929  return(NULL);
4930  }
4931 
4932  const char *type = getTopTypeO(delim1);
4933 
4934  if (!eqS(type,"string")) {
4935  return(NULL);
4936  }
4937 
4938  return(extractSmallString(self, sjGet(delim1), ssGet(delim2)));
4939 }
4940 
4941 internal smallArrayt* extractSmallJsonSSmallString(smallStringt *self, smallJsont* delim1, const char* delim2) {
4942 
4943  if (!delim1) {
4944  return(NULL);
4945  }
4946 
4947  if (checkObjectTypes && !isOSmallJson(delim1)) {
4948  return(NULL);
4949  }
4950 
4951  const char *type = getTopTypeO(delim1);
4952 
4953  if (!eqS(type,"string")) {
4954  return(NULL);
4955  }
4956 
4957  return(extractSmallString(self, sjGet(delim1), delim2));
4958 }
4959 
4960 internal smallArrayt* extractSmallJsonCharSmallString(smallStringt *self, smallJsont* delim1, char delim2) {
4961 
4962  if (!delim1) {
4963  return(NULL);
4964  }
4965 
4966  if (checkObjectTypes && !isOSmallJson(delim1)) {
4967  return(NULL);
4968  }
4969 
4970  const char *type = getTopTypeO(delim1);
4971 
4972  if (!eqS(type,"string")) {
4973  return(NULL);
4974  }
4975 
4976  charToS(d2, delim2);
4977  return(extractSmallString(self, sjGet(delim1), d2));
4978 }
4979 
4981 
4982  if (!delim1 || !delim2) {
4983  return(NULL);
4984  }
4985 
4986  if (checkObjectTypes && !isOSmallString(delim1)) {
4987  return(NULL);
4988  }
4989 
4990  if (checkObjectTypes && !isOSmallJson(delim2)) {
4991  return(NULL);
4992  }
4993 
4994  const char *type = getTopTypeO(delim2);
4995 
4996  if (!eqS(type,"string")) {
4997  return(NULL);
4998  }
4999 
5000  return(extractSmallString(self, ssGet(delim1), sjGet(delim2)));
5001 }
5002 
5004 
5005  if (!delim1 || !delim2) {
5006  return(NULL);
5007  }
5008  if (checkObjectTypes && !isOSmallString(delim1)) {
5009  return(NULL);
5010  }
5011  if (checkObjectTypes && !isOSmallString(delim2)) {
5012  return(NULL);
5013  }
5014 
5015 
5016  return(extractSmallString(self, ssGet(delim1), ssGet(delim2)));
5017 }
5018 
5019 internal smallArrayt* extractSmallStringSSmallString(smallStringt *self, smallStringt* delim1, const char* delim2) {
5020 
5021  if (!delim1) {
5022  return(NULL);
5023  }
5024  if (checkObjectTypes && !isOSmallString(delim1)) {
5025  return(NULL);
5026  }
5027 
5028  return(extractSmallString(self, ssGet(delim1), delim2));
5029 }
5030 
5032 
5033  if (!delim1) {
5034  return(NULL);
5035  }
5036  if (checkObjectTypes && !isOSmallString(delim1)) {
5037  return(NULL);
5038  }
5039 
5040  charToS(d2, delim2);
5041  return(extractSmallString(self, ssGet(delim1), d2));
5042 }
5043 
5044 internal smallArrayt* extractSSmallJsonSmallString(smallStringt *self, const char* delim1, smallJsont* delim2) {
5045 
5046  if (!delim2) {
5047  return(NULL);
5048  }
5049 
5050  if (checkObjectTypes && !isOSmallJson(delim2)) {
5051  return(NULL);
5052  }
5053 
5054  const char *type = getTopTypeO(delim2);
5055 
5056  if (!eqS(type,"string")) {
5057  return(NULL);
5058  }
5059 
5060  return(extractSmallString(self, delim1, sjGet(delim2)));
5061 }
5062 
5063 internal smallArrayt* extractSSmallStringSmallString(smallStringt *self, const char* delim1, smallStringt* delim2) {
5064 
5065  if (!delim2) {
5066  return(NULL);
5067  }
5068  if (checkObjectTypes && !isOSmallString(delim2)) {
5069  return(NULL);
5070  }
5071 
5072  return(extractSmallString(self, delim1, ssGet(delim2)));
5073 }
5074 
5075 internal smallArrayt* extractCharSmallJsonSmallString(smallStringt *self, char delim1, smallJsont* delim2) {
5076 
5077  if (!delim2) {
5078  return(NULL);
5079  }
5080 
5081  if (checkObjectTypes && !isOSmallJson(delim2)) {
5082  return(NULL);
5083  }
5084 
5085  const char *type = getTopTypeO(delim2);
5086 
5087  if (!eqS(type,"string")) {
5088  return(NULL);
5089  }
5090 
5091  charToS(d1, delim1);
5092  return(extractSmallString(self, d1, sjGet(delim2)));
5093 }
5094 
5096 
5097  if (!delim2) {
5098  return(NULL);
5099  }
5100  if (checkObjectTypes && !isOSmallString(delim2)) {
5101  return(NULL);
5102  }
5103 
5104  charToS(d1, delim1);
5105  return(extractSmallString(self, d1, ssGet(delim2)));
5106 }
5107 
5108 internal smallArrayt* icSplitSmallString(smallStringt *self, const char *delim) {
5109 
5110  // sanity checks
5111  if (!self->data || !delim) {
5112  return(NULL);
5113  }
5114 
5116  if (!r) {
5117  return(NULL);
5118  }
5119 
5120  char **list = icSplitSSmallString(self, delim);
5121  r->f->fromArray(r, list, 0);
5122  listFreeS(list);
5123  return(r);
5124 }
5125 
5127 
5128  charToS(s, c);
5129  return(icSplitSmallString(self, s));
5130 }
5131 
5133 
5134  if (!delim) {
5135  return(NULL);
5136  }
5137 
5138  if (checkObjectTypes && !isOSmallJson(delim)) {
5139  return(NULL);
5140  }
5141 
5142  const char *type = getTopTypeO(delim);
5143 
5144  if (!eqS(type,"string")) {
5145  return(NULL);
5146  }
5147 
5148  return(icSplitSmallString(self, sjGet(delim)));
5149 }
5150 
5152 
5153  if (!delim) {
5154  return(NULL);
5155  }
5156  if (checkObjectTypes && !isOSmallString(delim)) {
5157  return(NULL);
5158  }
5159 
5160  return(icSplitSmallString(self, ssGet(delim)));
5161 }
5162 
5163 internal char** icSplitSSmallString(smallStringt *self, const char *delim) {
5164  char *startSmallString = NULL;
5165  char *workingSmallString = NULL;
5166  char *line = NULL;
5167  char *token = NULL;
5168  char **r = NULL;
5169 
5170  // sanity checks
5171  if (!self->data || !delim) {
5172  return(NULL);
5173  }
5174 
5175  if (!*delim || !*sStringGetTiny(self->data)) {
5176  // empty delimiter or empty string
5177  pErrorNULL(listPushS(&r, sStringGetTiny(self->data)));
5178  return(r);
5179  }
5180 
5181  // split using strtok_r
5182  startSmallString = strdup(sStringGetTiny(self->data));
5183  workingSmallString = startSmallString;
5184  line = workingSmallString;
5185  while (strlen(workingSmallString) != 0) {
5186  token = icTokS(line, delim, &workingSmallString);
5187  pErrorNULL(listPushS(&r, token));
5188  // mac os sets workingSmallString to NULL at the end
5189  if (!workingSmallString) {
5190  break; //LCOV_EXCL_LINE
5191  }
5192  // first parameter should be NULL in next strtok_r calls
5193  line = NULL;
5194  }
5195  free(startSmallString);
5196 
5197  // check if delim is at the end of smallString
5198  // if yes, add an empty smallString in the result
5199  // ["one",""] = split "one/" "/"
5200  size_t lenD = strlen(delim);
5201  // +1 for sType
5202  if (icEqS(sStringGetTiny(self->data)+(self->_len-lenD), delim)) {
5203  pErrorNULL(listPushS(&r, ""));
5204  }
5205 
5206  return(r);
5207 }
5208 
5209 internal char** icSplitCharSSmallString(smallStringt *self, char c) {
5210 
5211  charToS(s, c);
5212  return(icSplitSSmallString(self, s));
5213 }
5214 
5215 internal char** icSplitSmallJsonSSmallString(smallStringt *self, smallJsont *delim) {
5216 
5217  if (!delim) {
5218  return(NULL);
5219  }
5220 
5221  if (checkObjectTypes && !isOSmallJson(delim)) {
5222  return(NULL);
5223  }
5224 
5225  const char *type = getTopTypeO(delim);
5226 
5227  if (!eqS(type,"string")) {
5228  return(NULL);
5229  }
5230 
5231  return(icSplitSSmallString(self, sjGet(delim)));
5232 }
5233 
5235 
5236  if (!delim) {
5237  return(NULL);
5238  }
5239  if (checkObjectTypes && !isOSmallString(delim)) {
5240  return(NULL);
5241  }
5242 
5243  return(icSplitSSmallString(self, ssGet(delim)));
5244 }
5245 
5246 internal smallArrayt* icExtractSmallString(smallStringt *self, const char* delim1, const char* delim2) {
5247  char **tmp = NULL;
5248  char **r = NULL;
5249 
5250  // sanity checks
5251  if (!self->data || !delim1 || !delim2) {
5252  return(NULL);
5253  }
5254 
5255  if (strEq(delim1, delim2)) {
5256  return(NULL);
5257  }
5258 
5259  tmp = icSplitSSmallString(self, delim1);;
5260 
5261  if (listLengthS(tmp) < 2) {
5262  // delim1 not found
5263  listFreeS(tmp);
5264  return(NULL);
5265  }
5266 
5267  // remove first element
5268  pErrorNULL(iListSliceS(&tmp, 1, 0));
5269 
5270  forEachCharP(tmp, e) {
5271  char **tmp2 = icSplit(*e, delim2);
5272  if (listLengthS(tmp2) > 1) {
5273  pErrorNULL(listPushS(&r, tmp2[0]));
5274  }
5275  listFreeS(tmp2);
5276  }
5277 
5278  listFreeS(tmp);
5279 
5280  if (!r) {
5281  return(NULL);
5282  }
5283 
5285  if (!a) {
5286  listFreeS(r);
5287  return(NULL);
5288  }
5289  a->f->fromArrayNFree(a, r, 0);
5290  return(a);
5291 }
5292 
5293 internal smallArrayt* icExtractCharSSmallString(smallStringt *self, char delim1, const char* delim2) {
5294 
5295  charToS(d1, delim1);
5296  return(icExtractSmallString(self, d1, delim2));
5297 }
5298 
5299 internal smallArrayt* icExtractSCharSmallString(smallStringt *self, const char* delim1, char delim2) {
5300 
5301  charToS(d2, delim2);
5302  return(icExtractSmallString(self, delim1, d2));
5303 }
5304 
5305 internal smallArrayt* icExtractCharCharSmallString(smallStringt *self, char delim1, char delim2) {
5306 
5307  charToS(d1, delim1);
5308  charToS(d2, delim2);
5309  return(icExtractSmallString(self, d1, d2));
5310 }
5311 
5313 
5314  if (!delim1 || !delim2) {
5315  return(NULL);
5316  }
5317 
5318  if (checkObjectTypes && !isOSmallJson(delim1)) {
5319  return(NULL);
5320  }
5321 
5322  if (checkObjectTypes && !isOSmallJson(delim2)) {
5323  return(NULL);
5324  }
5325 
5326  const char *type = getTopTypeO(delim1);
5327 
5328  if (!eqS(type,"string")) {
5329  return(NULL);
5330  }
5331 
5332  type = getTopTypeO(delim2);
5333 
5334  if (!eqS(type,"string")) {
5335  return(NULL);
5336  }
5337 
5338  return(icExtractSmallString(self, sjGet(delim1), sjGet(delim2)));
5339 }
5340 
5342 
5343  if (!delim1 || !delim2) {
5344  return(NULL);
5345  }
5346 
5347  if (checkObjectTypes && !isOSmallJson(delim1)) {
5348  return(NULL);
5349  }
5350 
5351  if (checkObjectTypes && !isOSmallString(delim2)) {
5352  return(NULL);
5353  }
5354 
5355  const char *type = getTopTypeO(delim1);
5356 
5357  if (!eqS(type,"string")) {
5358  return(NULL);
5359  }
5360 
5361  return(icExtractSmallString(self, sjGet(delim1), ssGet(delim2)));
5362 }
5363 
5364 internal smallArrayt* icExtractSmallJsonSSmallString(smallStringt *self, smallJsont* delim1, const char* delim2) {
5365 
5366  if (!delim1) {
5367  return(NULL);
5368  }
5369 
5370  if (checkObjectTypes && !isOSmallJson(delim1)) {
5371  return(NULL);
5372  }
5373 
5374  const char *type = getTopTypeO(delim1);
5375 
5376  if (!eqS(type,"string")) {
5377  return(NULL);
5378  }
5379 
5380  return(icExtractSmallString(self, sjGet(delim1), delim2));
5381 }
5382 
5384 
5385  if (!delim1) {
5386  return(NULL);
5387  }
5388 
5389  if (checkObjectTypes && !isOSmallJson(delim1)) {
5390  return(NULL);
5391  }
5392 
5393  const char *type = getTopTypeO(delim1);
5394 
5395  if (!eqS(type,"string")) {
5396  return(NULL);
5397  }
5398 
5399  charToS(d2, delim2);
5400  return(icExtractSmallString(self, sjGet(delim1), d2));
5401 }
5402 
5404 
5405  if (!delim1 || !delim2) {
5406  return(NULL);
5407  }
5408 
5409  if (checkObjectTypes && !isOSmallString(delim1)) {
5410  return(NULL);
5411  }
5412 
5413  if (checkObjectTypes && !isOSmallJson(delim2)) {
5414  return(NULL);
5415  }
5416 
5417  const char *type = getTopTypeO(delim2);
5418 
5419  if (!eqS(type,"string")) {
5420  return(NULL);
5421  }
5422 
5423  return(icExtractSmallString(self, ssGet(delim1), sjGet(delim2)));
5424 }
5425 
5427 
5428  if (!delim1 || !delim2) {
5429  return(NULL);
5430  }
5431 
5432  if (checkObjectTypes && !isOSmallString(delim1)) {
5433  return(NULL);
5434  }
5435 
5436  if (checkObjectTypes && !isOSmallString(delim2)) {
5437  return(NULL);
5438  }
5439 
5440  return(icExtractSmallString(self, ssGet(delim1), ssGet(delim2)));
5441 }
5442 
5443 internal smallArrayt* icExtractSmallStringSSmallString(smallStringt *self, smallStringt* delim1, const char* delim2) {
5444 
5445  if (!delim1) {
5446  return(NULL);
5447  }
5448  if (checkObjectTypes && !isOSmallString(delim1)) {
5449  return(NULL);
5450  }
5451 
5452  return(icExtractSmallString(self, ssGet(delim1), delim2));
5453 }
5454 
5456 
5457  if (!delim1) {
5458  return(NULL);
5459  }
5460  if (checkObjectTypes && !isOSmallString(delim1)) {
5461  return(NULL);
5462  }
5463 
5464  charToS(d2, delim2);
5465  return(icExtractSmallString(self, ssGet(delim1), d2));
5466 }
5467 
5468 internal smallArrayt* icExtractSSmallJsonSmallString(smallStringt *self, const char* delim1, smallJsont* delim2) {
5469 
5470  if (!delim2) {
5471  return(NULL);
5472  }
5473 
5474  if (checkObjectTypes && !isOSmallJson(delim2)) {
5475  return(NULL);
5476  }
5477 
5478  const char *type = getTopTypeO(delim2);
5479 
5480  if (!eqS(type,"string")) {
5481  return(NULL);
5482  }
5483 
5484  return(icExtractSmallString(self, delim1, sjGet(delim2)));
5485 }
5486 
5487 internal smallArrayt* icExtractSSmallStringSmallString(smallStringt *self, const char* delim1, smallStringt* delim2) {
5488 
5489  if (!delim2) {
5490  return(NULL);
5491  }
5492  if (checkObjectTypes && !isOSmallString(delim2)) {
5493  return(NULL);
5494  }
5495 
5496  return(icExtractSmallString(self, delim1, ssGet(delim2)));
5497 }
5498 
5500 
5501  if (!delim2) {
5502  return(NULL);
5503  }
5504 
5505  if (checkObjectTypes && !isOSmallJson(delim2)) {
5506  return(NULL);
5507  }
5508 
5509  const char *type = getTopTypeO(delim2);
5510 
5511  if (!eqS(type,"string")) {
5512  return(NULL);
5513  }
5514 
5515  charToS(d1, delim1);
5516  return(icExtractSmallString(self, d1, sjGet(delim2)));
5517 }
5518 
5520 
5521  if (!delim2) {
5522  return(NULL);
5523  }
5524  if (checkObjectTypes && !isOSmallString(delim2)) {
5525  return(NULL);
5526  }
5527 
5528  charToS(d1, delim1);
5529  return(icExtractSmallString(self, d1, ssGet(delim2)));
5530 }
5531 
5532 internal smallStringt* colorSmallString(smallStringt *self, const char *colr) {
5533 
5534  if (!self->data || !colr) {
5535  return(NULL);
5536  }
5537 
5538  char *s = catS(colr, sStringGetTiny(self->data), RST);
5539  setSmallString(self, s);
5540  free(s);
5541  return(self);
5542 }
5543 
5544 internal char* colordSmallString(smallStringt *self, const char *color) {
5545 
5546  if (!self->data || !color) {
5547  return(NULL);
5548  }
5549  if (isEmptySmallString(self)) {
5550  return(emptySF());
5551  }
5552  return(catS(color, sStringGetTiny(self->data), RST));
5553 }
5554 
5555 internal smallStringt* readFileSmallString(smallStringt *self, const char *filePath) {
5556  FILE *f = NULL;
5557  ssize_t len;
5558  size_t readStatus;
5559 
5560  // sanity checks
5561  if (!filePath || isBlankS(filePath)) {
5562  return(NULL);
5563  }
5564 
5565  len = fileSize(filePath);;
5566  if (len == -1) {
5567  return(NULL);
5568  }
5569 
5570  free(self->data);
5571 
5572  // +1 to add \0 at the end
5573  self->data = malloc((size_t)len+2);
5574  if (!self->data) {
5575  return(NULL);
5576  }
5577 
5578  f = fopen(filePath, "r");
5579  if (!f) {
5580  pFuncError
5581  shEPrintfS("The path was: \"%s\"\n", filePath);
5582  return(NULL);
5583  }
5584  readStatus = fread(((char *)self->data)+1, 1, (size_t)len , f);
5585  fclose(f);
5586 
5587  self->data->type = STRING;
5588 
5589  if (readStatus != (size_t)len) {
5590  pFuncError
5591  shEPrintfS("The path was: \"%s\"\n", filePath);
5592  return(NULL);
5593  }
5594 
5595  *((char*)self->data+len+1) = 0;
5596  self->_len = (size_t)len;
5597 
5598  return(self);
5599 }
5600 
5602 
5603  if (!filePath) {
5604  return(NULL);
5605  }
5606 
5607  if (checkObjectTypes && !isOSmallJson(filePath)) {
5608  return(NULL);
5609  }
5610 
5611  const char *type = getTopTypeO(filePath);
5612 
5613  if (!eqS(type,"string")) {
5614  return(NULL);
5615  }
5616 
5617  return(readFileSmallString(self, getTopSO(filePath)));
5618 }
5619 
5621 
5622  if (!filePath) {
5623  return(NULL);
5624  }
5625 
5626  if (checkObjectTypes && !isOSmallString(filePath)) {
5627  return(NULL);
5628  }
5629 
5630  return(readFileSmallString(self, ssGet(filePath)));
5631 }
5632 
5634  ssize_t len;
5635  size_t readStatus;
5636 
5637  // sanity checks
5638  if (!fp) {
5639  return(NULL);
5640  }
5641 
5642  len = fileSizeFP(fp);;
5643  if (len == -1) {
5644  return(NULL);
5645  }
5646 
5647  free(self->data);
5648 
5649  // +1 to add \0 at the end
5650  self->data = malloc((size_t)len+2);
5651  if (!self->data) {
5652  return(NULL);
5653  }
5654 
5655  readStatus = fread(&self->data->data, 1, (size_t)len , fp);
5656 
5657  self->data->type = STRING;
5658 
5659  if (readStatus != (size_t)len) {
5660  pFuncError
5661  return(NULL);
5662  }
5663 
5664  *(&self->data->data+len) = 0;
5665  self->_len = (size_t)len;
5666 
5667  return(self);
5668 }
5669 
5670 internal int writeFileSmallString(smallStringt *self, const char *filePath) {
5671  FILE *f = NULL;
5672  size_t len;
5673  size_t writeStatus;
5674 
5675  // sanity checks
5676  if (!filePath || isBlankS(filePath) || !self->data) {
5677  return(0);
5678  }
5679 
5680  len = self->_len;
5681 
5682  f = fopen(filePath, "w");
5683  if (!f) {
5684  pFuncError
5685  shEPrintfS("The path was: \"%s\"\n", filePath);
5686  return(0);
5687  }
5688  writeStatus = fwrite(sStringGetTiny(self->data), 1, len , f);
5689  fclose(f);
5690 
5691  if (writeStatus != len) {
5692  pFuncError
5693  shEPrintfS("The path was: \"%s\"\n", filePath);
5694  return(0);
5695  }
5696 
5697  return(1);
5698 }
5699 
5701 
5702  if (!filePath) {
5703  return(0);
5704  }
5705 
5706  if (checkObjectTypes && !isOSmallJson(filePath)) {
5707  return(0);
5708  }
5709 
5710  const char *type = getTopTypeO(filePath);
5711 
5712  if (!eqS(type,"string")) {
5713  return(0);
5714  }
5715 
5716  return(writeFileSmallString(self, getTopSO(filePath)));
5717 }
5718 
5720 
5721  if (!filePath) {
5722  return(0);
5723  }
5724 
5725  if (checkObjectTypes && !isOSmallString(filePath)) {
5726  return(0);
5727  }
5728 
5729  return(writeFileSmallString(self, ssGet(filePath)));
5730 }
5731 
5732 internal int writeStreamSmallString(smallStringt *self, FILE *fp) {
5733  size_t len;
5734  size_t writeStatus;
5735 
5736  // sanity checks
5737  if (!fp || !self->data) {
5738  return(0);
5739  }
5740 
5741  len = self->_len;
5742 
5743  writeStatus = fwrite(sStringGetTiny(self->data), 1, len , fp);
5744 
5745  if (writeStatus != len) {
5746  pFuncError
5747  return(0);
5748  }
5749 
5750  return(1);
5751 }
5752 
5753 internal int appendFileSmallString(smallStringt *self, const char *filePath) {
5754  FILE *f = NULL;
5755  size_t len;
5756  size_t writeStatus;
5757 
5758  // sanity checks
5759  if (!filePath || isBlankS(filePath) || !self->data) {
5760  return(0);
5761  }
5762 
5763  len = self->_len;
5764 
5765  f = fopen(filePath, "a");
5766  if (!f) {
5767  pFuncError
5768  shEPrintfS("The path was: \"%s\"\n", filePath);
5769  return(0);
5770  }
5771  writeStatus = fwrite(sStringGetTiny(self->data), 1, len , f);
5772  fclose(f);
5773 
5774  if (writeStatus != len) {
5775  pFuncError
5776  shEPrintfS("The path was: \"%s\"\n", filePath);
5777  return(0);
5778  }
5779 
5780  return(1);
5781 }
5782 
5784 
5785  if (!filePath) {
5786  return(0);
5787  }
5788  if (checkObjectTypes && !isOSmallString(filePath)) {
5789  return(0);
5790  }
5791 
5792  return(appendFileSmallString(self, ssGet(filePath)));
5793 }
5794 
5796 
5797  return(self->f->duplicate(self));
5798 }
5799 
5800 void freeSmallStringG (smallStringt *self) {self->f->free(self);}
5801 
5803 
5804  return(self->f->setBool(self, p2));
5805 }
5806 
5808 
5809  return(self->f->setDouble(self, p2));
5810 }
5811 
5813 
5814  return(self->f->setInt64(self, p2));
5815 }
5816 
5818 
5819  return(self->f->setInt32(self, p2));
5820 }
5821 
5823 
5824  return(self->f->setUint32(self, p2));
5825 }
5826 
5828 
5829  return(self->f->setUint64(self, p2));
5830 }
5831 
5832 smallStringt* setSmallStringG(smallStringt* self, const char* p2) {
5833 
5834  return(self->f->set(self, p2));
5835 }
5836 
5838 
5839  return(self->f->setChar(self,c));
5840 }
5841 
5843 
5844  return(self->f->setSmallArray(self, p2));
5845 }
5846 
5848 
5849  return(self->f->setFromSmallDict(self, p2));
5850 }
5851 
5853 
5854  return(self->f->setFromSmallJson(self, p2));
5855 }
5856 
5858 
5859  return(self->f->setSmallBool(self, p2));
5860 }
5861 
5863 
5864  return(self->f->setSmallDouble(self, p2));
5865 }
5866 
5868 
5869  return(self->f->setSmallInt(self, p2));
5870 }
5871 
5873 
5874  return(self->f->setSmallJson(self, p2));
5875 }
5876 
5878 
5879  return(self->f->setSmallString(self, p2));
5880 }
5881 
5882 
5883 char getAtSmallStringG(smallStringt *self, char retType UNUSED, int64_t index) {
5884 
5885  return(self->f->getAt(self, index));
5886 }
5887 
5888 smallStringt* setAtSmallStringG(smallStringt *self, int64_t index, char c) {
5889 
5890  return(self->f->setAt(self, index, c));
5891 }
5892 
5894 
5895  return(self->f->append(self, string));
5896 }
5897 
5899 
5900  return(self->f->appendSmallJson(self, string));
5901 }
5902 
5903 smallStringt* appendSSmallStringG (smallStringt *self, const char *string) {
5904 
5905  return(self->f->appendS(self, string));
5906 }
5907 
5909 
5910  return(self->f->appendChar(self,c));
5911 }
5912 
5914 
5915  return(self->f->appendNSmash(self,string));
5916 }
5917 
5919 
5920  return(self->f->appendNSmashSmallJson(self,string));
5921 }
5922 
5924 
5925  return(self->f->appendNSmashS(self, string));
5926 }
5927 
5928 
5930 
5931  return(self->f->prepend(self, string));
5932 }
5933 
5935 
5936  return(self->f->prependSmallJson(self, json));
5937 }
5938 
5939 smallStringt* prependSSmallStringG (smallStringt *self, const char *string) {
5940 
5941  return(self->f->prependS(self, string));
5942 }
5943 
5945 
5946  return(self->f->prependChar(self,c));
5947 }
5948 
5950 
5951  return(self->f->prependNSmash(self, string));
5952 }
5953 
5955 
5956  return(self->f->prependNSmashSmallJson(self, json));
5957 }
5958 
5960 
5961  return(self->f->prependNSmashS(self, string));
5962 }
5963 
5964 
5965 smallStringt* replaceSmallStringG (smallStringt *self, const char *olds, const char *news, size_t max) {
5966 
5967  return(self->f->replace(self, olds, news, max));
5968 }
5969 
5970 smallStringt* replaceCharSSmallStringG(smallStringt *self, char olds, const char *news, size_t max) {
5971 
5972  return(self->f->replaceCharS(self,olds,news,max));
5973 }
5974 
5975 smallStringt* replaceSCharSmallStringG(smallStringt *self, const char *olds, char news, size_t max) {
5976 
5977  return(self->f->replaceSChar(self,olds,news,max));
5978 }
5979 
5980 smallStringt* replaceCharCharSmallStringG(smallStringt *self, char olds, char news, size_t max) {
5981 
5982  return(self->f->replaceCharChar(self,olds,news,max));
5983 }
5984 
5986 
5987  return(self->f->replaceSmallJsonSmallJson(self,olds,news,max));
5988 }
5989 
5991 
5992  return(self->f->replaceSmallJsonSmallString(self,olds,news,max));
5993 }
5994 
5995 smallStringt* replaceSmallJsonSSmallStringG(smallStringt *self, smallJsont *olds, const char *news, size_t max) {
5996 
5997  return(self->f->replaceSmallJsonS(self,olds,news,max));
5998 }
5999 
6001 
6002  return(self->f->replaceSmallJsonChar(self,olds,news,max));
6003 }
6004 
6006 
6007  return(self->f->replaceSmallStringSmallJson(self,olds,news,max));
6008 }
6009 
6011 
6012  return(self->f->replaceSmallStringSmallString(self,olds,news,max));
6013 }
6014 
6015 smallStringt* replaceSmallStringSSmallStringG(smallStringt *self, smallStringt *olds, const char *news, size_t max) {
6016 
6017  return(self->f->replaceSmallStringS(self,olds,news,max));
6018 }
6019 
6021 
6022  return(self->f->replaceSmallStringChar(self,olds,news,max));
6023 }
6024 
6025 smallStringt* replaceSSmallJsonSmallStringG(smallStringt *self, const char *olds, smallJsont *news, size_t max) {
6026 
6027  return(self->f->replaceSSmallJson(self,olds,news,max));
6028 }
6029 
6030 smallStringt* replaceSSmallStringSmallStringG(smallStringt *self, const char *olds, smallStringt *news, size_t max) {
6031 
6032  return(self->f->replaceSSmallString(self,olds,news,max));
6033 }
6034 
6036 
6037  return(self->f->replaceCharSmallJson(self,olds,news,max));
6038 }
6039 
6041 
6042  return(self->f->replaceCharSmallString(self,olds,news,max));
6043 }
6044 
6045 smallStringt* icReplaceSmallStringG (smallStringt *self, const char *olds, const char *news, size_t max) {
6046 
6047  return(self->f->icReplace(self, olds, news, max));
6048 }
6049 
6050 smallStringt* icReplaceCharSSmallStringG(smallStringt *self, char olds, const char *news, size_t max) {
6051 
6052  return(self->f->icReplaceCharS(self,olds,news,max));
6053 }
6054 
6055 smallStringt* icReplaceSCharSmallStringG(smallStringt *self, const char *olds, char news, size_t max) {
6056 
6057  return(self->f->icReplaceSChar(self,olds,news,max));
6058 }
6059 
6060 smallStringt* icReplaceCharCharSmallStringG(smallStringt *self, char olds, char news, size_t max) {
6061 
6062  return(self->f->icReplaceCharChar(self,olds,news,max));
6063 }
6064 
6066 
6067  return(self->f->icReplaceSmallJsonSmallJson(self,olds,news,max));
6068 }
6069 
6071 
6072  return(self->f->icReplaceSmallJsonSmallString(self,olds,news,max));
6073 }
6074 
6075 smallStringt* icReplaceSmallJsonSSmallStringG(smallStringt *self, smallJsont *olds, const char *news, size_t max) {
6076 
6077  return(self->f->icReplaceSmallJsonS(self,olds,news,max));
6078 }
6079 
6081 
6082  return(self->f->icReplaceSmallJsonChar(self,olds,news,max));
6083 }
6084 
6086 
6087  return(self->f->icReplaceSmallStringSmallJson(self,olds,news,max));
6088 }
6089 
6091 
6092  return(self->f->icReplaceSmallStringSmallString(self,olds,news,max));
6093 }
6094 
6095 smallStringt* icReplaceSmallStringSSmallStringG(smallStringt *self, smallStringt *olds, const char *news, size_t max) {
6096 
6097  return(self->f->icReplaceSmallStringS(self,olds,news,max));
6098 }
6099 
6101 
6102  return(self->f->icReplaceSmallStringChar(self,olds,news,max));
6103 }
6104 
6105 smallStringt* icReplaceSSmallJsonSmallStringG(smallStringt *self, const char *olds, smallJsont *news, size_t max) {
6106 
6107  return(self->f->icReplaceSSmallJson(self,olds,news,max));
6108 }
6109 
6110 smallStringt* icReplaceSSmallStringSmallStringG(smallStringt *self, const char *olds, smallStringt *news, size_t max) {
6111 
6112  return(self->f->icReplaceSSmallString(self,olds,news,max));
6113 }
6114 
6116 
6117  return(self->f->icReplaceCharSmallJson(self,olds,news,max));
6118 }
6119 
6121 
6122  return(self->f->icReplaceCharSmallString(self,olds,news,max));
6123 }
6124 
6126 
6127  return(self->f->equal(self, p2));
6128 }
6129 
6131 
6132  return(self->f->equalChar(self,c));
6133 }
6134 
6135 bool equalSSmallStringG (smallStringt *self, const char *string) {
6136 
6137  return(self->f->equalS(self, string));
6138 }
6139 
6141 
6142  return(self->f->equalBase(self, p2));
6143 }
6144 
6145 bool equalSmallStringBoolG(smallStringt* self, bool p2) {
6146 
6147  return(self->f->equalBool(self, p2));
6148 }
6149 
6150 bool equalSmallStringDoubleG(smallStringt* self, double p2) {
6151 
6152  return(self->f->equalDouble(self, p2));
6153 }
6154 
6155 bool equalSmallStringInt64G(smallStringt* self, int64_t p2) {
6156 
6157  return(self->f->equalInt64(self, p2));
6158 }
6159 
6160 bool equalSmallStringInt32G(smallStringt* self, int32_t p2) {
6161 
6162  return(self->f->equalInt32(self, p2));
6163 }
6164 
6165 bool equalSmallStringUint32G(smallStringt* self, uint32_t p2) {
6166 
6167  return(self->f->equalUint32(self, p2));
6168 }
6169 
6170 bool equalSmallStringUint64G(smallStringt* self, uint64_t p2) {
6171 
6172  return(self->f->equalUint64(self, p2));
6173 }
6174 
6176 
6177  return(self->f->equalSmallBool(self, p2));
6178 }
6179 
6181 
6182  return(self->f->equalSmallBytes(self, p2));
6183 }
6184 
6186 
6187  return(self->f->equalSmallDouble(self, p2));
6188 }
6189 
6191 
6192  return(self->f->equalSmallInt(self, p2));
6193 }
6194 
6196 
6197  return(self->f->equalSmallJson(self, p2));
6198 }
6199 
6201 
6202  return(self->f->icEqual(self, p2));
6203 }
6204 
6206 
6207  return(self->f->icEqualChar(self,c));
6208 }
6209 
6210 bool icEqualSSmallStringG (smallStringt *self, const char *string) {
6211 
6212  return(self->f->icEqualS(self, string));
6213 }
6214 
6216 
6217  return(self->f->icEqualBase(self, p2));
6218 }
6219 
6221 
6222  return(self->f->icEqualSmallJson(self, p2));
6223 }
6224 
6225 bool equalISSmallStringG (smallStringt *self, const char *string, int64_t index) {
6226 
6227  return(self->f->equalIS(self, string, index));
6228 }
6229 
6230 bool equalICharSmallStringG(smallStringt *self, char c, int64_t index) {
6231 
6232  return(self->f->equalIChar(self,c,index));
6233 }
6234 
6235 bool equalISmallJsonSmallStringG(smallStringt *self, smallJsont *string, int64_t index) {
6236 
6237  return(self->f->equalISmallJson(self,string,index));
6238 }
6239 
6240 bool equalISmallStringSmallStringG(smallStringt *self, smallStringt *string, int64_t index) {
6241 
6242  return(self->f->equalISmallString(self,string,index));
6243 }
6244 
6245 bool startsWithSSmallStringG (smallStringt *self, const char *string) {
6246 
6247  return(self->f->startsWithS(self, string));
6248 }
6249 
6251 
6252  return(self->f->startsWithChar(self,c));
6253 }
6254 
6256 
6257  return(self->f->startsWithSmallJson(self,string));
6258 }
6259 
6261 
6262  return(self->f->startsWithSmallString(self,string));
6263 }
6264 
6265 bool endsWithSSmallStringG (smallStringt *self, const char *string) {
6266 
6267  return(self->f->endsWithS(self, string));
6268 }
6269 
6271 
6272  return(self->f->endsWithChar(self,c));
6273 }
6274 
6276 
6277  return(self->f->endsWithSmallJson(self,string));
6278 }
6279 
6281 
6282  return(self->f->endsWithSmallString(self,string));
6283 }
6284 
6285 ssize_t countSSmallStringG (smallStringt *self, const char *string) {
6286 
6287  return(self->f->countS(self, string));
6288 }
6289 
6290 ssize_t countCharSmallStringG(smallStringt *self, char c) {
6291 
6292  return(self->f->countChar(self,c));
6293 }
6294 
6296 
6297  return(self->f->countSmallJson(self,string));
6298 }
6299 
6301 
6302  return(self->f->countSmallString(self,string));
6303 }
6304 
6305 bool icStartsWithSSmallStringG (smallStringt *self, const char *string) {
6306 
6307  return(self->f->icStartsWithS(self, string));
6308 }
6309 
6311 
6312  return(self->f->icStartsWithChar(self,c));
6313 }
6314 
6316 
6317  return(self->f->icStartsWithSmallJson(self,string));
6318 }
6319 
6321 
6322  return(self->f->icStartsWithSmallString(self,string));
6323 }
6324 
6325 bool icEndsWithSSmallStringG (smallStringt *self, const char *string) {
6326 
6327  return(self->f->icEndsWithS(self, string));
6328 }
6329 
6331 
6332  return(self->f->icEndsWithChar(self,c));
6333 }
6334 
6336 
6337  return(self->f->icEndsWithSmallJson(self,string));
6338 }
6339 
6341 
6342  return(self->f->icEndsWithSmallString(self,string));
6343 }
6344 
6345 ssize_t icCountSSmallStringG (smallStringt *self, const char *string) {
6346 
6347  return(self->f->icCountS(self, string));
6348 }
6349 
6351 
6352  return(self->f->icCountChar(self,c));
6353 }
6354 
6356 
6357  return(self->f->icCountSmallJson(self,string));
6358 }
6359 
6361 
6362  return(self->f->icCountSmallString(self,string));
6363 }
6364 
6366 
6367  return(self->f->isNumber(self));
6368 }
6369 
6371 
6372  return(self->f->isInt(self));
6373 }
6374 
6376 
6377  return(self->f->parseInt(self));
6378 }
6379 
6381 
6382  return(self->f->intTo(self, n));
6383 }
6384 
6386 
6387  return(self->f->parseDouble(self));
6388 }
6389 
6391 
6392  return(self->f->doubleTo(self, n));
6393 }
6394 
6396 
6397  return(self->f->len(self));
6398 }
6399 
6401 
6402  return(self->f->upper(self));
6403 }
6404 
6406 
6407  return(self->f->lower(self));
6408 }
6409 
6411 
6412  return(self->f->trim(self));
6413 }
6414 
6416 
6417  return(self->f->lTrim(self));
6418 }
6419 
6421 
6422  return(self->f->rTrim(self));
6423 }
6424 
6426 
6427  return(self->f->uniq(self, c));
6428 }
6429 
6431 
6432  return(self->f->icUniq(self, c));
6433 }
6434 
6435 smallStringt* sliceSmallStringG (smallStringt *self, int64_t start, int64_t end) {
6436 
6437  return(self->f->slice(self, start, end));
6438 }
6439 
6440 smallStringt* cropSmallStringG (smallStringt *self, int64_t start, int64_t end) {
6441 
6442  return(self->f->crop(self, start, end));
6443 }
6444 
6445 char* cropSSmallStringG (smallStringt *self, int64_t start, int64_t end) {
6446 
6447  return(self->f->cropS(self, start, end));
6448 }
6449 
6450 smallJsont* cropSmallJsonSmallStringG(smallStringt *self, int64_t start, int64_t end) {
6451 
6452  return(self->f->cropSmallJson(self, start, end));
6453 }
6454 
6455 char cropElemSmallStringG (smallStringt *self, int64_t index) {
6456 
6457  return(self->f->cropElem(self, index));
6458 }
6459 
6460 smallStringt* copySmallStringG(smallStringt *self, int64_t start, int64_t end) {
6461 
6462  return(self->f->copy(self, start, end));
6463 }
6464 
6465 smallStringt* insertSmallStringG (smallStringt *self, int64_t index, smallStringt *toInsert) {
6466 
6467  return(self->f->insert(self, index, toInsert));
6468 }
6469 
6471 
6472  return(self->f->insertSmallJson(self, index, toInsert));
6473 }
6474 
6475 smallStringt* insertSSmallStringG (smallStringt *self, int64_t index, const char *toInsert) {
6476 
6477  return(self->f->insertS(self, index, toInsert));
6478 }
6479 
6481 
6482  return(self->f->insertNFree(self, index, toInsert));
6483 }
6484 
6486 
6487  return(self->f->insertNFreeSmallJson(self, index, toInsert));
6488 }
6489 
6490 smallStringt* insertSNFreeSmallStringG(smallStringt *self, int64_t index, char *toInsert) {
6491 
6492  return(self->f->insertSNFree(self, index, toInsert));
6493 }
6494 
6495 smallStringt* injectSmallStringG (smallStringt *self, int64_t index, char toInject) {
6496 
6497  return(self->f->inject(self, index, toInject));
6498 }
6499 
6500 smallStringt* delSmallStringG (smallStringt *self, int64_t start, int64_t end) {
6501 
6502  return(self->f->del(self, start, end));
6503 }
6504 
6506 
6507  return(self->f->delElem(self, index));
6508 }
6509 
6510 char* hasSmallStringG (smallStringt *self, const char *needle) {
6511 
6512  return(self->f->has(self, needle));
6513 }
6514 
6515 char* hasCharSmallStringG(smallStringt *self, char c) {
6516 
6517  return(self->f->hasChar(self,c));
6518 }
6519 
6521 
6522  return(self->f->hasSmallJson(self,needle));
6523 }
6524 
6526 
6527  return(self->f->hasSmallString(self,needle));
6528 }
6529 
6530 smallStringt* findSmallStringG(smallStringt *self, const char *needle) {
6531 
6532  return(self->f->find(self, needle));
6533 }
6534 
6536 
6537  return(self->f->findChar(self,c));
6538 }
6539 
6541 
6542  return(self->f->findSmallJson(self,needle));
6543 }
6544 
6546 
6547  return(self->f->findSmallString(self,needle));
6548 }
6549 
6550 ssize_t indexOfSmallStringG(smallStringt *self, const char *needle) {
6551 
6552  return(self->f->indexOf(self,needle));
6553 }
6554 
6556 
6557  return(self->f->indexOfChar(self,c));
6558 }
6559 
6561 
6562  return(self->f->indexOfSmallJson(self,needle));
6563 }
6564 
6566 
6567  return(self->f->indexOfSmallString(self,needle));
6568 }
6569 
6570 char* icHasSmallStringG (smallStringt *self, const char *needle) {
6571 
6572  return(self->f->icHas(self, needle));
6573 }
6574 
6576 
6577  return(self->f->icHasChar(self,c));
6578 }
6579 
6581 
6582  return(self->f->icHasSmallJson(self,needle));
6583 }
6584 
6586 
6587  return(self->f->icHasSmallString(self,needle));
6588 }
6589 
6590 smallStringt* icFindSmallStringG(smallStringt *self, const char *needle) {
6591 
6592  return(self->f->icFind(self, needle));
6593 }
6594 
6596 
6597  return(self->f->icFindChar(self,c));
6598 }
6599 
6601 
6602  return(self->f->icFindSmallJson(self,needle));
6603 }
6604 
6606 
6607  return(self->f->icFindSmallString(self,needle));
6608 }
6609 
6610 ssize_t icIndexOfSmallStringG(smallStringt *self, const char *needle) {
6611 
6612  return(self->f->icIndexOf(self,needle));
6613 }
6614 
6616 
6617  return(self->f->icIndexOfChar(self,c));
6618 }
6619 
6621 
6622  return(self->f->icIndexOfSmallJson(self,needle));
6623 }
6624 
6626 
6627  return(self->f->icIndexOfSmallString(self,needle));
6628 }
6629 
6631 
6632  return(self->f->empty(self));
6633 }
6634 
6636 
6637  return(self->f->isEmpty(self));
6638 }
6639 
6641 
6642  return(self->f->isBlank(self));
6643 }
6644 
6645 smallArrayt* splitSmallStringG(smallStringt *self, const char *delim) {
6646 
6647  return(self->f->split(self, delim));
6648 }
6649 
6651 
6652  return(self->f->splitChar(self,c));
6653 }
6654 
6656 
6657  return(self->f->splitSmallJson(self,delim));
6658 }
6659 
6661 
6662  return(self->f->splitSmallString(self,delim));
6663 }
6664 
6665 char** splitCharPSSmallStringG(smallStringt *self, const char* delim) {
6666 
6667  return(self->f->splitS(self,delim));
6668 }
6669 
6671 
6672  return(self->f->splitCharS(self,c));
6673 }
6674 
6676 
6677  return(self->f->splitSmallJsonS(self,delim));
6678 }
6679 
6681 
6682  return(self->f->splitSmallStringS(self,delim));
6683 }
6684 
6685 smallArrayt* extractSmallStringG(smallStringt *self, const char* delim1, const char* delim2) {
6686 
6687  return(self->f->extract(self, delim1, delim2));
6688 }
6689 
6690 smallArrayt* extractCharSSmallStringG(smallStringt *self, char delim1, const char* delim2) {
6691 
6692  return(self->f->extractCharS(self,delim1,delim2));
6693 }
6694 
6695 smallArrayt* extractSCharSmallStringG(smallStringt *self, const char* delim1, char delim2) {
6696 
6697  return(self->f->extractSChar(self,delim1,delim2));
6698 }
6699 
6700 smallArrayt* extractCharCharSmallStringG(smallStringt *self, char delim1, char delim2) {
6701 
6702  return(self->f->extractCharChar(self,delim1,delim2));
6703 }
6704 
6706 
6707  return(self->f->extractSmallJsonSmallJson(self,delim1,delim2));
6708 }
6709 
6711 
6712  return(self->f->extractSmallJsonSmallString(self,delim1,delim2));
6713 }
6714 
6716 
6717  return(self->f->extractSmallJsonS(self,delim1,delim2));
6718 }
6719 
6721 
6722  return(self->f->extractSmallJsonChar(self,delim1,delim2));
6723 }
6724 
6726 
6727  return(self->f->extractSmallStringSmallJson(self,delim1,delim2));
6728 }
6729 
6731 
6732  return(self->f->extractSmallStringSmallString(self,delim1,delim2));
6733 }
6734 
6736 
6737  return(self->f->extractSmallStringS(self,delim1,delim2));
6738 }
6739 
6741 
6742  return(self->f->extractSmallStringChar(self,delim1,delim2));
6743 }
6744 
6746 
6747  return(self->f->extractSSmallJson(self,delim1,delim2));
6748 }
6749 
6751 
6752  return(self->f->extractSSmallString(self,delim1,delim2));
6753 }
6754 
6756 
6757  return(self->f->extractCharSmallJson(self,delim1,delim2));
6758 }
6759 
6761 
6762  return(self->f->extractCharSmallString(self,delim1,delim2));
6763 }
6764 
6765 smallArrayt* icSplitSmallStringG (smallStringt *self, const char *delim) {
6766 
6767  return(self->f->icSplit(self, delim));
6768 }
6769 
6771 
6772  return(self->f->icSplitChar(self, c));
6773 }
6774 
6776 
6777  return(self->f->icSplitSmallJson(self, delim));
6778 }
6779 
6781 
6782  return(self->f->icSplitSmallString(self, delim));
6783 }
6784 
6785 char** icSplitCharPSSmallStringG (smallStringt *self, char *delim) {
6786 
6787  return(self->f->icSplitS(self, delim));
6788 }
6789 
6791 
6792  return(self->f->icSplitCharS(self, c));
6793 }
6794 
6796 
6797  return(self->f->icSplitSmallJsonS(self, delim));
6798 }
6799 
6801 
6802  return(self->f->icSplitSmallStringS(self, delim));
6803 }
6804 
6805 smallArrayt* icExtractSmallStringG(smallStringt *self, const char* delim1, const char* delim2) {
6806 
6807  return(self->f->icExtract(self, delim1, delim2));
6808 }
6809 
6810 smallArrayt* icExtractCharSSmallStringG (smallStringt *self, char delim1, const char* delim2) {
6811 
6812  return(self->f->icExtractCharS(self,delim1,delim2));
6813 }
6814 
6815 smallArrayt* icExtractSCharSmallStringG (smallStringt *self, const char* delim1, char delim2) {
6816 
6817  return(self->f->icExtractSChar(self,delim1,delim2));
6818 }
6819 
6820 smallArrayt* icExtractCharCharSmallStringG (smallStringt *self, char delim1, char delim2) {
6821 
6822  return(self->f->icExtractCharChar(self,delim1,delim2));
6823 }
6824 
6826 
6827  return(self->f->icExtractSmallJsonSmallJson(self,delim1,delim2));
6828 }
6829 
6831 
6832  return(self->f->icExtractSmallJsonSmallString(self,delim1,delim2));
6833 }
6834 
6836 
6837  return(self->f->icExtractSmallJsonS(self,delim1,delim2));
6838 }
6839 
6841 
6842  return(self->f->icExtractSmallJsonChar(self,delim1,delim2));
6843 }
6844 
6846 
6847  return(self->f->icExtractSmallStringSmallJson(self,delim1,delim2));
6848 }
6849 
6851 
6852  return(self->f->icExtractSmallStringSmallString(self,delim1,delim2));
6853 }
6854 
6856 
6857  return(self->f->icExtractSmallStringS(self,delim1,delim2));
6858 }
6859 
6861 
6862  return(self->f->icExtractSmallStringChar(self,delim1,delim2));
6863 }
6864 
6866 
6867  return(self->f->icExtractSSmallJson(self,delim1,delim2));
6868 }
6869 
6871 
6872  return(self->f->icExtractSSmallString(self,delim1,delim2));
6873 }
6874 
6876 
6877  return(self->f->icExtractCharSmallJson(self,delim1,delim2));
6878 }
6879 
6881 
6882  return(self->f->icExtractCharSmallString(self,delim1,delim2));
6883 }
6884 
6885 smallStringt* readFileSmallStringG (smallStringt *self, const char *filePath) {
6886 
6887  return(self->f->readFile(self, filePath));
6888 }
6889 
6891 
6892  return(self->f->readFileSmallJson(self,filePath));
6893 }
6894 
6896 
6897  return(self->f->readFileSmallString(self,filePath));
6898 }
6899 
6901 
6902  return(self->f->readStream(self, fp));
6903 }
6904 
6905 int writeFileSmallStringG (smallStringt *self, const char *filePath) {
6906 
6907  return(self->f->writeFile(self, filePath));
6908 }
6909 
6911 
6912  return(self->f->writeFileSmallJson(self,filePath));
6913 }
6914 
6916 
6917  return(self->f->writeFileSmallString(self,filePath));
6918 }
6919 
6921 
6922  return(self->f->writeStream(self, fp));
6923 }
6924 
6925 int appendFileSmallStringFG (smallStringt *self, const char *filePath) {
6926 
6927  return(self->f->appendFile(self, filePath));
6928 }
6929 
6931 
6932  return(self->f->appendFileSmallString(self,filePath));
6933 }
6934 
internal bool endsWithSmallJsonSmallString(smallStringt *self, smallJsont *string)
internal smallStringt * icReplaceSCharSmallString(smallStringt *self, const char *olds, char news, size_t max)
internal const char * helpSmallString(smallStringt UNUSED *self)
#define getTopDoubleO(self)
void listFreeS(char **list)
list Free String
Definition: libsheepy.c:50780
internal smallStringt * setSmallArraySmallString(smallStringt *self, smallArrayt *p2)
internal smallStringt * readStreamSmallString(smallStringt *self, FILE *fp)
internal bool equalSSmallString(smallStringt *self, const char *string)
internal bool icEqualSmallString(smallStringt *self, smallStringt *string)
void sStringSetTiny(sStringt **string, const char *news)
set string in small string
char * s
#define charToS(dst, c)
Definition: libsheepy.h:1862
bool equalICharSmallStringG(smallStringt *self, char c, int64_t index)
size_t len
smallStringt * setUint64SmallStringG(smallStringt *self, uint64_t p2)
internal smallStringt * replaceManySmallString(smallStringt *self, const char *paramType,...)
internal void finishSmallString(smallStringt **self)
#define getTopBoolO(self)
bool eqS(const char *string1, const char *string2)
string Equal compare string1 to string2
Definition: libsheepy.c:9067
internal int writeFileSmallStringSmallString(smallStringt *self, smallStringt *filePath)
internal char cropElemSmallString(smallStringt *self, int64_t index)
internal smallStringt * pushNFreeManySmallString(smallStringt *self,...)
#define getTopArrayO(self)
bool isBlankS(const char *string)
is Blank String
Definition: libsheepy.c:50246
smallStringt * setSmallDoubleSmallStringG(smallStringt *self, smallDoublet *p2)
smallArrayt * extractSmallStringSmallJsonSmallStringG(smallStringt *self, smallStringt *delim1, smallJsont *delim2)
smallArrayt * extractCharCharSmallStringG(smallStringt *self, char delim1, char delim2)
internal smallArrayt * icExtractSmallString(smallStringt *self, const char *delim1, const char *delim2)
#define getTopSO(self)
internal smallArrayt * icExtractCharSmallJsonSmallString(smallStringt *self, char delim1, smallJsont *delim2)
internal bool icEndsWithSmallJsonSmallString(smallStringt *self, smallJsont *string)
internal char * colordSmallString(smallStringt *self, const char *color)
internal char * hasSmallStringSmallString(smallStringt *self, smallStringt *needle)
internal smallStringt * icReplaceSmallJsonSmallJsonSmallString(smallStringt *self, smallJsont *olds, smallJsont *news, size_t max)
internal smallStringt * setSmallIntSmallString(smallStringt *self, smallIntt *p2)
internal char ** splitSSmallString(smallStringt *self, const char *delim)
internal smallStringt * icFindSmallStringSmallString(smallStringt *self, smallStringt *needle)
internal smallArrayt * icExtractCharCharSmallString(smallStringt *self, char delim1, char delim2)
ssize_t countSmallJsonSmallStringG(smallStringt *self, smallJsont *string)
ssize_t icCountSmallJsonSmallStringG(smallStringt *self, smallJsont *string)
ssize_t icIndexOfCharSmallStringG(smallStringt *self, char c)
internal smallStringt * icReplaceCharCharSmallString(smallStringt *self, char olds, char news, size_t max)
smallArrayt * extractCharSSmallStringG(smallStringt *self, char delim1, const char *delim2)
smallStringt * prependNSmashSmallStringG(smallStringt *self, smallStringt *string)
internal void smashSmallString(smallStringt **self)
smallStringt * icReplaceSmallJsonCharSmallStringG(smallStringt *self, smallJsont *olds, char news, size_t max)
internal smallStringt * rTrimSmallString(smallStringt *self)
internal ssize_t indexOfSmallString(smallStringt *self, const char *needle)
free(s)
smallStringt * icReplaceSCharSmallStringG(smallStringt *self, const char *olds, char news, size_t max)
char * icHasSmallStringSmallStringG(smallStringt *self, smallStringt *needle)
internal bool icStartsWithCharSmallString(smallStringt *self, char c)
smallStringt * prependNSmashSmallJsonSmallStringG(smallStringt *self, smallJsont *json)
smallArrayt * icExtractSmallStringG(smallStringt *self, const char *delim1, const char *delim2)
#define ssGet(obj)
get a pointer to the string in the smallString object
#define equalSmallStringO(self, p2)
internal bool endsWithSSmallString(smallStringt *self, const char *string)
internal bool startsWithCharSmallString(smallStringt *self, char c)
char ** iListSliceS(char ***list, int64_t start, int64_t end)
list Slice String return list with elements from start and end in list negative indexes are allowed ...
Definition: libsheepy.c:52623
bool equalSmallStringInt32G(smallStringt *self, int32_t p2)
smallStringt * intToSmallStringG(smallStringt *self, int64_t n)
char * sStringEscapeTiny(sStringt *obj)
stringify string
smallStringt * cropSmallStringG(smallStringt *self, int64_t start, int64_t end)
internal smallStringt * prependNSmashSmallString(smallStringt *self, smallStringt *string)
internal ssize_t indexOfSmallStringSmallString(smallStringt *self, smallStringt *needle)
internal ssize_t icIndexOfSmallJsonSmallString(smallStringt *self, smallJsont *needle)
internal char * toStringSmallString(smallStringt *self)
smallArrayt * icExtractCharCharSmallStringG(smallStringt *self, char delim1, char delim2)
internal smallStringt * icReplaceManySmallString(smallStringt *self, const char *paramType,...)
internal smallArrayt * icExtractSmallJsonSmallJsonSmallString(smallStringt *self, smallJsont *delim1, smallJsont *delim2)
#define RST
reset for color function
Definition: libsheepy.h:763
internal smallStringt * insertSSmallString(smallStringt *self, int64_t index, const char *toInsert)
smallStringt * icFindSmallJsonSmallStringG(smallStringt *self, smallJsont *needle)
internal char * getSmallString(smallStringt *self)
smallStringt * setUint32SmallStringG(smallStringt *self, uint32_t p2)
internal smallStringt * icReplaceSmallStringCharSmallString(smallStringt *self, smallStringt *olds, char news, size_t max)
internal smallArrayt * extractSmallJsonSSmallString(smallStringt *self, smallJsont *delim1, const char *delim2)
#define getTopIntO(self)
smallStringt * replaceSSmallJsonSmallStringG(smallStringt *self, const char *olds, smallJsont *news, size_t max)
char ** icSplitCharSSmallStringG(smallStringt *self, char c)
internal char ** icSplitSmallStringSSmallString(smallStringt *self, smallStringt *delim)
internal smallStringt * appendCharSmallString(smallStringt *self, char c)
bool equalSmallStringSmallJsonG(smallStringt *self, smallJsont *p2)
internal smallStringt * setAtSmallString(smallStringt *self, int64_t index, char c)
internal bool icEqualCharSmallString(smallStringt *self, char c)
internal size_t lenSmallString(smallStringt *self)
internal smallArrayt * splitSmallJsonSmallString(smallStringt *self, smallJsont *delim)
#define u64
Definition: libsheepy.h:448
internal smallStringt * readFileSmallStringSmallString(smallStringt *self, smallStringt *filePath)
internal smallStringt * replaceCharSmallJsonSmallString(smallStringt *self, char olds, smallJsont *news, size_t max)
size_t lenSmallStringG(smallStringt *self)
internal smallStringt * findSmallString(smallStringt *self, const char *needle)
int writeFileSmallJsonSmallStringG(smallStringt *self, smallJsont *filePath)
smallArrayFunctionst * f
internal smallArrayt * splitCharSmallString(smallStringt *self, char c)
bool equalSSmallStringG(smallStringt *self, const char *string)
smallStringt * insertSNFreeSmallStringG(smallStringt *self, int64_t index, char *toInsert)
#define isOSmallInt(obj)
test if obj type is smallInt
char ** icSplitSmallJsonSSmallStringG(smallStringt *self, smallJsont *delim)
smallt * i
bool icEqualSmallStringBaseG(smallStringt *self, baset *p2)
smallStringt * setDoubleSmallStringG(smallStringt *self, double p2)
ssize_t countSSmallStringG(smallStringt *self, const char *string)
internal bool isBlankSmallString(smallStringt *self)
smallStringt * replaceSmallJsonSSmallStringG(smallStringt *self, smallJsont *olds, const char *news, size_t max)
bool icEqS(const char *string1, const char *string2)
ignore case string Equal compare string1 to string2
Definition: libsheepy.c:9283
char getAtSmallStringG(smallStringt *self, char retType UNUSED, int64_t index)
char * trimS(const char *string)
trim String duplicate string
Definition: libsheepy.c:11245
internal smallStringt * setDoubleSmallString(smallStringt *self, double p2)
smallArrayt * icExtractSmallStringCharSmallStringG(smallStringt *self, smallStringt *delim1, char delim2)
smallStringt * emptySmallStringG(smallStringt *self)
internal char ** splitSmallStringSSmallString(smallStringt *self, smallStringt *delim)
smallArrayt * splitSmallStringG(smallStringt *self, const char *delim)
internal bool icStartsWithSmallStringSmallString(smallStringt *self, smallStringt *string)
bool equalSmallStringInt64G(smallStringt *self, int64_t p2)
ssize_t fileSizeFP(FILE *fp)
get file size from file pointer
Definition: libsheepy.c:4401
#define emptyS(string)
Definition: libsheepy.h:2544
#define pFuncError
print function name and system error
Definition: libsheepy.h:306
internal smallStringt * insertNFreeSmallJsonSmallString(smallStringt *self, int64_t index, smallJsont *toInsert)
internal smallJsont * cropSmallJsonSmallString(smallStringt *self, int64_t start, int64_t end)
bool endsWithSmallJsonSmallStringG(smallStringt *self, smallJsont *string)
internal smallStringt * catSSmallString(smallStringt *self,...)
internal smallArrayt * icSplitSmallStringSmallString(smallStringt *self, smallStringt *delim)
internal int writeFileSmallString(smallStringt *self, const char *filePath)
internal smallArrayt * icExtractSmallJsonSmallStringSmallString(smallStringt *self, smallJsont *delim1, smallStringt *delim2)
smallStringt * setCharSmallStringG(smallStringt *self, char c)
smallArrayt * extractSSmallStringSmallStringG(smallStringt *self, const char *delim1, smallStringt *delim2)
internal smallStringt * icReplaceCharSmallStringSmallString(smallStringt *self, char olds, smallStringt *news, size_t max)
smallStringt * icFindCharSmallStringG(smallStringt *self, char c)
internal smallStringt * icReplaceSmallStringSSmallString(smallStringt *self, smallStringt *olds, const char *news, size_t max)
bool equalISmallStringSmallStringG(smallStringt *self, smallStringt *string, int64_t index)
smallArrayt * icSplitSmallJsonSmallStringG(smallStringt *self, smallJsont *delim)
base class for the small objects all small objects have a type
internal ssize_t icCountCharSmallString(smallStringt *self, char c)
smallDictt * d
internal smallStringt * appendSSmallString(smallStringt *self, const char *string)
internal smallStringt * replaceSmallJsonSmallStringSmallString(smallStringt *self, smallJsont *olds, smallStringt *news, size_t max)
internal int appendFileSmallStringSmallString(smallStringt *self, smallStringt *filePath)
bool equalISmallJsonSmallStringG(smallStringt *self, smallJsont *string, int64_t index)
char cropElemSmallStringG(smallStringt *self, int64_t index)
smallStringt * duplicateSmallStringG(smallStringt *self)
ssize_t countSmallStringSmallStringG(smallStringt *self, smallStringt *string)
smallStringt * icReplaceCharSSmallStringG(smallStringt *self, char olds, const char *news, size_t max)
smallStringt * appendNSmashSmallJsonSmallStringG(smallStringt *self, smallJsont *string)
smallStringt * replaceCharCharSmallStringG(smallStringt *self, char olds, char news, size_t max)
bool icEndsWithCharSmallStringG(smallStringt *self, char c)
internal char ** icSplitSmallJsonSSmallString(smallStringt *self, smallJsont *delim)
internal smallStringt * setInt32SmallString(smallStringt *self, int32_t p2)
smallStringt * findSmallStringSmallStringG(smallStringt *self, smallStringt *needle)
internal smallStringt * setFromSmallJsonSmallString(smallStringt *self, smallJsont *p2)
internal smallStringt * replaceSSmallStringSmallString(smallStringt *self, const char *olds, smallStringt *news, size_t max)
smallArrayt * splitSmallStringSmallStringG(smallStringt *self, smallStringt *delim)
ssize_t icIndexOfSmallJsonSmallStringG(smallStringt *self, smallJsont *needle)
smallStringt * setBoolSmallStringG(smallStringt *self, bool p2)
smallStringt * icReplaceSmallStringSmallJsonSmallStringG(smallStringt *self, smallStringt *olds, smallJsont *news, size_t max)
internal bool equalSmallStringDouble(smallStringt *self, double p2)
internal smallArrayt * icExtractSmallJsonSSmallString(smallStringt *self, smallJsont *delim1, const char *delim2)
internal smallStringt * upperSmallString(smallStringt *self)
#define helpTextSmallString
help text for this class It is public declaration so that child classes can add their help text easil...
internal char ** splitCharSSmallString(smallStringt *self, char c)
#define isError(assigned, left)
is Assigment Error catch error when assigned is false, 0 or NULL after being assigned with left ...
Definition: libsheepy.h:386
void cleanUpSmallStringFreeG(smallStringt **val)
smallStringt * replaceSmallStringSmallStringSmallStringG(smallStringt *self, smallStringt *olds, smallStringt *news, size_t max)
internal bool endsWithCharSmallString(smallStringt *self, char c)
internal smallArrayt * extractSmallString(smallStringt *self, const char *delim1, const char *delim2)
internal bool equalSmallStringSmallInt(smallStringt *self, smallIntt *p2)
smallStringt * doubleToSmallStringG(smallStringt *self, double n)
smallStringt * insertSSmallStringG(smallStringt *self, int64_t index, const char *toInsert)
bool endsWithSmallStringSmallStringG(smallStringt *self, smallStringt *string)
char * sStringGetTiny(sStringt *string)
get string in a small string object
smallStringt * icFindSmallStringG(smallStringt *self, const char *needle)
char ** icSplit(const char *string, const char *delim)
ignore case split string with delim string when updating this function, also update icSplitS (identic...
Definition: libsheepy.c:51407
internal smallStringt * replaceSmallStringCharSmallString(smallStringt *self, smallStringt *olds, char news, size_t max)
internal smallArrayt * icExtractSmallJsonCharSmallString(smallStringt *self, smallJsont *delim1, char delim2)
sBoolt * value
bool value
internal smallStringt * insertSmallString(smallStringt *self, int64_t index, smallStringt *toInsert)
char * hasSmallJsonSmallStringG(smallStringt *self, smallJsont *needle)
bool icStartsWithSSmallStringG(smallStringt *self, const char *string)
internal smallStringt * pushNFreeManySSmallString(smallStringt *self,...)
smallArrayt * icExtractCharSSmallStringG(smallStringt *self, char delim1, const char *delim2)
internal smallArrayt * splitSmallStringSmallString(smallStringt *self, smallStringt *delim)
internal smallArrayt * icExtractCharSmallStringSmallString(smallStringt *self, char delim1, smallStringt *delim2)
smallArrayt * icExtractSSmallJsonSmallStringG(smallStringt *self, const char *delim1, smallJsont *delim2)
internal smallStringt * icReplaceCharSmallJsonSmallString(smallStringt *self, char olds, smallJsont *news, size_t max)
int writeFileSmallStringSmallStringG(smallStringt *self, smallStringt *filePath)
#define pStrError(str)
print string and system error
Definition: libsheepy.h:311
internal ssize_t countSmallJsonSmallString(smallStringt *self, smallJsont *string)
internal void freeSmallString(smallStringt *self)
internal smallArrayt * extractSmallJsonSmallStringSmallString(smallStringt *self, smallJsont *delim1, smallStringt *delim2)
#define getTopTypeO(self)
bool equalSmallStringFG(smallStringt *self, smallStringt *p2)
bool icStartsWithSmallStringSmallStringG(smallStringt *self, smallStringt *string)
#define isOSmallJson(obj)
test if obj type is smallJson
int appendFileSmallStringFG(smallStringt *self, const char *filePath)
internal smallArrayt * icExtractSmallStringSSmallString(smallStringt *self, smallStringt *delim1, const char *delim2)
smallArrayt * icExtractSmallJsonSSmallStringG(smallStringt *self, smallJsont *delim1, const char *delim2)
smallStringt * setSmallBoolSmallStringG(smallStringt *self, smallBoolt *p2)
smallStringFunctionst * f
internal smallStringt * icReplaceSmallString(smallStringt *self, const char *olds, const char *news, size_t max)
smallStringt * delSmallStringG(smallStringt *self, int64_t start, int64_t end)
internal int64_t parseIntSmallString(smallStringt *self)
char * icTokS(char *s, const char *delim, char **saveptr)
ignore case token in String
Definition: libsheepy.c:16038
smallStringt * createSF(const char *paramType,...)
create String: f("qwd ", str," werr ", str2) like catS, concatenate strings to a new smallString ...
smallt * sDuplicateTiny(smallt *obj)
duplicate small object
smallStringt * upperSmallStringG(smallStringt *self)
internal smallStringt * prependSSmallString(smallStringt *self, const char *string)
#define createAllocateSmallJson(obj)
internal smallStringt * setSmallJsonSmallString(smallStringt *self, smallJsont *p2)
internal smallStringt * icUniqSmallString(smallStringt *self, char c)
internal smallArrayt * icExtractCharSSmallString(smallStringt *self, char delim1, const char *delim2)
smallArrayt * icExtractSmallStringSmallStringSmallStringG(smallStringt *self, smallStringt *delim1, smallStringt *delim2)
bool isIntSmallStringG(smallStringt *self)
#define terminateO(obj)
free buffers and obj itself
bool equalSmallStringSmallIntG(smallStringt *self, smallIntt *p2)
internal smallArrayt * extractSCharSmallString(smallStringt *self, const char *delim1, char delim2)
internal smallStringt * copySmallString(smallStringt *self, int64_t start, int64_t end)
smallStringt * setSmallStringSmallStringG(smallStringt *self, smallStringt *p2)
smallStringt * icReplaceSmallJsonSmallStringSmallStringG(smallStringt *self, smallJsont *olds, smallStringt *news, size_t max)
smallStringt * icReplaceSSmallStringSmallStringG(smallStringt *self, const char *olds, smallStringt *news, size_t max)
ssize_t indexOfS(const char *string, const char *needle)
indexOf String relative to start
Definition: libsheepy.c:15821
smallStringt * findSmallStringG(smallStringt *self, const char *needle)
pErrorNULL(iPrependS(&ks, "[1]"))
internal bool equalSmallStringSmallJson(smallStringt *self, smallJsont *p2)
smallStringt * rTrimSmallStringG(smallStringt *self)
smallStringt * prependCharSmallStringG(smallStringt *self, char c)
#define isOSmallBytes(obj)
test if obj type is smallBytes
smallArrayt * icExtractSmallStringSSmallStringG(smallStringt *self, smallStringt *delim1, const char *delim2)
internal smallStringt * prependSmallJsonSmallString(smallStringt *self, smallJsont *json)
internal smallStringt * icReplaceSmallJsonSmallStringSmallString(smallStringt *self, smallJsont *olds, smallStringt *news, size_t max)
double parseDoubleSmallStringG(smallStringt *self)
smallStringt * setFromSmallDictSmallStringG(smallStringt *self, smallDictt *p2)
smallStringt * findCharSmallStringG(smallStringt *self, char c)
internal smallStringt * insertSNFreeSmallString(smallStringt *self, int64_t index, char *toInsert)
bool icEqualCharSmallStringG(smallStringt *self, char c)
const char ** l
internal smallStringt * findCharSmallString(smallStringt *self, char c)
#define logBtrace
Definition: libsheepy.h:3249
smallStringt * replaceSmallJsonCharSmallStringG(smallStringt *self, smallJsont *olds, char news, size_t max)
internal smallStringt * sliceSmallString(smallStringt *self, int64_t start, int64_t end)
internal bool startsWithSSmallString(smallStringt *self, const char *string)
internal ssize_t icCountSmallJsonSmallString(smallStringt *self, smallJsont *string)
internal smallStringt * uniqSmallString(smallStringt *self, char c)
char * icHasCharSmallStringG(smallStringt *self, char c)
bool isBlankSmallStringG(smallStringt *self)
smallStringt * setInt32SmallStringG(smallStringt *self, int32_t p2)
uint32_t count
internal smallStringt * findSmallStringSmallString(smallStringt *self, smallStringt *needle)
ssize_t icIndexOfCharS(const char *string, char c)
Definition: libsheepy.c:15934
ssize_t indexOfSmallStringSmallStringG(smallStringt *self, smallStringt *needle)
internal smallArrayt * icSplitCharSmallString(smallStringt *self, char c)
internal bool icEndsWithSmallStringSmallString(smallStringt *self, smallStringt *string)
smallStringt * icReplaceSmallStringCharSmallStringG(smallStringt *self, smallStringt *olds, char news, size_t max)
internal smallStringt * appendNSmashSmallJsonSmallString(smallStringt *self, smallJsont *string)
smallStringt * lowerSmallStringG(smallStringt *self)
internal char * cropSSmallString(smallStringt *self, int64_t start, int64_t end)
char ** splitCharSSmallStringG(smallStringt *self, char c)
internal ssize_t indexOfSmallJsonSmallString(smallStringt *self, smallJsont *needle)
int writeFileSmallStringG(smallStringt *self, const char *filePath)
smallStringt * setAtSmallStringG(smallStringt *self, int64_t index, char c)
internal ssize_t icIndexOfSmallString(smallStringt *self, const char *needle)
internal bool equalSmallStringUint64(smallStringt *self, uint64_t p2)
internal smallStringt * replaceSmallJsonSmallJsonSmallString(smallStringt *self, smallJsont *olds, smallJsont *news, size_t max)
smallStringt * icReplaceSSmallJsonSmallStringG(smallStringt *self, const char *olds, smallJsont *news, size_t max)
void cleanUpSmallStringFinishG(smallStringt **val)
internal smallArrayt * extractSmallJsonSmallJsonSmallString(smallStringt *self, smallJsont *delim1, smallJsont *delim2)
internal smallStringt * delSmallString(smallStringt *self, int64_t start, int64_t end)
internal double parseDoubleSmallString(smallStringt *self)
toStringSmallStringFt toString
internal smallArrayt * extractSmallStringSmallJsonSmallString(smallStringt *self, smallStringt *delim1, smallJsont *delim2)
internal bool equalSmallStringSmallBytes(smallStringt *self, smallBytest *p2)
bool icEndsWithSmallJsonSmallStringG(smallStringt *self, smallJsont *string)
smallStringt * appendSmallJsonSmallStringG(smallStringt *self, smallJsont *string)
internal smallStringt * appendSmallJsonSmallString(smallStringt *self, smallJsont *string)
int writeStreamSmallStringG(smallStringt *self, FILE *fp)
internal char * escapeSmallString(smallStringt *self)
void cleanUpSmallStringFreeLocalG(smallStringt *val)
END_TEST FILE * fp
smallArrayt * icExtractCharSmallStringSmallStringG(smallStringt *self, char delim1, smallStringt *delim2)
internal smallStringt * replaceSCharSmallString(smallStringt *self, const char *olds, char news, size_t max)
char * cropSSmallStringG(smallStringt *self, int64_t start, int64_t end)
internal ssize_t countCharSmallString(smallStringt *self, char c)
ssize_t icIndexOfS(const char *string, const char *needle)
ignore case indexOf String relative to start
Definition: libsheepy.c:15925
internal smallStringt * setSmallBoolSmallString(smallStringt *self, smallBoolt *p2)
internal smallStringt * prependCharSmallString(smallStringt *self, char c)
internal smallArrayt * extractCharSmallStringSmallString(smallStringt *self, char delim1, smallStringt *delim2)
internal smallArrayt * extractCharSSmallString(smallStringt *self, char delim1, const char *delim2)
smallArrayt * extractSmallStringCharSmallStringG(smallStringt *self, smallStringt *delim1, char delim2)
bool icEqualSmallStringFG(smallStringt *self, smallStringt *p2)
smallStringt * appendNSmashSSmallStringG(smallStringt *self, char *string)
char * sliceS(const char *string, int64_t start, int64_t end)
slice String return new string which is the string between start and end negative indexes are allowed...
Definition: libsheepy.c:14148
bool equalSmallStringDoubleG(smallStringt *self, double p2)
internal smallStringt * icFindSmallJsonSmallString(smallStringt *self, smallJsont *needle)
char c
char * emptySF(void)
empty String Function
Definition: libsheepy.c:50188
smallStringt * replaceSmallStringG(smallStringt *self, const char *olds, const char *news, size_t max)
internal bool equalISSmallString(smallStringt *self, const char *string, int64_t index)
#define toStringO(obj)
convert data in obj to string
smallStringt * appendCharSmallStringG(smallStringt *self, char c)
smallArrayt * icExtractSmallStringSmallJsonSmallStringG(smallStringt *self, smallStringt *delim1, smallJsont *delim2)
bool isNumber(const char *string)
is Number (integer or float) String
Definition: libsheepy.c:10749
smallStringt * injectSmallStringG(smallStringt *self, int64_t index, char toInject)
internal bool equalICharSmallString(smallStringt *self, char c, int64_t index)
int appendFileSmallStringSmallStringG(smallStringt *self, smallStringt *filePath)
smallArrayt * splitCharSmallStringG(smallStringt *self, char c)
internal smallStringt * setUint32SmallString(smallStringt *self, uint32_t p2)
internal bool equalISmallJsonSmallString(smallStringt *self, smallJsont *string, int64_t index)
internal smallStringt * icReplaceSmallJsonSSmallString(smallStringt *self, smallJsont *olds, const char *news, size_t max)
internal smallStringt * replaceSmallStringSmallJsonSmallString(smallStringt *self, smallStringt *olds, smallJsont *news, size_t max)
ssize_t icIndexOfSmallStringSmallStringG(smallStringt *self, smallStringt *needle)
internal ssize_t icIndexOfSmallStringSmallString(smallStringt *self, smallStringt *needle)
internal ssize_t indexOfCharSmallString(smallStringt *self, char c)
smallStringt * copySmallStringG(smallStringt *self, int64_t start, int64_t end)
internal smallStringt * setSmallStringSmallString(smallStringt *self, smallStringt *p2)
smallStringt * uniqSmallStringG(smallStringt *self, char c)
smallStringt * readFileSmallStringG(smallStringt *self, const char *filePath)
smallStringt * appendSSmallStringG(smallStringt *self, const char *string)
char * strLCpy(char *restrict dst, size_t dstSize, const char *restrict src)
strLCpy - copy src to dst
Definition: libsheepy.c:6822
internal smallStringt * setBoolSmallString(smallStringt *self, bool p2)
smallStringt * insertSmallStringG(smallStringt *self, int64_t index, smallStringt *toInsert)
smallStringt * replaceSmallJsonSmallStringSmallStringG(smallStringt *self, smallJsont *olds, smallStringt *news, size_t max)
smallStringt * replaceSmallStringSSmallStringG(smallStringt *self, smallStringt *olds, const char *news, size_t max)
internal ssize_t icCountSmallStringSmallString(smallStringt *self, smallStringt *string)
void cleanUpSmallStringTerminateG(smallStringt **val)
internal bool startsWithSmallJsonSmallString(smallStringt *self, smallJsont *string)
smallStringt * prependSSmallStringG(smallStringt *self, const char *string)
internal smallStringt * catSmallString(smallStringt *self,...)
char ** icSplitSmallStringSSmallStringG(smallStringt *self, smallStringt *delim)
ssize_t indexOfCharSmallStringG(smallStringt *self, char c)
internal smallStringt * replaceSmallString(smallStringt *self, const char *olds, const char *news, size_t max)
smallStringt * appendSmallStringG(smallStringt *self, smallStringt *string)
bool equalSmallStringUint64G(smallStringt *self, uint64_t p2)
internal bool endsWithSmallStringSmallString(smallStringt *self, smallStringt *string)
internal char * icHasSmallJsonSmallString(smallStringt *self, smallJsont *needle)
internal smallStringt * replaceSmallJsonCharSmallString(smallStringt *self, smallJsont *olds, char news, size_t max)
#define setTopStringO(self, value)
smallStringt * setFromSmallJsonSmallStringG(smallStringt *self, smallJsont *p2)
void initiateAllocateSmallString(smallStringt **self)
internal smallStringt * colorSmallString(smallStringt *self, const char *colr)
internal bool icStartsWithSSmallString(smallStringt *self, const char *string)
ssize_t icCountSmallStringSmallStringG(smallStringt *self, smallStringt *string)
bool isEmptySmallStringG(smallStringt *self)
bool isInt(const char *string)
is Integer String
Definition: libsheepy.c:10811
smallArrayt * extractSmallStringSSmallStringG(smallStringt *self, smallStringt *delim1, const char *delim2)
fclose(fp)
smallStringt * prependNSmashSSmallStringG(smallStringt *self, char *string)
internal smallStringt * readFileSmallJsonSmallString(smallStringt *self, smallJsont *filePath)
internal bool equalSmallStringSmallDouble(smallStringt *self, smallDoublet *p2)
smallStringt * sliceSmallStringG(smallStringt *self, int64_t start, int64_t end)
ssize_t icIndexOfSmallStringG(smallStringt *self, const char *needle)
smallStringt * replaceSSmallStringSmallStringG(smallStringt *self, const char *olds, smallStringt *news, size_t max)
internal smallStringt * appendNSmashSSmallString(smallStringt *self, char *string)
internal bool equalSmallStringInt64(smallStringt *self, int64_t p2)
smallStringt * prependSmallJsonSmallStringG(smallStringt *self, smallJsont *json)
smallArrayt * icExtractSSmallStringSmallStringG(smallStringt *self, const char *delim1, smallStringt *delim2)
internal smallStringt * setUint64SmallString(smallStringt *self, uint64_t p2)
internal smallArrayt * extractSmallStringCharSmallString(smallStringt *self, smallStringt *delim1, char delim2)
int64_t parseIntSmallStringG(smallStringt *self)
internal bool equalISmallStringSmallString(smallStringt *self, smallStringt *string, int64_t index)
int64_t value
internal ssize_t countSmallStringSmallString(smallStringt *self, smallStringt *string)
#define disposeO(self)
bool icStartsWithSmallJsonSmallStringG(smallStringt *self, smallJsont *string)
internal smallStringt * setFromSmallDictSmallString(smallStringt *self, smallDictt *p2)
char ** splitSmallStringSSmallStringG(smallStringt *self, smallStringt *delim)
#define isOSmallDouble(obj)
test if obj type is smallDouble
internal bool icEndsWithCharSmallString(smallStringt *self, char c)
internal smallArrayt * splitSmallString(smallStringt *self, const char *delim)
internal smallStringt * lowerSmallString(smallStringt *self)
internal smallStringt * setInt64SmallString(smallStringt *self, int64_t p2)
bool icEqualSSmallStringG(smallStringt *self, const char *string)
internal smallStringt * emptySmallString(smallStringt *self)
internal char * hasSmallString(smallStringt *self, const char *needle)
internal smallArrayt * icExtractSmallStringSmallJsonSmallString(smallStringt *self, smallStringt *delim1, smallJsont *delim2)
smallStringt * setSmallArraySmallStringG(smallStringt *self, smallArrayt *p2)
internal smallStringt * prependSmallString(smallStringt *self, smallStringt *string)
smallStringt * replaceCharSSmallStringG(smallStringt *self, char olds, const char *news, size_t max)
internal smallArrayt * icExtractSSmallJsonSmallString(smallStringt *self, const char *delim1, smallJsont *delim2)
internal smallArrayt * extractSmallStringSSmallString(smallStringt *self, smallStringt *delim1, const char *delim2)
internal bool isEmptySmallString(smallStringt *self)
internal smallStringt * icFindCharSmallString(smallStringt *self, char c)
bool icEqualSmallStringSmallJsonG(smallStringt *self, smallJsont *p2)
#define isOSmallDict(obj)
test if obj type is smallDictt
bool icEndsWithSSmallStringG(smallStringt *self, const char *string)
internal smallStringt * icReplaceSmallStringSmallJsonSmallString(smallStringt *self, smallStringt *olds, smallJsont *news, size_t max)
internal char * icHasSmallStringSmallString(smallStringt *self, smallStringt *needle)
internal smallArrayt * icExtractSSmallStringSmallString(smallStringt *self, const char *delim1, smallStringt *delim2)
#define BLD
bold for color function
Definition: libsheepy.h:765
internal char * icHasSmallString(smallStringt *self, const char *needle)
internal smallStringt * delElemSmallString(smallStringt *self, int64_t index)
smallStringt * readFileSmallJsonSmallStringG(smallStringt *self, smallJsont *filePath)
ssize_t icCountSSmallStringG(smallStringt *self, const char *string)
smallStringt * lTrimSmallStringG(smallStringt *self)
finishSmallStringFt finish
END_TEST createSmallArray(obj)
smallArrayt * extractSmallJsonSmallStringSmallStringG(smallStringt *self, smallJsont *delim1, smallStringt *delim2)
#define strEq
Definition: libsheepy.h:2018
internal bool equalSmallStringSmallBool(smallStringt *self, smallBoolt *p2)
initiateAllocateSmallJson & json
internal char ** icSplitCharSSmallString(smallStringt *self, char c)
smallArrayt * extractSSmallJsonSmallStringG(smallStringt *self, const char *delim1, smallJsont *delim2)
internal smallArrayt * extractSSmallStringSmallString(smallStringt *self, const char *delim1, smallStringt *delim2)
smallStringt * appendNSmashSmallStringG(smallStringt *self, smallStringt *string)
bool equalCharSmallStringG(smallStringt *self, char c)
char * tokS(char *s, const char *delim, char **saveptr)
token in String
Definition: libsheepy.c:15996
internal char ** splitSmallJsonSSmallString(smallStringt *self, smallJsont *delim)
smallStringt * delElemSmallStringG(smallStringt *self, int64_t index)
smallStringt * setSmallJsonSmallStringG(smallStringt *self, smallJsont *p2)
smallArrayt * a
ssize_t countCharSmallStringG(smallStringt *self, char c)
smallStringt * insertSmallJsonSmallStringG(smallStringt *self, int64_t index, smallJsont *toInsert)
#define isOSmallBool(obj)
test if obj type is smallBool
internal smallStringt * duplicateSmallString(smallStringt *self)
internal bool equalSmallStringBase(smallStringt *self, baset *p2)
smallStringt * findSmallJsonSmallStringG(smallStringt *self, smallJsont *needle)
internal smallStringt * replaceCharSmallStringSmallString(smallStringt *self, char olds, smallStringt *news, size_t max)
ssize_t icCountCharSmallStringG(smallStringt *self, char c)
smallArrayt * extractSmallStringG(smallStringt *self, const char *delim1, const char *delim2)
bool equalSmallStringSmallDoubleG(smallStringt *self, smallDoublet *p2)
internal char ** icSplitSSmallString(smallStringt *self, const char *delim)
double value
smallStringt * insertNFreeSmallJsonSmallStringG(smallStringt *self, int64_t index, smallJsont *toInsert)
bool endsWithSSmallStringG(smallStringt *self, const char *string)
duplicateSmallStringFt duplicate
internal smallArrayt * icSplitSmallString(smallStringt *self, const char *delim)
internal bool equalSmallString(smallStringt *self, smallStringt *string)
smallArrayt * extractCharSmallJsonSmallStringG(smallStringt *self, char delim1, smallJsont *delim2)
smallStringt * icReplaceSmallStringSSmallStringG(smallStringt *self, smallStringt *olds, const char *news, size_t max)
smallStringt * icReplaceCharSmallStringSmallStringG(smallStringt *self, char olds, smallStringt *news, size_t max)
small string
smallArrayt * extractSmallStringSmallStringSmallStringG(smallStringt *self, smallStringt *delim1, smallStringt *delim2)
internal smallArrayt * icExtractSmallStringSmallStringSmallString(smallStringt *self, smallStringt *delim1, smallStringt *delim2)
smallArrayt * extractSmallJsonSSmallStringG(smallStringt *self, smallJsont *delim1, const char *delim2)
internal smallStringt * insertNFreeSmallString(smallStringt *self, int64_t index, smallStringt *toInsert)
#define catS(...)
Definition: libsheepy.h:1911
smallArrayt * icExtractSmallJsonSmallJsonSmallStringG(smallStringt *self, smallJsont *delim1, smallJsont *delim2)
#define delO(self, start, end)
internal smallStringt * setSmallDoubleSmallString(smallStringt *self, smallDoublet *p2)
internal int appendFileSmallString(smallStringt *self, const char *filePath)
smallJsonFunctionst * f
smallStringt * icReplaceCharSmallJsonSmallStringG(smallStringt *self, char olds, smallJsont *news, size_t max)
smallArrayt * icExtractCharSmallJsonSmallStringG(smallStringt *self, char delim1, smallJsont *delim2)
smallStringt * replaceCharSmallJsonSmallStringG(smallStringt *self, char olds, smallJsont *news, size_t max)
internal smallStringt * icReplaceSSmallStringSmallString(smallStringt *self, const char *olds, smallStringt *news, size_t max)
smallStringt * prependSmallStringG(smallStringt *self, smallStringt *string)
internal char * icHasCharSmallString(smallStringt *self, char c)
#define UNUSED
Definition: libsheepy.h:8195
smallArrayt * icSplitSmallStringG(smallStringt *self, const char *delim)
internal smallStringt * replaceSSmallJsonSmallString(smallStringt *self, const char *olds, smallJsont *news, size_t max)
smallStringt * replaceSmallStringSmallJsonSmallStringG(smallStringt *self, smallStringt *olds, smallJsont *news, size_t max)
bool equalSmallStringUint32G(smallStringt *self, uint32_t p2)
smallArrayt * icSplitSmallStringSmallStringG(smallStringt *self, smallStringt *delim)
bool icEndsWithSmallStringSmallStringG(smallStringt *self, smallStringt *string)
smallArrayt * splitSmallJsonSmallStringG(smallStringt *self, smallJsont *delim)
internal bool equalSmallStringInt32(smallStringt *self, int32_t p2)
smallStringt * setInt64SmallStringG(smallStringt *self, int64_t p2)
smallStringt * icFindSmallStringSmallStringG(smallStringt *self, smallStringt *needle)
internal smallStringt * icFindSmallString(smallStringt *self, const char *needle)
char * hasSmallStringG(smallStringt *self, const char *needle)
char ** splitSmallJsonSSmallStringG(smallStringt *self, smallJsont *delim)
smallStringt * icReplaceSmallStringG(smallStringt *self, const char *olds, const char *news, size_t max)
#define forEachCharP(list, element)
forEach - loop macro on list indexes to access the element in the loop, use *element ...
Definition: libsheepy.h:2979
internal smallStringt * replaceCharCharSmallString(smallStringt *self, char olds, char news, size_t max)
smallStringt * allocSmallString(const char *string)
internal smallStringt * appendNSmashSmallString(smallStringt *self, smallStringt *string)
char ** split(const char *string, const char *delim)
split string with delim string when updating this function, also update splitS (identical to split) r...
Definition: libsheepy.c:51294
internal smallStringt * prependNSmashSSmallString(smallStringt *self, char *string)
#define createAllocateSmallString(obj)
bool endsWithCharSmallStringG(smallStringt *self, char c)
char * icHasSmallStringG(smallStringt *self, const char *needle)
internal smallStringt * replaceSmallStringSSmallString(smallStringt *self, smallStringt *olds, const char *news, size_t max)
smallStringt * readStreamSmallStringG(smallStringt *self, FILE *fp)
internal bool icEndsWithSSmallString(smallStringt *self, const char *string)
internal smallStringt * prependNSmashSmallJsonSmallString(smallStringt *self, smallJsont *json)
smallArrayt * extractSCharSmallStringG(smallStringt *self, const char *delim1, char delim2)
internal bool icEqualSmallStringSmallJson(smallStringt *self, smallJsont *p2)
#define rangeFrom(index, from, maxCount)
range loop starting at value from ;size_t UNIQVAR needed to avoid: error: a label can only be part of...
Definition: libsheepy.h:2803
char * sStringToStringTiny(sStringt *obj)
stringify string
internal smallStringt * intToSmallString(smallStringt *self, int64_t n)
bool equalSmallStringSmallBoolG(smallStringt *self, smallBoolt *p2)
bool r
bool equalSmallStringBaseG(smallStringt *self, baset *p2)
#define sjGet(obj)
get a pointer to the string in the smallJson object
smallStringt * icUniqSmallStringG(smallStringt *self, char c)
internal smallStringt * readFileSmallString(smallStringt *self, const char *filePath)
#define logW(...)
Definition: libsheepy.h:1061
smallStringt * readFileSmallStringSmallStringG(smallStringt *self, smallStringt *filePath)
internal smallArrayt * extractCharSmallJsonSmallString(smallStringt *self, char delim1, smallJsont *delim2)
bool equalSmallStringSmallBytesG(smallStringt *self, smallBytest *p2)
void shEPrintfS(const char *fmt,...)
sheepy Error printf String print with logE
Definition: libsheepy.c:6589
void finalizeRecycleSmallString(void *arg UNUSED)
internal smallStringt * appendSmallString(smallStringt *self, smallStringt *string)
internal bool icEqualSmallStringBase(smallStringt *self, baset *p2)
ssize_t indexOfCharS(const char *string, char c)
Definition: libsheepy.c:15830
base class
internal smallArrayt * extractSmallStringSmallStringSmallString(smallStringt *self, smallStringt *delim1, smallStringt *delim2)
internal bool icStartsWithSmallJsonSmallString(smallStringt *self, smallJsont *string)
void registerMethodsSmallString(smallStringFunctionst *f)
#define freeO(obj)
free buffers in obj
internal smallStringt * cropSmallString(smallStringt *self, int64_t start, int64_t end)
internal char getAtSmallString(smallStringt *self, int64_t index)
char ** splitCharPSSmallStringG(smallStringt *self, const char *delim)
smallStringt * insertNFreeSmallStringG(smallStringt *self, int64_t index, smallStringt *toInsert)
smallArrayt * icExtractSmallJsonSmallStringSmallStringG(smallStringt *self, smallJsont *delim1, smallStringt *delim2)
void initiateSmallString(smallStringt *self)
bool isNumberSmallStringG(smallStringt *self)
char * hasSmallStringSmallStringG(smallStringt *self, smallStringt *needle)
internal bool isIntSmallString(smallStringt *self)
internal char * hasCharSmallString(smallStringt *self, char c)
bool icStartsWithCharSmallStringG(smallStringt *self, char c)
internal smallArrayt * extractSmallJsonCharSmallString(smallStringt *self, smallJsont *delim1, char delim2)
bool startsWithCharSmallStringG(smallStringt *self, char c)
internal smallStringt * injectSmallString(smallStringt *self, int64_t index, char toInject)
internal smallStringt * lTrimSmallString(smallStringt *self)
smallStringt * replaceSmallJsonSmallJsonSmallStringG(smallStringt *self, smallJsont *olds, smallJsont *news, size_t max)
smallStringt * setSmallIntSmallStringG(smallStringt *self, smallIntt *p2)
internal smallStringt * trimSmallString(smallStringt *self)
internal smallArrayt * icSplitSmallJsonSmallString(smallStringt *self, smallJsont *delim)
internal bool equalSmallStringBool(smallStringt *self, bool p2)
smallArrayt * icExtractSmallJsonCharSmallStringG(smallStringt *self, smallJsont *delim1, char delim2)
size_t listLengthS(char **list)
list Length String return number of elements until the first NULL element
Definition: libsheepy.c:50820
internal bool startsWithSmallStringSmallString(smallStringt *self, smallStringt *string)
char ** listPushS(char ***list, const char *s)
list Push String append s at the end of the list when list is NULL, a new list with one element is re...
Definition: libsheepy.c:50504
void finalizeSmallString(void)
ssize_t fileSize(const char *filePath)
get file size
Definition: libsheepy.c:4369
internal smallStringt * icReplaceSmallJsonCharSmallString(smallStringt *self, smallJsont *olds, char news, size_t max)
internal smallStringt * setNFreeSmallString(smallStringt *self, char *string)
ssize_t indexOfSmallJsonSmallStringG(smallStringt *self, smallJsont *needle)
internal bool equalCharSmallString(smallStringt *self, char c)
internal ssize_t icCountSSmallString(smallStringt *self, const char *string)
bool value
internal smallArrayt * icExtractSCharSmallString(smallStringt *self, const char *delim1, char delim2)
internal smallStringt * replaceCharSSmallString(smallStringt *self, char olds, const char *news, size_t max)
bool equalISSmallStringG(smallStringt *self, const char *string, int64_t index)
smallStringt * icReplaceSmallJsonSmallJsonSmallStringG(smallStringt *self, smallJsont *olds, smallJsont *news, size_t max)
char * icHasSmallJsonSmallStringG(smallStringt *self, smallJsont *needle)
smallStringt * icReplaceSmallJsonSSmallStringG(smallStringt *self, smallJsont *olds, const char *news, size_t max)
bool startsWithSmallJsonSmallStringG(smallStringt *self, smallJsont *string)
internal int writeStreamSmallString(smallStringt *self, FILE *fp)
internal smallStringt * findSmallJsonSmallString(smallStringt *self, smallJsont *needle)
internal smallStringt * icReplaceCharSSmallString(smallStringt *self, char olds, const char *news, size_t max)
smallArrayt * extractSmallJsonSmallJsonSmallStringG(smallStringt *self, smallJsont *delim1, smallJsont *delim2)
#define freeManyS(...)
Definition: libsheepy.h:1867
internal smallStringt * doubleToSmallString(smallStringt *self, double n)
smallStringt * replaceCharSmallStringSmallStringG(smallStringt *self, char olds, smallStringt *news, size_t max)
smallStringt * setSmallStringG(smallStringt *self, const char *p2)
internal smallStringt * icReplaceSmallStringSmallStringSmallString(smallStringt *self, smallStringt *olds, smallStringt *news, size_t max)
ssize_t indexOfSmallStringG(smallStringt *self, const char *needle)
internal smallArrayt * extractCharCharSmallString(smallStringt *self, char delim1, char delim2)
smallStringt * trimSmallStringG(smallStringt *self)
smallArrayt * extractSmallJsonCharSmallStringG(smallStringt *self, smallJsont *delim1, char delim2)
terminateSmallStringFt terminate
smallStringt * replaceSmallStringCharSmallStringG(smallStringt *self, smallStringt *olds, char news, size_t max)
internal int writeFileSmallJsonSmallString(smallStringt *self, smallJsont *filePath)
#define createAllocateSmallArray(obj)
internal void terminateSmallString(smallStringt **self)
bool startsWithSSmallStringG(smallStringt *self, const char *string)
#define finishO(obj)
free container only
#define isOSmallArray(obj)
test if obj type is smallArray
bool startsWithSmallStringSmallStringG(smallStringt *self, smallStringt *string)
char ** icSplitCharPSSmallStringG(smallStringt *self, char *delim)
smallStringt * icReplaceCharCharSmallStringG(smallStringt *self, char olds, char news, size_t max)
internal smallStringt * replaceSmallJsonSSmallString(smallStringt *self, smallJsont *olds, const char *news, size_t max)
internal smallStringt * insertSmallJsonSmallString(smallStringt *self, int64_t index, smallJsont *toInsert)
internal smallStringt * replaceSmallStringSmallStringSmallString(smallStringt *self, smallStringt *olds, smallStringt *news, size_t max)
smallStringt * icReplaceSmallStringSmallStringSmallStringG(smallStringt *self, smallStringt *olds, smallStringt *news, size_t max)
smallStringt * replaceSCharSmallStringG(smallStringt *self, const char *olds, char news, size_t max)
smallJsont * cropSmallJsonSmallStringG(smallStringt *self, int64_t start, int64_t end)
internal bool equalSmallStringUint32(smallStringt *self, uint32_t p2)
internal ssize_t icIndexOfCharSmallString(smallStringt *self, char c)
internal bool icEqualSSmallString(smallStringt *self, const char *string)
internal smallStringt * setCharSmallString(smallStringt *self, char c)
internal smallArrayt * extractSSmallJsonSmallString(smallStringt *self, const char *delim1, smallJsont *delim2)
void freeSmallStringG(smallStringt *self)
bool equalSmallStringBoolG(smallStringt *self, bool p2)
smallArrayt * icExtractSCharSmallStringG(smallStringt *self, const char *delim1, char delim2)
internal char * hasSmallJsonSmallString(smallStringt *self, smallJsont *needle)
internal smallArrayt * icExtractSmallStringCharSmallString(smallStringt *self, smallStringt *delim1, char delim2)
char * hasCharSmallStringG(smallStringt *self, char c)
internal smallStringt * icReplaceSSmallJsonSmallString(smallStringt *self, const char *olds, smallJsont *news, size_t max)
#define getTopDictO(self)
internal bool isNumberSmallString(smallStringt *self)
internal smallStringt * setSmallString(smallStringt *self, const char *string)
smallArrayt * extractCharSmallStringSmallStringG(smallStringt *self, char delim1, smallStringt *delim2)
smallArrayt * icSplitCharSmallStringG(smallStringt *self, char c)
internal ssize_t countSSmallString(smallStringt *self, const char *string)
#define isOSmallString(obj)
test if obj type is smallString