libsheepy
libsheepySmall.c
Go to the documentation of this file.
1 // MIT License
2 //
3 // Copyright (c) 2023 Remy Noulin
4 //
5 // Permission is hereby granted, free of charge, to any person obtaining a copy
6 // of this software and associated documentation files (the "Software"), to deal
7 // in the Software without restriction, including without limitation the rights
8 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 // copies of the Software, and to permit persons to whom the Software is
10 // furnished to do so, subject to the following conditions:
11 //
12 // The above copyright notice and this permission notice shall be included in all
13 // copies or substantial portions of the Software.
14 //
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 // SOFTWARE.
22 
23 #include "libsheepySmall.h"
24 #include <inttypes.h>
25 
26 #define internal static
27 
28 #include <stdint.h>
29 #include <stdlib.h>
30 #include <stdbool.h>
31 #include <string.h>
32 #include <stdio.h>
33 
34 bool isSTypeF(smallt *obj, char sType);
35 size_t sSizeTiny(smallt *obj);
36 sBoolt* allocSBool(bool value);
38 sDictt* allocSDict(void);
39 sDoublet* allocSDouble(double value);
40 sIntt* allocSInt(int64_t value);
41 sStringt* allocSStringTiny(const char* data);
42 sArrayt* allocSArray(void);
44 sBytest* allocSBytes(void);
45 void sFree(smallt *obj);
46 void sFreeTiny(smallt *obj);
48 void sDictFreeElements(sDictt *dict);
49 void sDictFreeTiny(sDictt *dict);
56 char* sToStringTiny(smallt *obj);
57 char* sToString(smallt *obj);
62 char* sIntToStringTiny(sIntt* obj);
67 char* sEscapeTiny(smallt *obj);
68 char* sEscape(smallt *obj);
69 char* sDictEscapeTiny(sDictt* obj);
72 char* sTypesTiny(smallt* obj);
74 const char** sDictTypeStrings(sDictt* obj);
75 const char ** sTypesToStrings(sBytest *types);
78 const char** sArrayTypeStrings(sArrayt* obj);
81 smallt* sDictGet(sDictt *dict, const char *key);
82 smallt** sDictGetP(sDictt *dict, const char *key);
83 smallt* sDictGetTiny(sDictt *dict, const char *key);
84 void sDictSetP(sDictt **dict, const char *key, smallt *data);
85 void sDictSetTiny(sDictt **dict, const char *key, smallt *data);
86 void sDictPushTiny(sDictt **dict, const char *key, smallt *data);
87 void sDictDelTiny(sDictt *dict, const char *key);
88 char* sStringGetTiny(sStringt *string);
89 void sStringSetTiny(sStringt **string, const char *news);
94 smallt** sArrayGetP(sArrayt *array, uint32_t index);
95 smallt* sArrayGetTiny(sArrayt *array, uint32_t index);
96 void sArraySetShortTiny(sArrayt *array, uint32_t index, smallt *value);
97 void sArraySetP(sArrayt *array, uint32_t index, smallt *value);
98 void sArraySetTiny(sArrayt *array, uint32_t index, smallt *value);
100 void sArrayDelTiny(sArrayt *array, uint32_t index);
101 void sArrayDelRangeTiny(sArrayt *array, uint32_t start, uint32_t end);
102 void* sBytesGet(sBytest *bytes);
103 void* sBytesGetTiny(sBytest *bytes);
104 void sBytesPush(sBytest **bytes, char data);
105 void sBytesPushBuffer(sBytest **bytes, void* data, uint32_t size);
106 void sBytesPushBufferTiny(sBytest **bytes, void* data, uint32_t size);
109 void sDictSerialElementsTiny(sBytest **r, sDictt *dict);
113 void sDictDeserialElementsTiny(sDictt **dict, char **data);
115 
130 // min MIN_ELEMENTS is 1
131 #define SDICT_MIN_ELEMENTS 12
132 #define SDICT_REALLOC_STEPS 4
133 // min MIN_ELEMENTS is 1
134 #define SARRAY_MIN_ELEMENTS 4
135 #define SARRAY_REALLOC_STEPS 4
136 
146 bool isSTypeF(smallt *obj, char sType) {
147 
148  if (!obj) {
149  return(false);
150  }
151  return(isSType(obj, sType));
152 }
153 
158 size_t sSizeTiny(smallt *obj) {
159  size_t r = 0;;
160 
161  /* if !obj */
162  /* return 0 */
163 
164  switch(obj->type) {
165  case UNDEFINED:
166  r = sizeof(sUndefinedt);
167  break;
168  case BOOL:
169  r = sizeof(sBoolt);
170  break;
171  case CONTAINER:
172  r = sizeof(sContainert);
173  break;
174  case DICT:
175  if (!((sDictt *)obj)->count) {
176  r = sizeof(sDictt);
177  }
178  else {
179  r = sizeof(sDictt) + sizeof(sDictElemt) * (((sDictt *)obj)->count - 1);
180  }
181  break;
182  case DOUBLE:
183  r = sizeof(sDoublet);
184  break;
185  case INT:
186  r = sizeof(sIntt);
187  break;
188  case STRING:
189  r = sizeof(sStringt) + strlen(&(((sStringt *)obj)->data));
190  break;
191  case ARRAY:
192  if (!((sArrayt* )obj)->count) {
193  r = sizeof(sArrayt);
194  }
195  else {
196  r = sizeof(sArrayt) + sizeof(smallt *) * (((sArrayt* )obj)->count - 1);
197  }
198  break;
199  case BYTES:
200  if (!((sBytest* )obj)->count) {
201  r = sizeof(sBytest);
202  }
203  else {
204  r = sizeof(sBytest) + sizeof(char) * (((sBytest* )obj)->count - 1);
205  }
206  break;
207  default:;
208  // return 0
209  }
210  return(r);
211 }
212 
222  sBoolt *r = NULL;
223 
224  isError(r, malloc(sizeof(sBoolt))) return(NULL);
225  r->type = BOOL;
226  r->value = value;
227  return(r);
228 }
229 
240  sContainert *r = NULL;
241 
242  isError(r, malloc(sizeof(sContainert))) return(NULL);
243  r->type = CONTAINER;
244  r->dataType = SH_DT_UNKNOWN;
245  r->data = data;
246  r->free = NULL;
247  return(r);
248 }
249 
257  sDictt *r = NULL;
258 
259  isError(r, malloc(sizeof(sDictt) + sizeof(sDictElemt) * (SDICT_MIN_ELEMENTS-1))) return(NULL);
260  r->type = DICT;
261  r->count = 0;
263  return(r);
264 }
265 
275  sDoublet *r = NULL;
276 
277  isError(r, malloc(sizeof(sDoublet))) return(NULL);
278  r->type = DOUBLE;
279  r->value = value;
280  return(r);
281 }
282 
291 sIntt* allocSInt(int64_t value) {
292  sIntt *r = NULL;
293 
294  isError(r, malloc(sizeof(sIntt))) return(NULL);
295  r->type = INT;
296  r->value = value;
297  return(r);
298 }
299 
309  sStringt *r = NULL;
310  size_t len;
311  char *T = NULL;
312 
313  len = strlen(data);
314  isError(r, malloc(sizeof(sStringt) + len)) return(NULL);
315  r->type = STRING;
316  // should be: strcpy(&(r->data), data); but it fails (Abort trap 6) with clang / macOS
317  T = &(r->data);;
318  strcpy(T, data);
319  return(r);
320 }
321 
328 // keep data uninitialized (count)
330  sArrayt *r = NULL;
331 
332  isError(r, malloc(sizeof(sArrayt) + sizeof(smallt *) * SARRAY_MIN_ELEMENTS)) return(NULL);
333  r->type = ARRAY;
334  r->count = 0;
336  return(r);
337 }
338 
346  sUndefinedt *r = NULL;
347 
348  isError(r, malloc(sizeof(sUndefinedt))) return(NULL);
349  r->type = UNDEFINED;
350  return(r);
351 }
352 
360  sBytest *r = NULL;
361 
362  isError(r, malloc(sizeof(sBytest))) return(NULL);
363  r->type = BYTES;
364  r->count = 0;
365  return(r);
366 }
367 
371 void sFree(smallt *obj) {
372 
373  if (obj) {
374  sFreeTiny(obj);
375 }
376  }
377 
387  sContainert *c = NULL;
388 
389  switch(obj->type) {
390  case DICT:
391  sDictFreeTiny((sDictt *) obj);
392  break;
393  case ARRAY:
394  sArrayFreeTiny((sArrayt *) obj);
395  break;
396  case CONTAINER:
397  c = (sContainert*)obj;
398  if (c->free) {
399  c->free(c->data);
400  c->data = NULL;
401  }
402  free(obj);
403  break;
404  default:
405  free(obj);
406  }
407 }
408 
418 
419  if (e->key) {
420  free(e->key);
421  sFreeTiny(e->data);
422  e->key = NULL;
423 }
424  }
425 
433 
434  forEachSDict(dict, e) {
435  sDictFreeElement(e);
436 }
437  }
438 
445 void sDictFreeTiny(sDictt *dict) {
446 
447  sDictFreeElements(dict);
448  free(dict);
449 }
450 
458 
459  forEachSArray(array, e) {
460  sFree(e);
461 }
462  }
463 
471 
472  sArrayFreeElements(array);
473  free(array);
474 }
475 
486 
487  if (!o) {
488  return(NULL);
489  }
490 
491  return(sDuplicateTiny(o));
492 }
493 
505  smallt *r = NULL;
506  sBytest *B = NULL;
507  sContainert *c = NULL;
508 
509  switch(obj->type) {
510  case UNDEFINED:
511  r = (smallt *)allocSUndefined();
512  break;
513  case BOOL:
514  r = (smallt *)allocSBool(((sBoolt *)obj)->value);
515  break;
516  case CONTAINER:
517  // data is not copied, same data pointer is used
518  isError(c, allocSContainer(((sContainert *)obj)->data)) return(NULL);
519  c->dataType = ((sContainert *)obj)->dataType;
520  c->free = ((sContainert *)obj)->free;
521  r = (smallt *)c;
522  break;
523  case DICT:
524  r = (smallt *)sDictDuplicateTiny((sDictt *)obj);
525  break;
526  case DOUBLE:
527  r = (smallt *)allocSDouble(((sDoublet *)obj)->value);
528  break;
529  case INT:
530  r = (smallt *)allocSInt(((sIntt *)obj)->value);
531  break;
532  case STRING:
533  r = (smallt *) strdup((char *) obj);;
534  break;
535  case ARRAY:
537  break;
538  case BYTES:
539  isError(B, allocSBytes()) return(NULL);
540  if (((sBytest *)obj)->count) {
541  sBytesPushBuffer(&B, sBytesGetTiny((sBytest *)obj), ((sBytest *)obj)->count);
542  }
543  r = (smallt *) B;
544  break;
545  default:
546  logME(libsheepyErrorMask, "Unsupported object type.");
547  }
548  return(r);
549 }
550 
560 
561  sDictt *d = allocSDict();
562  if (!d) {
563  return(NULL);
564  }
565 
566  forEachSDict(dict, e) {
567  if (e->key) {
568  smallt *eDup = sDuplicateTiny(e->data);
569  sDictPushTiny(&d, e->key, eDup);
570  }
571  }
572  return(d);
573 }
574 
584 
585  sArrayt *a = allocSArray();
586  if (!a) {
587  return(NULL);
588  }
589 
590  forEachSArray(array, e) {
591  sArrayPushTiny(&a, sDuplicate(e));
592  }
593  return(a);
594 }
595 
607  char *r = NULL;
608 
609  switch(obj->type) {
610  case UNDEFINED:
612  break;
613  case BOOL:
614  r = sBoolToStringTiny((sBoolt *)obj);
615  break;
616  case CONTAINER:
618  break;
619  case DICT:
620  r = sDictToStringTiny((sDictt *)obj);
621  break;
622  case DOUBLE:
623  r = sDoubleToStringTiny((sDoublet *)obj);
624  break;
625  case INT:
626  r = sIntToStringTiny((sIntt *)obj);
627  break;
628  case STRING:
629  r = sStringToStringTiny((sStringt *)obj);
630  break;
631  case ARRAY:
632  r = sArrayToStringTiny((sArrayt* )obj);
633  break;
634  case BYTES:
635  r = sBytesToStringTiny((sBytest* )obj);
636  break;
637  default:
638  logME(libsheepyErrorMask, "Unsupported object type.");
639  }
640  return(r);
641 }
642 
655 
656  if (obj) {
657  return(sToStringTiny(obj));
658  }
659  return(NULL);
660 }
661 
673 
674  if (obj->value) {
675  return(strdup("true"));
676  }
677  else {
678  return(strdup("false"));
679 }
680  }
681 
689 
690  return(strdup("<data container>"));
691 }
692 
704  char *s = NULL;
705 
706  if (!obj->count) {
707  return(strdup("{}"));
708  }
709 
710  char *r = strdup("{");
711 
712  bool hasAtLeastOneElement = no;
713 
714  forEachSDict(obj, e) {
715  if (e->key) {
716  hasAtLeastOneElement = yes;
717  pErrorNULL(iAppendS(&r, "\""));
718  pErrorNULL(iAppendS(&r, e->key));
719  pErrorNULL(iAppendS(&r, "\""));
720  if (isSType(e->data, STRING) || isSType(e->data, CONTAINER)) {
721  // add quotes for strings
722  pErrorNULL(iAppendS(&r, ":\""));
723  s = sToStringTiny(e->data);
724  pErrorNULL(iAppendS(&r, s));
725  free(s);
726  pErrorNULL(iAppendS(&r, "\","));
727  }
728  else {
729  pErrorNULL(iAppendS(&r, ":"));
730  s = sToStringTiny(e->data);
731  pErrorNULL(iAppendS(&r, s));
732  free(s);
733  pErrorNULL(iAppendS(&r, ","));
734  }
735  }
736  }
737 
738  if (hasAtLeastOneElement) {
739  pErrorNULL(setS(r, -1, '}'));
740  }
741  else {
742  pErrorNULL(iAppendS(&r, "}"));
743  }
744  return(r);
745 }
746 
758  char *s = NULL;
759 
760  isError(s, malloc(256*sizeof(char))) return(NULL);
761  snprintf(s,256, "%e", obj->value);
762 
763  return(s);
764 }
765 
777  char *s = NULL;
778 
779  isError(s, malloc(256*sizeof(char))) return(NULL);
780  snprintf(s,256, "%" PRIi64, obj->value);
781 
782  return(s);
783 }
784 
796 
797  return(strdup(sStringGetTiny(obj)));
798 }
799 
811  char *s = NULL;
812 
813  if (!obj->count) {
814  return(strdup("[]"));
815  }
816 
817  char *r = strdup("[");
818  uint32_t cnt = 0;;
819  bool emptySlot = false;;
820  forEachSArray(obj, o) {
821  if (!o) {
822  // empty slot
823  emptySlot = true;;
824  continue;
825  }
826  emptySlot = false;;
827  cnt++;
828  if (isSType(o, STRING) || isSType(o, CONTAINER)) {
829  // add quotes for strings
830  pErrorNULL(iAppendS(&r, "\""));
831  s = sToStringTiny(o);
832  pErrorNULL(iAppendS(&r, s));
833  free(s);
834  pErrorNULL(iAppendS(&r, "\""));
835  }
836  else {
837  s = sToStringTiny(o);
838  pErrorNULL(iAppendS(&r, s));
839  free(s);
840  }
841  pErrorNULL(iAppendS(&r, ","));
842  }
843  if (!cnt && emptySlot) {
844  pErrorNULL(iAppendS(&r, "]"));
845  }
846  else {
847  pErrorNULL(setS(r, -1, ']'));
848  }
849  return(r);
850 }
851 
863 
864  return(strdup("null"));
865 }
866 
878 
879  if (!obj->count) {
880  return(strdup("[]"));
881  }
882 
883  char *r = toHexSepS(&(obj->data), obj->count, ",");
884  pErrorNULL(iPrependS(&r, "["));
885  pErrorNULL(iAppendS(&r, "]"));
886  return(r);
887 }
888 
902  char *r = NULL;
903 
904  switch(obj->type) {
905  case UNDEFINED:
907  break;
908  case BOOL:
909  r = sBoolToStringTiny((sBoolt *)obj);
910  break;
911  case CONTAINER:
913  break;
914  case DICT:
915  r = sDictEscapeTiny((sDictt *)obj);
916  break;
917  case DOUBLE:
918  r = sDoubleToStringTiny((sDoublet *)obj);
919  break;
920  case INT:
921  r = sIntToStringTiny((sIntt *)obj);
922  break;
923  case STRING:
924  r = sStringEscapeTiny((sStringt *)obj);
925  break;
926  case ARRAY:
927  r = sArrayEscapeTiny((sArrayt* )obj);
928  break;
929  case BYTES:
930  r = sBytesToStringTiny((sBytest* )obj);
931  break;
932  default:
933  logME(libsheepyErrorMask, "Unsupported object type.");
934  }
935  return(r);
936 }
937 
949 char* sEscape(smallt *obj) {
950 
951  if (obj) {
952  return(sEscapeTiny(obj));
953  }
954  return(NULL);
955 }
956 
968  char *s = NULL;
969 
970  if (!obj->count) {
971  return(strdup("{}"));
972  }
973 
974  char *r = strdup("{");
975 
976  bool hasAtLeastOneElement = no;
977 
978  forEachSDict(obj, e) {
979  if (e->key) {
980  hasAtLeastOneElement = yes;
981  pErrorNULL(iAppendS(&r, "\""));
982  pErrorNULL(iAppendNFreeS(&r, escapeS(e->key, '\"')));
983  pErrorNULL(iAppendS(&r, "\""));
984  if (isSType(e->data, STRING)) {
985  // add quotes for strings
986  pErrorNULL(iAppendS(&r, ":\""));
987  s = sEscapeTiny(e->data);
988  pErrorNULL(iAppendS(&r, s));
989  free(s);
990  pErrorNULL(iAppendS(&r, "\","));
991  }
992  else if (isSType(e->data, CONTAINER)) {
993  // add quotes for strings
994  pErrorNULL(iAppendS(&r, ":\""));
995  s = sToStringTiny(e->data);
996  pErrorNULL(iAppendS(&r, s));
997  free(s);
998  pErrorNULL(iAppendS(&r, "\","));
999  }
1000  else {
1001  pErrorNULL(iAppendS(&r, ":"));
1002  s = sEscapeTiny(e->data);
1003  pErrorNULL(iAppendS(&r, s));
1004  free(s);
1005  pErrorNULL(iAppendS(&r, ","));
1006  }
1007  }
1008  }
1009 
1010  if (hasAtLeastOneElement) {
1011  pErrorNULL(setS(r, -1, '}'));
1012  }
1013  else {
1014  pErrorNULL(iAppendS(&r, "}"));
1015  }
1016  return(r);
1017 }
1018 
1030 
1031  return(escapeS(sStringGetTiny(obj), '\"'));
1032 }
1033 
1045  char *s = NULL;
1046 
1047  if (!obj->count) {
1048  return(strdup("[]"));
1049  }
1050 
1051  char *r = strdup("[");
1052  uint32_t cnt = 0;;
1053  bool emptySlot = false;;
1054  forEachSArray(obj, o) {
1055  if (!o) {
1056  // empty slot
1057  emptySlot = true;;
1058  continue;
1059  }
1060  emptySlot = false;;
1061  cnt++;
1062  if (isSType(o, STRING)) {
1063  // add quotes for strings
1064  pErrorNULL(iAppendS(&r, "\""));
1065  s = sEscapeTiny(o);
1066  pErrorNULL(iAppendS(&r, s));
1067  free(s);
1068  pErrorNULL(iAppendS(&r, "\""));
1069  }
1070  else if (isSType(o, CONTAINER)) {
1071  // add quotes for strings
1072  pErrorNULL(iAppendS(&r, "\""));
1073  s = sToStringTiny(o);
1074  pErrorNULL(iAppendS(&r, s));
1075  free(s);
1076  pErrorNULL(iAppendS(&r, "\""));
1077  }
1078  else {
1079  s = sEscapeTiny(o);
1080  pErrorNULL(iAppendS(&r, s));
1081  free(s);
1082  }
1083  pErrorNULL(iAppendS(&r, ","));
1084  }
1085  if (!cnt && emptySlot) {
1086  pErrorNULL(iAppendS(&r, "]"));
1087  }
1088  else {
1089  pErrorNULL(setS(r, -1, ']'));
1090  }
1091  return(r);
1092 }
1093 
1105  char *r = NULL;
1106  sArrayt *a = NULL;
1107  sBytest *types = NULL;
1108 
1109  isError(types, sTypesToBytesTiny(obj)) return(NULL);
1110 
1111  for (uint32_t i = 0; i < types->count;i++) {
1112  char b = (&(types->data))[i];
1113  if ((size_t)b >= ARRAY_SIZE(SMALL_TYPE_NAMES)) {
1114  free(types);
1115  if (a) {
1116  sArrayFreeTiny(a);
1117  }
1118  return(NULL);
1119  }
1120  sStringt *s = allocSStringTiny(SMALL_TYPE_NAMES[(size_t) b]);
1121  if (!s) {
1122  free(types);
1123  if (a) {
1124  sArrayFreeTiny(a);
1125  }
1126  return(NULL);
1127  }
1128  sArrayPushTiny(&a, (smallt *) s);
1129  }
1130 
1131  r = sArrayToStringTiny(a);
1132  free(types);
1133  sArrayFreeTiny(a);
1134  return(r);
1135 }
1136 
1146  sBytest *r = NULL;
1147 
1148  switch(obj->type) {
1149  case DICT:
1150  r = sDictTypesTiny((sDictt *) obj);;
1151  break;
1152  case ARRAY:
1153  r = sArrayTypesTiny((sArrayt *) obj);;
1154  break;
1155  default:;
1156  }
1157  return(r);
1158 }
1159 
1170 const char** sDictTypeStrings(sDictt* obj) {
1171 
1172  sBytest *types = sDictTypes(obj);
1173 
1174  return(sTypesToStrings(types));
1175 }
1176 
1186 const char ** sTypesToStrings(sBytest *types) {
1187  const char **r = NULL;
1188 
1189  if (!types) {
1190  return(NULL);
1191  }
1192 
1193  isError(r, malloc((types->count+1) * sizeof(char *))) return(NULL);
1194  r[types->count] = NULL;
1195 
1196  for (uint32_t i = 0 ; i < types->count ; i++) {
1197  char b = (&(types->data))[i];
1198  if ((size_t)b >= ARRAY_SIZE(SMALL_TYPE_NAMES)) {
1199  free(r);
1200  return(NULL);
1201  }
1202  r[i] = SMALL_TYPE_NAMES[(size_t) b];
1203  }
1204 
1205  free(types);
1206  return(r);
1207 }
1208 
1219 
1220  if (!obj || !isSType(obj, DICT)) {
1221  return(NULL);
1222  }
1223 
1224  return(sDictTypesTiny(obj));
1225 }
1226 
1236  sBytest *r = NULL;
1237 
1238  forEachSDict(obj, e) {
1239  if (e->key) {
1240  sBytesPush(&r, e->data->type);
1241  }
1242  }
1243 
1244  return(r);
1245 }
1246 
1258 
1259  sBytest *types = sArrayTypes(obj);
1260 
1261  return(sTypesToStrings(types));
1262 }
1263 
1274 
1275  if (!obj || !isSType(obj, ARRAY)) {
1276  return(NULL);
1277  }
1278 
1279  return(sArrayTypesTiny(obj));
1280 }
1281 
1291  sBytest *r = NULL;
1292 
1293  forEachSArray(obj, e) {
1294  if (e) {
1295  sBytesPush(&r, e->type);
1296  }
1297  }
1298 
1299  return(r);
1300 }
1301 
1312 smallt* sDictGet(sDictt *dict, const char *key) {
1313 
1314  if (!dict || !key) {
1315  return(NULL);
1316  }
1317 
1318  return(sDictGetTiny(dict, key));
1319 }
1320 
1332 smallt** sDictGetP(sDictt *dict, const char *key) {
1333 
1334  if (!dict || !key) {
1335  return(NULL);
1336  }
1337 
1338  forEachSDict(dict, e) {
1339  if (e->key && eqS(key, e->key)) {
1340  return(&(e->data));
1341  }
1342  }
1343 
1344  return(NULL);
1345 }
1346 
1357 smallt* sDictGetTiny(sDictt *dict, const char *key) {
1358 
1359  forEachSDict(dict, e) {
1360  if (e->key && strEq(key, e->key)) {
1361  return(e->data);
1362  }
1363  }
1364 
1365  return(NULL);
1366 }
1367 
1385 // TODO create SetShort - create element and add - no alloc
1386 void sDictSetP(sDictt **dict, const char *key, smallt *data) {
1387 
1388  if (!(*dict)) {
1389  sDictPushTiny(dict, key, data);
1390  return;
1391  }
1392 
1393  if (!data) {
1394  // NULL not inserted in dictionary
1395  return;
1396  }
1397 
1398  forEachSDict(*dict, e) {
1399  if (e->key && strEq(key, e->key)) {
1400  e->data = data;
1401  return;
1402  }
1403  }
1404 
1405  // create new element
1406  sDictPushTiny(dict, key, data);
1407 }
1408 
1426 void sDictSetTiny(sDictt **dict, const char *key, smallt *data) {
1427 
1428  if (!(*dict)) {
1429  sDictPushTiny(dict, key, data);
1430  return;
1431  }
1432 
1433  if (!data) {
1434  // NULL not inserted in dictionary
1435  return;
1436  }
1437 
1438  forEachSDict(*dict, e) {
1439  if (e->key && strEq(key, e->key)) {
1440  sFree(e->data);
1441  e->data = data;
1442  return;
1443  }
1444  }
1445 
1446  // create new element
1447  sDictPushTiny(dict, key, data);
1448 }
1449 
1467 // TODO create PushShort - create element and add - no alloc
1468 void sDictPushTiny(sDictt **dict, const char *key, smallt *data) {
1469 
1470  /* // sanity checks */
1471  /* if !dict */
1472  /* return */
1473 
1474  if (!(*dict)) {
1475  // create dict
1476  isError(*dict, allocSDict()) {
1477  return;
1478  }
1479  }
1480 
1481  if (!data) {
1482  // NULL not inserted in dictionary
1483  return;
1484  }
1485 
1486  if ((*dict)->count == 0) {
1487  (*dict)->elements.key = strdup(key);
1488  (*dict)->elements.data = data;
1489  }
1490  else {
1491  if ((*dict)->count >= (*dict)->maxCount) {
1492  // realloc
1493  sDictt *tmp = realloc(*dict, sizeof(sDictt) + sizeof(sDictElemt) * ((*dict)->count + SDICT_REALLOC_STEPS-1));
1494  if (!tmp) {
1495  return;
1496  }
1497  else {
1498  *dict = tmp;
1499  (*dict)->maxCount = 1 + (*dict)->count + SDICT_REALLOC_STEPS-1;
1500  }
1501  }
1502  sDictElemt *di = &((*dict)->elements);
1503  di[(*dict)->count].key = strdup(key);
1504  di[(*dict)->count].data = data;
1505  }
1506 
1507  (*dict)->count++;
1508  return;
1509 }
1510 
1518 void sDictDelTiny(sDictt *dict, const char *key) {
1519 
1520  forEachSDict(dict, e) {
1521  if (e->key && strEq(key, e->key)) {
1522  sDictFreeElement(e);
1523  return;
1524 }
1525  }
1526  }
1527 
1538 char* sStringGetTiny(sStringt *string) {
1539 
1540  return(&(string->data));
1541 }
1542 
1550 void sStringSetTiny(sStringt **string, const char *news) {
1551 
1552  free(*string);
1553  *string = allocSStringTiny(news);
1554 }
1555 
1568 // TODO create PushShort - create element and add - no alloc
1570 
1571  /* // sanity checks */
1572  /* if !array */
1573  /* return */
1574 
1575  if (!(*array)) {
1576  // create array
1577  isError(*array, allocSArray())
1578  return;
1579  }
1580 
1581  if ((*array)->count == 0) {
1582  (*array)->data = data;;
1583  }
1584  else {
1585  if ((*array)->count >= (*array)->maxCount) {
1586  // realloc
1587  //print 'ARRAY REALLOC'
1588  sArrayt *tmp = realloc(*array, sizeof(sArrayt) + sizeof(smallt *) * ((*array)->count + SARRAY_REALLOC_STEPS));
1589  if (!tmp) {
1590  return;
1591  }
1592  else {
1593  *array = tmp;
1594  (*array)->maxCount = 1 + (*array)->count + SARRAY_REALLOC_STEPS-1;
1595  }
1596  }
1597  smallt **arr = &((*array)->data);
1598  arr[(*array)->count] = data;
1599  }
1600 
1601  (*array)->count++;
1602  return;
1603 }
1604 
1618 
1619  /* // sanity checks */
1620  /* if !array */
1621  /* return */
1622 
1623  if (!(*array)) {
1624  // create array
1625  isError(*array, allocSArray())
1626  return;
1627  }
1628 
1629  if ((*array)->count == 0) {
1630  (*array)->data = data;;
1631  }
1632  else {
1633  if ((*array)->count >= (*array)->maxCount) {
1634  // realloc
1635  //print 'ARRAY REALLOC'
1636  sArrayt *tmp = realloc(*array, sizeof(sArrayt) + sizeof(smallt *) * ((*array)->count + SARRAY_REALLOC_STEPS));
1637  if (!tmp) {
1638  return;
1639  }
1640  else {
1641  *array = tmp;
1642  (*array)->maxCount = 1 + (*array)->count + SARRAY_REALLOC_STEPS-1;
1643  }
1644  }
1645  smallt **arr = &((*array)->data);
1646  // shift list
1647  for (uint32_t i = (*array)->count; i > 0; i--) {
1648  arr[i] = arr[i-1];
1649  }
1650  arr[0] = data;
1651  }
1652 
1653  (*array)->count++;
1654  return;
1655 }
1656 
1661  smallt *r = NULL;
1662 
1663  /* if !array->count */
1664  /* return NULL */
1665 
1666  r = sArrayGetTiny(array, array->count -1);
1667  array->count--;
1668  return(r);
1669 }
1670 
1675  smallt *r = NULL;
1676 
1677  /* if !array->count */
1678  /* return NULL */
1679 
1680  smallt **arr = &(array->data);
1681  r = arr[0];
1682  // shift list
1683  for (uint32_t i = 1 ; i < array->count ; i++) {
1684  arr[i-1] = arr[i];
1685  }
1686  array->count--;
1687  return(r);
1688 }
1689 
1699 smallt** sArrayGetP(sArrayt *array, uint32_t index) {
1700 
1701  return(&(((smallt **) &(array->data))[index]));
1702 }
1703 
1713 smallt* sArrayGetTiny(sArrayt *array, uint32_t index) {
1714 
1715  return(((smallt **) &(array->data))[index]);
1716 }
1717 
1729 void sArraySetShortTiny(sArrayt *array, uint32_t index, smallt *value) {
1730 
1731  ((smallt **) &(array->data))[index] = value;
1732 }
1733 
1745 void sArraySetP(sArrayt *array, uint32_t index, smallt *value) {
1746 
1747  sArraySetShortTiny(array, index, value);
1748 }
1749 
1761 void sArraySetTiny(sArrayt *array, uint32_t index, smallt *value) {
1762 
1763  if (value == (((smallt **) &(array->data))[index])) {
1764  // value is same element as the element already in the array
1765  return;
1766  }
1767  sFree(((smallt **) &(array->data))[index]);
1768  sArraySetShortTiny(array, index, value);
1769 }
1770 
1783 
1784  /* if !array->count */
1785  /* return -1 */
1786 
1787  smallt **arr = &(array->data);
1788  for (uint32_t i = 0 ; i < array->count/2 ; i++) {
1789  smallt *a = arr[i];
1790  arr[i] = arr[array->count-1 -i];
1791  arr[array->count-1 -i] = a;
1792  }
1793  return(1);
1794 }
1795 
1806 void sArrayDelTiny(sArrayt *array, uint32_t index) {
1807 
1808  sArraySetTiny(array, index, NULL);
1809 }
1810 
1826 void sArrayDelRangeTiny(sArrayt *array, uint32_t start, uint32_t end) {
1827 
1828  smallt **arr = &(array->data);
1829 
1830  // free elements in range start, end
1831  for (uint32_t i = start ; i < end ; i++) {
1832  sFree(arr[i]);
1833  }
1834 
1835  // copy pointers from range end, array->count to start
1836  for (uint32_t i = 0 ; i < (array->count - end) ; i ++) {
1837  arr[start+i] = arr[end + i];;
1838  }
1839 
1840  array->count -= end - start;
1841 }
1842 
1852 void* sBytesGet(sBytest *bytes) {
1853 
1854  if (!bytes || !isSType(bytes, BYTES)) {
1855  return(NULL);
1856  }
1857 
1858  return(sBytesGetTiny(bytes));
1859 }
1860 
1869 void* sBytesGetTiny(sBytest *bytes) {
1870 
1871  return(&(bytes->data));
1872 }
1873 
1885 void sBytesPush(sBytest **bytes, char data) {
1886 
1887  if (!(*bytes)) {
1888  // create bytes
1889  isError(*bytes, allocSBytes())
1890  return;
1891  }
1892 
1893  if ((*bytes)->count == 0) {
1894  (*bytes)->data = data;;
1895  }
1896  else {
1897  sBytest *tmp = realloc(*bytes, sizeof(sBytest) + sizeof(char) * ((*bytes)->count));
1898  if (!tmp) {
1899  return;
1900  }
1901  else {
1902  *bytes = tmp;
1903  (&((*bytes)->data))[(*bytes)->count] = data;
1904  }
1905  }
1906 
1907  (*bytes)->count++;
1908  return;
1909 }
1910 
1925 void sBytesPushBuffer(sBytest **bytes, void* data, uint32_t size) {
1926 
1927  if (!(*bytes)) {
1928  // create bytes
1929  *bytes = allocSBytes();
1930  }
1931 
1932  if (!data || !size) {
1933  return;
1934  }
1935 
1936  sBytesPushBufferTiny(bytes, data, size);
1937 }
1938 
1939 
1950 void sBytesPushBufferTiny(sBytest **bytes, void* data, uint32_t size) {
1951 
1952  if ((*bytes)->count == 0) {
1953  sBytest *tmp = realloc(*bytes, sizeof(sBytest) + sizeof(char) * (size-1));
1954  if (!tmp) {
1955  return;
1956  }
1957  else {
1958  *bytes = tmp;
1959  memcpy(&((*bytes)->data), data, size);
1960  (*bytes)->count = size;;
1961  }
1962  }
1963  else {
1964  sBytest *tmp = realloc(*bytes, sizeof(sBytest) + sizeof(char) * ((*bytes)->count + size-1));
1965  if (!tmp) {
1966  return;
1967  }
1968  else {
1969  *bytes = tmp;
1970  memcpy((&((*bytes)->data))+(*bytes)->count, data, size);
1971  (*bytes)->count += size;;
1972  }
1973  }
1974  return;
1975 }
1976 
1987 
1988  if (!obj) {
1989  return(NULL);
1990  }
1991 
1992  return(sSerialTiny(obj));
1993 }
1994 
2007 // TODO reimplement using loops
2008 // TODO serialize simple types
2010  sBytest *r = NULL;
2011  sBytest *B = NULL;
2012 
2013  switch(obj->type) {
2014  case UNDEFINED:
2015  sBytesPush(&r, obj->type);
2016  break;
2017  case BOOL:
2018  sBytesPush(&r, obj->type);
2019  sBytesPushBuffer(&r, &((sBoolt *)&(obj->type))->value, sizeof(bool));
2020  break;
2021  case CONTAINER:
2022  sBytesPush(&r, obj->type);
2023  break;
2024  case DICT:
2025  sDictSerialElementsTiny(&r, (sDictt *)&(obj->type));
2026  break;
2027  case DOUBLE:
2028  sBytesPush(&r, obj->type);
2029  sBytesPushBuffer(&r, &((sDoublet *)&(obj->type))->value, sizeof(double));
2030  break;
2031  case INT:
2032  sBytesPush(&r, obj->type);
2033  sBytesPushBuffer(&r, &((sIntt *)&(obj->type))->value, sizeof(int64_t));
2034  break;
2035  case STRING:
2036  sBytesPush(&r, obj->type);
2037  sBytesPushBuffer(&r, &((sStringt *)&(obj->type))->data, (uint32_t)sizeof(sStringt) + (uint32_t)strlen(&(((sStringt *)&(obj->type))->data)) -1);
2038  break;
2039  case ARRAY:
2040  sArraySerialElementsTiny(&r, (sArrayt *)&(obj->type));
2041  break;
2042  case BYTES:
2043  sBytesPush(&r, obj->type);
2044  B = (sBytest *)&(obj->type);
2045  sBytesPushBuffer(&r, &(B->count), sizeof(uint32_t));
2046  sBytesPushBuffer(&r, &(B->data), B->count);
2047  break;
2048  default:
2049  logME(libsheepyErrorMask, "Unsupported object type.");
2050  }
2051  return(r);
2052 }
2053 
2067  sBytest *B = NULL;
2068 
2069  sBytesPush(r, dict->type);
2070  sBytesPushBuffer(r, &(dict->count), sizeof(uint32_t));
2071 
2072  forEachSDict(dict, e) {
2073  if (e->key) {
2074  sBytesPushBuffer(r, e->key, (uint32_t)strlen(e->key) + 1);
2075  sBytesPush(r, e->data->type);
2076 
2077  switch(e->data->type) {
2078  case UNDEFINED:
2079  break;
2080  case BOOL:
2081  sBytesPushBuffer(r, &((sBoolt *)(e->data))->value, sizeof(bool));
2082  break;
2083  case CONTAINER:
2084  break;
2085  case DICT:
2086  // decrease to overwrite the e->type since sDictSerialElementsTiny stores the type
2087  // again
2088  (*r)->count--;
2089  sDictSerialElementsTiny(r, (sDictt *)(e->data));
2090  break;
2091  case DOUBLE:
2092  sBytesPushBuffer(r, &((sDoublet *)(e->data))->value, sizeof(double));
2093  break;
2094  case INT:
2095  sBytesPushBuffer(r, &((sIntt *)(e->data))->value, sizeof(int64_t));
2096  break;
2097  case STRING:
2098  sBytesPushBuffer(r, &((sStringt *)(e->data))->data, (uint32_t)sizeof(sStringt) + (uint32_t)strlen(&(((sStringt *)(e->data))->data)) -1);
2099  break;
2100  case ARRAY:
2101  // decrease to overwrite the e->type since sDictSerialElementsTiny stores the type
2102  // again
2103  (*r)->count--;
2104  sArraySerialElementsTiny(r, (sArrayt *)(e->data));
2105  break;
2106  case BYTES:
2107  B = (sBytest *)(e->data);
2108  sBytesPushBuffer(r, &(B->count), sizeof(uint32_t));
2109  sBytesPushBuffer(r, &(B->data), B->count);
2110  break;
2111  default:
2112  logME(libsheepyErrorMask, "Unsupported object type.");
2113  }
2114  }
2115  }
2116  return;
2117 }
2118 
2132  sBytest *B = NULL;
2133 
2134  sBytesPush(r, array->type);
2135  sBytesPushBuffer(r, &(array->count), sizeof(uint32_t));
2136 
2137  forEachSArray(array, e) {
2138  if (!e) {
2139  // empty slots are represented as undefined elements
2140  sBytesPush(r, UNDEFINED);
2141  }
2142  else {
2143  sBytesPush(r, e->type);
2144 
2145  switch(e->type) {
2146  case UNDEFINED:
2147  break;
2148  case BOOL:
2149  sBytesPushBuffer(r, &((sBoolt *)e)->value, sizeof(bool));
2150  break;
2151  case CONTAINER:
2152  break;
2153  case DICT:
2154  // decrease to overwrite the e->type since sDictSerialElementsTiny stores the type
2155  // again
2156  (*r)->count--;
2158  break;
2159  case DOUBLE:
2160  sBytesPushBuffer(r, &((sDoublet *)e)->value, sizeof(double));
2161  break;
2162  case INT:
2163  sBytesPushBuffer(r, &((sIntt *)e)->value, sizeof(int64_t));
2164  break;
2165  case STRING:
2166  sBytesPushBuffer(r, &((sStringt *)e)->data, (uint32_t)sizeof(sStringt) + (uint32_t)strlen(&(((sStringt *)e)->data)) -1);
2167  break;
2168  case ARRAY:
2169  // decrease to overwrite the e->type since sDictSerialElementsTiny stores the type
2170  // again
2171  (*r)->count--;
2173  break;
2174  case BYTES:
2175  B = (sBytest *)e;
2176  sBytesPushBuffer(r, &(B->count), sizeof(uint32_t));
2177  sBytesPushBuffer(r, &(B->data), B->count);
2178  break;
2179  default:
2180  logME(libsheepyErrorMask, "Unsupported object type.");
2181  }
2182  }
2183  }
2184  return;
2185 }
2186 
2197 
2198  if (!obj || !obj->count) {
2199  return(NULL);
2200  }
2201 
2202  return(sDeserialTiny(obj));
2203 }
2204 
2214 // TODO reimplement using loops
2216  smallt *r = NULL;
2217  bool *b = NULL;
2218  double *D = NULL;
2219  int64_t *i = NULL;
2220  char *s = NULL;
2221  sBytest *B = NULL;
2222  uint32_t *count = NULL;
2223  char *data = NULL;
2224 
2225  switch(obj->data) {
2226  case UNDEFINED:
2227  r = (smallt *) allocSUndefined();
2228  break;
2229  case BOOL:
2230  data = &(obj->data)+1;
2231  b = (bool *)data;
2232  r = (smallt *) allocSBool(*b);
2233  break;
2234  case CONTAINER:
2235  r = (smallt *) allocSContainer(NULL);
2236  break;
2237  case DICT:
2238  data = (char *)&(obj->data)+1;
2239  sDictDeserialElementsTiny((sDictt **)&r, &data);
2240  break;
2241  case DOUBLE:
2242  data = &(obj->data)+1;
2243  D = (double *)data;
2244  r = (smallt *) allocSDouble(*D);
2245  break;
2246  case INT:
2247  data = &(obj->data)+1;
2248  i = (int64_t *)data;
2249  r = (smallt *) allocSInt(*i);
2250  break;
2251  case STRING:
2252  s = (char *)&(obj->data)+1;
2253  r = (smallt *) allocSStringTiny(s);
2254  break;
2255  case ARRAY:
2256  data = (char *)&(obj->data)+1;
2257  sArrayDeserialElementsTiny((sArrayt **)&r, &data);
2258  break;
2259  case BYTES:
2260  isError(B, allocSBytes()) return(NULL);
2261  data = &(obj->data)+1;
2262  count = (uint32_t *)data;
2263  s = (char *)data + sizeof(uint32_t);
2264  sBytesPushBuffer(&B, s, *count);
2265  r = (smallt *)B;
2266  break;
2267  default:
2268  logME(libsheepyErrorMask, "Unsupported object type.");
2269  }
2270 
2271  return(r);
2272 }
2273 
2283 void sDictDeserialElementsTiny(sDictt **dict, char **data) {
2284  sUndefinedt *u = NULL;
2285  bool *b = NULL;
2286  sBoolt *bo = NULL;
2287  sContainert *c = NULL;
2288  double *D = NULL;
2289  sDoublet *Do = NULL;
2290  sDictt *d = NULL;
2291  int64_t *i = NULL;
2292  sIntt *io = NULL;
2293  char *s = NULL;
2294  sStringt *so = NULL;
2295  sArrayt *a = NULL;
2296  sBytest *B = NULL;
2297  uint32_t *count = NULL;
2298  uint32_t dictCount;
2299 
2300  dictCount = *((uint32_t *)(*data));
2301  *data += sizeof(uint32_t);
2302 
2303  if (!dictCount) {
2304  *dict = allocSDict();
2305  return;
2306  }
2307 
2308  for (uint32_t counter = 0 ; counter < dictCount ; counter++) {
2309  char type;
2310  char *key;
2311  key = *data;
2312  *data += strlen(key)+1;
2313  type = *((*data)++);
2314 
2315  switch(type) {
2316  case UNDEFINED:
2317  u = allocSUndefined();
2318  sDictPushTiny(dict, key, (smallt *) u);
2319  break;
2320  case BOOL:
2321  b = (bool *)(*data);
2322  *data += sizeof(bool);
2323  bo = allocSBool(*b);
2324  sDictPushTiny(dict, key, (smallt *) bo);
2325  break;
2326  case CONTAINER:
2327  c = allocSContainer(NULL);
2328  sDictPushTiny(dict, key, (smallt *) c);
2329  break;
2330  case DICT:
2331  d = NULL;
2332  sDictDeserialElementsTiny(&d, data);
2333  sDictPushTiny(dict, key, (smallt *) d);
2334  break;
2335  case DOUBLE:
2336  D = (double *)(*data);
2337  *data += sizeof(double);
2338  Do = allocSDouble(*D);
2339  sDictPushTiny(dict, key, (smallt *) Do);
2340  break;
2341  case INT:
2342  i = (int64_t *)(*data);
2343  *data += sizeof(int64_t);
2344  io = allocSInt(*i);
2345  sDictPushTiny(dict, key, (smallt *) io);
2346  break;
2347  case STRING:
2348  s = (char *)(*data);
2349  *data += strlen(s)+1;
2350  so = allocSStringTiny(s);
2351  sDictPushTiny(dict, key, (smallt *) so);
2352  break;
2353  case ARRAY:
2354  a = NULL;
2355  sArrayDeserialElementsTiny(&a, data);
2356  sDictPushTiny(dict, key, (smallt *) a);
2357  break;
2358  case BYTES:
2359  isError(B, allocSBytes()) {
2360  return;
2361  }
2362  count = (uint32_t *)(*data);
2363  *data += sizeof(uint32_t);
2364  s = *data;
2365  *data += *count;
2366  sBytesPushBuffer(&B, s, *count);
2367  sDictPushTiny(dict, key, (smallt *) B);
2368  break;
2369  default:
2370  logME(libsheepyErrorMask, "Unsupported object type.");
2371  }
2372 }
2373  }
2374 
2385  sUndefinedt *u = NULL;
2386  bool *b = NULL;
2387  sBoolt *bo = NULL;
2388  sContainert *c = NULL;
2389  double *D = NULL;
2390  sDoublet *Do = NULL;
2391  sDictt *d = NULL;
2392  int64_t *i = NULL;
2393  sIntt *io = NULL;
2394  char *s = NULL;
2395  sStringt *so = NULL;
2396  sArrayt *a = NULL;
2397  sBytest *B = NULL;
2398  uint32_t *count = NULL;
2399  uint32_t arrayCount;
2400 
2401  arrayCount = *((uint32_t *)(*data));
2402  *data += sizeof(uint32_t);
2403 
2404  if (!arrayCount) {
2405  *array = allocSArray();
2406  return;
2407  }
2408 
2409  for (uint32_t counter = 0 ; counter < arrayCount ; counter++) {
2410  char type;
2411  type = *((*data)++);
2412 
2413  switch(type) {
2414  case UNDEFINED:
2415  u = allocSUndefined();
2416  sArrayPushTiny(array, (smallt *) u);
2417  break;
2418  case BOOL:
2419  b = (bool *)(*data);
2420  *data += sizeof(bool);
2421  bo = allocSBool(*b);
2422  sArrayPushTiny(array, (smallt *) bo);
2423  break;
2424  case CONTAINER:
2425  c = allocSContainer(NULL);
2426  sArrayPushTiny(array, (smallt *) c);
2427  break;
2428  case DICT:
2429  d = NULL;
2430  sDictDeserialElementsTiny(&d, data);
2431  sArrayPushTiny(array, (smallt *) d);
2432  break;
2433  case DOUBLE:
2434  D = (double *)(*data);
2435  *data += sizeof(double);
2436  Do = allocSDouble(*D);
2437  sArrayPushTiny(array, (smallt *) Do);
2438  break;
2439  case INT:
2440  i = (int64_t *)(*data);
2441  *data += sizeof(int64_t);
2442  io = allocSInt(*i);
2443  sArrayPushTiny(array, (smallt *) io);
2444  break;
2445  case STRING:
2446  s = (char *)(*data);
2447  *data += strlen(s)+1;
2448  so = allocSStringTiny(s);
2449  sArrayPushTiny(array, (smallt *) so);
2450  break;
2451  case ARRAY:
2452  a = NULL;
2453  sArrayDeserialElementsTiny(&a, data);
2454  sArrayPushTiny(array, (smallt *) a);
2455  break;
2456  case BYTES:
2457  isError(B, allocSBytes()) {
2458  return;
2459  }
2460  count = (uint32_t *)(*data);
2461  *data += sizeof(uint32_t);
2462  s = *data;
2463  *data += *count;
2464  sBytesPushBuffer(&B, s, *count);
2465  sArrayPushTiny(array, (smallt *) B);
2466  break;
2467  default:
2468  logME(libsheepyErrorMask, "Unsupported object type.");
2469  }
2470 }
2471  }
char * sEscapeTiny(smallt *obj)
stringify a small object
void sStringSetTiny(sStringt **string, const char *news)
set string in small string
sArrayt * sArrayDuplicateTiny(sArrayt *array)
duplicate array
char * s
const char ** sDictTypeStrings(sDictt *obj)
list first level of dictionary types in a list of strings
smallt * so
int sArrayReverseTiny(sArrayt *array)
reverse element order
char * escapeS(const char *s, char delim)
escape string according the json specification (RFC 8259) if there is in the string, the backslash is escaped and it will be parsed as the string &#39;&#39; be the json parsers the unicode characters should be converted to UTF8 codepoints instead of using the result can be included in a json string and the parsing will be correct
Definition: libsheepy.c:10045
dictionary element: key, value
size_t len
void sDictSetP(sDictt **dict, const char *key, smallt *data)
dictionary set pointer
obj f free & obj
bool eqS(const char *string1, const char *string2)
string Equal compare string1 to string2
Definition: libsheepy.c:9067
smallt * sDictGet(sDictt *dict, const char *key)
get object stored at key
#define yes
Definition: libsheepy.h:127
char * toHexSepS(const void *buf, size_t len, const char *separator)
create a string with bytes in buf converted to hex strings separated by separator ...
Definition: libsheepy.c:6686
char * sToString(smallt *obj)
stringify object
void sDictFreeElements(sDictt *dict)
free dictionary elements
char * sDoubleToStringTiny(sDoublet *obj)
stringify double
free(s)
sStringt * allocSStringTiny(const char *data)
allocate a small string
uint32_t count
void sArraySetP(sArrayt *array, uint32_t index, smallt *value)
set value at index
smallt * sDeserialTiny(sBytest *obj)
deserialize small bytes object
char * sStringEscapeTiny(sStringt *obj)
stringify string
smallBytest * B
sIntt * allocSInt(int64_t value)
allocate a small int
undefined
smallt * sArrayDequeueTiny(sArrayt *array)
dequeue object from array
freeSContainerFt free
void sArraySetShortTiny(sArrayt *array, uint32_t index, smallt *value)
set value at index
char * iAppendNFreeS(char **string1, char *string2)
append and free strings
Definition: libsheepy.c:7368
void sArrayDeserialElementsTiny(sArrayt **array, char **data)
deserialize array from data
void sBytesPush(sBytest **bytes, char data)
push char to bytes
sBytest * sDictTypes(sDictt *obj)
list first level of object types in dictionary
void sArrayDelRangeTiny(sArrayt *array, uint32_t start, uint32_t end)
delete range and shift elements
void sArrayDelTiny(sArrayt *array, uint32_t index)
delete element at index
smallt * i
array
smallt ** sArrayGetP(sArrayt *array, uint32_t index)
get pointer to object at index
void sDictSerialElementsTiny(sBytest **r, sDictt *dict)
serialize dictionary
char * sArrayEscapeTiny(sArrayt *obj)
stringify array
char * sDictToStringTiny(sDictt *obj)
stringify dictionary
sBytest * sSerial(smallt *obj)
serialize object to small bytes
base class for the small objects all small objects have a type
smallDictt * d
#define forEachSArray(array, element)
smallDoublet * D
char data[7]
Definition: libsheepy.c:19690
sBytest * allocSBytes(void)
allocate a small bytes object
#define libsheepyErrorMask
Definition: libsheepy.h:291
baset * b
char * sDictEscapeTiny(sDictt *obj)
stringify dictionary
#define isError(assigned, left)
is Assigment Error catch error when assigned is false, 0 or NULL after being assigned with left ...
Definition: libsheepy.h:386
small bytes
char * sStringGetTiny(sStringt *string)
get string in a small string object
const char ** sArrayTypeStrings(sArrayt *obj)
list first level of array types in a list of strings
char * sBytesToStringTiny(sBytest *obj)
stringify small bytes
uint32_t maxCount
size_t sSizeTiny(smallt *obj)
unused function and wrong result TODO update or remove
void sArrayPushTiny(sArrayt **array, smallt *data)
push data to array
small int
char * array[]
smallt * sDuplicateTiny(smallt *obj)
duplicate small object
void sDictFreeTiny(sDictt *dict)
free dictionary elements and dictionary object
char * sUndefinedToStringTiny(sUndefinedt *obj UNUSED)
stringify undefined
#define SARRAY_MIN_ELEMENTS
pErrorNULL(iPrependS(&ks, "[1]"))
sContainert * allocSContainer(void *data)
allocate a small container The container holds a pointer to a user buffer
sUndefinedt * allocSUndefined(void)
allocate a small undefined object
char type
void sArraySerialElementsTiny(sBytest **r, sArrayt *array)
serialize array
uint32_t count
sBytest * sSerialTiny(smallt *obj)
serialize object to small bytes
char * sBoolToStringTiny(sBoolt *obj)
stringify bool
char * iPrependS(char **string1, const char *string2)
prepend strings
Definition: libsheepy.c:7557
char * setS(char *string, int64_t index, char c)
set string
Definition: libsheepy.c:13898
char type
char * sTypesTiny(smallt *obj)
get list of object types string
#define SDICT_MIN_ELEMENTS
void sDictDeserialElementsTiny(sDictt **dict, char **data)
deserialize dictionary from data
char * sContainerToStringTiny(sContainert *obj UNUSED)
stringify container
#define SDICT_REALLOC_STEPS
char c
const char ** sTypesToStrings(sBytest *types)
convert a list of object types to a list of strings
sBytest * sDictTypesTiny(sDictt *obj)
list first level of object types in dictionary
void sBytesPushBuffer(sBytest **bytes, void *data, uint32_t size)
push data buffer to bytes
sDictt * allocSDict(void)
allocate a small dict
smallt * data
smallt * sDictGetTiny(sDictt *dict, const char *key)
get object stored at key
smallDictt * o
void sArrayPrependTiny(sArrayt **array, smallt *data)
prepend data in array
void * sBytesGetTiny(sBytest *bytes)
get buffer in small bytes
sDictt * sDictDuplicateTiny(sDictt *dict)
duplicate dictionary
int64_t value
void sArraySetTiny(sArrayt *array, uint32_t index, smallt *value)
set value at index
void sDictPushTiny(sDictt **dict, const char *key, smallt *data)
push new key-value
void * sBytesGet(sBytest *bytes)
get buffer in small bytes
#define logME(mask,...)
Definition: libsheepy.h:1205
sBytest * sTypesToBytesTiny(smallt *obj)
collect the types in an array or dictionary
smallt * sDeserial(sBytest *obj)
deserialize small bytes object
sDoublet * allocSDouble(double value)
allocate a small double
uint32_t maxCount
#define strEq
Definition: libsheepy.h:2018
smallt ** sDictGetP(sDictt *dict, const char *key)
get pointer to object at key
uint32_t count
char * sArrayToStringTiny(sArrayt *obj)
stringify array
smallArrayt * a
in value value
#define forEachSDict(dict, element)
char * iAppendS(char **string1, const char *string2)
append strings
Definition: libsheepy.c:7285
sBytest * sArrayTypesTiny(sArrayt *obj)
list first level of object types in array
dictionary
double value
char * sEscape(smallt *obj)
stringify object
small string
char * sToStringTiny(smallt *obj)
stringify a small object
#define isSType(obj, sType)
true when object is type sType
small bool
#define UNUSED
Definition: libsheepy.h:8195
void sDictDelTiny(sDictt *dict, const char *key)
delete dictionary element
void sFreeTiny(smallt *obj)
free any type of small object
void sDictFreeElement(sDictElemt *e)
free a dictionary element
sBoolt * allocSBool(bool value)
allocate a small bool
void sArrayFreeTiny(sArrayt *array)
free array elements and array object
*Tiny functions dont check the parameter validity *ShortTiny do the shortest possible operations ...
void sDictSetTiny(sDictt **dict, const char *key, smallt *data)
dictionary set key, value
#define SARRAY_REALLOC_STEPS
void sBytesPushBufferTiny(sBytest **bytes, void *data, uint32_t size)
push data buffer to bytes
char * sStringToStringTiny(sStringt *obj)
stringify string
bool isSTypeF(smallt *obj, char sType)
is Small Type true if obj has type sType
bool r
#define no
Definition: libsheepy.h:129
smallt * sArrayGetTiny(sArrayt *array, uint32_t index)
get object at index
small double
#define ARRAY_SIZE
Definition: libsheepy.h:473
void sFree(smallt *obj)
free non null objects
char type
sArrayt * allocSArray(void)
allocate a small array
bool value
undefinedt * u
sBytest * sArrayTypes(sArrayt *obj)
list first level of object types in array
smallt * sArrayPopTiny(sArrayt *array)
pop object from array
smallt * data
smallt * sDuplicate(smallt *o)
duplicate small object
char * sIntToStringTiny(sIntt *obj)
stringify int
void sArrayFreeElements(sArrayt *array)
free array elements