libsheepy

C lib for handling text files, strings and json like data structure with an object oriented system
git clone https://spartatek.se/git/libsheepy.git
Log | Files | Refs | README | LICENSE

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