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

commit e72d85d9afaf2f22b4e9c52c87abacc87f176ff0
parent 82fdf683fbe46d8afa1da8d072152ddce069bb8c
Author: Remy Noulin <loader2x@gmail.com>
Date:   Mon, 31 Aug 2020 12:33:37 +0200

Ignore NULL elements in arrays (happens after elements are deleted from the array, positions of deleted elements are set to NULL) to avoid the need to compact arrays

src/json/libsheepyCSmallArray.c | 85 +++++++++++++++++++++++++++++++++++
src/json/libsheepyCSmallDict.c  |  8 +++-
src/json/libsheepyCSmallJson.c  | 98 ++++++++++++++++++++++++++++++++++++++++-
src/json/libsheepyObject.c      |  6 +++
src/libsheepy.h                 |  2 +-
5 files changed, 196 insertions(+), 3 deletions(-)

Diffstat:
Msrc/json/libsheepyCSmallArray.c | 85+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/json/libsheepyCSmallDict.c | 8+++++++-
Msrc/json/libsheepyCSmallJson.c | 98++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
Msrc/json/libsheepyObject.c | 6++++++
Msrc/libsheepy.h | 2+-
5 files changed, 196 insertions(+), 3 deletions(-)

diff --git a/src/json/libsheepyCSmallArray.c b/src/json/libsheepyCSmallArray.c @@ -5928,6 +5928,14 @@ internal bool equalSmallArray(smallArrayt *self, smallArrayt *array) { char *es = NULL; char *as = NULL; enumerateSArray(self->a, e, i) { + if (not e) { + if (not sArrayGetTiny(array->a, i)) { + continue; + } + else { + return(false); + } + } if ((e->type != sArrayGetTiny(array->a, i)->type)) { return(false); } @@ -6026,6 +6034,9 @@ internal bool equalSmallArrayArray(smallArrayt* self, char ** p2) { // compare elements enumerateSArray(self->a, e, i) { + if (not e) { + return(false); + } if (e->type != STRING) { return(false); } @@ -6075,6 +6086,14 @@ internal bool icEqualSmallArray(smallArrayt *self, smallArrayt *array) { char *es = NULL; char *as = NULL; enumerateSArray(self->a, e, i) { + if (not e) { + if (not sArrayGetTiny(array->a, i)) { + continue; + } + else { + return(false); + } + } if ((e->type != sArrayGetTiny(array->a, i)->type)) { return(false); } @@ -6179,6 +6198,9 @@ bool icEqualSmallArrayArray(smallArrayt* self, char ** p2) { // compare elements enumerateSArray(self->a, e, i) { + if (not e) { + return(false); + } if (e->type != STRING) { return(false); } @@ -8055,6 +8077,9 @@ internal ssize_t indexOfSmallArray(smallArrayt *self, baset *value) { char *es = NULL; enumerateSArray(self->a, e, i) { + if (not e) { + continue; + } es = sToString(e); if (strEq(es, s)) { free(es); @@ -8080,6 +8105,9 @@ internal ssize_t indexOfUndefinedSmallArray(smallArrayt *self, undefinedt *undef // search string in elements enumerateSArray(self->a, e, i) { + if (not e) { + continue; + } if (e->type == UNDEFINED) { return(i); } @@ -8096,6 +8124,9 @@ internal ssize_t indexOfBoolSmallArray(smallArrayt *self, bool value) { // search value in elements enumerateSArray(self->a, e, i) { + if (not e) { + continue; + } if (e->type == BOOL && ((sBoolt*)e)->value == value) { return(i); } @@ -8112,6 +8143,9 @@ internal ssize_t indexOfDoubleSmallArray(smallArrayt *self, double value) { // search value in elements enumerateSArray(self->a, e, i) { + if (not e) { + continue; + } if (e->type == DOUBLE && ((sDoublet*)e)->value == value) { return(i); } @@ -8128,6 +8162,9 @@ internal ssize_t indexOfIntSmallArray(smallArrayt *self, int64_t value) { // search value in elements enumerateSArray(self->a, e, i) { + if (not e) { + continue; + } if (e->type == INT && ((sIntt*)e)->value == value) { return(i); } @@ -8146,6 +8183,9 @@ internal ssize_t indexOfSSmallArray(smallArrayt *self, const char *string) { } // search string in elements enumerateSArray(self->a, e, i) { + if (not e) { + continue; + } if (e->type == STRING && strEq(sStringGetTiny((sStringt*)e), string)) { return(i); } @@ -8175,6 +8215,9 @@ internal ssize_t indexOfDictSmallArray(smallArrayt *self, smallDictt *dict) { char *es = NULL;; enumerateSArray(self->a, e, i) { + if (not e) { + continue; + } if (e->type == DICT) { es = sToString(e); if (strEq(es, s)) { @@ -8205,6 +8248,9 @@ internal ssize_t indexOfArraySmallArray(smallArrayt *self, smallArrayt *array) { char *es = NULL;; enumerateSArray(self->a, e, i) { + if (not e) { + continue; + } if (e->type == ARRAY) { es = sToString(e); if (strEq(es, s)) { @@ -8233,6 +8279,9 @@ internal ssize_t indexOfArraycSmallArray(smallArrayt *self, char **array) { char *es = NULL;; enumerateSArray(self->a, e, i) { + if (not e) { + continue; + } if (e->type == ARRAY) { es = sToString(e); if (strEq(es, s)) { @@ -8262,6 +8311,9 @@ internal ssize_t indexOfSmallBoolSmallArray(smallArrayt *self, smallBoolt *value bool b = value->f->get(value); enumerateSArray(self->a, e, i) { + if (not e) { + continue; + } if (e->type == BOOL && ((sBoolt*)e)->value == b) { return(i); } @@ -8285,6 +8337,9 @@ internal ssize_t indexOfSmallBytesSmallArray(smallArrayt *self, smallBytest *val uint32_t count = value->B->count; enumerateSArray(self->a, e, i) { + if (not e) { + continue; + } if (e->type == BYTES && ((sBytest*)e)->count == count && !memcmp(&(((sBytest*)e)->data), b, count)) { return(i); } @@ -8307,6 +8362,9 @@ internal ssize_t indexOfSmallDoubleSmallArray(smallArrayt *self, smallDoublet *v double v = value->f->get(value); enumerateSArray(self->a, e, i) { + if (not e) { + continue; + } if (e->type == DOUBLE && ((sDoublet*)e)->value == v) { return(i); } @@ -8329,6 +8387,9 @@ internal ssize_t indexOfSmallIntSmallArray(smallArrayt *self, smallIntt *value) int64_t v = value->f->get(value); enumerateSArray(self->a, e, i) { + if (not e) { + continue; + } if (e->type == INT && ((sIntt*)e)->value == v) { return(i); } @@ -8413,6 +8474,9 @@ internal ssize_t indexOfSmallStringSmallArray(smallArrayt *self, smallStringt *s char *s = sStringGetTiny(string->data); enumerateSArray(self->a, e, i) { + if (not e) { + continue; + } if (e->type == STRING && strEq(sStringGetTiny((sStringt*)e), s)) { return(i); } @@ -9174,6 +9238,9 @@ internal ssize_t icIndexOfSmallArray(smallArrayt *self, baset *value) { char *es = NULL; enumerateSArray(self->a, e, i) { + if (not e) { + continue; + } es = sToString(e); if (icEqS(es, s)) { free(es); @@ -9197,6 +9264,9 @@ internal ssize_t icIndexOfSSmallArray(smallArrayt *self, const char *string) { } // search string in elements enumerateSArray(self->a, e, i) { + if (not e) { + continue; + } if (e->type == STRING && icEqS(sStringGetTiny((sStringt*)e), string)) { return(i); } @@ -9226,6 +9296,9 @@ internal ssize_t icIndexOfDictSmallArray(smallArrayt *self, smallDictt *dict) { char *es = NULL;; enumerateSArray(self->a, e, i) { + if (not e) { + continue; + } if (e->type == DICT) { es = sToString(e); if (icEqS(es, s)) { @@ -9256,6 +9329,9 @@ internal ssize_t icIndexOfArraySmallArray(smallArrayt *self, smallArrayt *array) char *es = NULL;; enumerateSArray(self->a, e, i) { + if (not e) { + continue; + } if (e->type == ARRAY) { es = sToString(e); if (icEqS(es, s)) { @@ -9284,6 +9360,9 @@ internal ssize_t icIndexOfArraycSmallArray(smallArrayt *self, char **array) { char *es = NULL;; enumerateSArray(self->a, e, i) { + if (not e) { + continue; + } if (e->type == ARRAY) { es = sToString(e); if (icEqS(es, s)) { @@ -9374,6 +9453,9 @@ internal ssize_t icIndexOfSmallStringSmallArray(smallArrayt *self, smallStringt char *s = sStringGetTiny(string->data); enumerateSArray(self->a, e, i) { + if (not e) { + continue; + } if (e->type == STRING && icEqS(sStringGetTiny((sStringt*)e), s)) { return(i); } @@ -9891,6 +9973,9 @@ internal bool isBlankSmallArray(smallArrayt *self) { internal void forEachSmallArrayF(smallArrayt *self, void *closure, forEachElementSmallArrayFt funcElem) { forEachSmallArray(self, e) { + if (not e) { + continue; + } if (!funcElem(closure, e)) { finishO(e); break; diff --git a/src/json/libsheepyCSmallDict.c b/src/json/libsheepyCSmallDict.c @@ -4603,6 +4603,9 @@ internal smallDictt* zipSmallDict(smallDictt *self, smallArrayt *keys, smallArra count = 0; forEachSmallArray(keys, K) { + if (not K) { + return(NULL); + } castS(k, K); sDictSetTiny(&(self->d), ssGet(k), sArrayGetTiny(values->a, count)); finishO(K); @@ -4834,6 +4837,9 @@ internal smallDictt* zipVArraySmallDict(smallDictt *self, smallArrayt *keys, cha smallt *e; forEachSmallArray(keys, K) { + if (not K) { + return(NULL); + } castS(k, K); e = (smallt *) allocSStringTiny(values[count]);; sDictSetTiny(&(self->d), ssGet(k), e); @@ -4862,7 +4868,7 @@ internal smallDictt* fromArraySmallDict(smallDictt *self, smallArrayt *items) { } forEachSmallArray(items, E) { - if (!isOType(E, "smallArray")) { + if (not E or !isOType(E, "smallArray")) { goto cont; } cast(smallArrayt*, a, E); diff --git a/src/json/libsheepyCSmallJson.c b/src/json/libsheepyCSmallJson.c @@ -3446,7 +3446,7 @@ internal smallJsont* fromArrayDictSmallJson(smallJsont *self, smallArrayt *items } forEachSmallArray(items, E) { - if (!isOType(E, "smallArray")) { + if (!E || !isOType(E, "smallArray")) { goto cont; } cast(smallArrayt*, a, E); @@ -12092,6 +12092,9 @@ internal ssize_t indexOfSmallJson(smallJsont *self, baset *value) { char *es = NULL; enumerateSArray(self->topA, e, i) { + if (not e) { + continue; + } es = sToString(e); if (strEq(es, s)) { free(es); @@ -12121,6 +12124,9 @@ internal ssize_t indexOfUndefinedSmallJson(smallJsont *self, undefinedt *undefin // search string in elements enumerateSArray(self->topA, e, i) { + if (not e) { + continue; + } if (e->type == UNDEFINED) { return(i); } @@ -12141,6 +12147,9 @@ internal ssize_t indexOfBoolSmallJson(smallJsont *self, bool value) { // search value in elements enumerateSArray(self->topA, e, i) { + if (not e) { + continue; + } if (e->type == BOOL && ((sBoolt*)e)->value == value) { return(i); } @@ -12161,6 +12170,9 @@ internal ssize_t indexOfDoubleSmallJson(smallJsont *self, double value) { // search value in elements enumerateSArray(self->topA, e, i) { + if (not e) { + continue; + } if (e->type == DOUBLE && ((sDoublet*)e)->value == value) { return(i); } @@ -12181,6 +12193,9 @@ internal ssize_t indexOfIntSmallJson(smallJsont *self, int64_t value) { // search value in elements enumerateSArray(self->topA, e, i) { + if (not e) { + continue; + } if (e->type == INT && ((sIntt*)e)->value == value) { return(i); } @@ -12206,6 +12221,9 @@ internal ssize_t indexOfSSmallJson(smallJsont *self, const char *string) { } // search string in elements enumerateSArray(self->topA, e, i) { + if (not e) { + continue; + } if (e->type == STRING && strEq(sStringGetTiny((sStringt*)e), string)) { return(i); } @@ -12243,6 +12261,9 @@ internal ssize_t indexOfDictSmallJson(smallJsont *self, smallDictt *dict) { char *es = NULL;; enumerateSArray(self->topA, e, i) { + if (not e) { + continue; + } if (e->type == DICT) { es = sToString(e); if (strEq(es, s)) { @@ -12277,6 +12298,9 @@ internal ssize_t indexOfArraySmallJson(smallJsont *self, smallArrayt *array) { char *es = NULL;; enumerateSArray(self->topA, e, i) { + if (not e) { + continue; + } if (e->type == ARRAY) { es = sToString(e); if (strEq(es, s)) { @@ -12309,6 +12333,9 @@ internal ssize_t indexOfArraycSmallJson(smallJsont *self, char **array) { char *es = NULL;; enumerateSArray(self->topA, e, i) { + if (not e) { + continue; + } if (e->type == ARRAY) { es = sToString(e); if (strEq(es, s)) { @@ -12342,6 +12369,9 @@ internal ssize_t indexOfSmallBoolSmallJson(smallJsont *self, smallBoolt *value) bool b = value->f->get(value); enumerateSArray(self->topA, e, i) { + if (not e) { + continue; + } if (e->type == BOOL && ((sBoolt*)e)->value == b) { return(i); } @@ -12369,6 +12399,9 @@ internal ssize_t indexOfSmallBytesSmallJson(smallJsont *self, smallBytest *value uint32_t count = value->B->count; enumerateSArray(self->topA, e, i) { + if (not e) { + continue; + } if (e->type == BYTES && ((sBytest*)e)->count == count && !memcmp(&(((sBytest*)e)->data), b, count)) { return(i); } @@ -12395,6 +12428,9 @@ internal ssize_t indexOfSmallDoubleSmallJson(smallJsont *self, smallDoublet *val double v = value->f->get(value); enumerateSArray(self->topA, e, i) { + if (not e) { + continue; + } if (e->type == DOUBLE && ((sDoublet*)e)->value == v) { return(i); } @@ -12421,6 +12457,9 @@ internal ssize_t indexOfSmallIntSmallJson(smallJsont *self, smallIntt *value) { int64_t v = value->f->get(value); enumerateSArray(self->topA, e, i) { + if (not e) { + continue; + } if (e->type == INT && ((sIntt*)e)->value == v) { return(i); } @@ -12512,6 +12551,9 @@ internal ssize_t indexOfSmallStringSmallJson(smallJsont *self, smallStringt *str } enumerateSArray(self->topA, e, i) { + if (not e) { + continue; + } if (e->type == STRING && strEq(sStringGetTiny((sStringt*)e), s)) { return(i); } @@ -13290,6 +13332,9 @@ internal ssize_t icIndexOfSmallJson(smallJsont *self, baset *value) { char *es = NULL; enumerateSArray(self->topA, e, i) { + if (not e) { + continue; + } es = sToString(e); if (icEqS(es, s)) { free(es); @@ -13320,6 +13365,9 @@ internal ssize_t icIndexOfSSmallJson(smallJsont *self, const char *string) { } // search string in elements enumerateSArray(self->topA, e, i) { + if (not e) { + continue; + } if (e->type == STRING && icEqS(sStringGetTiny((sStringt*)e), string)) { return(i); } @@ -13357,6 +13405,9 @@ internal ssize_t icIndexOfDictSmallJson(smallJsont *self, smallDictt *dict) { char *es = NULL;; enumerateSArray(self->topA, e, i) { + if (not e) { + continue; + } if (e->type == DICT) { es = sToString(e); if (icEqS(es, s)) { @@ -13391,6 +13442,9 @@ internal ssize_t icIndexOfArraySmallJson(smallJsont *self, smallArrayt *array) { char *es = NULL;; enumerateSArray(self->topA, e, i) { + if (not e) { + continue; + } if (e->type == ARRAY) { es = sToString(e); if (icEqS(es, s)) { @@ -13423,6 +13477,9 @@ internal ssize_t icIndexOfArraycSmallJson(smallJsont *self, char **array) { char *es = NULL;; enumerateSArray(self->topA, e, i) { + if (not e) { + continue; + } if (e->type == ARRAY) { es = sToString(e); if (icEqS(es, s)) { @@ -13462,6 +13519,9 @@ internal ssize_t icIndexOfSmallStringSmallJson(smallJsont *self, smallStringt *s } enumerateSArray(self->topA, e, i) { + if (not e) { + continue; + } if (e->type == STRING && icEqS(sStringGetTiny((sStringt*)e), s)) { return(i); } @@ -14895,6 +14955,9 @@ internal bool equalSmallJsonSmallArray(smallJsont *self, smallArrayt *array) { char *es = NULL; char *as = NULL; enumerateSArray(self->topA, e, i) { + if (not e) { + return(false); + } if ((e->type != sArrayGetTiny(array->a, i)->type)) { return(false); } @@ -14975,6 +15038,9 @@ bool equalSmallJsonArray(smallJsont *self, char ** p2) { // compare elements enumerateSArray(self->topA, e, i) { + if (not e) { + return(false); + } if (e->type != STRING) { return(false); } @@ -15539,6 +15605,9 @@ internal bool icEqualSmallJsonSmallArray(smallJsont *self, smallArrayt *array) { char *es = NULL; char *as = NULL; enumerateSArray(self->topA, e, i) { + if (not e) { + return(false); + } if ((e->type != sArrayGetTiny(array->a, i)->type)) { return(false); } @@ -15615,6 +15684,9 @@ bool icEqualSmallJsonArray(smallJsont *self, char ** p2) { // compare elements enumerateSArray(self->topA, e, i) { + if (not e) { + return(false); + } if (e->type != STRING) { return(false); } @@ -16641,6 +16713,9 @@ internal void forEachSmallJsonF(smallJsont *self, void *closure, forEachElementS } forEachSmallJson(self, e) { + if (!e) { + continue; + } if (!funcElem(closure, e)) { finishO(e); break; @@ -16658,6 +16733,9 @@ internal void enumerateSmallJsonF(smallJsont *self, void *closure, enumerateElem } enumerateSArray(self->topA, e, i) { + if (not e) { + continue; + } baset *E = toBaset(e); if (!funcElem(closure, i, E)) { if (e->type == CONTAINER && ((sContainert*)e)->dataType == SH_DT_BASET) { @@ -17614,6 +17692,9 @@ internal smallJsont* zipSmallJson(smallJsont *self, smallArrayt *array1, smallAr count = 0; forEachSmallArray(array1, K) { + if (!K) { + return(NULL); + } castS(k, K); sDictSetTiny(&(self->top), ssGet(k), sArrayGetTiny(array2->a, count)); finishO(K); @@ -17730,6 +17811,9 @@ internal smallJsont* zipCharSmallJson(smallJsont *self, smallArrayt *array1, cha smallt *e; forEachSmallArray(array1, K) { + if (!K) { + return(NULL); + } castS(k, K); e = (smallt *) allocSStringTiny(array2[count]);; sDictSetTiny(&(self->top), ssGet(k), e); @@ -17847,6 +17931,9 @@ smallJsont* zipJsonSmallJson(smallJsont *self, smallJsont *array1, smallJsont *a count = 0; forEachSmallJson(array1, K) { + if (!K) { + return(NULL); + } castS(k, K); sDictSetTiny(&(self->top), ssGet(k), sArrayGetTiny(array2->topA, count)); finishO(K); @@ -17910,6 +17997,9 @@ smallJsont* zipJsonSmallArraySmallJson(smallJsont *self, smallJsont *array1, sma count = 0; forEachSmallJson(array1, K) { + if (!K) { + return(NULL); + } castS(k, K); sDictSetTiny(&(self->top), ssGet(k), sArrayGetTiny(array2->a, count)); finishO(K); @@ -17974,6 +18064,9 @@ smallJsont* zipJsonArraySmallJson(smallJsont *self, smallJsont *array1, char** a smallt *e; forEachSmallJson(array1, K) { + if (!K) { + return(NULL); + } castS(k, K); e = (smallt *) allocSStringTiny(array2[count]);; sDictSetTiny(&(self->top), ssGet(k), e); @@ -18037,6 +18130,9 @@ smallJsont* zipSmallArrayJsonSmallJson(smallJsont *self, smallArrayt *array1, sm count = 0; forEachSmallArray(array1, K) { + if (!K) { + return(NULL); + } castS(k, K); sDictSetTiny(&(self->top), ssGet(k), sArrayGetTiny(array2->topA, count)); finishO(K); diff --git a/src/json/libsheepyObject.c b/src/json/libsheepyObject.c @@ -3613,6 +3613,9 @@ bool equalArrayOG(char ** p1, baset* p2) { // compare elements // TODO compare any types of element, not only strings enumerateSArray(arr->a, e, i) { + if (not e) { + return(false); + } if (!strEq(sStringGetTiny((sStringt*)e), p1[i])) { return(false); } @@ -4960,6 +4963,9 @@ bool icEqualArrayOG(char ** p1, baset* p2) { // compare elements // TODO compare any types of element, not only strings enumerateSArray(arr->a, e, i) { + if (not e) { + return(false); + } if (!icEqS(sStringGetTiny((sStringt*)e), p1[i])) { return(false); } diff --git a/src/libsheepy.h b/src/libsheepy.h @@ -98,7 +98,7 @@ // version accoring to the version package: Release.Major.minor.patch // https://noulin.net/version/file/README.md.html -#define LIBSHEEPY_VERSION "1.2.3.1" +#define LIBSHEEPY_VERSION "1.2.3.2" #ifndef SH_PREFIX #define SH_PREFIX(NAME) NAME