libsheepyCSmallString.c (192394B)
1 // MIT License 2 // 3 // Copyright (c) 2026 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" 25 #include "libsheepyCSmallStringInternal.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 37 void initiateSmallString(smallStringt *self); 38 void registerMethodsSmallString(smallStringFunctionst *f); 39 void initiateAllocateSmallString(smallStringt **self); 40 void finalizeRecycleSmallString(void *arg UNUSED); 41 void finalizeSmallString(void); 42 smallStringt* allocSmallString(const char *string); 43 void cleanUpSmallStringTerminateG(smallStringt **val); 44 void cleanUpSmallStringFreeLocalG(smallStringt *val); 45 void cleanUpSmallStringFreeG(smallStringt **val); 46 void cleanUpSmallStringFinishG(smallStringt **val); 47 smallStringt* createSF(const char *paramType, ...); 48 internal void freeSmallString(smallStringt *self); 49 internal void terminateSmallString(smallStringt **self); 50 internal char* toStringSmallString(smallStringt *self); 51 internal smallStringt* duplicateSmallString(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); 69 internal smallStringt* setSmallArraySmallString(smallStringt* self, smallArrayt* p2); 70 internal smallStringt* setFromSmallDictSmallString(smallStringt* self, smallDictt* p2); 71 internal smallStringt* setFromSmallJsonSmallString(smallStringt* self, smallJsont* p2); 72 internal smallStringt* setSmallBoolSmallString(smallStringt* self, smallBoolt* p2); 73 internal smallStringt* setSmallDoubleSmallString(smallStringt* self, smallDoublet* p2); 74 internal smallStringt* setSmallIntSmallString(smallStringt* self, smallIntt* p2); 75 internal smallStringt* setSmallJsonSmallString(smallStringt* self, smallJsont* p2); 76 internal smallStringt* setSmallStringSmallString(smallStringt* self, smallStringt* p2); 77 internal smallStringt* setNFreeSmallString(smallStringt *self, char *string); 78 internal smallStringt* appendSmallString(smallStringt *self, smallStringt *string); 79 internal smallStringt* appendSmallJsonSmallString(smallStringt *self, smallJsont *string); 80 internal smallStringt* appendNSmashSmallString(smallStringt *self, smallStringt *string); 81 internal smallStringt* appendSSmallString(smallStringt *self, const char *string); 82 internal smallStringt* appendCharSmallString(smallStringt *self, char c); 83 internal smallStringt* appendNSmashSmallJsonSmallString(smallStringt *self, smallJsont *string); 84 internal smallStringt* appendNSmashSSmallString(smallStringt *self, char *string); 85 internal smallStringt* prependSmallString(smallStringt *self, smallStringt *string); 86 internal smallStringt* prependSmallJsonSmallString(smallStringt *self, smallJsont *json); 87 internal smallStringt* prependNSmashSmallString(smallStringt *self, smallStringt *string); 88 internal smallStringt* prependNSmashSmallJsonSmallString(smallStringt *self, smallJsont *json); 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, ...); 94 internal smallStringt* pushNFreeManySmallString(smallStringt *self, ...); 95 internal smallStringt* pushNFreeManySSmallString(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); 101 internal smallStringt* replaceSmallJsonSmallStringSmallString(smallStringt *self, smallJsont *olds, smallStringt *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); 104 internal smallStringt* replaceSmallStringSmallJsonSmallString(smallStringt *self, smallStringt *olds, smallJsont *news, size_t max); 105 internal smallStringt* replaceSmallStringSmallStringSmallString(smallStringt *self, smallStringt *olds, smallStringt *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); 117 internal smallStringt* icReplaceSmallJsonSmallJsonSmallString(smallStringt *self, smallJsont *olds, smallJsont *news, size_t max); 118 internal smallStringt* icReplaceSmallJsonSmallStringSmallString(smallStringt *self, smallJsont *olds, smallStringt *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); 121 internal smallStringt* icReplaceSmallStringSmallJsonSmallString(smallStringt *self, smallStringt *olds, smallJsont *news, size_t max); 122 internal smallStringt* icReplaceSmallStringSmallStringSmallString(smallStringt *self, smallStringt *olds, smallStringt *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); 185 internal smallStringt* upperSmallString(smallStringt *self); 186 internal smallStringt* lowerSmallString(smallStringt *self); 187 internal smallStringt* trimSmallString(smallStringt *self); 188 internal smallStringt* lTrimSmallString(smallStringt *self); 189 internal smallStringt* rTrimSmallString(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); 215 internal smallStringt* findSmallJsonSmallString(smallStringt *self, smallJsont *needle); 216 internal smallStringt* findSmallStringSmallString(smallStringt *self, smallStringt *needle); 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); 227 internal smallStringt* icFindSmallJsonSmallString(smallStringt *self, smallJsont *needle); 228 internal smallStringt* icFindSmallStringSmallString(smallStringt *self, smallStringt *needle); 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); 233 internal smallStringt* emptySmallString(smallStringt *self); 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); 238 internal smallArrayt* splitSmallJsonSmallString(smallStringt *self, smallJsont *delim); 239 internal smallArrayt* splitSmallStringSmallString(smallStringt *self, smallStringt *delim); 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); 248 internal smallArrayt* extractSmallJsonSmallJsonSmallString(smallStringt *self, smallJsont* delim1, smallJsont* delim2); 249 internal smallArrayt* extractSmallJsonSmallStringSmallString(smallStringt *self, smallJsont* delim1, smallStringt* delim2); 250 internal smallArrayt* extractSmallJsonSSmallString(smallStringt *self, smallJsont* delim1, const char* delim2); 251 internal smallArrayt* extractSmallJsonCharSmallString(smallStringt *self, smallJsont* delim1, char delim2); 252 internal smallArrayt* extractSmallStringSmallJsonSmallString(smallStringt *self, smallStringt* delim1, smallJsont* delim2); 253 internal smallArrayt* extractSmallStringSmallStringSmallString(smallStringt *self, smallStringt* delim1, smallStringt* 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); 262 internal smallArrayt* icSplitSmallJsonSmallString(smallStringt *self, smallJsont *delim); 263 internal smallArrayt* icSplitSmallStringSmallString(smallStringt *self, smallStringt *delim); 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); 272 internal smallArrayt* icExtractSmallJsonSmallJsonSmallString(smallStringt *self, smallJsont* delim1, smallJsont* delim2); 273 internal smallArrayt* icExtractSmallJsonSmallStringSmallString(smallStringt *self, smallJsont* delim1, smallStringt* delim2); 274 internal smallArrayt* icExtractSmallJsonSSmallString(smallStringt *self, smallJsont* delim1, const char* delim2); 275 internal smallArrayt* icExtractSmallJsonCharSmallString(smallStringt *self, smallJsont* delim1, char delim2); 276 internal smallArrayt* icExtractSmallStringSmallJsonSmallString(smallStringt *self, smallStringt* delim1, smallJsont* delim2); 277 internal smallArrayt* icExtractSmallStringSmallStringSmallString(smallStringt *self, smallStringt* delim1, smallStringt* 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); 287 internal smallStringt* readFileSmallJsonSmallString(smallStringt *self, smallJsont *filePath); 288 internal smallStringt* readFileSmallStringSmallString(smallStringt *self, smallStringt *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); 296 smallStringt* duplicateSmallStringG (smallStringt *self); 297 smallStringt* setBoolSmallStringG(smallStringt* self, bool p2); 298 smallStringt* setDoubleSmallStringG(smallStringt* self, double p2); 299 smallStringt* setInt64SmallStringG(smallStringt* self, int64_t p2); 300 smallStringt* setInt32SmallStringG(smallStringt* self, int32_t p2); 301 smallStringt* setUint32SmallStringG(smallStringt* self, uint32_t p2); 302 smallStringt* setUint64SmallStringG(smallStringt* self, uint64_t p2); 303 smallStringt* setSmallStringG(smallStringt* self, const char* p2); 304 smallStringt* setCharSmallStringG(smallStringt *self, char c); 305 smallStringt* setSmallArraySmallStringG(smallStringt* self, smallArrayt* p2); 306 smallStringt* setFromSmallDictSmallStringG(smallStringt* self, smallDictt* p2); 307 smallStringt* setFromSmallJsonSmallStringG(smallStringt* self, smallJsont* p2); 308 smallStringt* setSmallBoolSmallStringG(smallStringt* self, smallBoolt* p2); 309 smallStringt* setSmallDoubleSmallStringG(smallStringt* self, smallDoublet* p2); 310 smallStringt* setSmallIntSmallStringG(smallStringt* self, smallIntt* p2); 311 smallStringt* setSmallJsonSmallStringG(smallStringt* self, smallJsont* p2); 312 smallStringt* setSmallStringSmallStringG(smallStringt* self, smallStringt* p2); 313 char getAtSmallStringG(smallStringt *self, char retType UNUSED, int64_t index); 314 smallStringt* setAtSmallStringG(smallStringt *self, int64_t index, char c); 315 smallStringt* appendSmallStringG (smallStringt *self, smallStringt *string); 316 smallStringt* appendSmallJsonSmallStringG(smallStringt *self, smallJsont *string); 317 smallStringt* appendSSmallStringG (smallStringt *self, const char *string); 318 smallStringt* appendCharSmallStringG(smallStringt *self, char c); 319 smallStringt* appendNSmashSmallStringG(smallStringt *self, smallStringt *string); 320 smallStringt* appendNSmashSmallJsonSmallStringG(smallStringt *self, smallJsont *string); 321 smallStringt* appendNSmashSSmallStringG(smallStringt *self, char *string); 322 smallStringt* prependSmallStringG (smallStringt *self, smallStringt *string); 323 smallStringt* prependSmallJsonSmallStringG(smallStringt *self, smallJsont *json); 324 smallStringt* prependSSmallStringG (smallStringt *self, const char *string); 325 smallStringt* prependCharSmallStringG(smallStringt *self, char c); 326 smallStringt* prependNSmashSmallStringG(smallStringt *self, smallStringt *string); 327 smallStringt* prependNSmashSmallJsonSmallStringG(smallStringt *self, smallJsont *json); 328 smallStringt* prependNSmashSSmallStringG (smallStringt *self, 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); 333 smallStringt* replaceSmallJsonSmallJsonSmallStringG(smallStringt *self, smallJsont *olds, smallJsont *news, size_t max); 334 smallStringt* replaceSmallJsonSmallStringSmallStringG(smallStringt *self, smallJsont *olds, smallStringt *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); 337 smallStringt* replaceSmallStringSmallJsonSmallStringG(smallStringt *self, smallStringt *olds, smallJsont *news, size_t max); 338 smallStringt* replaceSmallStringSmallStringSmallStringG(smallStringt *self, smallStringt *olds, smallStringt *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); 349 smallStringt* icReplaceSmallJsonSmallJsonSmallStringG(smallStringt *self, smallJsont *olds, smallJsont *news, size_t max); 350 smallStringt* icReplaceSmallJsonSmallStringSmallStringG(smallStringt *self, smallJsont *olds, smallStringt *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); 353 smallStringt* icReplaceSmallStringSmallJsonSmallStringG(smallStringt *self, smallStringt *olds, smallJsont *news, size_t max); 354 smallStringt* icReplaceSmallStringSmallStringSmallStringG(smallStringt *self, smallStringt *olds, smallStringt *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); 361 bool equalSmallStringFG(smallStringt* self, smallStringt* p2); 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); 371 bool equalSmallStringSmallBoolG(smallStringt* self, smallBoolt* p2); 372 bool equalSmallStringSmallBytesG(smallStringt* self, smallBytest* p2); 373 bool equalSmallStringSmallDoubleG(smallStringt* self, smallDoublet* p2); 374 bool equalSmallStringSmallIntG(smallStringt* self, smallIntt* p2); 375 bool equalSmallStringSmallJsonG(smallStringt* self, smallJsont* p2); 376 bool icEqualSmallStringFG(smallStringt* self, smallStringt* p2); 377 bool icEqualCharSmallStringG(smallStringt *self, char c); 378 bool icEqualSSmallStringG (smallStringt *self, const char *string); 379 bool icEqualSmallStringBaseG(smallStringt* self, baset* p2); 380 bool icEqualSmallStringSmallJsonG(smallStringt* self, smallJsont* p2); 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); 387 bool startsWithSmallJsonSmallStringG (smallStringt *self, smallJsont *string); 388 bool startsWithSmallStringSmallStringG(smallStringt *self, smallStringt *string); 389 bool endsWithSSmallStringG (smallStringt *self, const char *string); 390 bool endsWithCharSmallStringG(smallStringt *self, char c); 391 bool endsWithSmallJsonSmallStringG (smallStringt *self, smallJsont *string); 392 bool endsWithSmallStringSmallStringG(smallStringt *self, smallStringt *string); 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); 396 ssize_t countSmallStringSmallStringG(smallStringt *self, smallStringt *string); 397 bool icStartsWithSSmallStringG (smallStringt *self, const char *string); 398 bool icStartsWithCharSmallStringG(smallStringt *self, char c); 399 bool icStartsWithSmallJsonSmallStringG (smallStringt *self, smallJsont *string); 400 bool icStartsWithSmallStringSmallStringG(smallStringt *self, smallStringt *string); 401 bool icEndsWithSSmallStringG (smallStringt *self, const char *string); 402 bool icEndsWithCharSmallStringG(smallStringt *self, char c); 403 bool icEndsWithSmallJsonSmallStringG (smallStringt *self, smallJsont *string); 404 bool icEndsWithSmallStringSmallStringG(smallStringt *self, smallStringt *string); 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); 408 ssize_t icCountSmallStringSmallStringG(smallStringt *self, smallStringt *string); 409 bool isNumberSmallStringG(smallStringt *self); 410 bool isIntSmallStringG(smallStringt *self); 411 int64_t parseIntSmallStringG (smallStringt *self); 412 smallStringt* intToSmallStringG (smallStringt *self, int64_t n); 413 double parseDoubleSmallStringG (smallStringt *self); 414 smallStringt* doubleToSmallStringG (smallStringt *self, double n); 415 size_t lenSmallStringG (smallStringt *self); 416 smallStringt* upperSmallStringG (smallStringt *self); 417 smallStringt* lowerSmallStringG (smallStringt *self); 418 smallStringt* trimSmallStringG (smallStringt *self); 419 smallStringt* lTrimSmallStringG (smallStringt *self); 420 smallStringt* rTrimSmallStringG (smallStringt *self); 421 smallStringt* uniqSmallStringG (smallStringt *self, char c); 422 smallStringt* icUniqSmallStringG (smallStringt *self, char c); 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); 441 char* hasSmallStringSmallStringG(smallStringt *self, smallStringt *needle); 442 smallStringt* findSmallStringG(smallStringt *self, const char *needle); 443 smallStringt* findCharSmallStringG(smallStringt *self, char c); 444 smallStringt* findSmallJsonSmallStringG (smallStringt *self, smallJsont *needle); 445 smallStringt* findSmallStringSmallStringG(smallStringt *self, smallStringt *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); 449 ssize_t indexOfSmallStringSmallStringG(smallStringt *self, smallStringt *needle); 450 char* icHasSmallStringG (smallStringt *self, const char *needle); 451 char* icHasCharSmallStringG(smallStringt *self, char c); 452 char* icHasSmallJsonSmallStringG(smallStringt *self, smallJsont *needle); 453 char* icHasSmallStringSmallStringG(smallStringt *self, smallStringt *needle); 454 smallStringt* icFindSmallStringG(smallStringt *self, const char *needle); 455 smallStringt* icFindCharSmallStringG(smallStringt *self, char c); 456 smallStringt* icFindSmallJsonSmallStringG(smallStringt *self, smallJsont *needle); 457 smallStringt* icFindSmallStringSmallStringG(smallStringt *self, smallStringt *needle); 458 ssize_t icIndexOfSmallStringG(smallStringt *self, const char *needle); 459 ssize_t icIndexOfCharSmallStringG(smallStringt *self, char c); 460 ssize_t icIndexOfSmallJsonSmallStringG (smallStringt *self, smallJsont *needle); 461 ssize_t icIndexOfSmallStringSmallStringG(smallStringt *self, smallStringt *needle); 462 smallStringt* emptySmallStringG (smallStringt *self); 463 bool isEmptySmallStringG (smallStringt *self); 464 bool isBlankSmallStringG (smallStringt *self); 465 smallArrayt* splitSmallStringG(smallStringt *self, const char *delim); 466 smallArrayt* splitCharSmallStringG(smallStringt *self, char c); 467 smallArrayt* splitSmallJsonSmallStringG (smallStringt *self, smallJsont *delim); 468 smallArrayt* splitSmallStringSmallStringG(smallStringt *self, smallStringt *delim); 469 char** splitCharPSSmallStringG(smallStringt *self, const char* delim); 470 char** splitCharSSmallStringG(smallStringt *self, char c); 471 char** splitSmallJsonSSmallStringG (smallStringt *self, smallJsont *delim); 472 char** splitSmallStringSSmallStringG(smallStringt *self, smallStringt *delim); 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); 477 smallArrayt* extractSmallJsonSmallJsonSmallStringG(smallStringt *self, smallJsont* delim1, smallJsont* delim2); 478 smallArrayt* extractSmallJsonSmallStringSmallStringG(smallStringt *self, smallJsont* delim1, smallStringt* delim2); 479 smallArrayt* extractSmallJsonSSmallStringG(smallStringt *self, smallJsont* delim1, const char* delim2); 480 smallArrayt* extractSmallJsonCharSmallStringG(smallStringt *self, smallJsont* delim1, char delim2); 481 smallArrayt* extractSmallStringSmallJsonSmallStringG(smallStringt *self, smallStringt* delim1, smallJsont* delim2); 482 smallArrayt* extractSmallStringSmallStringSmallStringG(smallStringt *self, smallStringt* delim1, smallStringt* delim2); 483 smallArrayt* extractSmallStringSSmallStringG(smallStringt *self, smallStringt* delim1, const char* delim2); 484 smallArrayt* extractSmallStringCharSmallStringG(smallStringt *self, smallStringt* delim1, char delim2); 485 smallArrayt* extractSSmallJsonSmallStringG(smallStringt *self, const char* delim1, smallJsont* delim2); 486 smallArrayt* extractSSmallStringSmallStringG(smallStringt *self, const char* delim1, smallStringt* delim2); 487 smallArrayt* extractCharSmallJsonSmallStringG(smallStringt *self, char delim1, smallJsont* delim2); 488 smallArrayt* extractCharSmallStringSmallStringG(smallStringt *self, char delim1, smallStringt* delim2); 489 smallArrayt* icSplitSmallStringG (smallStringt *self, const char *delim); 490 smallArrayt* icSplitCharSmallStringG (smallStringt *self, char c); 491 smallArrayt* icSplitSmallJsonSmallStringG (smallStringt *self, smallJsont *delim); 492 smallArrayt* icSplitSmallStringSmallStringG(smallStringt *self, smallStringt *delim); 493 char** icSplitCharPSSmallStringG (smallStringt *self, char *delim); 494 char** icSplitCharSSmallStringG (smallStringt *self, char c); 495 char** icSplitSmallJsonSSmallStringG (smallStringt *self, smallJsont *delim); 496 char** icSplitSmallStringSSmallStringG(smallStringt *self, smallStringt *delim); 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); 501 smallArrayt* icExtractSmallJsonSmallJsonSmallStringG (smallStringt *self, smallJsont* delim1, smallJsont* delim2); 502 smallArrayt* icExtractSmallJsonSmallStringSmallStringG (smallStringt *self, smallJsont* delim1, smallStringt* delim2); 503 smallArrayt* icExtractSmallJsonSSmallStringG (smallStringt *self, smallJsont* delim1, const char* delim2); 504 smallArrayt* icExtractSmallJsonCharSmallStringG (smallStringt *self, smallJsont* delim1, char delim2); 505 smallArrayt* icExtractSmallStringSmallJsonSmallStringG (smallStringt *self, smallStringt* delim1, smallJsont* delim2); 506 smallArrayt* icExtractSmallStringSmallStringSmallStringG(smallStringt *self, smallStringt* delim1, smallStringt* delim2); 507 smallArrayt* icExtractSmallStringSSmallStringG (smallStringt *self, smallStringt* delim1, const char* delim2); 508 smallArrayt* icExtractSmallStringCharSmallStringG (smallStringt *self, smallStringt* delim1, char delim2); 509 smallArrayt* icExtractSSmallJsonSmallStringG (smallStringt *self, const char* delim1, smallJsont* delim2); 510 smallArrayt* icExtractSSmallStringSmallStringG (smallStringt *self, const char* delim1, smallStringt* delim2); 511 smallArrayt* icExtractCharSmallJsonSmallStringG (smallStringt *self, char delim1, smallJsont* delim2); 512 smallArrayt* icExtractCharSmallStringSmallStringG (smallStringt *self, char delim1, smallStringt* delim2); 513 smallStringt* readFileSmallStringG (smallStringt *self, const char *filePath); 514 smallStringt* readFileSmallJsonSmallStringG (smallStringt *self, smallJsont *filePath); 515 smallStringt* readFileSmallStringSmallStringG(smallStringt *self, smallStringt *filePath); 516 smallStringt* readStreamSmallStringG (smallStringt *self, FILE *fp); 517 int writeFileSmallStringG (smallStringt *self, const char *filePath); 518 int writeFileSmallJsonSmallStringG (smallStringt *self, smallJsont *filePath); 519 int writeFileSmallStringSmallStringG(smallStringt *self, smallStringt *filePath); 520 int writeStreamSmallStringG (smallStringt *self, FILE *fp); 521 int appendFileSmallStringFG (smallStringt *self, const char *filePath); 522 int appendFileSmallStringSmallStringG(smallStringt *self, smallStringt *filePath); 523 524 void initiateSmallString(smallStringt *self) { 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 540 void registerMethodsSmallString(smallStringFunctionst *f) { 541 542 f->free = freeSmallString; 543 f->terminate = terminateSmallString; 544 f->toString = toStringSmallString; 545 f->duplicate = duplicateSmallString; 546 547 f->smash = smashSmallString; 548 f->finish = finishSmallString; 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 792 void initiateAllocateSmallString(smallStringt **self) { 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 810 void finalizeRecycleSmallString(void *arg UNUSED) { 811 812 #if (recycleContainers) 813 finalizeRecycle 814 #endif 815 // recycleContainers 816 } 817 818 void finalizeSmallString(void) { 819 820 if (smallStringF) { 821 free(smallStringF); 822 smallStringF = NULL; 823 } 824 finalizeRecycleSmallString(NULL); 825 } 826 827 smallStringt* allocSmallString(const char *string) { 828 smallStringt *r = NULL; 829 830 initiateAllocateSmallString(&r); 831 if (!r) { 832 return(NULL); 833 } 834 r->f->set(r, string); 835 return(r); 836 } 837 838 void cleanUpSmallStringTerminateG(smallStringt **val) { 839 840 terminateO(*val); 841 } 842 843 void cleanUpSmallStringFreeLocalG(smallStringt *val) { 844 845 freeO(val); 846 } 847 848 void cleanUpSmallStringFreeG(smallStringt **val) { 849 850 freeO(*val); 851 } 852 853 void cleanUpSmallStringFinishG(smallStringt **val) { 854 855 finishO(*val); 856 } 857 858 smallStringt* createSF(const char *paramType, ...) { 859 va_list pl; 860 smallStringt *r = NULL; 861 862 createSmallArray(l); 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 904 internal smallStringt* duplicateSmallString(smallStringt *self) { 905 906 createAllocateSmallString(dup); 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 993 internal smallStringt* setCharSmallString(smallStringt *self, char c) { 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 1042 internal smallStringt* setSmallArraySmallString(smallStringt* self, smallArrayt* p2) { 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 1060 internal smallStringt* setFromSmallDictSmallString(smallStringt* self, smallDictt* p2) { 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 1077 internal smallStringt* setFromSmallJsonSmallString(smallStringt* self, smallJsont* p2) { 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 1094 internal smallStringt* setSmallBoolSmallString(smallStringt* self, smallBoolt* p2) { 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 1111 internal smallStringt* setSmallDoubleSmallString(smallStringt* self, smallDoublet* p2) { 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 1128 internal smallStringt* setSmallIntSmallString(smallStringt* self, smallIntt* p2) { 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 1145 internal smallStringt* setSmallJsonSmallString(smallStringt* self, smallJsont* p2) { 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 1189 internal smallStringt* setSmallStringSmallString(smallStringt* self, smallStringt* p2) { 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 1214 internal smallStringt* appendSmallString(smallStringt *self, smallStringt *string) { 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 1252 internal smallStringt* appendSmallJsonSmallString(smallStringt *self, smallJsont *string) { 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 1271 internal smallStringt* appendNSmashSmallString(smallStringt *self, smallStringt *string) { 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 1345 internal smallStringt* appendCharSmallString(smallStringt *self, char c) { 1346 1347 charToS(s, c); 1348 return(appendSSmallString(self, s)); 1349 } 1350 1351 internal smallStringt* appendNSmashSmallJsonSmallString(smallStringt *self, smallJsont *string) { 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 1386 internal smallStringt* prependSmallString(smallStringt *self, smallStringt *string) { 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 1415 internal smallStringt* prependSmallJsonSmallString(smallStringt *self, smallJsont *json) { 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 1435 internal smallStringt* prependNSmashSmallString(smallStringt *self, smallStringt *string) { 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 1468 internal smallStringt* prependNSmashSmallJsonSmallString(smallStringt *self, smallJsont *json) { 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 1514 internal smallStringt* prependCharSmallString(smallStringt *self, char c) { 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 1527 internal smallStringt* catSmallString(smallStringt *self, ...) { 1528 va_list pl; 1529 smallStringt *paramType = NULL; 1530 1531 createSmallArray(l); 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 1564 internal smallStringt* catSSmallString(smallStringt *self, ...) { 1565 va_list pl; 1566 char *paramType = NULL; 1567 1568 createSmallArray(l); 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 1596 internal smallStringt* pushNFreeManySmallString(smallStringt *self, ...) { 1597 va_list pl; 1598 smallStringt *paramType = NULL; 1599 1600 createSmallArray(l); 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 1633 internal smallStringt* pushNFreeManySSmallString(smallStringt *self, ...) { 1634 va_list pl; 1635 char *paramType = NULL; 1636 1637 createSmallArray(l); 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 1767 internal smallStringt* replaceSmallJsonSmallJsonSmallString(smallStringt *self, smallJsont *olds, smallJsont *news, size_t max) { 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 1808 internal smallStringt* replaceSmallJsonSmallStringSmallString(smallStringt *self, smallJsont *olds, smallStringt *news, size_t max) { 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 1898 internal smallStringt* replaceSmallStringSmallJsonSmallString(smallStringt *self, smallStringt *olds, smallJsont *news, size_t max) { 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 1933 internal smallStringt* replaceSmallStringSmallStringSmallString(smallStringt *self, smallStringt *olds, smallStringt *news, size_t max) { 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 2255 internal smallStringt* icReplaceSmallJsonSmallJsonSmallString(smallStringt *self, smallJsont *olds, smallJsont *news, size_t max) { 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 2296 internal smallStringt* icReplaceSmallJsonSmallStringSmallString(smallStringt *self, smallJsont *olds, smallStringt *news, size_t max) { 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 2386 internal smallStringt* icReplaceSmallStringSmallJsonSmallString(smallStringt *self, smallStringt *olds, smallJsont *news, size_t max) { 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 2421 internal smallStringt* icReplaceSmallStringSmallStringSmallString(smallStringt *self, smallStringt *olds, smallStringt *news, size_t max) { 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 2800 internal bool equalSmallStringSmallBool(smallStringt* self, smallBoolt* p2) { 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 2826 internal bool equalSmallStringSmallBytes(smallStringt* self, smallBytest* p2) { 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 2849 internal bool equalSmallStringSmallDouble(smallStringt* self, smallDoublet* p2) { 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 2875 internal bool equalSmallStringSmallInt(smallStringt* self, smallIntt* p2) { 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 2901 internal bool equalSmallStringSmallJson(smallStringt* self, smallJsont* p2) { 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 2969 internal bool icEqualSmallStringSmallJson(smallStringt* self, smallJsont* p2) { 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 3070 internal bool startsWithSmallJsonSmallString(smallStringt *self, smallJsont *string) { 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 3090 internal bool startsWithSmallStringSmallString(smallStringt *self, smallStringt *string) { 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 3130 internal bool endsWithSmallJsonSmallString(smallStringt *self, smallJsont *string) { 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 3150 internal bool endsWithSmallStringSmallString(smallStringt *self, smallStringt *string) { 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 3241 internal bool icStartsWithSmallJsonSmallString(smallStringt *self, smallJsont *string) { 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 3261 internal bool icStartsWithSmallStringSmallString(smallStringt *self, smallStringt *string) { 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 3301 internal bool icEndsWithSmallJsonSmallString(smallStringt *self, smallJsont *string) { 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 3321 internal bool icEndsWithSmallStringSmallString(smallStringt *self, smallStringt *string) { 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 3527 internal smallStringt* upperSmallString(smallStringt *self) { 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 3541 internal smallStringt* lowerSmallString(smallStringt *self) { 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 3555 internal smallStringt* trimSmallString(smallStringt *self) { 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 3599 internal smallStringt* lTrimSmallString(smallStringt *self) { 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 3625 internal smallStringt* rTrimSmallString(smallStringt *self) { 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 3680 internal smallStringt* icUniqSmallString(smallStringt *self, char c) { 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 3886 createAllocateSmallJson(r); 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 3981 smallStringt *r = allocSmallString(s); 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 } 4376 createAllocateSmallString(r); 4377 if (!r) { 4378 return(NULL); 4379 } 4380 r->f->set(r, s); 4381 return(r); 4382 } 4383 4384 internal smallStringt* findCharSmallString(smallStringt *self, char c) { 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 } 4395 createAllocateSmallString(r); 4396 if (!r) { 4397 return(NULL); 4398 } 4399 r->f->set(r, s); 4400 return(r); 4401 } 4402 4403 internal smallStringt* findSmallJsonSmallString(smallStringt *self, smallJsont *needle) { 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 4422 internal smallStringt* findSmallStringSmallString(smallStringt *self, smallStringt *needle) { 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 4523 internal char* icHasSmallStringSmallString(smallStringt *self, smallStringt *needle) { 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 } 4546 createAllocateSmallString(r); 4547 if (!r) { 4548 return(NULL); 4549 } 4550 r->f->set(r, s); 4551 return(r); 4552 } 4553 4554 internal smallStringt* icFindCharSmallString(smallStringt *self, char c) { 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 } 4567 createAllocateSmallString(r); 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 4578 internal smallStringt* icFindSmallJsonSmallString(smallStringt *self, smallJsont *needle) { 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 4597 internal smallStringt* icFindSmallStringSmallString(smallStringt *self, smallStringt *needle) { 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 4641 internal ssize_t icIndexOfSmallStringSmallString(smallStringt *self, smallStringt *needle) { 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 4655 internal smallStringt* emptySmallString(smallStringt *self) { 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 4692 createAllocateSmallArray(r); 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 4703 internal smallArrayt* splitCharSmallString(smallStringt *self, char c) { 4704 4705 charToS(s, c); 4706 return(splitSmallString(self, s)); 4707 } 4708 4709 internal smallArrayt* splitSmallJsonSmallString(smallStringt *self, smallJsont *delim) { 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 4728 internal smallArrayt* splitSmallStringSmallString(smallStringt *self, smallStringt *delim) { 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 4762 // preallocate list r 4763 ssize_t rlen = countS(startSmallString, delim) + 2; /* extra empty line at the end + null*/ 4764 r = malloc(rlen * sizeof(char*)); 4765 u32 ridx = 0; 4766 4767 line = workingSmallString; 4768 while (strlen(workingSmallString) != 0) { 4769 token = tokS(line, delim, &workingSmallString); 4770 r[ridx++] = strdup(token); 4771 // mac os sets workingSmallString to NULL at the end 4772 if (!workingSmallString) { 4773 break; //LCOV_EXCL_LINE 4774 } 4775 // first parameter should be NULL in next strtok_r calls 4776 line = NULL; 4777 } 4778 free(startSmallString); 4779 4780 // check if delim is at the end of smallString 4781 // if yes, add an empty smallString in the result 4782 // ["one",""] = split "one/" "/" 4783 size_t lenD = strlen(delim); 4784 // +1 for sType 4785 if (strEq(sStringGetTiny(self->data)+(self->_len-lenD), delim)) { 4786 r[ridx++] = strdup("");; 4787 } 4788 4789 r[ridx] = NULL;; 4790 return(r); 4791 } 4792 4793 internal char** splitCharSSmallString(smallStringt *self, char c) { 4794 4795 charToS(s, c); 4796 return(splitSSmallString(self, s)); 4797 } 4798 4799 internal char** splitSmallJsonSSmallString(smallStringt *self, smallJsont *delim) { 4800 4801 if (!delim) { 4802 return(NULL); 4803 } 4804 4805 if (checkObjectTypes && !isOSmallJson(delim)) { 4806 return(NULL); 4807 } 4808 4809 const char *type = getTopTypeO(delim); 4810 4811 if (!eqS(type,"string")) { 4812 return(NULL); 4813 } 4814 4815 return(splitSSmallString(self, sjGet(delim))); 4816 } 4817 4818 internal char** splitSmallStringSSmallString(smallStringt *self, smallStringt *delim) { 4819 4820 if (!delim) { 4821 return(NULL); 4822 } 4823 if (checkObjectTypes && !isOSmallString(delim)) { 4824 return(NULL); 4825 } 4826 4827 return(splitSSmallString(self, ssGet(delim))); 4828 } 4829 4830 internal smallArrayt* extractSmallString(smallStringt *self, const char* delim1, const char* delim2) { 4831 char **tmp = NULL; 4832 char **r = NULL; 4833 4834 // sanity checks 4835 if (!self->data || !delim1 || !delim2) { 4836 return(NULL); 4837 } 4838 4839 if (strEq(delim1, delim2)) { 4840 return(NULL); 4841 } 4842 4843 tmp = splitSSmallString(self, delim1); 4844 4845 if (listLengthS(tmp) < 2) { 4846 // delim1 not found 4847 listFreeS(tmp); 4848 return(NULL); 4849 } 4850 4851 // remove first element 4852 pErrorNULL(iListSliceS(&tmp, 1, 0)); 4853 4854 forEachCharP(tmp, e) { 4855 char **tmp2 = split(*e, delim2); 4856 if (listLengthS(tmp2) > 1) { 4857 pErrorNULL(listPushS(&r, tmp2[0])); 4858 } 4859 listFreeS(tmp2); 4860 } 4861 4862 listFreeS(tmp); 4863 4864 if (!r) { 4865 return(NULL); 4866 } 4867 4868 createAllocateSmallArray(a); 4869 if (!a) { 4870 listFreeS(r); 4871 return(NULL); 4872 } 4873 a->f->fromArrayNFree(a, r, 0); 4874 return(a); 4875 } 4876 4877 internal smallArrayt* extractCharSSmallString(smallStringt *self, char delim1, const char* delim2) { 4878 4879 charToS(d1, delim1); 4880 return(extractSmallString(self, d1, delim2)); 4881 } 4882 4883 internal smallArrayt* extractSCharSmallString(smallStringt *self, const char* delim1, char delim2) { 4884 4885 charToS(d2, delim2); 4886 return(extractSmallString(self, delim1, d2)); 4887 } 4888 4889 internal smallArrayt* extractCharCharSmallString(smallStringt *self, char delim1, char delim2) { 4890 4891 charToS(d1, delim1); 4892 charToS(d2, delim2); 4893 return(extractSmallString(self, d1, d2)); 4894 } 4895 4896 internal smallArrayt* extractSmallJsonSmallJsonSmallString(smallStringt *self, smallJsont* delim1, smallJsont* delim2) { 4897 4898 if (!delim1 || !delim2) { 4899 return(NULL); 4900 } 4901 4902 if (checkObjectTypes && !isOSmallJson(delim1)) { 4903 return(NULL); 4904 } 4905 4906 if (checkObjectTypes && !isOSmallJson(delim2)) { 4907 return(NULL); 4908 } 4909 4910 const char *type = getTopTypeO(delim1); 4911 4912 if (!eqS(type,"string")) { 4913 return(NULL); 4914 } 4915 4916 type = getTopTypeO(delim2); 4917 4918 if (!eqS(type,"string")) { 4919 return(NULL); 4920 } 4921 4922 return(extractSmallString(self, sjGet(delim1), sjGet(delim2))); 4923 } 4924 4925 internal smallArrayt* extractSmallJsonSmallStringSmallString(smallStringt *self, smallJsont* delim1, smallStringt* delim2) { 4926 4927 if (!delim1 || !delim2) { 4928 return(NULL); 4929 } 4930 4931 if (checkObjectTypes && !isOSmallJson(delim1)) { 4932 return(NULL); 4933 } 4934 4935 if (checkObjectTypes && !isOSmallString(delim2)) { 4936 return(NULL); 4937 } 4938 4939 const char *type = getTopTypeO(delim1); 4940 4941 if (!eqS(type,"string")) { 4942 return(NULL); 4943 } 4944 4945 return(extractSmallString(self, sjGet(delim1), ssGet(delim2))); 4946 } 4947 4948 internal smallArrayt* extractSmallJsonSSmallString(smallStringt *self, smallJsont* delim1, const char* delim2) { 4949 4950 if (!delim1) { 4951 return(NULL); 4952 } 4953 4954 if (checkObjectTypes && !isOSmallJson(delim1)) { 4955 return(NULL); 4956 } 4957 4958 const char *type = getTopTypeO(delim1); 4959 4960 if (!eqS(type,"string")) { 4961 return(NULL); 4962 } 4963 4964 return(extractSmallString(self, sjGet(delim1), delim2)); 4965 } 4966 4967 internal smallArrayt* extractSmallJsonCharSmallString(smallStringt *self, smallJsont* delim1, char delim2) { 4968 4969 if (!delim1) { 4970 return(NULL); 4971 } 4972 4973 if (checkObjectTypes && !isOSmallJson(delim1)) { 4974 return(NULL); 4975 } 4976 4977 const char *type = getTopTypeO(delim1); 4978 4979 if (!eqS(type,"string")) { 4980 return(NULL); 4981 } 4982 4983 charToS(d2, delim2); 4984 return(extractSmallString(self, sjGet(delim1), d2)); 4985 } 4986 4987 internal smallArrayt* extractSmallStringSmallJsonSmallString(smallStringt *self, smallStringt* delim1, smallJsont* delim2) { 4988 4989 if (!delim1 || !delim2) { 4990 return(NULL); 4991 } 4992 4993 if (checkObjectTypes && !isOSmallString(delim1)) { 4994 return(NULL); 4995 } 4996 4997 if (checkObjectTypes && !isOSmallJson(delim2)) { 4998 return(NULL); 4999 } 5000 5001 const char *type = getTopTypeO(delim2); 5002 5003 if (!eqS(type,"string")) { 5004 return(NULL); 5005 } 5006 5007 return(extractSmallString(self, ssGet(delim1), sjGet(delim2))); 5008 } 5009 5010 internal smallArrayt* extractSmallStringSmallStringSmallString(smallStringt *self, smallStringt* delim1, smallStringt* delim2) { 5011 5012 if (!delim1 || !delim2) { 5013 return(NULL); 5014 } 5015 if (checkObjectTypes && !isOSmallString(delim1)) { 5016 return(NULL); 5017 } 5018 if (checkObjectTypes && !isOSmallString(delim2)) { 5019 return(NULL); 5020 } 5021 5022 5023 return(extractSmallString(self, ssGet(delim1), ssGet(delim2))); 5024 } 5025 5026 internal smallArrayt* extractSmallStringSSmallString(smallStringt *self, smallStringt* delim1, const char* delim2) { 5027 5028 if (!delim1) { 5029 return(NULL); 5030 } 5031 if (checkObjectTypes && !isOSmallString(delim1)) { 5032 return(NULL); 5033 } 5034 5035 return(extractSmallString(self, ssGet(delim1), delim2)); 5036 } 5037 5038 internal smallArrayt* extractSmallStringCharSmallString(smallStringt *self, smallStringt* delim1, char delim2) { 5039 5040 if (!delim1) { 5041 return(NULL); 5042 } 5043 if (checkObjectTypes && !isOSmallString(delim1)) { 5044 return(NULL); 5045 } 5046 5047 charToS(d2, delim2); 5048 return(extractSmallString(self, ssGet(delim1), d2)); 5049 } 5050 5051 internal smallArrayt* extractSSmallJsonSmallString(smallStringt *self, const char* delim1, smallJsont* delim2) { 5052 5053 if (!delim2) { 5054 return(NULL); 5055 } 5056 5057 if (checkObjectTypes && !isOSmallJson(delim2)) { 5058 return(NULL); 5059 } 5060 5061 const char *type = getTopTypeO(delim2); 5062 5063 if (!eqS(type,"string")) { 5064 return(NULL); 5065 } 5066 5067 return(extractSmallString(self, delim1, sjGet(delim2))); 5068 } 5069 5070 internal smallArrayt* extractSSmallStringSmallString(smallStringt *self, const char* delim1, smallStringt* delim2) { 5071 5072 if (!delim2) { 5073 return(NULL); 5074 } 5075 if (checkObjectTypes && !isOSmallString(delim2)) { 5076 return(NULL); 5077 } 5078 5079 return(extractSmallString(self, delim1, ssGet(delim2))); 5080 } 5081 5082 internal smallArrayt* extractCharSmallJsonSmallString(smallStringt *self, char delim1, smallJsont* delim2) { 5083 5084 if (!delim2) { 5085 return(NULL); 5086 } 5087 5088 if (checkObjectTypes && !isOSmallJson(delim2)) { 5089 return(NULL); 5090 } 5091 5092 const char *type = getTopTypeO(delim2); 5093 5094 if (!eqS(type,"string")) { 5095 return(NULL); 5096 } 5097 5098 charToS(d1, delim1); 5099 return(extractSmallString(self, d1, sjGet(delim2))); 5100 } 5101 5102 internal smallArrayt* extractCharSmallStringSmallString(smallStringt *self, char delim1, smallStringt* delim2) { 5103 5104 if (!delim2) { 5105 return(NULL); 5106 } 5107 if (checkObjectTypes && !isOSmallString(delim2)) { 5108 return(NULL); 5109 } 5110 5111 charToS(d1, delim1); 5112 return(extractSmallString(self, d1, ssGet(delim2))); 5113 } 5114 5115 internal smallArrayt* icSplitSmallString(smallStringt *self, const char *delim) { 5116 5117 // sanity checks 5118 if (!self->data || !delim) { 5119 return(NULL); 5120 } 5121 5122 createAllocateSmallArray(r); 5123 if (!r) { 5124 return(NULL); 5125 } 5126 5127 char **list = icSplitSSmallString(self, delim); 5128 r->f->fromArray(r, list, 0); 5129 listFreeS(list); 5130 return(r); 5131 } 5132 5133 internal smallArrayt* icSplitCharSmallString(smallStringt *self, char c) { 5134 5135 charToS(s, c); 5136 return(icSplitSmallString(self, s)); 5137 } 5138 5139 internal smallArrayt* icSplitSmallJsonSmallString(smallStringt *self, smallJsont *delim) { 5140 5141 if (!delim) { 5142 return(NULL); 5143 } 5144 5145 if (checkObjectTypes && !isOSmallJson(delim)) { 5146 return(NULL); 5147 } 5148 5149 const char *type = getTopTypeO(delim); 5150 5151 if (!eqS(type,"string")) { 5152 return(NULL); 5153 } 5154 5155 return(icSplitSmallString(self, sjGet(delim))); 5156 } 5157 5158 internal smallArrayt* icSplitSmallStringSmallString(smallStringt *self, smallStringt *delim) { 5159 5160 if (!delim) { 5161 return(NULL); 5162 } 5163 if (checkObjectTypes && !isOSmallString(delim)) { 5164 return(NULL); 5165 } 5166 5167 return(icSplitSmallString(self, ssGet(delim))); 5168 } 5169 5170 internal char** icSplitSSmallString(smallStringt *self, const char *delim) { 5171 char *startSmallString = NULL; 5172 char *workingSmallString = NULL; 5173 char *line = NULL; 5174 char *token = NULL; 5175 char **r = NULL; 5176 5177 // sanity checks 5178 if (!self->data || !delim) { 5179 return(NULL); 5180 } 5181 5182 if (!*delim || !*sStringGetTiny(self->data)) { 5183 // empty delimiter or empty string 5184 pErrorNULL(listPushS(&r, sStringGetTiny(self->data))); 5185 return(r); 5186 } 5187 5188 // split using strtok_r 5189 startSmallString = strdup(sStringGetTiny(self->data)); 5190 workingSmallString = startSmallString; 5191 line = workingSmallString; 5192 while (strlen(workingSmallString) != 0) { 5193 token = icTokS(line, delim, &workingSmallString); 5194 pErrorNULL(listPushS(&r, token)); 5195 // mac os sets workingSmallString to NULL at the end 5196 if (!workingSmallString) { 5197 break; //LCOV_EXCL_LINE 5198 } 5199 // first parameter should be NULL in next strtok_r calls 5200 line = NULL; 5201 } 5202 free(startSmallString); 5203 5204 // check if delim is at the end of smallString 5205 // if yes, add an empty smallString in the result 5206 // ["one",""] = split "one/" "/" 5207 size_t lenD = strlen(delim); 5208 // +1 for sType 5209 if (icEqS(sStringGetTiny(self->data)+(self->_len-lenD), delim)) { 5210 pErrorNULL(listPushS(&r, "")); 5211 } 5212 5213 return(r); 5214 } 5215 5216 internal char** icSplitCharSSmallString(smallStringt *self, char c) { 5217 5218 charToS(s, c); 5219 return(icSplitSSmallString(self, s)); 5220 } 5221 5222 internal char** icSplitSmallJsonSSmallString(smallStringt *self, smallJsont *delim) { 5223 5224 if (!delim) { 5225 return(NULL); 5226 } 5227 5228 if (checkObjectTypes && !isOSmallJson(delim)) { 5229 return(NULL); 5230 } 5231 5232 const char *type = getTopTypeO(delim); 5233 5234 if (!eqS(type,"string")) { 5235 return(NULL); 5236 } 5237 5238 return(icSplitSSmallString(self, sjGet(delim))); 5239 } 5240 5241 internal char** icSplitSmallStringSSmallString(smallStringt *self, smallStringt *delim) { 5242 5243 if (!delim) { 5244 return(NULL); 5245 } 5246 if (checkObjectTypes && !isOSmallString(delim)) { 5247 return(NULL); 5248 } 5249 5250 return(icSplitSSmallString(self, ssGet(delim))); 5251 } 5252 5253 internal smallArrayt* icExtractSmallString(smallStringt *self, const char* delim1, const char* delim2) { 5254 char **tmp = NULL; 5255 char **r = NULL; 5256 5257 // sanity checks 5258 if (!self->data || !delim1 || !delim2) { 5259 return(NULL); 5260 } 5261 5262 if (strEq(delim1, delim2)) { 5263 return(NULL); 5264 } 5265 5266 tmp = icSplitSSmallString(self, delim1);; 5267 5268 if (listLengthS(tmp) < 2) { 5269 // delim1 not found 5270 listFreeS(tmp); 5271 return(NULL); 5272 } 5273 5274 // remove first element 5275 pErrorNULL(iListSliceS(&tmp, 1, 0)); 5276 5277 forEachCharP(tmp, e) { 5278 char **tmp2 = icSplit(*e, delim2); 5279 if (listLengthS(tmp2) > 1) { 5280 pErrorNULL(listPushS(&r, tmp2[0])); 5281 } 5282 listFreeS(tmp2); 5283 } 5284 5285 listFreeS(tmp); 5286 5287 if (!r) { 5288 return(NULL); 5289 } 5290 5291 createAllocateSmallArray(a); 5292 if (!a) { 5293 listFreeS(r); 5294 return(NULL); 5295 } 5296 a->f->fromArrayNFree(a, r, 0); 5297 return(a); 5298 } 5299 5300 internal smallArrayt* icExtractCharSSmallString(smallStringt *self, char delim1, const char* delim2) { 5301 5302 charToS(d1, delim1); 5303 return(icExtractSmallString(self, d1, delim2)); 5304 } 5305 5306 internal smallArrayt* icExtractSCharSmallString(smallStringt *self, const char* delim1, char delim2) { 5307 5308 charToS(d2, delim2); 5309 return(icExtractSmallString(self, delim1, d2)); 5310 } 5311 5312 internal smallArrayt* icExtractCharCharSmallString(smallStringt *self, char delim1, char delim2) { 5313 5314 charToS(d1, delim1); 5315 charToS(d2, delim2); 5316 return(icExtractSmallString(self, d1, d2)); 5317 } 5318 5319 internal smallArrayt* icExtractSmallJsonSmallJsonSmallString(smallStringt *self, smallJsont* delim1, smallJsont* delim2) { 5320 5321 if (!delim1 || !delim2) { 5322 return(NULL); 5323 } 5324 5325 if (checkObjectTypes && !isOSmallJson(delim1)) { 5326 return(NULL); 5327 } 5328 5329 if (checkObjectTypes && !isOSmallJson(delim2)) { 5330 return(NULL); 5331 } 5332 5333 const char *type = getTopTypeO(delim1); 5334 5335 if (!eqS(type,"string")) { 5336 return(NULL); 5337 } 5338 5339 type = getTopTypeO(delim2); 5340 5341 if (!eqS(type,"string")) { 5342 return(NULL); 5343 } 5344 5345 return(icExtractSmallString(self, sjGet(delim1), sjGet(delim2))); 5346 } 5347 5348 internal smallArrayt* icExtractSmallJsonSmallStringSmallString(smallStringt *self, smallJsont* delim1, smallStringt* delim2) { 5349 5350 if (!delim1 || !delim2) { 5351 return(NULL); 5352 } 5353 5354 if (checkObjectTypes && !isOSmallJson(delim1)) { 5355 return(NULL); 5356 } 5357 5358 if (checkObjectTypes && !isOSmallString(delim2)) { 5359 return(NULL); 5360 } 5361 5362 const char *type = getTopTypeO(delim1); 5363 5364 if (!eqS(type,"string")) { 5365 return(NULL); 5366 } 5367 5368 return(icExtractSmallString(self, sjGet(delim1), ssGet(delim2))); 5369 } 5370 5371 internal smallArrayt* icExtractSmallJsonSSmallString(smallStringt *self, smallJsont* delim1, const char* delim2) { 5372 5373 if (!delim1) { 5374 return(NULL); 5375 } 5376 5377 if (checkObjectTypes && !isOSmallJson(delim1)) { 5378 return(NULL); 5379 } 5380 5381 const char *type = getTopTypeO(delim1); 5382 5383 if (!eqS(type,"string")) { 5384 return(NULL); 5385 } 5386 5387 return(icExtractSmallString(self, sjGet(delim1), delim2)); 5388 } 5389 5390 internal smallArrayt* icExtractSmallJsonCharSmallString(smallStringt *self, smallJsont* delim1, char delim2) { 5391 5392 if (!delim1) { 5393 return(NULL); 5394 } 5395 5396 if (checkObjectTypes && !isOSmallJson(delim1)) { 5397 return(NULL); 5398 } 5399 5400 const char *type = getTopTypeO(delim1); 5401 5402 if (!eqS(type,"string")) { 5403 return(NULL); 5404 } 5405 5406 charToS(d2, delim2); 5407 return(icExtractSmallString(self, sjGet(delim1), d2)); 5408 } 5409 5410 internal smallArrayt* icExtractSmallStringSmallJsonSmallString(smallStringt *self, smallStringt* delim1, smallJsont* delim2) { 5411 5412 if (!delim1 || !delim2) { 5413 return(NULL); 5414 } 5415 5416 if (checkObjectTypes && !isOSmallString(delim1)) { 5417 return(NULL); 5418 } 5419 5420 if (checkObjectTypes && !isOSmallJson(delim2)) { 5421 return(NULL); 5422 } 5423 5424 const char *type = getTopTypeO(delim2); 5425 5426 if (!eqS(type,"string")) { 5427 return(NULL); 5428 } 5429 5430 return(icExtractSmallString(self, ssGet(delim1), sjGet(delim2))); 5431 } 5432 5433 internal smallArrayt* icExtractSmallStringSmallStringSmallString(smallStringt *self, smallStringt* delim1, smallStringt* delim2) { 5434 5435 if (!delim1 || !delim2) { 5436 return(NULL); 5437 } 5438 5439 if (checkObjectTypes && !isOSmallString(delim1)) { 5440 return(NULL); 5441 } 5442 5443 if (checkObjectTypes && !isOSmallString(delim2)) { 5444 return(NULL); 5445 } 5446 5447 return(icExtractSmallString(self, ssGet(delim1), ssGet(delim2))); 5448 } 5449 5450 internal smallArrayt* icExtractSmallStringSSmallString(smallStringt *self, smallStringt* delim1, const char* delim2) { 5451 5452 if (!delim1) { 5453 return(NULL); 5454 } 5455 if (checkObjectTypes && !isOSmallString(delim1)) { 5456 return(NULL); 5457 } 5458 5459 return(icExtractSmallString(self, ssGet(delim1), delim2)); 5460 } 5461 5462 internal smallArrayt* icExtractSmallStringCharSmallString(smallStringt *self, smallStringt* delim1, char delim2) { 5463 5464 if (!delim1) { 5465 return(NULL); 5466 } 5467 if (checkObjectTypes && !isOSmallString(delim1)) { 5468 return(NULL); 5469 } 5470 5471 charToS(d2, delim2); 5472 return(icExtractSmallString(self, ssGet(delim1), d2)); 5473 } 5474 5475 internal smallArrayt* icExtractSSmallJsonSmallString(smallStringt *self, const char* delim1, smallJsont* delim2) { 5476 5477 if (!delim2) { 5478 return(NULL); 5479 } 5480 5481 if (checkObjectTypes && !isOSmallJson(delim2)) { 5482 return(NULL); 5483 } 5484 5485 const char *type = getTopTypeO(delim2); 5486 5487 if (!eqS(type,"string")) { 5488 return(NULL); 5489 } 5490 5491 return(icExtractSmallString(self, delim1, sjGet(delim2))); 5492 } 5493 5494 internal smallArrayt* icExtractSSmallStringSmallString(smallStringt *self, const char* delim1, smallStringt* delim2) { 5495 5496 if (!delim2) { 5497 return(NULL); 5498 } 5499 if (checkObjectTypes && !isOSmallString(delim2)) { 5500 return(NULL); 5501 } 5502 5503 return(icExtractSmallString(self, delim1, ssGet(delim2))); 5504 } 5505 5506 internal smallArrayt* icExtractCharSmallJsonSmallString(smallStringt *self, char delim1, smallJsont* delim2) { 5507 5508 if (!delim2) { 5509 return(NULL); 5510 } 5511 5512 if (checkObjectTypes && !isOSmallJson(delim2)) { 5513 return(NULL); 5514 } 5515 5516 const char *type = getTopTypeO(delim2); 5517 5518 if (!eqS(type,"string")) { 5519 return(NULL); 5520 } 5521 5522 charToS(d1, delim1); 5523 return(icExtractSmallString(self, d1, sjGet(delim2))); 5524 } 5525 5526 internal smallArrayt* icExtractCharSmallStringSmallString(smallStringt *self, char delim1, smallStringt* delim2) { 5527 5528 if (!delim2) { 5529 return(NULL); 5530 } 5531 if (checkObjectTypes && !isOSmallString(delim2)) { 5532 return(NULL); 5533 } 5534 5535 charToS(d1, delim1); 5536 return(icExtractSmallString(self, d1, ssGet(delim2))); 5537 } 5538 5539 internal smallStringt* colorSmallString(smallStringt *self, const char *colr) { 5540 5541 if (!self->data || !colr) { 5542 return(NULL); 5543 } 5544 5545 char *s = catS(colr, sStringGetTiny(self->data), RST); 5546 setSmallString(self, s); 5547 free(s); 5548 return(self); 5549 } 5550 5551 internal char* colordSmallString(smallStringt *self, const char *color) { 5552 5553 if (!self->data || !color) { 5554 return(NULL); 5555 } 5556 if (isEmptySmallString(self)) { 5557 return(emptySF()); 5558 } 5559 return(catS(color, sStringGetTiny(self->data), RST)); 5560 } 5561 5562 internal smallStringt* readFileSmallString(smallStringt *self, const char *filePath) { 5563 FILE *f = NULL; 5564 ssize_t len; 5565 size_t readStatus; 5566 5567 // sanity checks 5568 if (!filePath || isBlankS(filePath)) { 5569 return(NULL); 5570 } 5571 5572 len = fileSize(filePath);; 5573 if (len == -1) { 5574 return(NULL); 5575 } 5576 5577 free(self->data); 5578 5579 // +1 to add \0 at the end 5580 self->data = malloc((size_t)len+2); 5581 if (!self->data) { 5582 return(NULL); 5583 } 5584 5585 f = fopen(filePath, "r"); 5586 if (!f) { 5587 pFuncError 5588 shEPrintfS("The path was: \"%s\"\n", filePath); 5589 return(NULL); 5590 } 5591 readStatus = fread(((char *)self->data)+1, 1, (size_t)len , f); 5592 fclose(f); 5593 5594 self->data->type = STRING; 5595 5596 if (readStatus != (size_t)len) { 5597 pFuncError 5598 shEPrintfS("The path was: \"%s\"\n", filePath); 5599 return(NULL); 5600 } 5601 5602 *((char*)self->data+len+1) = 0; 5603 self->_len = (size_t)len; 5604 5605 return(self); 5606 } 5607 5608 internal smallStringt* readFileSmallJsonSmallString(smallStringt *self, smallJsont *filePath) { 5609 5610 if (!filePath) { 5611 return(NULL); 5612 } 5613 5614 if (checkObjectTypes && !isOSmallJson(filePath)) { 5615 return(NULL); 5616 } 5617 5618 const char *type = getTopTypeO(filePath); 5619 5620 if (!eqS(type,"string")) { 5621 return(NULL); 5622 } 5623 5624 return(readFileSmallString(self, getTopSO(filePath))); 5625 } 5626 5627 internal smallStringt* readFileSmallStringSmallString(smallStringt *self, smallStringt *filePath) { 5628 5629 if (!filePath) { 5630 return(NULL); 5631 } 5632 5633 if (checkObjectTypes && !isOSmallString(filePath)) { 5634 return(NULL); 5635 } 5636 5637 return(readFileSmallString(self, ssGet(filePath))); 5638 } 5639 5640 internal smallStringt* readStreamSmallString(smallStringt *self, FILE *fp) { 5641 ssize_t len; 5642 size_t readStatus; 5643 5644 // sanity checks 5645 if (!fp) { 5646 return(NULL); 5647 } 5648 5649 len = fileSizeFP(fp);; 5650 if (len == -1) { 5651 return(NULL); 5652 } 5653 5654 free(self->data); 5655 5656 // +1 to add \0 at the end 5657 self->data = malloc((size_t)len+2); 5658 if (!self->data) { 5659 return(NULL); 5660 } 5661 5662 readStatus = fread(&self->data->data, 1, (size_t)len , fp); 5663 5664 self->data->type = STRING; 5665 5666 if (readStatus != (size_t)len) { 5667 pFuncError 5668 return(NULL); 5669 } 5670 5671 *(&self->data->data+len) = 0; 5672 self->_len = (size_t)len; 5673 5674 return(self); 5675 } 5676 5677 internal int writeFileSmallString(smallStringt *self, const char *filePath) { 5678 FILE *f = NULL; 5679 size_t len; 5680 size_t writeStatus; 5681 5682 // sanity checks 5683 if (!filePath || isBlankS(filePath) || !self->data) { 5684 return(0); 5685 } 5686 5687 len = self->_len; 5688 5689 f = fopen(filePath, "w"); 5690 if (!f) { 5691 pFuncError 5692 shEPrintfS("The path was: \"%s\"\n", filePath); 5693 return(0); 5694 } 5695 writeStatus = fwrite(sStringGetTiny(self->data), 1, len , f); 5696 fclose(f); 5697 5698 if (writeStatus != len) { 5699 pFuncError 5700 shEPrintfS("The path was: \"%s\"\n", filePath); 5701 return(0); 5702 } 5703 5704 return(1); 5705 } 5706 5707 internal int writeFileSmallJsonSmallString(smallStringt *self, smallJsont *filePath) { 5708 5709 if (!filePath) { 5710 return(0); 5711 } 5712 5713 if (checkObjectTypes && !isOSmallJson(filePath)) { 5714 return(0); 5715 } 5716 5717 const char *type = getTopTypeO(filePath); 5718 5719 if (!eqS(type,"string")) { 5720 return(0); 5721 } 5722 5723 return(writeFileSmallString(self, getTopSO(filePath))); 5724 } 5725 5726 internal int writeFileSmallStringSmallString(smallStringt *self, smallStringt *filePath) { 5727 5728 if (!filePath) { 5729 return(0); 5730 } 5731 5732 if (checkObjectTypes && !isOSmallString(filePath)) { 5733 return(0); 5734 } 5735 5736 return(writeFileSmallString(self, ssGet(filePath))); 5737 } 5738 5739 internal int writeStreamSmallString(smallStringt *self, FILE *fp) { 5740 size_t len; 5741 size_t writeStatus; 5742 5743 // sanity checks 5744 if (!fp || !self->data) { 5745 return(0); 5746 } 5747 5748 len = self->_len; 5749 5750 writeStatus = fwrite(sStringGetTiny(self->data), 1, len , fp); 5751 5752 if (writeStatus != len) { 5753 pFuncError 5754 return(0); 5755 } 5756 5757 return(1); 5758 } 5759 5760 internal int appendFileSmallString(smallStringt *self, const char *filePath) { 5761 FILE *f = NULL; 5762 size_t len; 5763 size_t writeStatus; 5764 5765 // sanity checks 5766 if (!filePath || isBlankS(filePath) || !self->data) { 5767 return(0); 5768 } 5769 5770 len = self->_len; 5771 5772 f = fopen(filePath, "a"); 5773 if (!f) { 5774 pFuncError 5775 shEPrintfS("The path was: \"%s\"\n", filePath); 5776 return(0); 5777 } 5778 writeStatus = fwrite(sStringGetTiny(self->data), 1, len , f); 5779 fclose(f); 5780 5781 if (writeStatus != len) { 5782 pFuncError 5783 shEPrintfS("The path was: \"%s\"\n", filePath); 5784 return(0); 5785 } 5786 5787 return(1); 5788 } 5789 5790 internal int appendFileSmallStringSmallString(smallStringt *self, smallStringt *filePath) { 5791 5792 if (!filePath) { 5793 return(0); 5794 } 5795 if (checkObjectTypes && !isOSmallString(filePath)) { 5796 return(0); 5797 } 5798 5799 return(appendFileSmallString(self, ssGet(filePath))); 5800 } 5801 5802 smallStringt* duplicateSmallStringG (smallStringt *self) { 5803 5804 return(self->f->duplicate(self)); 5805 } 5806 5807 void freeSmallStringG (smallStringt *self) {self->f->free(self);} 5808 5809 smallStringt* setBoolSmallStringG(smallStringt* self, bool p2) { 5810 5811 return(self->f->setBool(self, p2)); 5812 } 5813 5814 smallStringt* setDoubleSmallStringG(smallStringt* self, double p2) { 5815 5816 return(self->f->setDouble(self, p2)); 5817 } 5818 5819 smallStringt* setInt64SmallStringG(smallStringt* self, int64_t p2) { 5820 5821 return(self->f->setInt64(self, p2)); 5822 } 5823 5824 smallStringt* setInt32SmallStringG(smallStringt* self, int32_t p2) { 5825 5826 return(self->f->setInt32(self, p2)); 5827 } 5828 5829 smallStringt* setUint32SmallStringG(smallStringt* self, uint32_t p2) { 5830 5831 return(self->f->setUint32(self, p2)); 5832 } 5833 5834 smallStringt* setUint64SmallStringG(smallStringt* self, uint64_t p2) { 5835 5836 return(self->f->setUint64(self, p2)); 5837 } 5838 5839 smallStringt* setSmallStringG(smallStringt* self, const char* p2) { 5840 5841 return(self->f->set(self, p2)); 5842 } 5843 5844 smallStringt* setCharSmallStringG(smallStringt *self, char c) { 5845 5846 return(self->f->setChar(self,c)); 5847 } 5848 5849 smallStringt* setSmallArraySmallStringG(smallStringt* self, smallArrayt* p2) { 5850 5851 return(self->f->setSmallArray(self, p2)); 5852 } 5853 5854 smallStringt* setFromSmallDictSmallStringG(smallStringt* self, smallDictt* p2) { 5855 5856 return(self->f->setFromSmallDict(self, p2)); 5857 } 5858 5859 smallStringt* setFromSmallJsonSmallStringG(smallStringt* self, smallJsont* p2) { 5860 5861 return(self->f->setFromSmallJson(self, p2)); 5862 } 5863 5864 smallStringt* setSmallBoolSmallStringG(smallStringt* self, smallBoolt* p2) { 5865 5866 return(self->f->setSmallBool(self, p2)); 5867 } 5868 5869 smallStringt* setSmallDoubleSmallStringG(smallStringt* self, smallDoublet* p2) { 5870 5871 return(self->f->setSmallDouble(self, p2)); 5872 } 5873 5874 smallStringt* setSmallIntSmallStringG(smallStringt* self, smallIntt* p2) { 5875 5876 return(self->f->setSmallInt(self, p2)); 5877 } 5878 5879 smallStringt* setSmallJsonSmallStringG(smallStringt* self, smallJsont* p2) { 5880 5881 return(self->f->setSmallJson(self, p2)); 5882 } 5883 5884 smallStringt* setSmallStringSmallStringG(smallStringt* self, smallStringt* p2) { 5885 5886 return(self->f->setSmallString(self, p2)); 5887 } 5888 5889 5890 char getAtSmallStringG(smallStringt *self, char retType UNUSED, int64_t index) { 5891 5892 return(self->f->getAt(self, index)); 5893 } 5894 5895 smallStringt* setAtSmallStringG(smallStringt *self, int64_t index, char c) { 5896 5897 return(self->f->setAt(self, index, c)); 5898 } 5899 5900 smallStringt* appendSmallStringG (smallStringt *self, smallStringt *string) { 5901 5902 return(self->f->append(self, string)); 5903 } 5904 5905 smallStringt* appendSmallJsonSmallStringG(smallStringt *self, smallJsont *string) { 5906 5907 return(self->f->appendSmallJson(self, string)); 5908 } 5909 5910 smallStringt* appendSSmallStringG (smallStringt *self, const char *string) { 5911 5912 return(self->f->appendS(self, string)); 5913 } 5914 5915 smallStringt* appendCharSmallStringG(smallStringt *self, char c) { 5916 5917 return(self->f->appendChar(self,c)); 5918 } 5919 5920 smallStringt* appendNSmashSmallStringG(smallStringt *self, smallStringt *string) { 5921 5922 return(self->f->appendNSmash(self,string)); 5923 } 5924 5925 smallStringt* appendNSmashSmallJsonSmallStringG(smallStringt *self, smallJsont *string) { 5926 5927 return(self->f->appendNSmashSmallJson(self,string)); 5928 } 5929 5930 smallStringt* appendNSmashSSmallStringG(smallStringt *self, char *string) { 5931 5932 return(self->f->appendNSmashS(self, string)); 5933 } 5934 5935 5936 smallStringt* prependSmallStringG (smallStringt *self, smallStringt *string) { 5937 5938 return(self->f->prepend(self, string)); 5939 } 5940 5941 smallStringt* prependSmallJsonSmallStringG(smallStringt *self, smallJsont *json) { 5942 5943 return(self->f->prependSmallJson(self, json)); 5944 } 5945 5946 smallStringt* prependSSmallStringG (smallStringt *self, const char *string) { 5947 5948 return(self->f->prependS(self, string)); 5949 } 5950 5951 smallStringt* prependCharSmallStringG(smallStringt *self, char c) { 5952 5953 return(self->f->prependChar(self,c)); 5954 } 5955 5956 smallStringt* prependNSmashSmallStringG(smallStringt *self, smallStringt *string) { 5957 5958 return(self->f->prependNSmash(self, string)); 5959 } 5960 5961 smallStringt* prependNSmashSmallJsonSmallStringG(smallStringt *self, smallJsont *json) { 5962 5963 return(self->f->prependNSmashSmallJson(self, json)); 5964 } 5965 5966 smallStringt* prependNSmashSSmallStringG (smallStringt *self, char *string) { 5967 5968 return(self->f->prependNSmashS(self, string)); 5969 } 5970 5971 5972 smallStringt* replaceSmallStringG (smallStringt *self, const char *olds, const char *news, size_t max) { 5973 5974 return(self->f->replace(self, olds, news, max)); 5975 } 5976 5977 smallStringt* replaceCharSSmallStringG(smallStringt *self, char olds, const char *news, size_t max) { 5978 5979 return(self->f->replaceCharS(self,olds,news,max)); 5980 } 5981 5982 smallStringt* replaceSCharSmallStringG(smallStringt *self, const char *olds, char news, size_t max) { 5983 5984 return(self->f->replaceSChar(self,olds,news,max)); 5985 } 5986 5987 smallStringt* replaceCharCharSmallStringG(smallStringt *self, char olds, char news, size_t max) { 5988 5989 return(self->f->replaceCharChar(self,olds,news,max)); 5990 } 5991 5992 smallStringt* replaceSmallJsonSmallJsonSmallStringG(smallStringt *self, smallJsont *olds, smallJsont *news, size_t max) { 5993 5994 return(self->f->replaceSmallJsonSmallJson(self,olds,news,max)); 5995 } 5996 5997 smallStringt* replaceSmallJsonSmallStringSmallStringG(smallStringt *self, smallJsont *olds, smallStringt *news, size_t max) { 5998 5999 return(self->f->replaceSmallJsonSmallString(self,olds,news,max)); 6000 } 6001 6002 smallStringt* replaceSmallJsonSSmallStringG(smallStringt *self, smallJsont *olds, const char *news, size_t max) { 6003 6004 return(self->f->replaceSmallJsonS(self,olds,news,max)); 6005 } 6006 6007 smallStringt* replaceSmallJsonCharSmallStringG(smallStringt *self, smallJsont *olds, char news, size_t max) { 6008 6009 return(self->f->replaceSmallJsonChar(self,olds,news,max)); 6010 } 6011 6012 smallStringt* replaceSmallStringSmallJsonSmallStringG(smallStringt *self, smallStringt *olds, smallJsont *news, size_t max) { 6013 6014 return(self->f->replaceSmallStringSmallJson(self,olds,news,max)); 6015 } 6016 6017 smallStringt* replaceSmallStringSmallStringSmallStringG(smallStringt *self, smallStringt *olds, smallStringt *news, size_t max) { 6018 6019 return(self->f->replaceSmallStringSmallString(self,olds,news,max)); 6020 } 6021 6022 smallStringt* replaceSmallStringSSmallStringG(smallStringt *self, smallStringt *olds, const char *news, size_t max) { 6023 6024 return(self->f->replaceSmallStringS(self,olds,news,max)); 6025 } 6026 6027 smallStringt* replaceSmallStringCharSmallStringG(smallStringt *self, smallStringt *olds, char news, size_t max) { 6028 6029 return(self->f->replaceSmallStringChar(self,olds,news,max)); 6030 } 6031 6032 smallStringt* replaceSSmallJsonSmallStringG(smallStringt *self, const char *olds, smallJsont *news, size_t max) { 6033 6034 return(self->f->replaceSSmallJson(self,olds,news,max)); 6035 } 6036 6037 smallStringt* replaceSSmallStringSmallStringG(smallStringt *self, const char *olds, smallStringt *news, size_t max) { 6038 6039 return(self->f->replaceSSmallString(self,olds,news,max)); 6040 } 6041 6042 smallStringt* replaceCharSmallJsonSmallStringG(smallStringt *self, char olds, smallJsont *news, size_t max) { 6043 6044 return(self->f->replaceCharSmallJson(self,olds,news,max)); 6045 } 6046 6047 smallStringt* replaceCharSmallStringSmallStringG(smallStringt *self, char olds, smallStringt *news, size_t max) { 6048 6049 return(self->f->replaceCharSmallString(self,olds,news,max)); 6050 } 6051 6052 smallStringt* icReplaceSmallStringG (smallStringt *self, const char *olds, const char *news, size_t max) { 6053 6054 return(self->f->icReplace(self, olds, news, max)); 6055 } 6056 6057 smallStringt* icReplaceCharSSmallStringG(smallStringt *self, char olds, const char *news, size_t max) { 6058 6059 return(self->f->icReplaceCharS(self,olds,news,max)); 6060 } 6061 6062 smallStringt* icReplaceSCharSmallStringG(smallStringt *self, const char *olds, char news, size_t max) { 6063 6064 return(self->f->icReplaceSChar(self,olds,news,max)); 6065 } 6066 6067 smallStringt* icReplaceCharCharSmallStringG(smallStringt *self, char olds, char news, size_t max) { 6068 6069 return(self->f->icReplaceCharChar(self,olds,news,max)); 6070 } 6071 6072 smallStringt* icReplaceSmallJsonSmallJsonSmallStringG(smallStringt *self, smallJsont *olds, smallJsont *news, size_t max) { 6073 6074 return(self->f->icReplaceSmallJsonSmallJson(self,olds,news,max)); 6075 } 6076 6077 smallStringt* icReplaceSmallJsonSmallStringSmallStringG(smallStringt *self, smallJsont *olds, smallStringt *news, size_t max) { 6078 6079 return(self->f->icReplaceSmallJsonSmallString(self,olds,news,max)); 6080 } 6081 6082 smallStringt* icReplaceSmallJsonSSmallStringG(smallStringt *self, smallJsont *olds, const char *news, size_t max) { 6083 6084 return(self->f->icReplaceSmallJsonS(self,olds,news,max)); 6085 } 6086 6087 smallStringt* icReplaceSmallJsonCharSmallStringG(smallStringt *self, smallJsont *olds, char news, size_t max) { 6088 6089 return(self->f->icReplaceSmallJsonChar(self,olds,news,max)); 6090 } 6091 6092 smallStringt* icReplaceSmallStringSmallJsonSmallStringG(smallStringt *self, smallStringt *olds, smallJsont *news, size_t max) { 6093 6094 return(self->f->icReplaceSmallStringSmallJson(self,olds,news,max)); 6095 } 6096 6097 smallStringt* icReplaceSmallStringSmallStringSmallStringG(smallStringt *self, smallStringt *olds, smallStringt *news, size_t max) { 6098 6099 return(self->f->icReplaceSmallStringSmallString(self,olds,news,max)); 6100 } 6101 6102 smallStringt* icReplaceSmallStringSSmallStringG(smallStringt *self, smallStringt *olds, const char *news, size_t max) { 6103 6104 return(self->f->icReplaceSmallStringS(self,olds,news,max)); 6105 } 6106 6107 smallStringt* icReplaceSmallStringCharSmallStringG(smallStringt *self, smallStringt *olds, char news, size_t max) { 6108 6109 return(self->f->icReplaceSmallStringChar(self,olds,news,max)); 6110 } 6111 6112 smallStringt* icReplaceSSmallJsonSmallStringG(smallStringt *self, const char *olds, smallJsont *news, size_t max) { 6113 6114 return(self->f->icReplaceSSmallJson(self,olds,news,max)); 6115 } 6116 6117 smallStringt* icReplaceSSmallStringSmallStringG(smallStringt *self, const char *olds, smallStringt *news, size_t max) { 6118 6119 return(self->f->icReplaceSSmallString(self,olds,news,max)); 6120 } 6121 6122 smallStringt* icReplaceCharSmallJsonSmallStringG(smallStringt *self, char olds, smallJsont *news, size_t max) { 6123 6124 return(self->f->icReplaceCharSmallJson(self,olds,news,max)); 6125 } 6126 6127 smallStringt* icReplaceCharSmallStringSmallStringG(smallStringt *self, char olds, smallStringt *news, size_t max) { 6128 6129 return(self->f->icReplaceCharSmallString(self,olds,news,max)); 6130 } 6131 6132 bool equalSmallStringFG(smallStringt* self, smallStringt* p2) { 6133 6134 return(self->f->equal(self, p2)); 6135 } 6136 6137 bool equalCharSmallStringG(smallStringt *self, char c) { 6138 6139 return(self->f->equalChar(self,c)); 6140 } 6141 6142 bool equalSSmallStringG (smallStringt *self, const char *string) { 6143 6144 return(self->f->equalS(self, string)); 6145 } 6146 6147 bool equalSmallStringBaseG(smallStringt* self, baset* p2) { 6148 6149 return(self->f->equalBase(self, p2)); 6150 } 6151 6152 bool equalSmallStringBoolG(smallStringt* self, bool p2) { 6153 6154 return(self->f->equalBool(self, p2)); 6155 } 6156 6157 bool equalSmallStringDoubleG(smallStringt* self, double p2) { 6158 6159 return(self->f->equalDouble(self, p2)); 6160 } 6161 6162 bool equalSmallStringInt64G(smallStringt* self, int64_t p2) { 6163 6164 return(self->f->equalInt64(self, p2)); 6165 } 6166 6167 bool equalSmallStringInt32G(smallStringt* self, int32_t p2) { 6168 6169 return(self->f->equalInt32(self, p2)); 6170 } 6171 6172 bool equalSmallStringUint32G(smallStringt* self, uint32_t p2) { 6173 6174 return(self->f->equalUint32(self, p2)); 6175 } 6176 6177 bool equalSmallStringUint64G(smallStringt* self, uint64_t p2) { 6178 6179 return(self->f->equalUint64(self, p2)); 6180 } 6181 6182 bool equalSmallStringSmallBoolG(smallStringt* self, smallBoolt* p2) { 6183 6184 return(self->f->equalSmallBool(self, p2)); 6185 } 6186 6187 bool equalSmallStringSmallBytesG(smallStringt* self, smallBytest* p2) { 6188 6189 return(self->f->equalSmallBytes(self, p2)); 6190 } 6191 6192 bool equalSmallStringSmallDoubleG(smallStringt* self, smallDoublet* p2) { 6193 6194 return(self->f->equalSmallDouble(self, p2)); 6195 } 6196 6197 bool equalSmallStringSmallIntG(smallStringt* self, smallIntt* p2) { 6198 6199 return(self->f->equalSmallInt(self, p2)); 6200 } 6201 6202 bool equalSmallStringSmallJsonG(smallStringt* self, smallJsont* p2) { 6203 6204 return(self->f->equalSmallJson(self, p2)); 6205 } 6206 6207 bool icEqualSmallStringFG(smallStringt* self, smallStringt* p2) { 6208 6209 return(self->f->icEqual(self, p2)); 6210 } 6211 6212 bool icEqualCharSmallStringG(smallStringt *self, char c) { 6213 6214 return(self->f->icEqualChar(self,c)); 6215 } 6216 6217 bool icEqualSSmallStringG (smallStringt *self, const char *string) { 6218 6219 return(self->f->icEqualS(self, string)); 6220 } 6221 6222 bool icEqualSmallStringBaseG(smallStringt* self, baset* p2) { 6223 6224 return(self->f->icEqualBase(self, p2)); 6225 } 6226 6227 bool icEqualSmallStringSmallJsonG(smallStringt* self, smallJsont* p2) { 6228 6229 return(self->f->icEqualSmallJson(self, p2)); 6230 } 6231 6232 bool equalISSmallStringG (smallStringt *self, const char *string, int64_t index) { 6233 6234 return(self->f->equalIS(self, string, index)); 6235 } 6236 6237 bool equalICharSmallStringG(smallStringt *self, char c, int64_t index) { 6238 6239 return(self->f->equalIChar(self,c,index)); 6240 } 6241 6242 bool equalISmallJsonSmallStringG(smallStringt *self, smallJsont *string, int64_t index) { 6243 6244 return(self->f->equalISmallJson(self,string,index)); 6245 } 6246 6247 bool equalISmallStringSmallStringG(smallStringt *self, smallStringt *string, int64_t index) { 6248 6249 return(self->f->equalISmallString(self,string,index)); 6250 } 6251 6252 bool startsWithSSmallStringG (smallStringt *self, const char *string) { 6253 6254 return(self->f->startsWithS(self, string)); 6255 } 6256 6257 bool startsWithCharSmallStringG(smallStringt *self, char c) { 6258 6259 return(self->f->startsWithChar(self,c)); 6260 } 6261 6262 bool startsWithSmallJsonSmallStringG (smallStringt *self, smallJsont *string) { 6263 6264 return(self->f->startsWithSmallJson(self,string)); 6265 } 6266 6267 bool startsWithSmallStringSmallStringG(smallStringt *self, smallStringt *string) { 6268 6269 return(self->f->startsWithSmallString(self,string)); 6270 } 6271 6272 bool endsWithSSmallStringG (smallStringt *self, const char *string) { 6273 6274 return(self->f->endsWithS(self, string)); 6275 } 6276 6277 bool endsWithCharSmallStringG(smallStringt *self, char c) { 6278 6279 return(self->f->endsWithChar(self,c)); 6280 } 6281 6282 bool endsWithSmallJsonSmallStringG (smallStringt *self, smallJsont *string) { 6283 6284 return(self->f->endsWithSmallJson(self,string)); 6285 } 6286 6287 bool endsWithSmallStringSmallStringG(smallStringt *self, smallStringt *string) { 6288 6289 return(self->f->endsWithSmallString(self,string)); 6290 } 6291 6292 ssize_t countSSmallStringG (smallStringt *self, const char *string) { 6293 6294 return(self->f->countS(self, string)); 6295 } 6296 6297 ssize_t countCharSmallStringG(smallStringt *self, char c) { 6298 6299 return(self->f->countChar(self,c)); 6300 } 6301 6302 ssize_t countSmallJsonSmallStringG (smallStringt *self, smallJsont *string) { 6303 6304 return(self->f->countSmallJson(self,string)); 6305 } 6306 6307 ssize_t countSmallStringSmallStringG(smallStringt *self, smallStringt *string) { 6308 6309 return(self->f->countSmallString(self,string)); 6310 } 6311 6312 bool icStartsWithSSmallStringG (smallStringt *self, const char *string) { 6313 6314 return(self->f->icStartsWithS(self, string)); 6315 } 6316 6317 bool icStartsWithCharSmallStringG(smallStringt *self, char c) { 6318 6319 return(self->f->icStartsWithChar(self,c)); 6320 } 6321 6322 bool icStartsWithSmallJsonSmallStringG (smallStringt *self, smallJsont *string) { 6323 6324 return(self->f->icStartsWithSmallJson(self,string)); 6325 } 6326 6327 bool icStartsWithSmallStringSmallStringG(smallStringt *self, smallStringt *string) { 6328 6329 return(self->f->icStartsWithSmallString(self,string)); 6330 } 6331 6332 bool icEndsWithSSmallStringG (smallStringt *self, const char *string) { 6333 6334 return(self->f->icEndsWithS(self, string)); 6335 } 6336 6337 bool icEndsWithCharSmallStringG(smallStringt *self, char c) { 6338 6339 return(self->f->icEndsWithChar(self,c)); 6340 } 6341 6342 bool icEndsWithSmallJsonSmallStringG (smallStringt *self, smallJsont *string) { 6343 6344 return(self->f->icEndsWithSmallJson(self,string)); 6345 } 6346 6347 bool icEndsWithSmallStringSmallStringG(smallStringt *self, smallStringt *string) { 6348 6349 return(self->f->icEndsWithSmallString(self,string)); 6350 } 6351 6352 ssize_t icCountSSmallStringG (smallStringt *self, const char *string) { 6353 6354 return(self->f->icCountS(self, string)); 6355 } 6356 6357 ssize_t icCountCharSmallStringG(smallStringt *self, char c) { 6358 6359 return(self->f->icCountChar(self,c)); 6360 } 6361 6362 ssize_t icCountSmallJsonSmallStringG (smallStringt *self, smallJsont *string) { 6363 6364 return(self->f->icCountSmallJson(self,string)); 6365 } 6366 6367 ssize_t icCountSmallStringSmallStringG(smallStringt *self, smallStringt *string) { 6368 6369 return(self->f->icCountSmallString(self,string)); 6370 } 6371 6372 bool isNumberSmallStringG(smallStringt *self) { 6373 6374 return(self->f->isNumber(self)); 6375 } 6376 6377 bool isIntSmallStringG(smallStringt *self) { 6378 6379 return(self->f->isInt(self)); 6380 } 6381 6382 int64_t parseIntSmallStringG (smallStringt *self) { 6383 6384 return(self->f->parseInt(self)); 6385 } 6386 6387 smallStringt* intToSmallStringG (smallStringt *self, int64_t n) { 6388 6389 return(self->f->intTo(self, n)); 6390 } 6391 6392 double parseDoubleSmallStringG (smallStringt *self) { 6393 6394 return(self->f->parseDouble(self)); 6395 } 6396 6397 smallStringt* doubleToSmallStringG (smallStringt *self, double n) { 6398 6399 return(self->f->doubleTo(self, n)); 6400 } 6401 6402 size_t lenSmallStringG (smallStringt *self) { 6403 6404 return(self->f->len(self)); 6405 } 6406 6407 smallStringt* upperSmallStringG (smallStringt *self) { 6408 6409 return(self->f->upper(self)); 6410 } 6411 6412 smallStringt* lowerSmallStringG (smallStringt *self) { 6413 6414 return(self->f->lower(self)); 6415 } 6416 6417 smallStringt* trimSmallStringG (smallStringt *self) { 6418 6419 return(self->f->trim(self)); 6420 } 6421 6422 smallStringt* lTrimSmallStringG (smallStringt *self) { 6423 6424 return(self->f->lTrim(self)); 6425 } 6426 6427 smallStringt* rTrimSmallStringG (smallStringt *self) { 6428 6429 return(self->f->rTrim(self)); 6430 } 6431 6432 smallStringt* uniqSmallStringG (smallStringt *self, char c) { 6433 6434 return(self->f->uniq(self, c)); 6435 } 6436 6437 smallStringt* icUniqSmallStringG (smallStringt *self, char c) { 6438 6439 return(self->f->icUniq(self, c)); 6440 } 6441 6442 smallStringt* sliceSmallStringG (smallStringt *self, int64_t start, int64_t end) { 6443 6444 return(self->f->slice(self, start, end)); 6445 } 6446 6447 smallStringt* cropSmallStringG (smallStringt *self, int64_t start, int64_t end) { 6448 6449 return(self->f->crop(self, start, end)); 6450 } 6451 6452 char* cropSSmallStringG (smallStringt *self, int64_t start, int64_t end) { 6453 6454 return(self->f->cropS(self, start, end)); 6455 } 6456 6457 smallJsont* cropSmallJsonSmallStringG(smallStringt *self, int64_t start, int64_t end) { 6458 6459 return(self->f->cropSmallJson(self, start, end)); 6460 } 6461 6462 char cropElemSmallStringG (smallStringt *self, int64_t index) { 6463 6464 return(self->f->cropElem(self, index)); 6465 } 6466 6467 smallStringt* copySmallStringG(smallStringt *self, int64_t start, int64_t end) { 6468 6469 return(self->f->copy(self, start, end)); 6470 } 6471 6472 smallStringt* insertSmallStringG (smallStringt *self, int64_t index, smallStringt *toInsert) { 6473 6474 return(self->f->insert(self, index, toInsert)); 6475 } 6476 6477 smallStringt* insertSmallJsonSmallStringG (smallStringt *self, int64_t index, smallJsont *toInsert) { 6478 6479 return(self->f->insertSmallJson(self, index, toInsert)); 6480 } 6481 6482 smallStringt* insertSSmallStringG (smallStringt *self, int64_t index, const char *toInsert) { 6483 6484 return(self->f->insertS(self, index, toInsert)); 6485 } 6486 6487 smallStringt* insertNFreeSmallStringG(smallStringt *self, int64_t index, smallStringt *toInsert) { 6488 6489 return(self->f->insertNFree(self, index, toInsert)); 6490 } 6491 6492 smallStringt* insertNFreeSmallJsonSmallStringG(smallStringt *self, int64_t index, smallJsont *toInsert) { 6493 6494 return(self->f->insertNFreeSmallJson(self, index, toInsert)); 6495 } 6496 6497 smallStringt* insertSNFreeSmallStringG(smallStringt *self, int64_t index, char *toInsert) { 6498 6499 return(self->f->insertSNFree(self, index, toInsert)); 6500 } 6501 6502 smallStringt* injectSmallStringG (smallStringt *self, int64_t index, char toInject) { 6503 6504 return(self->f->inject(self, index, toInject)); 6505 } 6506 6507 smallStringt* delSmallStringG (smallStringt *self, int64_t start, int64_t end) { 6508 6509 return(self->f->del(self, start, end)); 6510 } 6511 6512 smallStringt* delElemSmallStringG (smallStringt *self, int64_t index) { 6513 6514 return(self->f->delElem(self, index)); 6515 } 6516 6517 char* hasSmallStringG (smallStringt *self, const char *needle) { 6518 6519 return(self->f->has(self, needle)); 6520 } 6521 6522 char* hasCharSmallStringG(smallStringt *self, char c) { 6523 6524 return(self->f->hasChar(self,c)); 6525 } 6526 6527 char* hasSmallJsonSmallStringG(smallStringt *self, smallJsont *needle) { 6528 6529 return(self->f->hasSmallJson(self,needle)); 6530 } 6531 6532 char* hasSmallStringSmallStringG(smallStringt *self, smallStringt *needle) { 6533 6534 return(self->f->hasSmallString(self,needle)); 6535 } 6536 6537 smallStringt* findSmallStringG(smallStringt *self, const char *needle) { 6538 6539 return(self->f->find(self, needle)); 6540 } 6541 6542 smallStringt* findCharSmallStringG(smallStringt *self, char c) { 6543 6544 return(self->f->findChar(self,c)); 6545 } 6546 6547 smallStringt* findSmallJsonSmallStringG (smallStringt *self, smallJsont *needle) { 6548 6549 return(self->f->findSmallJson(self,needle)); 6550 } 6551 6552 smallStringt* findSmallStringSmallStringG(smallStringt *self, smallStringt *needle) { 6553 6554 return(self->f->findSmallString(self,needle)); 6555 } 6556 6557 ssize_t indexOfSmallStringG(smallStringt *self, const char *needle) { 6558 6559 return(self->f->indexOf(self,needle)); 6560 } 6561 6562 ssize_t indexOfCharSmallStringG(smallStringt *self, char c) { 6563 6564 return(self->f->indexOfChar(self,c)); 6565 } 6566 6567 ssize_t indexOfSmallJsonSmallStringG (smallStringt *self, smallJsont *needle) { 6568 6569 return(self->f->indexOfSmallJson(self,needle)); 6570 } 6571 6572 ssize_t indexOfSmallStringSmallStringG(smallStringt *self, smallStringt *needle) { 6573 6574 return(self->f->indexOfSmallString(self,needle)); 6575 } 6576 6577 char* icHasSmallStringG (smallStringt *self, const char *needle) { 6578 6579 return(self->f->icHas(self, needle)); 6580 } 6581 6582 char* icHasCharSmallStringG(smallStringt *self, char c) { 6583 6584 return(self->f->icHasChar(self,c)); 6585 } 6586 6587 char* icHasSmallJsonSmallStringG(smallStringt *self, smallJsont *needle) { 6588 6589 return(self->f->icHasSmallJson(self,needle)); 6590 } 6591 6592 char* icHasSmallStringSmallStringG(smallStringt *self, smallStringt *needle) { 6593 6594 return(self->f->icHasSmallString(self,needle)); 6595 } 6596 6597 smallStringt* icFindSmallStringG(smallStringt *self, const char *needle) { 6598 6599 return(self->f->icFind(self, needle)); 6600 } 6601 6602 smallStringt* icFindCharSmallStringG(smallStringt *self, char c) { 6603 6604 return(self->f->icFindChar(self,c)); 6605 } 6606 6607 smallStringt* icFindSmallJsonSmallStringG(smallStringt *self, smallJsont *needle) { 6608 6609 return(self->f->icFindSmallJson(self,needle)); 6610 } 6611 6612 smallStringt* icFindSmallStringSmallStringG(smallStringt *self, smallStringt *needle) { 6613 6614 return(self->f->icFindSmallString(self,needle)); 6615 } 6616 6617 ssize_t icIndexOfSmallStringG(smallStringt *self, const char *needle) { 6618 6619 return(self->f->icIndexOf(self,needle)); 6620 } 6621 6622 ssize_t icIndexOfCharSmallStringG(smallStringt *self, char c) { 6623 6624 return(self->f->icIndexOfChar(self,c)); 6625 } 6626 6627 ssize_t icIndexOfSmallJsonSmallStringG (smallStringt *self, smallJsont *needle) { 6628 6629 return(self->f->icIndexOfSmallJson(self,needle)); 6630 } 6631 6632 ssize_t icIndexOfSmallStringSmallStringG(smallStringt *self, smallStringt *needle) { 6633 6634 return(self->f->icIndexOfSmallString(self,needle)); 6635 } 6636 6637 smallStringt* emptySmallStringG (smallStringt *self) { 6638 6639 return(self->f->empty(self)); 6640 } 6641 6642 bool isEmptySmallStringG (smallStringt *self) { 6643 6644 return(self->f->isEmpty(self)); 6645 } 6646 6647 bool isBlankSmallStringG (smallStringt *self) { 6648 6649 return(self->f->isBlank(self)); 6650 } 6651 6652 smallArrayt* splitSmallStringG(smallStringt *self, const char *delim) { 6653 6654 return(self->f->split(self, delim)); 6655 } 6656 6657 smallArrayt* splitCharSmallStringG(smallStringt *self, char c) { 6658 6659 return(self->f->splitChar(self,c)); 6660 } 6661 6662 smallArrayt* splitSmallJsonSmallStringG (smallStringt *self, smallJsont *delim) { 6663 6664 return(self->f->splitSmallJson(self,delim)); 6665 } 6666 6667 smallArrayt* splitSmallStringSmallStringG(smallStringt *self, smallStringt *delim) { 6668 6669 return(self->f->splitSmallString(self,delim)); 6670 } 6671 6672 char** splitCharPSSmallStringG(smallStringt *self, const char* delim) { 6673 6674 return(self->f->splitS(self,delim)); 6675 } 6676 6677 char** splitCharSSmallStringG(smallStringt *self, char c) { 6678 6679 return(self->f->splitCharS(self,c)); 6680 } 6681 6682 char** splitSmallJsonSSmallStringG (smallStringt *self, smallJsont *delim) { 6683 6684 return(self->f->splitSmallJsonS(self,delim)); 6685 } 6686 6687 char** splitSmallStringSSmallStringG(smallStringt *self, smallStringt *delim) { 6688 6689 return(self->f->splitSmallStringS(self,delim)); 6690 } 6691 6692 smallArrayt* extractSmallStringG(smallStringt *self, const char* delim1, const char* delim2) { 6693 6694 return(self->f->extract(self, delim1, delim2)); 6695 } 6696 6697 smallArrayt* extractCharSSmallStringG(smallStringt *self, char delim1, const char* delim2) { 6698 6699 return(self->f->extractCharS(self,delim1,delim2)); 6700 } 6701 6702 smallArrayt* extractSCharSmallStringG(smallStringt *self, const char* delim1, char delim2) { 6703 6704 return(self->f->extractSChar(self,delim1,delim2)); 6705 } 6706 6707 smallArrayt* extractCharCharSmallStringG(smallStringt *self, char delim1, char delim2) { 6708 6709 return(self->f->extractCharChar(self,delim1,delim2)); 6710 } 6711 6712 smallArrayt* extractSmallJsonSmallJsonSmallStringG(smallStringt *self, smallJsont* delim1, smallJsont* delim2) { 6713 6714 return(self->f->extractSmallJsonSmallJson(self,delim1,delim2)); 6715 } 6716 6717 smallArrayt* extractSmallJsonSmallStringSmallStringG(smallStringt *self, smallJsont* delim1, smallStringt* delim2) { 6718 6719 return(self->f->extractSmallJsonSmallString(self,delim1,delim2)); 6720 } 6721 6722 smallArrayt* extractSmallJsonSSmallStringG(smallStringt *self, smallJsont* delim1, const char* delim2) { 6723 6724 return(self->f->extractSmallJsonS(self,delim1,delim2)); 6725 } 6726 6727 smallArrayt* extractSmallJsonCharSmallStringG(smallStringt *self, smallJsont* delim1, char delim2) { 6728 6729 return(self->f->extractSmallJsonChar(self,delim1,delim2)); 6730 } 6731 6732 smallArrayt* extractSmallStringSmallJsonSmallStringG(smallStringt *self, smallStringt* delim1, smallJsont* delim2) { 6733 6734 return(self->f->extractSmallStringSmallJson(self,delim1,delim2)); 6735 } 6736 6737 smallArrayt* extractSmallStringSmallStringSmallStringG(smallStringt *self, smallStringt* delim1, smallStringt* delim2) { 6738 6739 return(self->f->extractSmallStringSmallString(self,delim1,delim2)); 6740 } 6741 6742 smallArrayt* extractSmallStringSSmallStringG(smallStringt *self, smallStringt* delim1, const char* delim2) { 6743 6744 return(self->f->extractSmallStringS(self,delim1,delim2)); 6745 } 6746 6747 smallArrayt* extractSmallStringCharSmallStringG(smallStringt *self, smallStringt* delim1, char delim2) { 6748 6749 return(self->f->extractSmallStringChar(self,delim1,delim2)); 6750 } 6751 6752 smallArrayt* extractSSmallJsonSmallStringG(smallStringt *self, const char* delim1, smallJsont* delim2) { 6753 6754 return(self->f->extractSSmallJson(self,delim1,delim2)); 6755 } 6756 6757 smallArrayt* extractSSmallStringSmallStringG(smallStringt *self, const char* delim1, smallStringt* delim2) { 6758 6759 return(self->f->extractSSmallString(self,delim1,delim2)); 6760 } 6761 6762 smallArrayt* extractCharSmallJsonSmallStringG(smallStringt *self, char delim1, smallJsont* delim2) { 6763 6764 return(self->f->extractCharSmallJson(self,delim1,delim2)); 6765 } 6766 6767 smallArrayt* extractCharSmallStringSmallStringG(smallStringt *self, char delim1, smallStringt* delim2) { 6768 6769 return(self->f->extractCharSmallString(self,delim1,delim2)); 6770 } 6771 6772 smallArrayt* icSplitSmallStringG (smallStringt *self, const char *delim) { 6773 6774 return(self->f->icSplit(self, delim)); 6775 } 6776 6777 smallArrayt* icSplitCharSmallStringG (smallStringt *self, char c) { 6778 6779 return(self->f->icSplitChar(self, c)); 6780 } 6781 6782 smallArrayt* icSplitSmallJsonSmallStringG (smallStringt *self, smallJsont *delim) { 6783 6784 return(self->f->icSplitSmallJson(self, delim)); 6785 } 6786 6787 smallArrayt* icSplitSmallStringSmallStringG(smallStringt *self, smallStringt *delim) { 6788 6789 return(self->f->icSplitSmallString(self, delim)); 6790 } 6791 6792 char** icSplitCharPSSmallStringG (smallStringt *self, char *delim) { 6793 6794 return(self->f->icSplitS(self, delim)); 6795 } 6796 6797 char** icSplitCharSSmallStringG (smallStringt *self, char c) { 6798 6799 return(self->f->icSplitCharS(self, c)); 6800 } 6801 6802 char** icSplitSmallJsonSSmallStringG (smallStringt *self, smallJsont *delim) { 6803 6804 return(self->f->icSplitSmallJsonS(self, delim)); 6805 } 6806 6807 char** icSplitSmallStringSSmallStringG(smallStringt *self, smallStringt *delim) { 6808 6809 return(self->f->icSplitSmallStringS(self, delim)); 6810 } 6811 6812 smallArrayt* icExtractSmallStringG(smallStringt *self, const char* delim1, const char* delim2) { 6813 6814 return(self->f->icExtract(self, delim1, delim2)); 6815 } 6816 6817 smallArrayt* icExtractCharSSmallStringG (smallStringt *self, char delim1, const char* delim2) { 6818 6819 return(self->f->icExtractCharS(self,delim1,delim2)); 6820 } 6821 6822 smallArrayt* icExtractSCharSmallStringG (smallStringt *self, const char* delim1, char delim2) { 6823 6824 return(self->f->icExtractSChar(self,delim1,delim2)); 6825 } 6826 6827 smallArrayt* icExtractCharCharSmallStringG (smallStringt *self, char delim1, char delim2) { 6828 6829 return(self->f->icExtractCharChar(self,delim1,delim2)); 6830 } 6831 6832 smallArrayt* icExtractSmallJsonSmallJsonSmallStringG (smallStringt *self, smallJsont* delim1, smallJsont* delim2) { 6833 6834 return(self->f->icExtractSmallJsonSmallJson(self,delim1,delim2)); 6835 } 6836 6837 smallArrayt* icExtractSmallJsonSmallStringSmallStringG (smallStringt *self, smallJsont* delim1, smallStringt* delim2) { 6838 6839 return(self->f->icExtractSmallJsonSmallString(self,delim1,delim2)); 6840 } 6841 6842 smallArrayt* icExtractSmallJsonSSmallStringG (smallStringt *self, smallJsont* delim1, const char* delim2) { 6843 6844 return(self->f->icExtractSmallJsonS(self,delim1,delim2)); 6845 } 6846 6847 smallArrayt* icExtractSmallJsonCharSmallStringG (smallStringt *self, smallJsont* delim1, char delim2) { 6848 6849 return(self->f->icExtractSmallJsonChar(self,delim1,delim2)); 6850 } 6851 6852 smallArrayt* icExtractSmallStringSmallJsonSmallStringG (smallStringt *self, smallStringt* delim1, smallJsont* delim2) { 6853 6854 return(self->f->icExtractSmallStringSmallJson(self,delim1,delim2)); 6855 } 6856 6857 smallArrayt* icExtractSmallStringSmallStringSmallStringG(smallStringt *self, smallStringt* delim1, smallStringt* delim2) { 6858 6859 return(self->f->icExtractSmallStringSmallString(self,delim1,delim2)); 6860 } 6861 6862 smallArrayt* icExtractSmallStringSSmallStringG (smallStringt *self, smallStringt* delim1, const char* delim2) { 6863 6864 return(self->f->icExtractSmallStringS(self,delim1,delim2)); 6865 } 6866 6867 smallArrayt* icExtractSmallStringCharSmallStringG (smallStringt *self, smallStringt* delim1, char delim2) { 6868 6869 return(self->f->icExtractSmallStringChar(self,delim1,delim2)); 6870 } 6871 6872 smallArrayt* icExtractSSmallJsonSmallStringG (smallStringt *self, const char* delim1, smallJsont* delim2) { 6873 6874 return(self->f->icExtractSSmallJson(self,delim1,delim2)); 6875 } 6876 6877 smallArrayt* icExtractSSmallStringSmallStringG (smallStringt *self, const char* delim1, smallStringt* delim2) { 6878 6879 return(self->f->icExtractSSmallString(self,delim1,delim2)); 6880 } 6881 6882 smallArrayt* icExtractCharSmallJsonSmallStringG (smallStringt *self, char delim1, smallJsont* delim2) { 6883 6884 return(self->f->icExtractCharSmallJson(self,delim1,delim2)); 6885 } 6886 6887 smallArrayt* icExtractCharSmallStringSmallStringG (smallStringt *self, char delim1, smallStringt* delim2) { 6888 6889 return(self->f->icExtractCharSmallString(self,delim1,delim2)); 6890 } 6891 6892 smallStringt* readFileSmallStringG (smallStringt *self, const char *filePath) { 6893 6894 return(self->f->readFile(self, filePath)); 6895 } 6896 6897 smallStringt* readFileSmallJsonSmallStringG (smallStringt *self, smallJsont *filePath) { 6898 6899 return(self->f->readFileSmallJson(self,filePath)); 6900 } 6901 6902 smallStringt* readFileSmallStringSmallStringG(smallStringt *self, smallStringt *filePath) { 6903 6904 return(self->f->readFileSmallString(self,filePath)); 6905 } 6906 6907 smallStringt* readStreamSmallStringG (smallStringt *self, FILE *fp) { 6908 6909 return(self->f->readStream(self, fp)); 6910 } 6911 6912 int writeFileSmallStringG (smallStringt *self, const char *filePath) { 6913 6914 return(self->f->writeFile(self, filePath)); 6915 } 6916 6917 int writeFileSmallJsonSmallStringG (smallStringt *self, smallJsont *filePath) { 6918 6919 return(self->f->writeFileSmallJson(self,filePath)); 6920 } 6921 6922 int writeFileSmallStringSmallStringG(smallStringt *self, smallStringt *filePath) { 6923 6924 return(self->f->writeFileSmallString(self,filePath)); 6925 } 6926 6927 int writeStreamSmallStringG (smallStringt *self, FILE *fp) { 6928 6929 return(self->f->writeStream(self, fp)); 6930 } 6931 6932 int appendFileSmallStringFG (smallStringt *self, const char *filePath) { 6933 6934 return(self->f->appendFile(self, filePath)); 6935 } 6936 6937 int appendFileSmallStringSmallStringG(smallStringt *self, smallStringt *filePath) { 6938 6939 return(self->f->appendFileSmallString(self,filePath)); 6940 } 6941